Merge to XFA: Use stdint.h types throughout PDFium.
[pdfium.git] / xfa / src / fxfa / src / app / xfa_ffapp.cpp
1 // Copyright 2014 PDFium Authors. All rights reserved.\r
2 // Use of this source code is governed by a BSD-style license that can be\r
3 // found in the LICENSE file.\r
4 \r
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\r
6 \r
7 #include "../../../foxitlib.h"\r
8 #include "../common/xfa_common.h"\r
9 #include "xfa_ffdochandler.h"\r
10 #include "xfa_fwladapter.h"\r
11 #include "xfa_ffdoc.h"\r
12 #include "xfa_ffapp.h"\r
13 #include "xfa_fwltheme.h"\r
14 #include "xfa_fontmgr.h"\r
15 #include "xfa_ffwidgethandler.h"\r
16 CXFA_FileRead::CXFA_FileRead(const CFX_ArrayTemplate<CPDF_Stream*> &streams)\r
17     : m_dwSize(0)\r
18 {\r
19     m_Streams.Copy(streams);\r
20 }\r
21 CXFA_FileRead::~CXFA_FileRead()\r
22 {\r
23     m_Streams.RemoveAll();\r
24     m_StreamSize.RemoveAll();\r
25 }\r
26 FX_FILESIZE CXFA_FileRead::GetSize()\r
27 {\r
28     if (m_StreamSize.GetSize() > 0) {\r
29         return m_dwSize;\r
30     }\r
31     int32_t iCount = m_Streams.GetSize();\r
32     FX_DWORD iBufferSize = 4096;\r
33     FX_LPBYTE pBuf = FX_Alloc(uint8_t, iBufferSize);\r
34     for (int32_t i = 0; i < iCount; i++) {\r
35         CPDF_StreamFilter* pStreamFilter = m_Streams[i]->GetStreamFilter(FALSE);\r
36         FX_DWORD dwCurSize = 0;\r
37         while (TRUE) {\r
38             FX_DWORD dwRead = pStreamFilter->ReadBlock(pBuf, iBufferSize);\r
39             dwCurSize += dwRead;\r
40             if (dwRead < iBufferSize) {\r
41                 break;\r
42             }\r
43         }\r
44         m_dwSize += dwCurSize;\r
45         m_StreamSize.Add(dwCurSize);\r
46         delete pStreamFilter;\r
47     }\r
48     FX_Free(pBuf);\r
49     return m_dwSize;\r
50 }\r
51 FX_BOOL CXFA_FileRead::ReadBlock(void* buffer, FX_FILESIZE offset, size_t size)\r
52 {\r
53     FX_FILESIZE dwLen = 0;\r
54     int32_t iCount = m_Streams.GetSize();\r
55     int32_t i = 0;\r
56     for (; i < iCount; i++) {\r
57         dwLen += m_StreamSize[i];\r
58         if (dwLen > offset) {\r
59             dwLen -= m_StreamSize[i];\r
60             break;\r
61         }\r
62     }\r
63     if (i >= iCount) {\r
64         return FALSE;\r
65     }\r
66     CPDF_StreamFilter* pStreamFilter = m_Streams[i]->GetStreamFilter(FALSE);\r
67     if ((offset -= dwLen) > 0) {\r
68         FX_LPBYTE pBuf = FX_Alloc(uint8_t, offset);\r
69         FX_DWORD dwRead = pStreamFilter->ReadBlock(pBuf, offset);\r
70         FX_Free(pBuf);\r
71     }\r
72     FX_DWORD dwHadRead = pStreamFilter->ReadBlock((FX_LPBYTE)buffer, size);\r
73     delete pStreamFilter;\r
74     size -= dwHadRead;\r
75     if (size <= 0) {\r
76         return TRUE;\r
77     }\r
78     FX_DWORD dwReadSize = dwHadRead;\r
79     for (int32_t iStart = i + 1; iStart < iCount; iStart++) {\r
80         CPDF_StreamFilter* pStreamFilter = m_Streams[iStart]->GetStreamFilter(FALSE);\r
81         FX_DWORD dwHadRead = pStreamFilter->ReadBlock(((FX_LPBYTE)buffer) + dwReadSize, size);\r
82         delete pStreamFilter;\r
83         size -= dwHadRead;\r
84         if (size <= 0) {\r
85             return TRUE;\r
86         }\r
87         dwReadSize += dwHadRead;\r
88     }\r
89     return FALSE;\r
90 }\r
91 CXFA_FileRead2::CXFA_FileRead2(const CFX_ArrayTemplate<CPDF_Stream*> &streams)\r
92 {\r
93     int32_t iCount = streams.GetSize();\r
94     for (int32_t i = 0; i < iCount; i++) {\r
95         CPDF_StreamAcc &acc = m_Data.Add();\r
96         acc.LoadAllData(streams[i]);\r
97     }\r
98 }\r
99 FX_FILESIZE CXFA_FileRead2::GetSize()\r
100 {\r
101     FX_DWORD dwSize = 0;\r
102     int32_t iCount = m_Data.GetSize();\r
103     for (int32_t i = 0; i < iCount; i++) {\r
104         CPDF_StreamAcc &acc = m_Data[i];\r
105         dwSize += acc.GetSize();\r
106     }\r
107     return dwSize;\r
108 }\r
109 FX_BOOL CXFA_FileRead2::ReadBlock(void* buffer, FX_FILESIZE offset, size_t size)\r
110 {\r
111     int32_t iCount = m_Data.GetSize();\r
112     int32_t index = 0;\r
113     while (index < iCount) {\r
114         CPDF_StreamAcc &acc = m_Data[index];\r
115         FX_FILESIZE dwSize = acc.GetSize();\r
116         if (offset < dwSize) {\r
117             break;\r
118         }\r
119         offset -= dwSize;\r
120         index++;\r
121     }\r
122     while (index < iCount) {\r
123         CPDF_StreamAcc &acc = m_Data[index];\r
124         FX_DWORD dwSize = acc.GetSize();\r
125         FX_DWORD dwRead = FX_MIN(size, dwSize - offset);\r
126         FXSYS_memcpy(buffer, acc.GetData() + offset, dwRead);\r
127         size -= dwRead;\r
128         if (size == 0) {\r
129             return TRUE;\r
130         }\r
131         buffer = (FX_LPBYTE)buffer + dwRead;\r
132         offset = 0;\r
133         index++;\r
134     }\r
135     return FALSE;\r
136 }\r
137 // static\r
138 IXFA_App* IXFA_App::Create(IXFA_AppProvider* pProvider)\r
139 {\r
140     return new CXFA_FFApp(pProvider);\r
141 }\r
142 // virtual\r
143 IXFA_App::~IXFA_App()\r
144 {\r
145 }\r
146 CXFA_FFApp::CXFA_FFApp(IXFA_AppProvider* pProvider)\r
147     : m_pDocHandler(NULL)\r
148     , m_pFWLTheme(NULL)\r
149     , m_pProvider(pProvider)\r
150     , m_pFontMgr(NULL)\r
151     , m_pAdapterWidgetMgr(NULL)\r
152     , m_pFDEFontMgr(NULL)\r
153     , m_pMenuHandler(NULL)\r
154     , m_pAdapterThreadMgr(NULL)\r
155 #if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_\r
156     , m_pFontSource(NULL)\r
157 #endif\r
158 {\r
159     m_pFWLApp = IFWL_App::Create(this);\r
160     FWL_SetApp(m_pFWLApp);\r
161     m_pFWLApp->Initialize();\r
162     IXFA_TimeZoneProvider::Create();\r
163 }\r
164 CXFA_FFApp::~CXFA_FFApp()\r
165 {\r
166     if (m_pDocHandler) {\r
167         delete m_pDocHandler;\r
168     }\r
169     if (m_pFWLApp) {\r
170         m_pFWLApp->Finalize();\r
171         m_pFWLApp->Release();\r
172     }\r
173     if (m_pFWLTheme) {\r
174         m_pFWLTheme->Release();\r
175     }\r
176     if (m_pAdapterWidgetMgr) {\r
177         delete m_pAdapterWidgetMgr;\r
178     }\r
179     if (m_pAdapterThreadMgr) {\r
180         delete m_pAdapterThreadMgr;\r
181         m_pAdapterThreadMgr = NULL;\r
182     }\r
183     if (m_pMenuHandler) {\r
184         delete m_pMenuHandler;\r
185         m_pMenuHandler = NULL;\r
186     }\r
187     IXFA_TimeZoneProvider::Destroy();\r
188     if (m_pFontMgr != NULL) {\r
189         delete m_pFontMgr;\r
190         m_pFontMgr = NULL;\r
191     }\r
192 #if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_\r
193     if(m_pFontSource != NULL) {\r
194         m_pFontSource->Release();\r
195     }\r
196 #endif\r
197     if (m_pFDEFontMgr) {\r
198         m_pFDEFontMgr->Release();\r
199     }\r
200 }\r
201 IXFA_MenuHandler* CXFA_FFApp::GetMenuHandler()\r
202 {\r
203     if (!m_pMenuHandler) {\r
204         m_pMenuHandler = FX_NEW CXFA_FFMenuHandler;\r
205     }\r
206     return m_pMenuHandler;\r
207 }\r
208 IXFA_DocHandler* CXFA_FFApp::GetDocHandler()\r
209 {\r
210     if (!m_pDocHandler) {\r
211         m_pDocHandler = FX_NEW CXFA_FFDocHandler;\r
212     }\r
213     return m_pDocHandler;\r
214 }\r
215 IXFA_Doc* CXFA_FFApp::CreateDoc(IXFA_DocProvider* pProvider, IFX_FileRead* pStream, FX_BOOL bTakeOverFile)\r
216 {\r
217     CXFA_FFDoc* pDoc = FX_NEW CXFA_FFDoc(this, pProvider);\r
218     if (!pDoc) {\r
219         return NULL;\r
220     }\r
221     FX_BOOL bSuccess = pDoc->OpenDoc(pStream, bTakeOverFile);\r
222     if (!bSuccess) {\r
223         delete pDoc;\r
224         pDoc = NULL;\r
225     }\r
226     return pDoc;\r
227 }\r
228 IXFA_Doc* CXFA_FFApp::CreateDoc(IXFA_DocProvider* pProvider, CPDF_Document *pPDFDoc)\r
229 {\r
230     if (pPDFDoc == NULL) {\r
231         return NULL;\r
232     }\r
233     CXFA_FFDoc* pDoc = FX_NEW CXFA_FFDoc(this, pProvider);\r
234     if (!pDoc) {\r
235         return NULL;\r
236     }\r
237     FX_BOOL bSuccess = pDoc->OpenDoc(pPDFDoc);\r
238     if (!bSuccess) {\r
239         delete pDoc;\r
240         pDoc = NULL;\r
241     }\r
242     return pDoc;\r
243 }\r
244 \r
245 void CXFA_FFApp::SetDefaultFontMgr(IXFA_FontMgr* pFontMgr)\r
246 {\r
247     if (!m_pFontMgr) {\r
248         m_pFontMgr = FX_NEW CXFA_FontMgr();\r
249     }\r
250     m_pFontMgr->SetDefFontMgr(pFontMgr);\r
251 }\r
252 CXFA_FontMgr* CXFA_FFApp::GetXFAFontMgr()\r
253 {\r
254     return m_pFontMgr;\r
255 }\r
256 IFX_FontMgr* CXFA_FFApp::GetFDEFontMgr()\r
257 {\r
258     if (!m_pFDEFontMgr) {\r
259 #if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_\r
260         m_pFDEFontMgr = IFX_FontMgr::Create(FX_GetDefFontEnumerator());\r
261 #else\r
262         m_pFontSource = FX_CreateDefaultFontSourceEnum();\r
263         m_pFDEFontMgr = IFX_FontMgr::Create(m_pFontSource);\r
264 #endif\r
265     }\r
266     return m_pFDEFontMgr;\r
267 }\r
268 CXFA_FWLTheme* CXFA_FFApp::GetFWLTheme()\r
269 {\r
270     if (!m_pFWLTheme) {\r
271         m_pFWLTheme = FX_NEW CXFA_FWLTheme(this);\r
272     }\r
273     return m_pFWLTheme;\r
274 }\r
275 IFWL_AdapterWidgetMgr* CXFA_FFApp::GetWidgetMgr(IFWL_WidgetMgrDelegate *pDelegate)\r
276 {\r
277     if (!m_pAdapterWidgetMgr) {\r
278         m_pAdapterWidgetMgr = FX_NEW CXFA_FWLAdapterWidgetMgr;\r
279         pDelegate->OnSetCapability(FWL_WGTMGR_DisableThread | FWL_WGTMGR_DisableForm);\r
280         m_pWidgetMgrDelegate = pDelegate;\r
281     }\r
282     return m_pAdapterWidgetMgr;\r
283 }\r
284 IFWL_AdapterThreadMgr* CXFA_FFApp::GetThreadMgr()\r
285 {\r
286     if (!m_pAdapterThreadMgr) {\r
287         m_pAdapterThreadMgr = FX_NEW CFWL_SDAdapterThreadMgr;\r
288     }\r
289     return m_pAdapterThreadMgr;\r
290 }\r
291 IFWL_AdapterTimerMgr* CXFA_FFApp::GetTimerMgr()\r
292 {\r
293     return m_pProvider->GetTimerMgr();\r
294 }\r
295 IFWL_AdapterCursorMgr*  CXFA_FFApp::GetCursorMgr()\r
296 {\r
297     return NULL;\r
298 }\r
299 IFWL_AdapterMonitorMgr* CXFA_FFApp::GetMonitorMgr()\r
300 {\r
301     return NULL;\r
302 }\r
303 IFWL_AdapterClipboardMgr* CXFA_FFApp::GetClipboardMgr()\r
304 {\r
305     return NULL;\r
306 }\r