1 // Copyright 2014 PDFium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 6 7 #include <algorithm> 8 9 #include "xfa/src/foxitlib.h" 10 #include "xfa/src/fxfa/src/common/xfa_common.h" 11 #include "xfa_ffdochandler.h" 12 #include "xfa_fwladapter.h" 13 #include "xfa_ffdoc.h" 14 #include "xfa_ffapp.h" 15 #include "xfa_fwltheme.h" 16 #include "xfa_fontmgr.h" 17 #include "xfa_ffwidgethandler.h" 18 19 CXFA_FileRead::CXFA_FileRead(const CFX_ArrayTemplate<CPDF_Stream*>& streams) { 20 int32_t iCount = streams.GetSize(); 21 for (int32_t i = 0; i < iCount; i++) { 22 CPDF_StreamAcc& acc = m_Data.Add(); 23 acc.LoadAllData(streams[i]); 24 } 25 } 26 FX_FILESIZE CXFA_FileRead::GetSize() { 27 FX_DWORD dwSize = 0; 28 int32_t iCount = m_Data.GetSize(); 29 for (int32_t i = 0; i < iCount; i++) { 30 CPDF_StreamAcc& acc = m_Data[i]; 31 dwSize += acc.GetSize(); 32 } 33 return dwSize; 34 } 35 FX_BOOL CXFA_FileRead::ReadBlock(void* buffer, 36 FX_FILESIZE offset, 37 size_t size) { 38 int32_t iCount = m_Data.GetSize(); 39 int32_t index = 0; 40 while (index < iCount) { 41 CPDF_StreamAcc& acc = m_Data[index]; 42 FX_FILESIZE dwSize = acc.GetSize(); 43 if (offset < dwSize) { 44 break; 45 } 46 offset -= dwSize; 47 index++; 48 } 49 while (index < iCount) { 50 CPDF_StreamAcc& acc = m_Data[index]; 51 FX_DWORD dwSize = acc.GetSize(); 52 size_t dwRead = std::min(size, static_cast<size_t>(dwSize - offset)); 53 FXSYS_memcpy(buffer, acc.GetData() + offset, dwRead); 54 size -= dwRead; 55 if (size == 0) { 56 return TRUE; 57 } 58 buffer = (uint8_t*)buffer + dwRead; 59 offset = 0; 60 index++; 61 } 62 return FALSE; 63 } 64 // static 65 IXFA_App* IXFA_App::Create(IXFA_AppProvider* pProvider) { 66 return new CXFA_FFApp(pProvider); 67 } 68 // virtual 69 IXFA_App::~IXFA_App() {} 70 CXFA_FFApp::CXFA_FFApp(IXFA_AppProvider* pProvider) 71 : m_pDocHandler(nullptr), 72 m_pFWLTheme(nullptr), 73 m_pProvider(pProvider), 74 m_pFontMgr(nullptr), 75 #if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_ 76 m_pFontSource(nullptr), 77 #endif 78 m_pAdapterWidgetMgr(nullptr), 79 m_pWidgetMgrDelegate(nullptr), 80 m_pFDEFontMgr(nullptr), 81 m_pMenuHandler(nullptr), 82 m_pAdapterThreadMgr(nullptr) { 83 m_pFWLApp = IFWL_App::Create(this); 84 FWL_SetApp(m_pFWLApp); 85 m_pFWLApp->Initialize(); 86 IXFA_TimeZoneProvider::Create(); 87 } 88 CXFA_FFApp::~CXFA_FFApp() { 89 if (m_pDocHandler) { 90 delete m_pDocHandler; 91 } 92 if (m_pFWLApp) { 93 m_pFWLApp->Finalize(); 94 m_pFWLApp->Release(); 95 delete m_pFWLApp; 96 } 97 if (m_pFWLTheme) { 98 m_pFWLTheme->Release(); 99 } 100 if (m_pAdapterWidgetMgr) { 101 delete m_pAdapterWidgetMgr; 102 } 103 if (m_pAdapterThreadMgr) { 104 delete m_pAdapterThreadMgr; 105 m_pAdapterThreadMgr = NULL; 106 } 107 if (m_pMenuHandler) { 108 delete m_pMenuHandler; 109 m_pMenuHandler = NULL; 110 } 111 IXFA_TimeZoneProvider::Destroy(); 112 if (m_pFontMgr != NULL) { 113 delete m_pFontMgr; 114 m_pFontMgr = NULL; 115 } 116 #if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_ 117 if (m_pFontSource != NULL) { 118 m_pFontSource->Release(); 119 } 120 #endif 121 if (m_pFDEFontMgr) { 122 m_pFDEFontMgr->Release(); 123 } 124 } 125 IXFA_MenuHandler* CXFA_FFApp::GetMenuHandler() { 126 if (!m_pMenuHandler) { 127 m_pMenuHandler = new CXFA_FFMenuHandler; 128 } 129 return m_pMenuHandler; 130 } 131 IXFA_DocHandler* CXFA_FFApp::GetDocHandler() { 132 if (!m_pDocHandler) { 133 m_pDocHandler = new CXFA_FFDocHandler; 134 } 135 return m_pDocHandler; 136 } 137 IXFA_Doc* CXFA_FFApp::CreateDoc(IXFA_DocProvider* pProvider, 138 IFX_FileRead* pStream, 139 FX_BOOL bTakeOverFile) { 140 CXFA_FFDoc* pDoc = new CXFA_FFDoc(this, pProvider); 141 FX_BOOL bSuccess = pDoc->OpenDoc(pStream, bTakeOverFile); 142 if (!bSuccess) { 143 delete pDoc; 144 pDoc = NULL; 145 } 146 return pDoc; 147 } 148 IXFA_Doc* CXFA_FFApp::CreateDoc(IXFA_DocProvider* pProvider, 149 CPDF_Document* pPDFDoc) { 150 if (pPDFDoc == NULL) { 151 return NULL; 152 } 153 CXFA_FFDoc* pDoc = new CXFA_FFDoc(this, pProvider); 154 FX_BOOL bSuccess = pDoc->OpenDoc(pPDFDoc); 155 if (!bSuccess) { 156 delete pDoc; 157 pDoc = NULL; 158 } 159 return pDoc; 160 } 161 162 void CXFA_FFApp::SetDefaultFontMgr(IXFA_FontMgr* pFontMgr) { 163 if (!m_pFontMgr) { 164 m_pFontMgr = new CXFA_FontMgr(); 165 } 166 m_pFontMgr->SetDefFontMgr(pFontMgr); 167 } 168 CXFA_FontMgr* CXFA_FFApp::GetXFAFontMgr() { 169 return m_pFontMgr; 170 } 171 IFX_FontMgr* CXFA_FFApp::GetFDEFontMgr() { 172 if (!m_pFDEFontMgr) { 173 #if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ 174 m_pFDEFontMgr = IFX_FontMgr::Create(FX_GetDefFontEnumerator()); 175 #else 176 m_pFontSource = FX_CreateDefaultFontSourceEnum(); 177 m_pFDEFontMgr = IFX_FontMgr::Create(m_pFontSource); 178 #endif 179 } 180 return m_pFDEFontMgr; 181 } 182 CXFA_FWLTheme* CXFA_FFApp::GetFWLTheme() { 183 if (!m_pFWLTheme) { 184 m_pFWLTheme = new CXFA_FWLTheme(this); 185 } 186 return m_pFWLTheme; 187 } 188 IFWL_AdapterWidgetMgr* CXFA_FFApp::GetWidgetMgr( 189 IFWL_WidgetMgrDelegate* pDelegate) { 190 if (!m_pAdapterWidgetMgr) { 191 m_pAdapterWidgetMgr = new CXFA_FWLAdapterWidgetMgr; 192 pDelegate->OnSetCapability(FWL_WGTMGR_DisableThread | 193 FWL_WGTMGR_DisableForm); 194 m_pWidgetMgrDelegate = pDelegate; 195 } 196 return m_pAdapterWidgetMgr; 197 } 198 IFWL_AdapterThreadMgr* CXFA_FFApp::GetThreadMgr() { 199 if (!m_pAdapterThreadMgr) { 200 m_pAdapterThreadMgr = new CFWL_SDAdapterThreadMgr; 201 } 202 return m_pAdapterThreadMgr; 203 } 204 IFWL_AdapterTimerMgr* CXFA_FFApp::GetTimerMgr() { 205 return m_pProvider->GetTimerMgr(); 206 } 207 IFWL_AdapterCursorMgr* CXFA_FFApp::GetCursorMgr() { 208 return NULL; 209 } 210 IFWL_AdapterMonitorMgr* CXFA_FFApp::GetMonitorMgr() { 211 return NULL; 212 } 213 IFWL_AdapterClipboardMgr* CXFA_FFApp::GetClipboardMgr() { 214 return NULL; 215 } 216