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