1e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Copyright 2014 PDFium Authors. All rights reserved.
2e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Use of this source code is governed by a BSD-style license that can be
3e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// found in the LICENSE file.
4e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
5e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
7e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include "../../include/fxcodec/fx_codec.h"
8e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include "../../include/fpdfapi/fpdf_module.h"
9e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovstatic CPDF_ModuleMgr*	g_FPDFAPI_pDefaultMgr = NULL;
10e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPDF_ModuleMgr* CPDF_ModuleMgr::Get()
11e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
12e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return g_FPDFAPI_pDefaultMgr;
13e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
14e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CPDF_ModuleMgr::Create()
15e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
16e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    g_FPDFAPI_pDefaultMgr = new CPDF_ModuleMgr;
17e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    g_FPDFAPI_pDefaultMgr->Initialize();
18e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
19e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CPDF_ModuleMgr::Destroy()
20e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
21e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (g_FPDFAPI_pDefaultMgr) {
22e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        delete g_FPDFAPI_pDefaultMgr;
23e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
24e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    g_FPDFAPI_pDefaultMgr = NULL;
25e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
26e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPDF_ModuleMgr::CPDF_ModuleMgr()
27e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
28e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    m_pCodecModule = NULL;
29e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    m_pPageModule = NULL;
30e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    m_pRenderModule = NULL;
31e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    m_FileBufSize = 512;
32e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
33e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CPDF_ModuleMgr::Initialize()
34e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
35e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    InitModules();
36e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    m_FileBufSize = 512;
37e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
38e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CPDF_ModuleMgr::InitModules()
39e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
40e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    m_pCodecModule = NULL;
41e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    m_pPageModule = new CPDF_PageModuleDef;
42e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    m_pRenderModule = new CPDF_RenderModuleDef;
43e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
44e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPDF_ModuleMgr::~CPDF_ModuleMgr()
45e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
46e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (m_pPageModule) {
47e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        delete m_pPageModule;
48e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
49e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (m_pRenderModule) {
50e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        delete m_pRenderModule;
51e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
52e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
53e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CPDF_ModuleMgr::SetDownloadCallback(FX_BOOL (*callback)(FX_LPCSTR module_name))
54e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
55e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    m_pDownloadCallback = callback;
56e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
57e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_BOOL CPDF_ModuleMgr::DownloadModule(FX_LPCSTR module_name)
58e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
59e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (m_pDownloadCallback == NULL) {
60e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        return FALSE;
61e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
62e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return m_pDownloadCallback(module_name);
63e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
64e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CPDF_ModuleMgr::NotifyModuleAvailable(FX_LPCSTR module_name)
65e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
66e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (FXSYS_strcmp(module_name, ADDIN_NAME_CJK) == 0) {
67e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        m_pPageModule->NotifyCJKAvailable();
68e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    } else if (FXSYS_strcmp(module_name, ADDIN_NAME_DECODER) == 0) {
69e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        m_pRenderModule->NotifyDecoderAvailable();
70e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
71e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
72e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CPDF_ModuleMgr::RegisterSecurityHandler(FX_LPCSTR filter, CPDF_SecurityHandler * (*CreateHandler)(void* param), void* param)
73e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
74e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (CreateHandler == NULL) {
75e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        m_SecurityHandlerMap.RemoveKey(filter);
76e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    } else {
77e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        m_SecurityHandlerMap.SetAt(filter, (void*)CreateHandler);
78e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
79e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (param) {
80e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        m_SecurityHandlerMap.SetAt(FX_BSTRC("_param_") + filter, param);
81e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
82e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
83e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid CPDF_ModuleMgr::SetPrivateData(FX_LPVOID module_id, FX_LPVOID pData, PD_CALLBACK_FREEDATA callback)
84e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
85e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    m_privateData.SetPrivateData(module_id, pData, callback);
86e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
87e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_LPVOID CPDF_ModuleMgr::GetPrivateData(FX_LPVOID module_id)
88e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
89e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return m_privateData.GetPrivateData(module_id);
90e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
91e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovCPDF_SecurityHandler* CPDF_ModuleMgr::CreateSecurityHandler(FX_LPCSTR filter)
92e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
93e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    CPDF_SecurityHandler* (*CreateHandler)(void*) = NULL;
94e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (!m_SecurityHandlerMap.Lookup(filter, (void*&)CreateHandler)) {
95e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        return NULL;
96e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
97e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (CreateHandler == NULL) {
98e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        return NULL;
99e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
100e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    void* param = NULL;
101e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    m_SecurityHandlerMap.Lookup(FX_BSTRC("_param_") + filter, param);
102e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return CreateHandler(param);
103e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
104e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovICodec_FaxModule* CPDF_ModuleMgr::GetFaxModule()
105e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
106e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return m_pCodecModule ? m_pCodecModule->GetFaxModule() : NULL;
107e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
108e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovICodec_JpegModule* CPDF_ModuleMgr::GetJpegModule()
109e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
110e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return m_pCodecModule ? m_pCodecModule->GetJpegModule() : NULL;
111e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
112e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovICodec_JpxModule* CPDF_ModuleMgr::GetJpxModule()
113e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
114e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return m_pCodecModule ? m_pCodecModule->GetJpxModule() : NULL;
115e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
116e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovICodec_Jbig2Module* CPDF_ModuleMgr::GetJbig2Module()
117e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
118e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return m_pCodecModule ? m_pCodecModule->GetJbig2Module() : NULL;
119e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
120e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovICodec_IccModule* CPDF_ModuleMgr::GetIccModule()
121e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
122e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return m_pCodecModule ? m_pCodecModule->GetIccModule() : NULL;
123e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
124e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovICodec_FlateModule* CPDF_ModuleMgr::GetFlateModule()
125e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
126e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return m_pCodecModule ? m_pCodecModule->GetFlateModule() : NULL;
127e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
128