// Copyright 2014 PDFium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

#ifndef CORE_INCLUDE_FPDFAPI_FPDF_MODULE_H_
#define CORE_INCLUDE_FPDFAPI_FPDF_MODULE_H_

#include "../../../third_party/base/nonstd_unique_ptr.h"
#include "../fxcrt/fx_coordinates.h"
#include "../fxcrt/fx_system.h"

class CCodec_ModuleMgr;
class CFX_AffineMatrix;
class CFX_BitmapDevice;
class CFX_DIBSource;
class CPDF_ColorSpace;
class CPDF_Dictionary;
class CPDF_DocPageData;
class CPDF_DocRenderData;
class CPDF_Document;
class CPDF_FontGlobals;
class CPDF_Image;
class CPDF_Page;
class CPDF_PageObjects;
class CPDF_PageRenderCache;
class CPDF_RenderConfig;
class CPDF_RenderOptions;
class CPDF_SecurityHandler;
class CPDF_Stream;
class ICodec_FaxModule;
class ICodec_FlateModule;
class ICodec_IccModule;
class ICodec_Jbig2Module;
class ICodec_JpegModule;
class ICodec_JpxModule;
class IPDF_FontMapper;
class IPDF_PageModule;
class IPDF_RenderModule;

class CPDF_ModuleMgr
{
public:
    static CPDF_ModuleMgr* Get();
    static void Create();
    static void Destroy();
    static const int kFileBufSize = 512;

    void SetCodecModule(CCodec_ModuleMgr* pModule)
    {
        m_pCodecModule = pModule;
    }
    CCodec_ModuleMgr* GetCodecModule()
    {
        return m_pCodecModule;
    }

    void InitPageModule();

    void InitRenderModule();

    void SetDownloadCallback(bool (*callback)(const FX_CHAR* module_name));

    bool DownloadModule(const FX_CHAR* module_name);

    void NotifyModuleAvailable(const FX_CHAR* module_name);

    IPDF_RenderModule* GetRenderModule() const
    {
        return m_pRenderModule.get();
    }

    IPDF_PageModule* GetPageModule() const
    {
        return m_pPageModule.get();
    }

    void LoadEmbeddedGB1CMaps();
    void LoadEmbeddedCNS1CMaps();
    void LoadEmbeddedJapan1CMaps();
    void LoadEmbeddedKorea1CMaps();

    ICodec_FaxModule* GetFaxModule();
    ICodec_JpegModule* GetJpegModule();
    ICodec_JpxModule* GetJpxModule();
    ICodec_Jbig2Module* GetJbig2Module();
    ICodec_IccModule* GetIccModule();
    ICodec_FlateModule* GetFlateModule();

    void RegisterSecurityHandler(
        const FX_CHAR* name,
        CPDF_SecurityHandler* (*CreateHandler)(void* param),
        void* param);

    CPDF_SecurityHandler* CreateSecurityHandler(const FX_CHAR* name);

    void SetPrivateData(void* module_id,
                        void* pData,
                        PD_CALLBACK_FREEDATA callback);

    void* GetPrivateData(void* module_id);

private:
    CPDF_ModuleMgr();
    ~CPDF_ModuleMgr();

    CCodec_ModuleMgr* m_pCodecModule;

    nonstd::unique_ptr<IPDF_RenderModule> m_pRenderModule;
    nonstd::unique_ptr<IPDF_PageModule> m_pPageModule;

    bool (*m_pDownloadCallback)(const FX_CHAR* module_name);

    CFX_MapByteStringToPtr m_SecurityHandlerMap;

    CFX_PrivateData m_privateData;
};

class IPDF_PageModule
{
public:
    virtual ~IPDF_PageModule() {}

    virtual CPDF_DocPageData* CreateDocData(CPDF_Document* pDoc) = 0;
    virtual void ReleaseDoc(CPDF_Document*) = 0;
    virtual void ClearDoc(CPDF_Document*) = 0;
    virtual CPDF_FontGlobals* GetFontGlobals() = 0;
    virtual void ClearStockFont(CPDF_Document* pDoc) = 0;
    virtual void NotifyCJKAvailable() = 0;
    virtual CPDF_ColorSpace* GetStockCS(int family) = 0;
};

class IPDF_RenderModule
{
public:
    virtual ~IPDF_RenderModule() {}

    virtual CPDF_DocRenderData* CreateDocData(CPDF_Document* pDoc) = 0;
    virtual void DestroyDocData(CPDF_DocRenderData*) = 0;
    virtual void ClearDocData(CPDF_DocRenderData*) = 0;
    virtual CPDF_DocRenderData* GetRenderData() = 0;
    virtual CPDF_PageRenderCache* CreatePageCache(CPDF_Page* pPage) = 0;
    virtual void DestroyPageCache(CPDF_PageRenderCache*)  = 0;
    virtual CPDF_RenderConfig* GetConfig() = 0;
};

#endif  // CORE_INCLUDE_FPDFAPI_FPDF_MODULE_H_
