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