blob: 61694d0a289a30dd94f9c424554261cdbc3ea407 [file] [log] [blame]
Lei Zhang94293682016-01-27 18:27:56 -08001// 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
dsinclair4d29e782016-10-04 14:02:47 -07007#include "fpdfsdk/fpdfxfa/cpdfxfa_app.h"
weili625ad662016-06-15 11:21:33 -07008
thestigd4c34f22016-09-28 17:04:51 -07009#include <memory>
10
dsinclair735606d2016-10-05 15:47:02 -070011#include "fpdfsdk/cpdfsdk_formfillenvironment.h"
dsinclair4d29e782016-10-04 14:02:47 -070012#include "fpdfsdk/fpdfxfa/cxfa_fwladaptertimermgr.h"
dsinclair114e46a2016-09-29 17:18:21 -070013#include "fpdfsdk/fsdk_define.h"
tsepez36eb4bd2016-10-03 15:24:27 -070014#include "third_party/base/ptr_util.h"
dsinclaira282c732016-10-13 12:14:34 -070015#include "xfa/fxbarcode/BC_Library.h"
dsinclair5b493092016-09-29 20:20:24 -070016#include "xfa/fxfa/xfa_ffapp.h"
17#include "xfa/fxfa/xfa_fontmgr.h"
Lei Zhang94293682016-01-27 18:27:56 -080018
dsinclaira282c732016-10-13 12:14:34 -070019namespace {
Lei Zhang94293682016-01-27 18:27:56 -080020
dsinclaira282c732016-10-13 12:14:34 -070021CPDFXFA_App* g_pApp = nullptr;
22
23} // namespace
24
25CPDFXFA_App* CPDFXFA_App::GetInstance() {
26 if (!g_pApp) {
27 g_pApp = new CPDFXFA_App();
28 }
29 return g_pApp;
30}
31
32void CPDFXFA_App::ReleaseInstance() {
33 delete g_pApp;
34 g_pApp = nullptr;
35}
36
37CPDFXFA_App::CPDFXFA_App()
38 : m_bJavaScriptInitialized(FALSE), m_pIsolate(nullptr) {
39 m_pFormFillEnvList.RemoveAll();
dsinclairb685e642016-10-13 10:57:01 -070040}
41
42CPDFXFA_App::~CPDFXFA_App() {
dsinclaira282c732016-10-13 12:14:34 -070043 FXJSE_Runtime_Release(m_pIsolate);
44 m_pIsolate = nullptr;
45
46 FXJSE_Finalize();
47 BC_Library_Destory();
48}
49
50FX_BOOL CPDFXFA_App::Initialize(v8::Isolate* pIsolate) {
51 BC_Library_Init();
52 FXJSE_Initialize();
53
54 m_pIsolate = pIsolate ? pIsolate : FXJSE_Runtime_Create_Own();
55 if (!m_pIsolate)
56 return FALSE;
57
58 m_pXFAApp = pdfium::MakeUnique<CXFA_FFApp>(this);
59 m_pXFAApp->SetDefaultFontMgr(
60 std::unique_ptr<CXFA_DefFontMgr>(new CXFA_DefFontMgr));
61
62 return TRUE;
63}
64
65FX_BOOL CPDFXFA_App::AddFormFillEnv(CPDFSDK_FormFillEnvironment* pFormFillEnv) {
66 if (!pFormFillEnv)
67 return FALSE;
68
69 m_pFormFillEnvList.Add(pFormFillEnv);
70 return TRUE;
71}
72
73FX_BOOL CPDFXFA_App::RemoveFormFillEnv(
74 CPDFSDK_FormFillEnvironment* pFormFillEnv) {
75 if (!pFormFillEnv)
76 return FALSE;
77
78 int nFind = m_pFormFillEnvList.Find(pFormFillEnv);
79 if (nFind != -1) {
80 m_pFormFillEnvList.RemoveAt(nFind);
81 return TRUE;
82 }
83
84 return FALSE;
dsinclairb685e642016-10-13 10:57:01 -070085}
Lei Zhang94293682016-01-27 18:27:56 -080086
Lei Zhang94293682016-01-27 18:27:56 -080087void CPDFXFA_App::GetAppName(CFX_WideString& wsName) {
dsinclaira282c732016-10-13 12:14:34 -070088 CPDFSDK_FormFillEnvironment* pFormFillEnv = m_pFormFillEnvList.GetAt(0);
89 if (pFormFillEnv)
90 wsName = pFormFillEnv->FFI_GetAppName();
Lei Zhang94293682016-01-27 18:27:56 -080091}
92
Lei Zhang94293682016-01-27 18:27:56 -080093void CPDFXFA_App::GetLanguage(CFX_WideString& wsLanguage) {
dsinclaira282c732016-10-13 12:14:34 -070094 CPDFSDK_FormFillEnvironment* pFormFillEnv = m_pFormFillEnvList.GetAt(0);
95 if (pFormFillEnv)
96 wsLanguage = pFormFillEnv->GetLanguage();
Lei Zhang94293682016-01-27 18:27:56 -080097}
98
99void CPDFXFA_App::GetPlatform(CFX_WideString& wsPlatform) {
dsinclaira282c732016-10-13 12:14:34 -0700100 CPDFSDK_FormFillEnvironment* pFormFillEnv = m_pFormFillEnvList.GetAt(0);
101 if (pFormFillEnv) {
102 wsPlatform = pFormFillEnv->GetPlatform();
Lei Zhang94293682016-01-27 18:27:56 -0800103 }
104}
105
tsepezc3255f52016-03-25 14:52:27 -0700106void CPDFXFA_App::Beep(uint32_t dwType) {
dsinclaira282c732016-10-13 12:14:34 -0700107 CPDFSDK_FormFillEnvironment* pFormFillEnv = m_pFormFillEnvList.GetAt(0);
108 if (pFormFillEnv)
109 pFormFillEnv->JS_appBeep(dwType);
Lei Zhang94293682016-01-27 18:27:56 -0800110}
111
tsepez3f80c862016-05-16 12:03:24 -0700112int32_t CPDFXFA_App::MsgBox(const CFX_WideString& wsMessage,
113 const CFX_WideString& wsTitle,
tsepezc3255f52016-03-25 14:52:27 -0700114 uint32_t dwIconType,
115 uint32_t dwButtonType) {
dsinclaira282c732016-10-13 12:14:34 -0700116 CPDFSDK_FormFillEnvironment* pFormFillEnv = m_pFormFillEnvList.GetAt(0);
117 if (!pFormFillEnv)
Lei Zhang94293682016-01-27 18:27:56 -0800118 return -1;
119
tsepezc3255f52016-03-25 14:52:27 -0700120 uint32_t iconType = 0;
Lei Zhang94293682016-01-27 18:27:56 -0800121 int iButtonType = 0;
122 switch (dwIconType) {
123 case XFA_MBICON_Error:
124 iconType |= 0;
125 break;
126 case XFA_MBICON_Warning:
127 iconType |= 1;
128 break;
129 case XFA_MBICON_Question:
130 iconType |= 2;
131 break;
132 case XFA_MBICON_Status:
133 iconType |= 3;
134 break;
135 }
136 switch (dwButtonType) {
137 case XFA_MB_OK:
138 iButtonType |= 0;
139 break;
140 case XFA_MB_OKCancel:
141 iButtonType |= 1;
142 break;
143 case XFA_MB_YesNo:
144 iButtonType |= 2;
145 break;
146 case XFA_MB_YesNoCancel:
147 iButtonType |= 3;
148 break;
149 }
dsinclaira282c732016-10-13 12:14:34 -0700150 int32_t iRet = pFormFillEnv->JS_appAlert(wsMessage.c_str(), wsTitle.c_str(),
151 iButtonType, iconType);
Lei Zhang94293682016-01-27 18:27:56 -0800152 switch (iRet) {
153 case 1:
154 return XFA_IDOK;
155 case 2:
156 return XFA_IDCancel;
157 case 3:
158 return XFA_IDNo;
159 case 4:
160 return XFA_IDYes;
161 }
162 return XFA_IDYes;
163}
164
tsepez3f80c862016-05-16 12:03:24 -0700165CFX_WideString CPDFXFA_App::Response(const CFX_WideString& wsQuestion,
166 const CFX_WideString& wsTitle,
167 const CFX_WideString& wsDefaultAnswer,
168 FX_BOOL bMark) {
169 CFX_WideString wsAnswer;
dsinclaira282c732016-10-13 12:14:34 -0700170 CPDFSDK_FormFillEnvironment* pFormFillEnv = m_pFormFillEnvList.GetAt(0);
171 if (pFormFillEnv) {
172 int nLength = 2048;
173 char* pBuff = new char[nLength];
174 nLength = pFormFillEnv->JS_appResponse(wsQuestion.c_str(), wsTitle.c_str(),
dsinclair8779fa82016-10-12 12:05:44 -0700175 wsDefaultAnswer.c_str(), nullptr,
176 bMark, pBuff, nLength);
dsinclaira282c732016-10-13 12:14:34 -0700177 if (nLength > 0) {
178 nLength = nLength > 2046 ? 2046 : nLength;
179 pBuff[nLength] = 0;
180 pBuff[nLength + 1] = 0;
181 wsAnswer = CFX_WideString::FromUTF16LE(
182 reinterpret_cast<const unsigned short*>(pBuff),
183 nLength / sizeof(unsigned short));
184 }
185 delete[] pBuff;
Lei Zhang94293682016-01-27 18:27:56 -0800186 }
tsepez3f80c862016-05-16 12:03:24 -0700187 return wsAnswer;
Lei Zhang94293682016-01-27 18:27:56 -0800188}
189
tsepez3f80c862016-05-16 12:03:24 -0700190IFX_FileRead* CPDFXFA_App::DownloadURL(const CFX_WideString& wsURL) {
dsinclaira282c732016-10-13 12:14:34 -0700191 CPDFSDK_FormFillEnvironment* pFormFillEnv = m_pFormFillEnvList.GetAt(0);
192 return pFormFillEnv ? pFormFillEnv->DownloadFromURL(wsURL.c_str()) : nullptr;
Lei Zhang94293682016-01-27 18:27:56 -0800193}
194
tsepez3f80c862016-05-16 12:03:24 -0700195FX_BOOL CPDFXFA_App::PostRequestURL(const CFX_WideString& wsURL,
196 const CFX_WideString& wsData,
197 const CFX_WideString& wsContentType,
198 const CFX_WideString& wsEncode,
199 const CFX_WideString& wsHeader,
Lei Zhang94293682016-01-27 18:27:56 -0800200 CFX_WideString& wsResponse) {
dsinclaira282c732016-10-13 12:14:34 -0700201 CPDFSDK_FormFillEnvironment* pFormFillEnv = m_pFormFillEnvList.GetAt(0);
202 if (!pFormFillEnv)
tsepez3f80c862016-05-16 12:03:24 -0700203 return FALSE;
204
dsinclaira282c732016-10-13 12:14:34 -0700205 wsResponse = pFormFillEnv->PostRequestURL(wsURL.c_str(), wsData.c_str(),
206 wsContentType.c_str(),
207 wsEncode.c_str(), wsHeader.c_str());
tsepez3f80c862016-05-16 12:03:24 -0700208 return TRUE;
Lei Zhang94293682016-01-27 18:27:56 -0800209}
210
tsepez3f80c862016-05-16 12:03:24 -0700211FX_BOOL CPDFXFA_App::PutRequestURL(const CFX_WideString& wsURL,
212 const CFX_WideString& wsData,
213 const CFX_WideString& wsEncode) {
dsinclaira282c732016-10-13 12:14:34 -0700214 CPDFSDK_FormFillEnvironment* pFormFillEnv = m_pFormFillEnvList.GetAt(0);
215 return pFormFillEnv &&
216 pFormFillEnv->PutRequestURL(wsURL.c_str(), wsData.c_str(),
217 wsEncode.c_str());
Lei Zhang94293682016-01-27 18:27:56 -0800218}
219
220void CPDFXFA_App::LoadString(int32_t iStringID, CFX_WideString& wsString) {
221 switch (iStringID) {
222 case XFA_IDS_ValidateFailed:
dsinclair0e0a86a2016-06-01 18:56:51 -0700223 wsString = L"%s validation failed";
Lei Zhang94293682016-01-27 18:27:56 -0800224 return;
225 case XFA_IDS_CalcOverride:
226 wsString = L"Calculate Override";
227 return;
228 case XFA_IDS_ModifyField:
229 wsString = L"Are you sure you want to modify this field?";
230 return;
231 case XFA_IDS_NotModifyField:
232 wsString = L"You are not allowed to modify this field.";
233 return;
234 case XFA_IDS_AppName:
dsinclair0e0a86a2016-06-01 18:56:51 -0700235 wsString = L"pdfium";
Lei Zhang94293682016-01-27 18:27:56 -0800236 return;
237 case XFA_IDS_Unable_TO_SET:
238 wsString = L"Unable to set ";
239 return;
Lei Zhang94293682016-01-27 18:27:56 -0800240 case XFA_IDS_INVAlID_PROP_SET:
dsinclair0e0a86a2016-06-01 18:56:51 -0700241 wsString = L"Invalid property set operation.";
Lei Zhang94293682016-01-27 18:27:56 -0800242 return;
243 case XFA_IDS_NOT_DEFAUL_VALUE:
dsinclair0e0a86a2016-06-01 18:56:51 -0700244 wsString = L" doesn't have a default property.";
Lei Zhang94293682016-01-27 18:27:56 -0800245 return;
246 case XFA_IDS_UNABLE_SET_LANGUAGE:
dsinclair0e0a86a2016-06-01 18:56:51 -0700247 wsString = L"Unable to set language value.";
Lei Zhang94293682016-01-27 18:27:56 -0800248 return;
249 case XFA_IDS_UNABLE_SET_NUMPAGES:
dsinclair0e0a86a2016-06-01 18:56:51 -0700250 wsString = L"Unable to set numPages value.";
Lei Zhang94293682016-01-27 18:27:56 -0800251 return;
252 case XFA_IDS_UNABLE_SET_PLATFORM:
dsinclair0e0a86a2016-06-01 18:56:51 -0700253 wsString = L"Unable to set platform value.";
Lei Zhang94293682016-01-27 18:27:56 -0800254 return;
255 case XFA_IDS_UNABLE_SET_VARIATION:
dsinclair0e0a86a2016-06-01 18:56:51 -0700256 wsString = L"Unable to set variation value.";
Lei Zhang94293682016-01-27 18:27:56 -0800257 return;
258 case XFA_IDS_UNABLE_SET_VERSION:
dsinclair0e0a86a2016-06-01 18:56:51 -0700259 wsString = L"Unable to set version value.";
Lei Zhang94293682016-01-27 18:27:56 -0800260 return;
261 case XFA_IDS_UNABLE_SET_READY:
dsinclair0e0a86a2016-06-01 18:56:51 -0700262 wsString = L"Unable to set ready value.";
Lei Zhang94293682016-01-27 18:27:56 -0800263 return;
264 case XFA_IDS_COMPILER_ERROR:
dsinclair0e0a86a2016-06-01 18:56:51 -0700265 wsString = L"Compiler error.";
Lei Zhang94293682016-01-27 18:27:56 -0800266 return;
267 case XFA_IDS_DIVIDE_ZERO:
dsinclair0e0a86a2016-06-01 18:56:51 -0700268 wsString = L"Divide by zero.";
Lei Zhang94293682016-01-27 18:27:56 -0800269 return;
270 case XFA_IDS_ACCESS_PROPERTY_IN_NOT_OBJECT:
271 wsString =
dsinclair0e0a86a2016-06-01 18:56:51 -0700272 L"An attempt was made to reference property '%s' of a non-object in "
273 L"SOM expression %s.";
Lei Zhang94293682016-01-27 18:27:56 -0800274 return;
275 case XFA_IDS_INDEX_OUT_OF_BOUNDS:
dsinclair0e0a86a2016-06-01 18:56:51 -0700276 wsString = L"Index value is out of bounds.";
Lei Zhang94293682016-01-27 18:27:56 -0800277 return;
278 case XFA_IDS_INCORRECT_NUMBER_OF_METHOD:
dsinclair0e0a86a2016-06-01 18:56:51 -0700279 wsString = L"Incorrect number of parameters calling method '%s'.";
Lei Zhang94293682016-01-27 18:27:56 -0800280 return;
281 case XFA_IDS_ARGUMENT_MISMATCH:
dsinclair0e0a86a2016-06-01 18:56:51 -0700282 wsString = L"Argument mismatch in property or function argument.";
Lei Zhang94293682016-01-27 18:27:56 -0800283 return;
284 case XFA_IDS_NOT_HAVE_PROPERTY:
dsinclair0e0a86a2016-06-01 18:56:51 -0700285 wsString = L"'%s' doesn't have property '%s'.";
Lei Zhang94293682016-01-27 18:27:56 -0800286 return;
287 case XFA_IDS_VIOLATE_BOUNDARY:
288 wsString =
dsinclair0e0a86a2016-06-01 18:56:51 -0700289 L"The element [%s] has violated its allowable number of occurrences.";
Lei Zhang94293682016-01-27 18:27:56 -0800290 return;
291 case XFA_IDS_SERVER_DENY:
dsinclair0e0a86a2016-06-01 18:56:51 -0700292 wsString = L"Server does not permit.";
Lei Zhang94293682016-01-27 18:27:56 -0800293 return;
294 case XFA_IDS_ValidateLimit:
dsinclair0e0a86a2016-06-01 18:56:51 -0700295 wsString =
Lei Zhang94293682016-01-27 18:27:56 -0800296 L"Message limit exceeded. Remaining %d validation errors not "
dsinclair0e0a86a2016-06-01 18:56:51 -0700297 L"reported.";
Lei Zhang94293682016-01-27 18:27:56 -0800298 return;
299 case XFA_IDS_ValidateNullWarning:
dsinclair0e0a86a2016-06-01 18:56:51 -0700300 wsString =
301 L"%s cannot be blank. To ignore validations for %s, click Ignore.";
Lei Zhang94293682016-01-27 18:27:56 -0800302 return;
303 case XFA_IDS_ValidateNullError:
dsinclair0e0a86a2016-06-01 18:56:51 -0700304 wsString = L"%s cannot be blank.";
Lei Zhang94293682016-01-27 18:27:56 -0800305 return;
306 case XFA_IDS_ValidateWarning:
dsinclair0e0a86a2016-06-01 18:56:51 -0700307 wsString =
Lei Zhang94293682016-01-27 18:27:56 -0800308 L"The value you entered for %s is invalid. To ignore validations for "
dsinclair0e0a86a2016-06-01 18:56:51 -0700309 L"%s, click Ignore.";
Lei Zhang94293682016-01-27 18:27:56 -0800310 return;
311 case XFA_IDS_ValidateError:
dsinclair0e0a86a2016-06-01 18:56:51 -0700312 wsString = L"The value you entered for %s is invalid.";
Lei Zhang94293682016-01-27 18:27:56 -0800313 return;
314 }
315}
316
Lei Zhang94293682016-01-27 18:27:56 -0800317IFWL_AdapterTimerMgr* CPDFXFA_App::GetTimerMgr() {
thestig1cd352e2016-06-07 17:53:06 -0700318 CXFA_FWLAdapterTimerMgr* pAdapter = nullptr;
dsinclaira282c732016-10-13 12:14:34 -0700319 CPDFSDK_FormFillEnvironment* pFormFillEnv = m_pFormFillEnvList.GetAt(0);
320 if (pFormFillEnv)
321 pAdapter = new CXFA_FWLAdapterTimerMgr(pFormFillEnv);
Lei Zhang94293682016-01-27 18:27:56 -0800322 return pAdapter;
323}