Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(315)

Side by Side Diff: fpdfsdk/fpdfxfa/cpdfxfa_document.cpp

Issue 2424993002: Merge CPDFXFA_App into CPDFXFA_Document. (Closed)
Patch Set: Delete files Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « fpdfsdk/fpdfxfa/cpdfxfa_document.h ('k') | fpdfsdk/javascript/cjs_runtime.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 PDFium Authors. All rights reserved. 1 // Copyright 2014 PDFium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6 6
7 #include "fpdfsdk/fpdfxfa/cpdfxfa_document.h" 7 #include "fpdfsdk/fpdfxfa/cpdfxfa_document.h"
8 8
9 #include "core/fpdfapi/parser/cpdf_document.h" 9 #include "core/fpdfapi/parser/cpdf_document.h"
10 #include "fpdfsdk/cpdfsdk_formfillenvironment.h" 10 #include "fpdfsdk/cpdfsdk_formfillenvironment.h"
11 #include "fpdfsdk/cpdfsdk_interform.h" 11 #include "fpdfsdk/cpdfsdk_interform.h"
12 #include "fpdfsdk/cpdfsdk_pageview.h" 12 #include "fpdfsdk/cpdfsdk_pageview.h"
13 #include "fpdfsdk/fpdfxfa/cpdfxfa_app.h"
14 #include "fpdfsdk/fpdfxfa/cpdfxfa_page.h" 13 #include "fpdfsdk/fpdfxfa/cpdfxfa_page.h"
15 #include "fpdfsdk/fpdfxfa/cxfa_fwladaptertimermgr.h" 14 #include "fpdfsdk/fpdfxfa/cxfa_fwladaptertimermgr.h"
16 #include "fpdfsdk/fsdk_define.h" 15 #include "fpdfsdk/fsdk_define.h"
16 #include "fpdfsdk/javascript/cjs_runtime.h"
17 #include "fpdfsdk/javascript/ijs_runtime.h" 17 #include "fpdfsdk/javascript/ijs_runtime.h"
18 #include "public/fpdf_formfill.h" 18 #include "public/fpdf_formfill.h"
19 #include "third_party/base/ptr_util.h" 19 #include "third_party/base/ptr_util.h"
20 #include "xfa/fxfa/cxfa_eventparam.h" 20 #include "xfa/fxfa/cxfa_eventparam.h"
21 #include "xfa/fxfa/xfa_ffapp.h" 21 #include "xfa/fxfa/xfa_ffapp.h"
22 #include "xfa/fxfa/xfa_ffdoc.h" 22 #include "xfa/fxfa/xfa_ffdoc.h"
23 #include "xfa/fxfa/xfa_ffdocview.h" 23 #include "xfa/fxfa/xfa_ffdocview.h"
24 #include "xfa/fxfa/xfa_ffpageview.h" 24 #include "xfa/fxfa/xfa_ffpageview.h"
25 #include "xfa/fxfa/xfa_ffwidgethandler.h" 25 #include "xfa/fxfa/xfa_ffwidgethandler.h"
26 #include "xfa/fxfa/xfa_fontmgr.h"
26 27
27 #ifndef _WIN32 28 #ifndef _WIN32
28 extern void SetLastError(int err); 29 extern void SetLastError(int err);
29 extern int GetLastError(); 30 extern int GetLastError();
30 #endif 31 #endif
31 32
32 CPDFXFA_Document::CPDFXFA_Document(std::unique_ptr<CPDF_Document> pPDFDoc) 33 CPDFXFA_Document::CPDFXFA_Document(std::unique_ptr<CPDF_Document> pPDFDoc)
33 : m_iDocType(DOCTYPE_PDF), 34 : m_iDocType(DOCTYPE_PDF),
34 m_pPDFDoc(std::move(pPDFDoc)), 35 m_pPDFDoc(std::move(pPDFDoc)),
35 m_pFormFillEnv(nullptr), 36 m_pFormFillEnv(nullptr),
36 m_pXFADocView(nullptr), 37 m_pXFADocView(nullptr),
37 m_nLoadStatus(FXFA_LOADSTATUS_PRELOAD), 38 m_nLoadStatus(FXFA_LOADSTATUS_PRELOAD),
38 m_nPageCount(0), 39 m_nPageCount(0),
39 m_DocEnv(this) {} 40 m_DocEnv(this) {
41 m_pXFAApp = pdfium::MakeUnique<CXFA_FFApp>(this);
42 m_pXFAApp->SetDefaultFontMgr(pdfium::MakeUnique<CXFA_DefFontMgr>());
43 }
40 44
41 CPDFXFA_Document::~CPDFXFA_Document() { 45 CPDFXFA_Document::~CPDFXFA_Document() {
42 m_nLoadStatus = FXFA_LOADSTATUS_CLOSING; 46 m_nLoadStatus = FXFA_LOADSTATUS_CLOSING;
43 47
44 // Must happen before we remove the form fill environment. 48 // Must happen before we remove the form fill environment.
45 if (m_pXFADoc) { 49 if (m_pXFADoc)
46 if (CXFA_FFApp* pApp = GetApp()->GetXFAApp()) 50 CloseXFADoc();
Tom Sepez 2016/11/02 19:19:34 Maybe CloseXFADoc() should make this check itself
dsinclair 2016/11/02 19:22:34 Done.
47 CloseXFADoc(pApp->GetDocHandler());
48 }
49 51
50 if (m_pFormFillEnv) { 52 if (m_pFormFillEnv) {
51 m_pFormFillEnv->ClearAllFocusedAnnots(); 53 m_pFormFillEnv->ClearAllFocusedAnnots();
52 // Once we're deleted the FormFillEnvironment will point at a bad underlying 54 // Once we're deleted the FormFillEnvironment will point at a bad underlying
53 // doc so we need to reset it ... 55 // doc so we need to reset it ...
54 m_pFormFillEnv->ResetXFADocument(); 56 m_pFormFillEnv->ResetXFADocument();
55 m_pFormFillEnv = nullptr; 57 m_pFormFillEnv = nullptr;
56 } 58 }
57 59
58 m_nLoadStatus = FXFA_LOADSTATUS_CLOSED; 60 m_nLoadStatus = FXFA_LOADSTATUS_CLOSED;
59 } 61 }
60 62
61 void CPDFXFA_Document::CloseXFADoc(CXFA_FFDocHandler* pDoc) { 63 void CPDFXFA_Document::CloseXFADoc() {
62 if (!pDoc)
63 return;
64 m_pXFADoc->CloseDoc(); 64 m_pXFADoc->CloseDoc();
65 m_pXFADoc.reset(); 65 m_pXFADoc.reset();
66 m_pXFADocView = nullptr; 66 m_pXFADocView = nullptr;
67 } 67 }
68 68
69 CPDFXFA_App* CPDFXFA_Document::GetApp() {
70 if (!m_pApp)
71 m_pApp = pdfium::MakeUnique<CPDFXFA_App>();
72 return m_pApp.get();
73 }
74
75 void CPDFXFA_Document::SetFormFillEnv( 69 void CPDFXFA_Document::SetFormFillEnv(
76 CPDFSDK_FormFillEnvironment* pFormFillEnv) { 70 CPDFSDK_FormFillEnvironment* pFormFillEnv) {
77 // The layout data can have pointers back into the script context. That 71 // The layout data can have pointers back into the script context. That
78 // context will be different if the form fill environment closes, so, force 72 // context will be different if the form fill environment closes, so, force
79 // the layout data to clear. 73 // the layout data to clear.
80 if (m_pXFADoc && m_pXFADoc->GetXFADoc()) 74 if (m_pXFADoc && m_pXFADoc->GetXFADoc())
81 m_pXFADoc->GetXFADoc()->ClearLayoutData(); 75 m_pXFADoc->GetXFADoc()->ClearLayoutData();
82 76
83 GetApp()->SetFormFillEnv(pFormFillEnv);
84 m_pFormFillEnv = pFormFillEnv; 77 m_pFormFillEnv = pFormFillEnv;
85 } 78 }
86 79
87 FX_BOOL CPDFXFA_Document::LoadXFADoc() { 80 FX_BOOL CPDFXFA_Document::LoadXFADoc() {
88 m_nLoadStatus = FXFA_LOADSTATUS_LOADING; 81 m_nLoadStatus = FXFA_LOADSTATUS_LOADING;
89 82
90 if (!m_pPDFDoc) 83 if (!m_pPDFDoc)
91 return FALSE; 84 return FALSE;
92 85
93 m_XFAPageList.RemoveAll(); 86 m_XFAPageList.RemoveAll();
94 87
95 CXFA_FFApp* pApp = GetApp()->GetXFAApp(); 88 CXFA_FFApp* pApp = GetXFAApp();
96 if (!pApp) 89 if (!pApp)
97 return FALSE; 90 return FALSE;
98 91
99 m_pXFADoc.reset(pApp->CreateDoc(&m_DocEnv, m_pPDFDoc.get())); 92 m_pXFADoc.reset(pApp->CreateDoc(&m_DocEnv, m_pPDFDoc.get()));
100 if (!m_pXFADoc) { 93 if (!m_pXFADoc) {
101 SetLastError(FPDF_ERR_XFALOAD); 94 SetLastError(FPDF_ERR_XFALOAD);
102 return FALSE; 95 return FALSE;
103 } 96 }
104 97
105 CXFA_FFDocHandler* pDocHandler = pApp->GetDocHandler(); 98 CXFA_FFDocHandler* pDocHandler = pApp->GetDocHandler();
106 if (!pDocHandler) { 99 if (!pDocHandler) {
107 SetLastError(FPDF_ERR_XFALOAD); 100 SetLastError(FPDF_ERR_XFALOAD);
108 return FALSE; 101 return FALSE;
109 } 102 }
110 103
111 m_pXFADoc->StartLoad(); 104 m_pXFADoc->StartLoad();
112 int iStatus = m_pXFADoc->DoLoad(nullptr); 105 int iStatus = m_pXFADoc->DoLoad(nullptr);
113 if (iStatus != XFA_PARSESTATUS_Done) { 106 if (iStatus != XFA_PARSESTATUS_Done) {
114 CloseXFADoc(pDocHandler); 107 CloseXFADoc();
115 SetLastError(FPDF_ERR_XFALOAD); 108 SetLastError(FPDF_ERR_XFALOAD);
116 return FALSE; 109 return FALSE;
117 } 110 }
118 m_pXFADoc->StopLoad(); 111 m_pXFADoc->StopLoad();
119 m_pXFADoc->GetXFADoc()->InitScriptContext(GetApp()->GetJSERuntime()); 112 m_pXFADoc->GetXFADoc()->InitScriptContext(GetJSERuntime());
120 113
121 if (m_pXFADoc->GetDocType() == XFA_DOCTYPE_Dynamic) 114 if (m_pXFADoc->GetDocType() == XFA_DOCTYPE_Dynamic)
122 m_iDocType = DOCTYPE_DYNAMIC_XFA; 115 m_iDocType = DOCTYPE_DYNAMIC_XFA;
123 else 116 else
124 m_iDocType = DOCTYPE_STATIC_XFA; 117 m_iDocType = DOCTYPE_STATIC_XFA;
125 118
126 m_pXFADocView = m_pXFADoc->CreateDocView(XFA_DOCVIEW_View); 119 m_pXFADocView = m_pXFADoc->CreateDocView(XFA_DOCVIEW_View);
127 if (m_pXFADocView->StartLayout() < 0) { 120 if (m_pXFADocView->StartLayout() < 0) {
128 CloseXFADoc(pDocHandler); 121 CloseXFADoc();
129 SetLastError(FPDF_ERR_XFALAYOUT); 122 SetLastError(FPDF_ERR_XFALAYOUT);
130 return FALSE; 123 return FALSE;
131 } 124 }
132 125
133 m_pXFADocView->DoLayout(nullptr); 126 m_pXFADocView->DoLayout(nullptr);
134 m_pXFADocView->StopLayout(); 127 m_pXFADocView->StopLayout();
135 m_nLoadStatus = FXFA_LOADSTATUS_LOADED; 128 m_nLoadStatus = FXFA_LOADSTATUS_LOADED;
136 129
137 return TRUE; 130 return TRUE;
138 } 131 }
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
217 } 210 }
218 211
219 void CPDFXFA_Document::RemovePage(CPDFXFA_Page* page) { 212 void CPDFXFA_Document::RemovePage(CPDFXFA_Page* page) {
220 m_XFAPageList.SetAt(page->GetPageIndex(), nullptr); 213 m_XFAPageList.SetAt(page->GetPageIndex(), nullptr);
221 } 214 }
222 215
223 void CPDFXFA_Document::ClearChangeMark() { 216 void CPDFXFA_Document::ClearChangeMark() {
224 if (m_pFormFillEnv) 217 if (m_pFormFillEnv)
225 m_pFormFillEnv->ClearChangeMark(); 218 m_pFormFillEnv->ClearChangeMark();
226 } 219 }
220
221 v8::Isolate* CPDFXFA_Document::GetJSERuntime() const {
222 if (!m_pFormFillEnv)
223 return nullptr;
224
225 // XFA requires V8, if we have V8 then we have a CJS_Runtime and not the stub.
226 CJS_Runtime* runtime =
227 static_cast<CJS_Runtime*>(m_pFormFillEnv->GetJSRuntime());
228 return runtime->GetIsolate();
229 }
230
231 void CPDFXFA_Document::GetAppName(CFX_WideString& wsName) {
232 if (m_pFormFillEnv)
233 wsName = m_pFormFillEnv->FFI_GetAppName();
234 }
235
236 void CPDFXFA_Document::GetLanguage(CFX_WideString& wsLanguage) {
237 if (m_pFormFillEnv)
238 wsLanguage = m_pFormFillEnv->GetLanguage();
239 }
240
241 void CPDFXFA_Document::GetPlatform(CFX_WideString& wsPlatform) {
242 if (m_pFormFillEnv)
243 wsPlatform = m_pFormFillEnv->GetPlatform();
244 }
245
246 void CPDFXFA_Document::Beep(uint32_t dwType) {
247 if (m_pFormFillEnv)
248 m_pFormFillEnv->JS_appBeep(dwType);
249 }
250
251 int32_t CPDFXFA_Document::MsgBox(const CFX_WideString& wsMessage,
252 const CFX_WideString& wsTitle,
253 uint32_t dwIconType,
254 uint32_t dwButtonType) {
255 if (!m_pFormFillEnv)
256 return -1;
257
258 uint32_t iconType = 0;
259 int iButtonType = 0;
260 switch (dwIconType) {
261 case XFA_MBICON_Error:
262 iconType |= 0;
263 break;
264 case XFA_MBICON_Warning:
265 iconType |= 1;
266 break;
267 case XFA_MBICON_Question:
268 iconType |= 2;
269 break;
270 case XFA_MBICON_Status:
271 iconType |= 3;
272 break;
273 }
274 switch (dwButtonType) {
275 case XFA_MB_OK:
276 iButtonType |= 0;
277 break;
278 case XFA_MB_OKCancel:
279 iButtonType |= 1;
280 break;
281 case XFA_MB_YesNo:
282 iButtonType |= 2;
283 break;
284 case XFA_MB_YesNoCancel:
285 iButtonType |= 3;
286 break;
287 }
288 int32_t iRet = m_pFormFillEnv->JS_appAlert(wsMessage.c_str(), wsTitle.c_str(),
289 iButtonType, iconType);
290 switch (iRet) {
291 case 1:
292 return XFA_IDOK;
293 case 2:
294 return XFA_IDCancel;
295 case 3:
296 return XFA_IDNo;
297 case 4:
298 return XFA_IDYes;
299 }
300 return XFA_IDYes;
301 }
302
303 CFX_WideString CPDFXFA_Document::Response(const CFX_WideString& wsQuestion,
304 const CFX_WideString& wsTitle,
305 const CFX_WideString& wsDefaultAnswer,
306 FX_BOOL bMark) {
307 CFX_WideString wsAnswer;
308 if (!m_pFormFillEnv)
309 return wsAnswer;
310
311 int nLength = 2048;
312 char* pBuff = new char[nLength];
313 nLength = m_pFormFillEnv->JS_appResponse(wsQuestion.c_str(), wsTitle.c_str(),
314 wsDefaultAnswer.c_str(), nullptr,
315 bMark, pBuff, nLength);
316 if (nLength > 0) {
317 nLength = nLength > 2046 ? 2046 : nLength;
318 pBuff[nLength] = 0;
319 pBuff[nLength + 1] = 0;
320 wsAnswer = CFX_WideString::FromUTF16LE(
321 reinterpret_cast<const unsigned short*>(pBuff),
322 nLength / sizeof(unsigned short));
323 }
324 delete[] pBuff;
325 return wsAnswer;
326 }
327
328 IFX_SeekableReadStream* CPDFXFA_Document::DownloadURL(
329 const CFX_WideString& wsURL) {
330 return m_pFormFillEnv ? m_pFormFillEnv->DownloadFromURL(wsURL.c_str())
331 : nullptr;
332 }
333
334 FX_BOOL CPDFXFA_Document::PostRequestURL(const CFX_WideString& wsURL,
335 const CFX_WideString& wsData,
336 const CFX_WideString& wsContentType,
337 const CFX_WideString& wsEncode,
338 const CFX_WideString& wsHeader,
339 CFX_WideString& wsResponse) {
340 if (!m_pFormFillEnv)
341 return FALSE;
342
343 wsResponse = m_pFormFillEnv->PostRequestURL(
344 wsURL.c_str(), wsData.c_str(), wsContentType.c_str(), wsEncode.c_str(),
345 wsHeader.c_str());
346 return TRUE;
347 }
348
349 FX_BOOL CPDFXFA_Document::PutRequestURL(const CFX_WideString& wsURL,
350 const CFX_WideString& wsData,
351 const CFX_WideString& wsEncode) {
352 return m_pFormFillEnv &&
353 m_pFormFillEnv->PutRequestURL(wsURL.c_str(), wsData.c_str(),
354 wsEncode.c_str());
355 }
356
357 void CPDFXFA_Document::LoadString(int32_t iStringID, CFX_WideString& wsString) {
358 switch (iStringID) {
359 case XFA_IDS_ValidateFailed:
360 wsString = L"%s validation failed";
361 return;
362 case XFA_IDS_CalcOverride:
363 wsString = L"Calculate Override";
364 return;
365 case XFA_IDS_ModifyField:
366 wsString = L"Are you sure you want to modify this field?";
367 return;
368 case XFA_IDS_NotModifyField:
369 wsString = L"You are not allowed to modify this field.";
370 return;
371 case XFA_IDS_AppName:
372 wsString = L"pdfium";
373 return;
374 case XFA_IDS_Unable_TO_SET:
375 wsString = L"Unable to set ";
376 return;
377 case XFA_IDS_INVAlID_PROP_SET:
378 wsString = L"Invalid property set operation.";
379 return;
380 case XFA_IDS_NOT_DEFAUL_VALUE:
381 wsString = L" doesn't have a default property.";
382 return;
383 case XFA_IDS_UNABLE_SET_LANGUAGE:
384 wsString = L"Unable to set language value.";
385 return;
386 case XFA_IDS_UNABLE_SET_NUMPAGES:
387 wsString = L"Unable to set numPages value.";
388 return;
389 case XFA_IDS_UNABLE_SET_PLATFORM:
390 wsString = L"Unable to set platform value.";
391 return;
392 case XFA_IDS_UNABLE_SET_VARIATION:
393 wsString = L"Unable to set variation value.";
394 return;
395 case XFA_IDS_UNABLE_SET_VERSION:
396 wsString = L"Unable to set version value.";
397 return;
398 case XFA_IDS_UNABLE_SET_READY:
399 wsString = L"Unable to set ready value.";
400 return;
401 case XFA_IDS_COMPILER_ERROR:
402 wsString = L"Compiler error.";
403 return;
404 case XFA_IDS_DIVIDE_ZERO:
405 wsString = L"Divide by zero.";
406 return;
407 case XFA_IDS_ACCESS_PROPERTY_IN_NOT_OBJECT:
408 wsString =
409 L"An attempt was made to reference property '%s' of a non-object in "
410 L"SOM expression %s.";
411 return;
412 case XFA_IDS_INDEX_OUT_OF_BOUNDS:
413 wsString = L"Index value is out of bounds.";
414 return;
415 case XFA_IDS_INCORRECT_NUMBER_OF_METHOD:
416 wsString = L"Incorrect number of parameters calling method '%s'.";
417 return;
418 case XFA_IDS_ARGUMENT_MISMATCH:
419 wsString = L"Argument mismatch in property or function argument.";
420 return;
421 case XFA_IDS_NOT_HAVE_PROPERTY:
422 wsString = L"'%s' doesn't have property '%s'.";
423 return;
424 case XFA_IDS_VIOLATE_BOUNDARY:
425 wsString =
426 L"The element [%s] has violated its allowable number of occurrences.";
427 return;
428 case XFA_IDS_SERVER_DENY:
429 wsString = L"Server does not permit.";
430 return;
431 case XFA_IDS_ValidateLimit:
432 wsString =
433 L"Message limit exceeded. Remaining %d validation errors not "
434 L"reported.";
435 return;
436 case XFA_IDS_ValidateNullWarning:
437 wsString =
438 L"%s cannot be blank. To ignore validations for %s, click Ignore.";
439 return;
440 case XFA_IDS_ValidateNullError:
441 wsString = L"%s cannot be blank.";
442 return;
443 case XFA_IDS_ValidateWarning:
444 wsString =
445 L"The value you entered for %s is invalid. To ignore validations for "
446 L"%s, click Ignore.";
447 return;
448 case XFA_IDS_ValidateError:
449 wsString = L"The value you entered for %s is invalid.";
450 return;
451 }
452 }
453
454 IFWL_AdapterTimerMgr* CPDFXFA_Document::GetTimerMgr() {
455 CXFA_FWLAdapterTimerMgr* pAdapter = nullptr;
456 if (m_pFormFillEnv)
457 pAdapter = new CXFA_FWLAdapterTimerMgr(m_pFormFillEnv);
458 return pAdapter;
459 }
OLDNEW
« no previous file with comments | « fpdfsdk/fpdfxfa/cpdfxfa_document.h ('k') | fpdfsdk/javascript/cjs_runtime.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698