OLD | NEW |
| (Empty) |
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 "fpdfsdk/include/fpdfxfa/fpdfxfa_app.h" | |
8 #include "fpdfsdk/include/fpdfxfa/fpdfxfa_doc.h" | |
9 #include "fpdfsdk/include/fpdfxfa/fpdfxfa_util.h" | |
10 #include "fpdfsdk/include/fsdk_define.h" | |
11 #include "fpdfsdk/include/fsdk_mgr.h" | |
12 #include "fpdfsdk/include/javascript/IJavaScript.h" | |
13 #include "public/fpdf_formfill.h" | |
14 #include "xfa/include/fxbarcode/BC_BarCode.h" | |
15 | |
16 CPDFXFA_App* CPDFXFA_App::g_pApp = NULL; | |
17 | |
18 CPDFXFA_App* CPDFXFA_App::GetInstance() { | |
19 if (!g_pApp) { | |
20 g_pApp = new CPDFXFA_App(); | |
21 } | |
22 return g_pApp; | |
23 } | |
24 | |
25 void CPDFXFA_App::ReleaseInstance() { | |
26 delete g_pApp; | |
27 g_pApp = NULL; | |
28 } | |
29 | |
30 CPDFXFA_App::CPDFXFA_App() | |
31 : m_bJavaScriptInitialized(FALSE), | |
32 m_pXFAApp(NULL), | |
33 m_pFontMgr(NULL), | |
34 m_hJSERuntime(NULL), | |
35 m_csAppType(JS_STR_VIEWERTYPE_STANDARD), | |
36 m_bOwnedRuntime(false) { | |
37 m_pEnvList.RemoveAll(); | |
38 } | |
39 | |
40 CPDFXFA_App::~CPDFXFA_App() { | |
41 delete m_pFontMgr; | |
42 m_pFontMgr = NULL; | |
43 | |
44 delete m_pXFAApp; | |
45 m_pXFAApp = NULL; | |
46 | |
47 #ifdef PDF_ENABLE_XFA | |
48 FXJSE_Runtime_Release(m_hJSERuntime, m_bOwnedRuntime); | |
49 m_hJSERuntime = NULL; | |
50 | |
51 FXJSE_Finalize(); | |
52 BC_Library_Destory(); | |
53 #endif | |
54 } | |
55 | |
56 FX_BOOL CPDFXFA_App::Initialize(FXJSE_HRUNTIME hRuntime) { | |
57 #ifdef PDF_ENABLE_XFA | |
58 BC_Library_Init(); | |
59 FXJSE_Initialize(); | |
60 | |
61 m_bOwnedRuntime = !hRuntime; | |
62 m_hJSERuntime = hRuntime ? hRuntime : FXJSE_Runtime_Create(); | |
63 if (!m_hJSERuntime) | |
64 return FALSE; | |
65 | |
66 m_pXFAApp = IXFA_App::Create(this); | |
67 if (!m_pXFAApp) | |
68 return FALSE; | |
69 | |
70 m_pFontMgr = IXFA_FontMgr::CreateDefault(); | |
71 if (!m_pFontMgr) | |
72 return FALSE; | |
73 | |
74 m_pXFAApp->SetDefaultFontMgr(m_pFontMgr); | |
75 #endif | |
76 return TRUE; | |
77 } | |
78 | |
79 FX_BOOL CPDFXFA_App::AddFormFillEnv(CPDFDoc_Environment* pEnv) { | |
80 if (!pEnv) | |
81 return FALSE; | |
82 | |
83 m_pEnvList.Add(pEnv); | |
84 return TRUE; | |
85 } | |
86 | |
87 FX_BOOL CPDFXFA_App::RemoveFormFillEnv(CPDFDoc_Environment* pEnv) { | |
88 if (!pEnv) | |
89 return FALSE; | |
90 | |
91 int nFind = m_pEnvList.Find(pEnv); | |
92 if (nFind != -1) { | |
93 m_pEnvList.RemoveAt(nFind); | |
94 return TRUE; | |
95 } | |
96 | |
97 return FALSE; | |
98 } | |
99 | |
100 void CPDFXFA_App::GetAppType(CFX_WideString& wsAppType) { | |
101 wsAppType = m_csAppType; | |
102 } | |
103 | |
104 void CPDFXFA_App::GetAppName(CFX_WideString& wsName) { | |
105 CPDFDoc_Environment* pEnv = m_pEnvList.GetAt(0); | |
106 if (pEnv) { | |
107 wsName = pEnv->FFI_GetAppName(); | |
108 } | |
109 } | |
110 | |
111 void CPDFXFA_App::SetAppType(const CFX_WideStringC& wsAppType) { | |
112 m_csAppType = wsAppType; | |
113 } | |
114 | |
115 void CPDFXFA_App::GetLanguage(CFX_WideString& wsLanguage) { | |
116 CPDFDoc_Environment* pEnv = m_pEnvList.GetAt(0); | |
117 if (pEnv) { | |
118 wsLanguage = pEnv->FFI_GetLanguage(); | |
119 } | |
120 } | |
121 | |
122 void CPDFXFA_App::GetPlatform(CFX_WideString& wsPlatform) { | |
123 CPDFDoc_Environment* pEnv = m_pEnvList.GetAt(0); | |
124 if (pEnv) { | |
125 wsPlatform = pEnv->FFI_GetPlatform(); | |
126 } | |
127 } | |
128 | |
129 void CPDFXFA_App::GetVariation(CFX_WideString& wsVariation) { | |
130 wsVariation = JS_STR_VIEWERVARIATION; | |
131 } | |
132 | |
133 void CPDFXFA_App::GetVersion(CFX_WideString& wsVersion) { | |
134 wsVersion = JS_STR_VIEWERVERSION_XFA; | |
135 } | |
136 | |
137 void CPDFXFA_App::Beep(FX_DWORD dwType) { | |
138 CPDFDoc_Environment* pEnv = m_pEnvList.GetAt(0); | |
139 if (pEnv) { | |
140 pEnv->JS_appBeep(dwType); | |
141 } | |
142 } | |
143 | |
144 int32_t CPDFXFA_App::MsgBox(const CFX_WideStringC& wsMessage, | |
145 const CFX_WideStringC& wsTitle, | |
146 FX_DWORD dwIconType, | |
147 FX_DWORD dwButtonType) { | |
148 CPDFDoc_Environment* pEnv = m_pEnvList.GetAt(0); | |
149 if (!pEnv) | |
150 return -1; | |
151 | |
152 FX_DWORD iconType = 0; | |
153 int iButtonType = 0; | |
154 switch (dwIconType) { | |
155 case XFA_MBICON_Error: | |
156 iconType |= 0; | |
157 break; | |
158 case XFA_MBICON_Warning: | |
159 iconType |= 1; | |
160 break; | |
161 case XFA_MBICON_Question: | |
162 iconType |= 2; | |
163 break; | |
164 case XFA_MBICON_Status: | |
165 iconType |= 3; | |
166 break; | |
167 } | |
168 switch (dwButtonType) { | |
169 case XFA_MB_OK: | |
170 iButtonType |= 0; | |
171 break; | |
172 case XFA_MB_OKCancel: | |
173 iButtonType |= 1; | |
174 break; | |
175 case XFA_MB_YesNo: | |
176 iButtonType |= 2; | |
177 break; | |
178 case XFA_MB_YesNoCancel: | |
179 iButtonType |= 3; | |
180 break; | |
181 } | |
182 int32_t iRet = pEnv->JS_appAlert(wsMessage.GetPtr(), wsTitle.GetPtr(), | |
183 iButtonType, iconType); | |
184 switch (iRet) { | |
185 case 1: | |
186 return XFA_IDOK; | |
187 case 2: | |
188 return XFA_IDCancel; | |
189 case 3: | |
190 return XFA_IDNo; | |
191 case 4: | |
192 return XFA_IDYes; | |
193 } | |
194 return XFA_IDYes; | |
195 } | |
196 | |
197 void CPDFXFA_App::Response(CFX_WideString& wsAnswer, | |
198 const CFX_WideStringC& wsQuestion, | |
199 const CFX_WideStringC& wsTitle, | |
200 const CFX_WideStringC& wsDefaultAnswer, | |
201 FX_BOOL bMark) { | |
202 CPDFDoc_Environment* pEnv = m_pEnvList.GetAt(0); | |
203 if (pEnv) { | |
204 int nLength = 2048; | |
205 char* pBuff = new char[nLength]; | |
206 nLength = pEnv->JS_appResponse(wsQuestion.GetPtr(), wsTitle.GetPtr(), | |
207 wsDefaultAnswer.GetPtr(), NULL, bMark, pBuff, | |
208 nLength); | |
209 if (nLength > 0) { | |
210 nLength = nLength > 2046 ? 2046 : nLength; | |
211 pBuff[nLength] = 0; | |
212 pBuff[nLength + 1] = 0; | |
213 wsAnswer = CFX_WideString::FromUTF16LE( | |
214 reinterpret_cast<const unsigned short*>(pBuff), | |
215 nLength / sizeof(unsigned short)); | |
216 } | |
217 delete[] pBuff; | |
218 } | |
219 } | |
220 | |
221 int32_t CPDFXFA_App::GetCurDocumentInBatch() { | |
222 CPDFDoc_Environment* pEnv = m_pEnvList.GetAt(0); | |
223 if (pEnv) { | |
224 return pEnv->FFI_GetCurDocument(); | |
225 } | |
226 return 0; | |
227 } | |
228 | |
229 int32_t CPDFXFA_App::GetDocumentCountInBatch() { | |
230 CPDFDoc_Environment* pEnv = m_pEnvList.GetAt(0); | |
231 if (pEnv) { | |
232 return pEnv->FFI_GetDocumentCount(); | |
233 } | |
234 | |
235 return 0; | |
236 } | |
237 | |
238 IFX_FileRead* CPDFXFA_App::DownloadURL(const CFX_WideStringC& wsURL) { | |
239 CPDFDoc_Environment* pEnv = m_pEnvList.GetAt(0); | |
240 if (pEnv) { | |
241 return pEnv->FFI_DownloadFromURL(wsURL.GetPtr()); | |
242 } | |
243 return NULL; | |
244 } | |
245 | |
246 FX_BOOL CPDFXFA_App::PostRequestURL(const CFX_WideStringC& wsURL, | |
247 const CFX_WideStringC& wsData, | |
248 const CFX_WideStringC& wsContentType, | |
249 const CFX_WideStringC& wsEncode, | |
250 const CFX_WideStringC& wsHeader, | |
251 CFX_WideString& wsResponse) { | |
252 CPDFDoc_Environment* pEnv = m_pEnvList.GetAt(0); | |
253 if (pEnv) { | |
254 wsResponse = pEnv->FFI_PostRequestURL(wsURL.GetPtr(), wsData.GetPtr(), | |
255 wsContentType.GetPtr(), | |
256 wsEncode.GetPtr(), wsHeader.GetPtr()); | |
257 return TRUE; | |
258 } | |
259 return FALSE; | |
260 } | |
261 | |
262 FX_BOOL CPDFXFA_App::PutRequestURL(const CFX_WideStringC& wsURL, | |
263 const CFX_WideStringC& wsData, | |
264 const CFX_WideStringC& wsEncode) { | |
265 CPDFDoc_Environment* pEnv = m_pEnvList.GetAt(0); | |
266 if (pEnv) { | |
267 return pEnv->FFI_PutRequestURL(wsURL.GetPtr(), wsData.GetPtr(), | |
268 wsEncode.GetPtr()); | |
269 } | |
270 return FALSE; | |
271 } | |
272 | |
273 void CPDFXFA_App::LoadString(int32_t iStringID, CFX_WideString& wsString) { | |
274 switch (iStringID) { | |
275 case XFA_IDS_ValidateFailed: | |
276 wsString = L"%s validate failed"; | |
277 return; | |
278 case XFA_IDS_CalcOverride: | |
279 wsString = L"Calculate Override"; | |
280 return; | |
281 case XFA_IDS_ModifyField: | |
282 wsString = L"Are you sure you want to modify this field?"; | |
283 return; | |
284 case XFA_IDS_NotModifyField: | |
285 wsString = L"You are not allowed to modify this field."; | |
286 return; | |
287 case XFA_IDS_AppName: | |
288 wsString = L"Foxit"; | |
289 return; | |
290 case XFA_IDS_ImageFilter: | |
291 wsString = | |
292 L"Image " | |
293 L"Files(*.bmp;*.jpg;*.png;*.gif;*.tif)|*.bmp;*.jpg;*.png;*.gif;*.tif|" | |
294 L"All Files(*.*)|*.*||"; | |
295 return; | |
296 case XFA_IDS_UNKNOW_CATCHED: | |
297 wsString = L"unknown error is catched!"; | |
298 return; | |
299 case XFA_IDS_Unable_TO_SET: | |
300 wsString = L"Unable to set "; | |
301 return; | |
302 case XFA_IDS_VALUE_EXCALMATORY: | |
303 wsString = L" value!"; | |
304 return; | |
305 case XFA_IDS_INVALID_ENUM_VALUE: | |
306 wsString = L"Invalid enumerated value: "; | |
307 return; | |
308 case XFA_IDS_UNSUPPORT_METHOD: | |
309 wsString = L"unsupport %s method."; | |
310 return; | |
311 case XFA_IDS_UNSUPPORT_PROP: | |
312 wsString = L"unsupport %s property."; | |
313 return; | |
314 case XFA_IDS_INVAlID_PROP_SET: | |
315 wsString = L"Invalid property set operation;"; | |
316 return; | |
317 case XFA_IDS_NOT_DEFAUL_VALUE: | |
318 wsString = L" doesn't have a default property"; | |
319 return; | |
320 case XFA_IDS_UNABLE_SET_LANGUAGE: | |
321 wsString = L"Unable to set language value!"; | |
322 return; | |
323 case XFA_IDS_UNABLE_SET_NUMPAGES: | |
324 wsString = L"Unable to set numPages value!"; | |
325 return; | |
326 case XFA_IDS_UNABLE_SET_PLATFORM: | |
327 wsString = L"Unable to set platform value!"; | |
328 return; | |
329 case XFA_IDS_UNABLE_SET_VALIDATIONENABLE: | |
330 wsString = L"Unable to set validationsEnabled value!"; | |
331 return; | |
332 case XFA_IDS_UNABLE_SET_VARIATION: | |
333 wsString = L"Unable to set variation value!"; | |
334 return; | |
335 case XFA_IDS_UNABLE_SET_VERSION: | |
336 wsString = L"Unable to set version value!"; | |
337 return; | |
338 case XFA_IDS_UNABLE_SET_READY: | |
339 wsString = L"Unable to set ready value!"; | |
340 return; | |
341 case XFA_IDS_NUMBER_OF_OCCUR: | |
342 wsString = | |
343 L"The element [%s] has violated its allowable number of occurrences"; | |
344 return; | |
345 case XFA_IDS_UNABLE_SET_CLASS_NAME: | |
346 wsString = L"Unable to set className value!"; | |
347 return; | |
348 case XFA_IDS_UNABLE_SET_LENGTH_VALUE: | |
349 wsString = L"Unable to set length value!"; | |
350 return; | |
351 case XFA_IDS_UNSUPPORT_CHAR: | |
352 wsString = L"unsupported char '%c'"; | |
353 return; | |
354 case XFA_IDS_BAD_SUFFIX: | |
355 wsString = L"bad suffix on number"; | |
356 return; | |
357 case XFA_IDS_EXPECTED_IDENT: | |
358 wsString = L"expected identifier instead of '%s'"; | |
359 return; | |
360 case XFA_IDS_EXPECTED_STRING: | |
361 wsString = L"expected '%s' instead of '%s'"; | |
362 return; | |
363 case XFA_IDS_INVALIDATE_CHAR: | |
364 wsString = L"invalidate char '%c'"; | |
365 return; | |
366 case XFA_IDS_REDEFINITION: | |
367 wsString = L"'%s' redefinition "; | |
368 return; | |
369 case XFA_IDS_INVALIDATE_TOKEN: | |
370 wsString = L"invalidate token '%s'"; | |
371 return; | |
372 case XFA_IDS_INVALIDATE_EXPRESSION: | |
373 wsString = L"invalidate expression '%s'"; | |
374 return; | |
375 case XFA_IDS_UNDEFINE_IDENTIFIER: | |
376 wsString = L"undefined identifier '%s'"; | |
377 return; | |
378 case XFA_IDS_INVALIDATE_LEFTVALUE: | |
379 wsString = L"invalidate left-value '%s'"; | |
380 return; | |
381 case XFA_IDS_COMPILER_ERROR: | |
382 wsString = L"compiler error"; | |
383 return; | |
384 case XFA_IDS_CANNOT_MODIFY_VALUE: | |
385 wsString = L"can't modify the '%s' value"; | |
386 return; | |
387 case XFA_IDS_ERROR_PARAMETERS: | |
388 wsString = L"function '%s' has not %d parameters"; | |
389 return; | |
390 case XFA_IDS_EXPECT_ENDIF: | |
391 wsString = L"expected 'endif' instead of '%s'"; | |
392 return; | |
393 case XFA_IDS_UNEXPECTED_EXPRESSION: | |
394 wsString = L"unexpected expression '%s'"; | |
395 return; | |
396 case XFA_IDS_CONDITION_IS_NULL: | |
397 wsString = L"condition is null"; | |
398 return; | |
399 case XFA_IDS_ILLEGALBREAK: | |
400 wsString = L"illegal break"; | |
401 return; | |
402 case XFA_IDS_ILLEGALCONTINUE: | |
403 wsString = L"illegal continue"; | |
404 return; | |
405 case XFA_IDS_EXPECTED_OPERATOR: | |
406 wsString = L"expected operator '%s' instead of '%s'"; | |
407 return; | |
408 case XFA_IDS_DIVIDE_ZERO: | |
409 wsString = L"divide by zero"; | |
410 return; | |
411 case XFA_IDS_CANNOT_COVERT_OBJECT: | |
412 wsString = L"%s.%s can not covert to object"; | |
413 return; | |
414 case XFA_IDS_NOT_FOUND_CONTAINER: | |
415 wsString = L"can not found container '%s'"; | |
416 return; | |
417 case XFA_IDS_NOT_FOUND_PROPERTY: | |
418 wsString = L"can not found property '%s'"; | |
419 return; | |
420 case XFA_IDS_NOT_FOUND_METHOD: | |
421 wsString = L"can not found method '%s'"; | |
422 return; | |
423 case XFA_IDS_NOT_FOUND_CONST: | |
424 wsString = L"can not found const '%s'"; | |
425 return; | |
426 case XFA_IDS_NOT_ASSIGN_OBJECT: | |
427 wsString = L"can not direct assign value to object"; | |
428 return; | |
429 case XFA_IDS_IVALIDATE_INSTRUCTION: | |
430 wsString = L"invalidate instruction"; | |
431 return; | |
432 case XFA_IDS_EXPECT_NUMBER: | |
433 wsString = L"expected number instead of '%s'"; | |
434 return; | |
435 case XFA_IDS_VALIDATE_OUT_ARRAY: | |
436 wsString = L"validate access index '%s' out of array"; | |
437 return; | |
438 case XFA_IDS_CANNOT_ASSIGN_IDENT: | |
439 wsString = L"can not assign to %s"; | |
440 return; | |
441 case XFA_IDS_NOT_FOUNT_FUNCTION: | |
442 wsString = L"can not found '%s' function"; | |
443 return; | |
444 case XFA_IDS_NOT_ARRAY: | |
445 wsString = L"'%s' doesn't an array"; | |
446 return; | |
447 case XFA_IDS_OUT_ARRAY: | |
448 wsString = L"out of range of '%s' array"; | |
449 return; | |
450 case XFA_IDS_NOT_SUPPORT_CALC: | |
451 wsString = L"'%s' operator can not support array calculate"; | |
452 return; | |
453 case XFA_IDS_ARGUMENT_NOT_ARRAY: | |
454 wsString = L"'%s' function's %d argument can not be array"; | |
455 return; | |
456 case XFA_IDS_ARGUMENT_EXPECT_CONTAINER: | |
457 wsString = L"'%s' argument expected a container"; | |
458 return; | |
459 case XFA_IDS_ACCESS_PROPERTY_IN_NOT_OBJECT: | |
460 wsString = | |
461 L"an attempt was made to reference property '%s' of a non-object in " | |
462 L"SOM expression %s"; | |
463 return; | |
464 case XFA_IDS_FUNCTION_IS_BUILDIN: | |
465 wsString = L"function '%s' is buildin"; | |
466 return; | |
467 case XFA_IDS_ERROR_MSG: | |
468 wsString = L"%s : %s"; | |
469 return; | |
470 case XFA_IDS_INDEX_OUT_OF_BOUNDS: | |
471 wsString = L"Index value is out of bounds"; | |
472 return; | |
473 case XFA_IDS_INCORRECT_NUMBER_OF_METHOD: | |
474 wsString = L"Incorrect number of parameters calling method '%s'"; | |
475 return; | |
476 case XFA_IDS_ARGUMENT_MISMATCH: | |
477 wsString = L"Argument mismatch in property or function argument"; | |
478 return; | |
479 case XFA_IDS_INVALID_ENUMERATE: | |
480 wsString = L"Invalid enumerated value: %s"; | |
481 return; | |
482 case XFA_IDS_INVALID_APPEND: | |
483 wsString = | |
484 L"Invalid append operation: %s cannot have a child element of %s"; | |
485 return; | |
486 case XFA_IDS_SOM_EXPECTED_LIST: | |
487 wsString = | |
488 L"SOM expression returned list when single result was expected"; | |
489 return; | |
490 case XFA_IDS_NOT_HAVE_PROPERTY: | |
491 wsString = L"'%s' doesn't have property '%s'"; | |
492 return; | |
493 case XFA_IDS_INVALID_NODE_TYPE: | |
494 wsString = L"Invalid node type : '%s'"; | |
495 return; | |
496 case XFA_IDS_VIOLATE_BOUNDARY: | |
497 wsString = | |
498 L"The element [%s] has violated its allowable number of occurrences"; | |
499 return; | |
500 case XFA_IDS_SERVER_DENY: | |
501 wsString = L"Server does not permit"; | |
502 return; | |
503 case XFA_IDS_ValidateLimit: | |
504 wsString = FX_WSTRC( | |
505 L"Message limit exceeded. Remaining %d validation errors not " | |
506 L"reported."); | |
507 return; | |
508 case XFA_IDS_ValidateNullWarning: | |
509 wsString = FX_WSTRC( | |
510 L"%s cannot be left blank. To ignore validations for %s, click " | |
511 L"Ignore."); | |
512 return; | |
513 case XFA_IDS_ValidateNullError: | |
514 wsString = FX_WSTRC(L"%s cannot be left blank."); | |
515 return; | |
516 case XFA_IDS_ValidateWarning: | |
517 wsString = FX_WSTRC( | |
518 L"The value you entered for %s is invalid. To ignore validations for " | |
519 L"%s, click Ignore."); | |
520 return; | |
521 case XFA_IDS_ValidateError: | |
522 wsString = FX_WSTRC(L"The value you entered for %s is invalid."); | |
523 return; | |
524 } | |
525 } | |
526 | |
527 FX_BOOL CPDFXFA_App::ShowFileDialog(const CFX_WideStringC& wsTitle, | |
528 const CFX_WideStringC& wsFilter, | |
529 CFX_WideStringArray& wsPathArr, | |
530 FX_BOOL bOpen) { | |
531 return FALSE; | |
532 } | |
533 | |
534 IFWL_AdapterTimerMgr* CPDFXFA_App::GetTimerMgr() { | |
535 CXFA_FWLAdapterTimerMgr* pAdapter = NULL; | |
536 CPDFDoc_Environment* pEnv = m_pEnvList.GetAt(0); | |
537 if (pEnv) | |
538 pAdapter = new CXFA_FWLAdapterTimerMgr(pEnv); | |
539 return pAdapter; | |
540 } | |
OLD | NEW |