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 "xfa/src/foxitlib.h"
8 #include "xfa/src/fxfa/src/common/xfa_utils.h"
9 #include "xfa/src/fxfa/src/common/xfa_object.h"
10 #include "xfa/src/fxfa/src/common/xfa_document.h"
11 #include "xfa/src/fxfa/src/common/xfa_parser.h"
12 #include "xfa/src/fxfa/src/common/xfa_script.h"
13 #include "xfa/src/fxfa/src/common/xfa_docdata.h"
14 #include "xfa/src/fxfa/src/common/xfa_doclayout.h"
15 #include "xfa/src/fxfa/src/common/xfa_localemgr.h"
16 #include "xfa/src/fxfa/src/common/xfa_fm2jsapi.h"
17 #include "xfa_script_hostpseudomodel.h"
CScript_HostPseudoModel(CXFA_Document * pDocument)18 CScript_HostPseudoModel::CScript_HostPseudoModel(CXFA_Document* pDocument)
19 : CXFA_OrdinaryObject(pDocument, XFA_ELEMENT_HostPseudoModel) {
20 m_uScriptHash = XFA_HASHCODE_Host;
21 }
~CScript_HostPseudoModel()22 CScript_HostPseudoModel::~CScript_HostPseudoModel() {}
Script_HostPseudoModel_LoadString(FXJSE_HVALUE hValue,IXFA_Notify * pNotify,FX_DWORD dwFlag)23 void CScript_HostPseudoModel::Script_HostPseudoModel_LoadString(
24 FXJSE_HVALUE hValue,
25 IXFA_Notify* pNotify,
26 FX_DWORD dwFlag) {
27 CFX_WideString wsValue;
28 pNotify->GetAppProvider()->LoadString(dwFlag, wsValue);
29 FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsValue));
30 }
Script_HostPseudoModel_AppType(FXJSE_HVALUE hValue,FX_BOOL bSetting,XFA_ATTRIBUTE eAttribute)31 void CScript_HostPseudoModel::Script_HostPseudoModel_AppType(
32 FXJSE_HVALUE hValue,
33 FX_BOOL bSetting,
34 XFA_ATTRIBUTE eAttribute) {
35 IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
36 if (!pNotify) {
37 return;
38 }
39 if (bSetting) {
40 ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET);
41 return;
42 }
43 CFX_WideString wsAppType;
44 pNotify->GetAppProvider()->GetAppType(wsAppType);
45 FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsAppType));
46 }
Script_HostPseudoModel_FoxitAppType(FXJSE_HVALUE hValue,FX_BOOL bSetting,XFA_ATTRIBUTE eAttribute)47 void CScript_HostPseudoModel::Script_HostPseudoModel_FoxitAppType(
48 FXJSE_HVALUE hValue,
49 FX_BOOL bSetting,
50 XFA_ATTRIBUTE eAttribute) {
51 IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
52 if (!pNotify) {
53 return;
54 }
55 if (bSetting) {
56 ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET);
57 return;
58 }
59 CFX_WideString wsAppType;
60 pNotify->GetAppProvider()->GetFoxitAppType(wsAppType);
61 FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsAppType));
62 }
Script_HostPseudoModel_CalculationsEnabled(FXJSE_HVALUE hValue,FX_BOOL bSetting,XFA_ATTRIBUTE eAttribute)63 void CScript_HostPseudoModel::Script_HostPseudoModel_CalculationsEnabled(
64 FXJSE_HVALUE hValue,
65 FX_BOOL bSetting,
66 XFA_ATTRIBUTE eAttribute) {
67 IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
68 if (!pNotify) {
69 return;
70 }
71 IXFA_Doc* hDoc = pNotify->GetHDOC();
72 if (bSetting) {
73 pNotify->GetDocProvider()->SetCalculationsEnabled(
74 hDoc, FXJSE_Value_ToBoolean(hValue));
75 return;
76 }
77 FX_BOOL bEnabled = pNotify->GetDocProvider()->IsCalculationsEnabled(hDoc);
78 FXJSE_Value_SetBoolean(hValue, bEnabled);
79 }
Script_HostPseudoModel_CurrentPage(FXJSE_HVALUE hValue,FX_BOOL bSetting,XFA_ATTRIBUTE eAttribute)80 void CScript_HostPseudoModel::Script_HostPseudoModel_CurrentPage(
81 FXJSE_HVALUE hValue,
82 FX_BOOL bSetting,
83 XFA_ATTRIBUTE eAttribute) {
84 IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
85 if (!pNotify) {
86 return;
87 }
88 IXFA_Doc* hDoc = pNotify->GetHDOC();
89 if (bSetting) {
90 pNotify->GetDocProvider()->SetCurrentPage(hDoc,
91 FXJSE_Value_ToInteger(hValue));
92 return;
93 }
94 int32_t iCurrentPage = pNotify->GetDocProvider()->GetCurrentPage(hDoc);
95 FXJSE_Value_SetInteger(hValue, iCurrentPage);
96 }
Script_HostPseudoModel_Language(FXJSE_HVALUE hValue,FX_BOOL bSetting,XFA_ATTRIBUTE eAttribute)97 void CScript_HostPseudoModel::Script_HostPseudoModel_Language(
98 FXJSE_HVALUE hValue,
99 FX_BOOL bSetting,
100 XFA_ATTRIBUTE eAttribute) {
101 IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
102 if (!pNotify) {
103 return;
104 }
105 if (bSetting) {
106 ThrowScriptErrorMessage(XFA_IDS_UNABLE_SET_LANGUAGE);
107 return;
108 }
109 CFX_WideString wsLanguage;
110 pNotify->GetAppProvider()->GetLanguage(wsLanguage);
111 FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsLanguage));
112 }
Script_HostPseudoModel_NumPages(FXJSE_HVALUE hValue,FX_BOOL bSetting,XFA_ATTRIBUTE eAttribute)113 void CScript_HostPseudoModel::Script_HostPseudoModel_NumPages(
114 FXJSE_HVALUE hValue,
115 FX_BOOL bSetting,
116 XFA_ATTRIBUTE eAttribute) {
117 IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
118 if (!pNotify) {
119 return;
120 }
121 IXFA_Doc* hDoc = pNotify->GetHDOC();
122 if (bSetting) {
123 ThrowScriptErrorMessage(XFA_IDS_UNABLE_SET_NUMPAGES);
124 return;
125 }
126 int32_t iNumPages = pNotify->GetDocProvider()->CountPages(hDoc);
127 FXJSE_Value_SetInteger(hValue, iNumPages);
128 }
Script_HostPseudoModel_Platform(FXJSE_HVALUE hValue,FX_BOOL bSetting,XFA_ATTRIBUTE eAttribute)129 void CScript_HostPseudoModel::Script_HostPseudoModel_Platform(
130 FXJSE_HVALUE hValue,
131 FX_BOOL bSetting,
132 XFA_ATTRIBUTE eAttribute) {
133 IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
134 if (!pNotify) {
135 return;
136 }
137 if (bSetting) {
138 ThrowScriptErrorMessage(XFA_IDS_UNABLE_SET_PLATFORM);
139 return;
140 }
141 CFX_WideString wsPlatform;
142 pNotify->GetAppProvider()->GetPlatform(wsPlatform);
143 FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsPlatform));
144 }
Script_HostPseudoModel_Title(FXJSE_HVALUE hValue,FX_BOOL bSetting,XFA_ATTRIBUTE eAttribute)145 void CScript_HostPseudoModel::Script_HostPseudoModel_Title(
146 FXJSE_HVALUE hValue,
147 FX_BOOL bSetting,
148 XFA_ATTRIBUTE eAttribute) {
149 if (!m_pDocument->GetScriptContext()->IsRunAtClient()) {
150 return;
151 }
152 IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
153 if (!pNotify) {
154 return;
155 }
156 IXFA_Doc* hDoc = pNotify->GetHDOC();
157 if (bSetting) {
158 CFX_ByteString bsValue;
159 FXJSE_Value_ToUTF8String(hValue, bsValue);
160 pNotify->GetDocProvider()->SetTitle(
161 hDoc, CFX_WideString::FromUTF8(bsValue, bsValue.GetLength()));
162 return;
163 }
164 CFX_WideString wsTitle;
165 pNotify->GetDocProvider()->GetTitle(hDoc, wsTitle);
166 FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsTitle));
167 }
Script_HostPseudoModel_ValidationsEnabled(FXJSE_HVALUE hValue,FX_BOOL bSetting,XFA_ATTRIBUTE eAttribute)168 void CScript_HostPseudoModel::Script_HostPseudoModel_ValidationsEnabled(
169 FXJSE_HVALUE hValue,
170 FX_BOOL bSetting,
171 XFA_ATTRIBUTE eAttribute) {
172 IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
173 if (!pNotify) {
174 return;
175 }
176 IXFA_Doc* hDoc = pNotify->GetHDOC();
177 if (bSetting) {
178 pNotify->GetDocProvider()->SetValidationsEnabled(
179 hDoc, FXJSE_Value_ToBoolean(hValue));
180 return;
181 }
182 FX_BOOL bEnabled = pNotify->GetDocProvider()->IsValidationsEnabled(hDoc);
183 FXJSE_Value_SetBoolean(hValue, bEnabled);
184 }
Script_HostPseudoModel_Variation(FXJSE_HVALUE hValue,FX_BOOL bSetting,XFA_ATTRIBUTE eAttribute)185 void CScript_HostPseudoModel::Script_HostPseudoModel_Variation(
186 FXJSE_HVALUE hValue,
187 FX_BOOL bSetting,
188 XFA_ATTRIBUTE eAttribute) {
189 if (!m_pDocument->GetScriptContext()->IsRunAtClient()) {
190 return;
191 }
192 IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
193 if (!pNotify) {
194 return;
195 }
196 if (bSetting) {
197 ThrowScriptErrorMessage(XFA_IDS_UNABLE_SET_VARIATION);
198 return;
199 }
200 CFX_WideString wsVariation;
201 pNotify->GetAppProvider()->GetVariation(wsVariation);
202 FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsVariation));
203 }
Script_HostPseudoModel_Version(FXJSE_HVALUE hValue,FX_BOOL bSetting,XFA_ATTRIBUTE eAttribute)204 void CScript_HostPseudoModel::Script_HostPseudoModel_Version(
205 FXJSE_HVALUE hValue,
206 FX_BOOL bSetting,
207 XFA_ATTRIBUTE eAttribute) {
208 IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
209 if (!pNotify) {
210 return;
211 }
212 if (bSetting) {
213 ThrowScriptErrorMessage(XFA_IDS_UNABLE_SET_VERSION);
214 return;
215 }
216 CFX_WideString wsVersion;
217 pNotify->GetAppProvider()->GetVersion(wsVersion);
218 FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsVersion));
219 }
Script_HostPseudoModel_FoxitVersion(FXJSE_HVALUE hValue,FX_BOOL bSetting,XFA_ATTRIBUTE eAttribute)220 void CScript_HostPseudoModel::Script_HostPseudoModel_FoxitVersion(
221 FXJSE_HVALUE hValue,
222 FX_BOOL bSetting,
223 XFA_ATTRIBUTE eAttribute) {
224 IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
225 if (!pNotify) {
226 return;
227 }
228 if (bSetting) {
229 ThrowScriptErrorMessage(XFA_IDS_UNABLE_SET_VERSION);
230 return;
231 }
232 CFX_WideString wsVersion;
233 pNotify->GetAppProvider()->GetFoxitVersion(wsVersion);
234 FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsVersion));
235 }
Script_HostPseudoModel_Name(FXJSE_HVALUE hValue,FX_BOOL bSetting,XFA_ATTRIBUTE eAttribute)236 void CScript_HostPseudoModel::Script_HostPseudoModel_Name(
237 FXJSE_HVALUE hValue,
238 FX_BOOL bSetting,
239 XFA_ATTRIBUTE eAttribute) {
240 IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
241 if (!pNotify) {
242 return;
243 }
244 if (bSetting) {
245 ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET);
246 return;
247 }
248 CFX_WideString wsAppName;
249 pNotify->GetAppProvider()->GetAppName(wsAppName);
250 FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsAppName));
251 }
Script_HostPseudoModel_FoxitName(FXJSE_HVALUE hValue,FX_BOOL bSetting,XFA_ATTRIBUTE eAttribute)252 void CScript_HostPseudoModel::Script_HostPseudoModel_FoxitName(
253 FXJSE_HVALUE hValue,
254 FX_BOOL bSetting,
255 XFA_ATTRIBUTE eAttribute) {
256 IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
257 if (!pNotify) {
258 return;
259 }
260 if (bSetting) {
261 ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET);
262 return;
263 }
264 CFX_WideString wsFoxitAppName;
265 pNotify->GetAppProvider()->GetFoxitAppName(wsFoxitAppName);
266 FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsFoxitAppName));
267 }
Script_HostPseudoModel_GotoURL(CFXJSE_Arguments * pArguments)268 void CScript_HostPseudoModel::Script_HostPseudoModel_GotoURL(
269 CFXJSE_Arguments* pArguments) {
270 if (!m_pDocument->GetScriptContext()->IsRunAtClient()) {
271 return;
272 }
273 int32_t iLength = pArguments->GetLength();
274 if (iLength != 1) {
275 ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"gotoURL");
276 return;
277 }
278 IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
279 if (!pNotify) {
280 return;
281 }
282 IXFA_Doc* hDoc = pNotify->GetHDOC();
283 CFX_WideString wsURL;
284 if (iLength >= 1) {
285 CFX_ByteString bsURL = pArguments->GetUTF8String(0);
286 wsURL = CFX_WideString::FromUTF8(bsURL, bsURL.GetLength());
287 }
288 pNotify->GetDocProvider()->GotoURL(hDoc, wsURL);
289 }
Script_HostPseudoModel_OpenList(CFXJSE_Arguments * pArguments)290 void CScript_HostPseudoModel::Script_HostPseudoModel_OpenList(
291 CFXJSE_Arguments* pArguments) {
292 if (!m_pDocument->GetScriptContext()->IsRunAtClient()) {
293 return;
294 }
295 int32_t iLength = pArguments->GetLength();
296 if (iLength != 1) {
297 ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"openList");
298 return;
299 }
300 IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
301 if (!pNotify) {
302 return;
303 }
304 CXFA_Node* pNode = NULL;
305 if (iLength >= 1) {
306 FXJSE_HVALUE hValue = pArguments->GetValue(0);
307 if (FXJSE_Value_IsObject(hValue)) {
308 pNode = (CXFA_Node*)FXJSE_Value_ToObject(hValue, NULL);
309 } else if (FXJSE_Value_IsUTF8String(hValue)) {
310 CFX_ByteString bsString;
311 FXJSE_Value_ToUTF8String(hValue, bsString);
312 CFX_WideString wsExpression =
313 CFX_WideString::FromUTF8(bsString, bsString.GetLength());
314 IXFA_ScriptContext* pScriptContext = m_pDocument->GetScriptContext();
315 if (!pScriptContext) {
316 FXJSE_Value_Release(hValue);
317 return;
318 }
319 CXFA_Object* pObject = pScriptContext->GetThisObject();
320 if (!pObject) {
321 FXJSE_Value_Release(hValue);
322 return;
323 }
324 FX_DWORD dwFlag = XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Parent |
325 XFA_RESOLVENODE_Siblings;
326 XFA_RESOLVENODE_RS resoveNodeRS;
327 int32_t iRet = pScriptContext->ResolveObjects(pObject, wsExpression,
328 resoveNodeRS, dwFlag);
329 if (iRet < 1 || !resoveNodeRS.nodes[0]->IsNode()) {
330 FXJSE_Value_Release(hValue);
331 return;
332 }
333 pNode = (CXFA_Node*)resoveNodeRS.nodes[0];
334 }
335 FXJSE_Value_Release(hValue);
336 }
337 IXFA_DocLayout* pDocLayout = m_pDocument->GetDocLayout();
338 if (!pDocLayout) {
339 return;
340 }
341 IXFA_Widget* hWidget = pNotify->GetHWidget(pDocLayout->GetLayoutItem(pNode));
342 if (!hWidget) {
343 return;
344 }
345 pNotify->GetDocProvider()->SetFocusWidget(pNotify->GetHDOC(), hWidget);
346 pNotify->OpenDropDownList(hWidget);
347 }
Script_HostPseudoModel_Response(CFXJSE_Arguments * pArguments)348 void CScript_HostPseudoModel::Script_HostPseudoModel_Response(
349 CFXJSE_Arguments* pArguments) {
350 int32_t iLength = pArguments->GetLength();
351 if (iLength < 1 || iLength > 4) {
352 ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"response");
353 return;
354 }
355 IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
356 if (!pNotify) {
357 return;
358 }
359 CFX_WideString wsQuestion;
360 CFX_WideString wsTitle;
361 CFX_WideString wsDefaultAnswer;
362 FX_BOOL bMark = FALSE;
363 if (iLength >= 1) {
364 CFX_ByteString bsQuestion = pArguments->GetUTF8String(0);
365 wsQuestion = CFX_WideString::FromUTF8(bsQuestion, bsQuestion.GetLength());
366 }
367 if (iLength >= 2) {
368 CFX_ByteString bsTitle = pArguments->GetUTF8String(1);
369 wsTitle = CFX_WideString::FromUTF8(bsTitle, bsTitle.GetLength());
370 }
371 if (iLength >= 3) {
372 CFX_ByteString bsDefaultAnswer = pArguments->GetUTF8String(2);
373 wsDefaultAnswer =
374 CFX_WideString::FromUTF8(bsDefaultAnswer, bsDefaultAnswer.GetLength());
375 }
376 if (iLength >= 4) {
377 bMark = pArguments->GetInt32(3) == 0 ? FALSE : TRUE;
378 }
379 CFX_WideString wsAnswer;
380 pNotify->GetAppProvider()->Response(wsAnswer, wsQuestion, wsTitle,
381 wsDefaultAnswer, bMark);
382 FXJSE_HVALUE hValue = pArguments->GetReturnValue();
383 if (hValue) {
384 FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsAnswer));
385 }
386 }
Script_HostPseudoModel_DocumentInBatch(CFXJSE_Arguments * pArguments)387 void CScript_HostPseudoModel::Script_HostPseudoModel_DocumentInBatch(
388 CFXJSE_Arguments* pArguments) {
389 IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
390 if (!pNotify) {
391 return;
392 }
393 int32_t iCur = pNotify->GetAppProvider()->GetCurDocumentInBatch();
394 FXJSE_HVALUE hValue = pArguments->GetReturnValue();
395 if (hValue) {
396 FXJSE_Value_SetInteger(hValue, iCur);
397 }
398 }
XFA_FilterName(const CFX_WideStringC & wsExpression,int32_t nStart,CFX_WideString & wsFilter)399 static int32_t XFA_FilterName(const CFX_WideStringC& wsExpression,
400 int32_t nStart,
401 CFX_WideString& wsFilter) {
402 FXSYS_assert(nStart > -1);
403 int32_t iLength = wsExpression.GetLength();
404 if (nStart >= iLength) {
405 return iLength;
406 }
407 FX_WCHAR* pBuf = wsFilter.GetBuffer(iLength - nStart);
408 int32_t nCount = 0;
409 const FX_WCHAR* pSrc = wsExpression.GetPtr();
410 FX_WCHAR wCur;
411 while (nStart < iLength) {
412 wCur = pSrc[nStart++];
413 if (wCur == ',') {
414 break;
415 }
416 pBuf[nCount++] = wCur;
417 }
418 wsFilter.ReleaseBuffer(nCount);
419 wsFilter.TrimLeft();
420 wsFilter.TrimRight();
421 return nStart;
422 }
Script_HostPseudoModel_ResetData(CFXJSE_Arguments * pArguments)423 void CScript_HostPseudoModel::Script_HostPseudoModel_ResetData(
424 CFXJSE_Arguments* pArguments) {
425 int32_t iLength = pArguments->GetLength();
426 if (iLength < 0 || iLength > 1) {
427 ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"resetData");
428 return;
429 }
430 IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
431 if (!pNotify) {
432 return;
433 }
434 CFX_WideString wsExpression;
435 if (iLength >= 1) {
436 CFX_ByteString bsExpression = pArguments->GetUTF8String(0);
437 wsExpression =
438 CFX_WideString::FromUTF8(bsExpression, bsExpression.GetLength());
439 }
440 if (wsExpression.IsEmpty()) {
441 pNotify->ResetData();
442 return;
443 }
444 int32_t iStart = 0;
445 CFX_WideString wsName;
446 CXFA_Node* pNode = NULL;
447 int32_t iExpLength = wsExpression.GetLength();
448 while (iStart < iExpLength) {
449 iStart = XFA_FilterName(wsExpression, iStart, wsName);
450 IXFA_ScriptContext* pScriptContext = m_pDocument->GetScriptContext();
451 if (!pScriptContext) {
452 return;
453 }
454 CXFA_Object* pObject = pScriptContext->GetThisObject();
455 if (!pObject) {
456 return;
457 }
458 FX_DWORD dwFlag = XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Parent |
459 XFA_RESOLVENODE_Siblings;
460 XFA_RESOLVENODE_RS resoveNodeRS;
461 int32_t iRet =
462 pScriptContext->ResolveObjects(pObject, wsName, resoveNodeRS, dwFlag);
463 if (iRet < 1 || !resoveNodeRS.nodes[0]->IsNode()) {
464 continue;
465 }
466 pNode = (CXFA_Node*)resoveNodeRS.nodes[0];
467 pNotify->ResetData(pNode->GetWidgetData());
468 }
469 if (!pNode) {
470 pNotify->ResetData();
471 }
472 }
Script_HostPseudoModel_Beep(CFXJSE_Arguments * pArguments)473 void CScript_HostPseudoModel::Script_HostPseudoModel_Beep(
474 CFXJSE_Arguments* pArguments) {
475 if (!m_pDocument->GetScriptContext()->IsRunAtClient()) {
476 return;
477 }
478 int32_t iLength = pArguments->GetLength();
479 if (iLength < 0 || iLength > 1) {
480 ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"beep");
481 return;
482 }
483 IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
484 if (!pNotify) {
485 return;
486 }
487 FX_DWORD dwType = 4;
488 if (iLength >= 1) {
489 dwType = pArguments->GetInt32(0);
490 }
491 pNotify->GetAppProvider()->Beep(dwType);
492 }
Script_HostPseudoModel_SetFocus(CFXJSE_Arguments * pArguments)493 void CScript_HostPseudoModel::Script_HostPseudoModel_SetFocus(
494 CFXJSE_Arguments* pArguments) {
495 if (!m_pDocument->GetScriptContext()->IsRunAtClient()) {
496 return;
497 }
498 int32_t iLength = pArguments->GetLength();
499 if (iLength != 1) {
500 ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"setFocus");
501 return;
502 }
503 IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
504 if (!pNotify) {
505 return;
506 }
507 CXFA_Node* pNode = NULL;
508 if (iLength >= 1) {
509 FXJSE_HVALUE hValue = pArguments->GetValue(0);
510 if (FXJSE_Value_IsObject(hValue)) {
511 pNode = (CXFA_Node*)FXJSE_Value_ToObject(hValue, NULL);
512 } else if (FXJSE_Value_IsUTF8String(hValue)) {
513 CFX_ByteString bsString;
514 FXJSE_Value_ToUTF8String(hValue, bsString);
515 CFX_WideString wsExpression =
516 CFX_WideString::FromUTF8(bsString, bsString.GetLength());
517 IXFA_ScriptContext* pScriptContext = m_pDocument->GetScriptContext();
518 if (!pScriptContext) {
519 FXJSE_Value_Release(hValue);
520 return;
521 }
522 CXFA_Object* pObject = pScriptContext->GetThisObject();
523 if (!pObject) {
524 FXJSE_Value_Release(hValue);
525 return;
526 }
527 FX_DWORD dwFlag = XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Parent |
528 XFA_RESOLVENODE_Siblings;
529 XFA_RESOLVENODE_RS resoveNodeRS;
530 int32_t iRet = pScriptContext->ResolveObjects(pObject, wsExpression,
531 resoveNodeRS, dwFlag);
532 if (iRet < 1 || !resoveNodeRS.nodes[0]->IsNode()) {
533 FXJSE_Value_Release(hValue);
534 return;
535 }
536 pNode = (CXFA_Node*)resoveNodeRS.nodes[0];
537 }
538 FXJSE_Value_Release(hValue);
539 }
540 pNotify->SetFocusWidgetNode(pNode);
541 }
Script_HostPseudoModel_GetFocus(CFXJSE_Arguments * pArguments)542 void CScript_HostPseudoModel::Script_HostPseudoModel_GetFocus(
543 CFXJSE_Arguments* pArguments) {
544 IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
545 if (!pNotify) {
546 return;
547 }
548 CXFA_Node* pNode = pNotify->GetFocusWidgetNode();
549 if (!pNode) {
550 return;
551 }
552 FXJSE_Value_Set(pArguments->GetReturnValue(),
553 m_pDocument->GetScriptContext()->GetJSValueFromMap(pNode));
554 }
Script_HostPseudoModel_MessageBox(CFXJSE_Arguments * pArguments)555 void CScript_HostPseudoModel::Script_HostPseudoModel_MessageBox(
556 CFXJSE_Arguments* pArguments) {
557 if (!m_pDocument->GetScriptContext()->IsRunAtClient()) {
558 return;
559 }
560 int32_t iLength = pArguments->GetLength();
561 if (iLength < 1 || iLength > 4) {
562 ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"messageBox");
563 return;
564 }
565 IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
566 if (!pNotify) {
567 return;
568 }
569 CFX_WideString wsMessage;
570 CFX_WideString bsTitle;
571 FX_DWORD dwMessageType = XFA_MBICON_Error;
572 FX_DWORD dwButtonType = XFA_MB_OK;
573 if (iLength >= 1) {
574 if (!Script_HostPseudoModel_ValidateArgsForMsg(pArguments, 0, wsMessage)) {
575 return;
576 }
577 }
578 if (iLength >= 2) {
579 if (!Script_HostPseudoModel_ValidateArgsForMsg(pArguments, 1, bsTitle)) {
580 return;
581 }
582 }
583 if (iLength >= 3) {
584 dwMessageType = pArguments->GetInt32(2);
585 if (dwMessageType > XFA_MBICON_Status) {
586 dwMessageType = XFA_MBICON_Error;
587 }
588 }
589 if (iLength >= 4) {
590 dwButtonType = pArguments->GetInt32(3);
591 if (dwButtonType > XFA_MB_YesNoCancel) {
592 dwButtonType = XFA_MB_OK;
593 }
594 }
595 int32_t iValue = pNotify->GetAppProvider()->MsgBox(
596 wsMessage, bsTitle, dwMessageType, dwButtonType);
597 FXJSE_HVALUE hValue = pArguments->GetReturnValue();
598 if (hValue) {
599 FXJSE_Value_SetInteger(hValue, iValue);
600 }
601 }
Script_HostPseudoModel_ValidateArgsForMsg(CFXJSE_Arguments * pArguments,int32_t iArgIndex,CFX_WideString & wsValue)602 FX_BOOL CScript_HostPseudoModel::Script_HostPseudoModel_ValidateArgsForMsg(
603 CFXJSE_Arguments* pArguments,
604 int32_t iArgIndex,
605 CFX_WideString& wsValue) {
606 if (pArguments == NULL || iArgIndex < 0) {
607 return FALSE;
608 }
609 FX_BOOL bIsJsType = FALSE;
610 if (m_pDocument->GetScriptContext()->GetType() ==
611 XFA_SCRIPTLANGTYPE_Javascript) {
612 bIsJsType = TRUE;
613 }
614 FXJSE_HVALUE hValueArg = pArguments->GetValue(iArgIndex);
615 if (!FXJSE_Value_IsUTF8String(hValueArg) && bIsJsType) {
616 ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH);
617 FXJSE_Value_Release(hValueArg);
618 return FALSE;
619 }
620 if (FXJSE_Value_IsNull(hValueArg)) {
621 wsValue = FX_WSTRC(L"");
622 } else {
623 CFX_ByteString byMessage;
624 FXJSE_Value_ToUTF8String(hValueArg, byMessage);
625 wsValue = CFX_WideString::FromUTF8(byMessage, byMessage.GetLength());
626 }
627 FXJSE_Value_Release(hValueArg);
628 return TRUE;
629 }
Script_HostPseudoModel_DocumentCountInBatch(CFXJSE_Arguments * pArguments)630 void CScript_HostPseudoModel::Script_HostPseudoModel_DocumentCountInBatch(
631 CFXJSE_Arguments* pArguments) {
632 IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
633 if (!pNotify) {
634 return;
635 }
636 int32_t iValue = pNotify->GetAppProvider()->GetDocumentCountInBatch();
637 FXJSE_HVALUE hValue = pArguments->GetReturnValue();
638 if (hValue) {
639 FXJSE_Value_SetInteger(hValue, iValue);
640 }
641 }
Script_HostPseudoModel_Print(CFXJSE_Arguments * pArguments)642 void CScript_HostPseudoModel::Script_HostPseudoModel_Print(
643 CFXJSE_Arguments* pArguments) {
644 if (!m_pDocument->GetScriptContext()->IsRunAtClient()) {
645 return;
646 }
647 int32_t iLength = pArguments->GetLength();
648 if (iLength != 8) {
649 ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"print");
650 return;
651 }
652 IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
653 if (!pNotify) {
654 return;
655 }
656 IXFA_Doc* hDoc = pNotify->GetHDOC();
657 FX_DWORD dwOptions = 0;
658 FX_BOOL bShowDialog = TRUE;
659 if (iLength >= 1) {
660 bShowDialog = pArguments->GetInt32(0) == 0 ? FALSE : TRUE;
661 }
662 if (bShowDialog) {
663 dwOptions |= XFA_PRINTOPT_ShowDialog;
664 }
665 int32_t nStartPage = 0;
666 if (iLength >= 2) {
667 nStartPage = pArguments->GetInt32(1);
668 }
669 int32_t nEndPage = 0;
670 if (iLength >= 3) {
671 nEndPage = pArguments->GetInt32(2);
672 }
673 FX_BOOL bCanCancel = TRUE;
674 if (iLength >= 4) {
675 bCanCancel = pArguments->GetInt32(3) == 0 ? FALSE : TRUE;
676 }
677 if (bCanCancel) {
678 dwOptions |= XFA_PRINTOPT_CanCancel;
679 }
680 FX_BOOL bShrinkPage = TRUE;
681 if (iLength >= 5) {
682 bShrinkPage = pArguments->GetInt32(4) == 0 ? FALSE : TRUE;
683 }
684 if (bShrinkPage) {
685 dwOptions |= XFA_PRINTOPT_ShrinkPage;
686 }
687 FX_BOOL bAsImage = TRUE;
688 if (iLength >= 6) {
689 bAsImage = pArguments->GetInt32(5) == 0 ? FALSE : TRUE;
690 }
691 if (bAsImage) {
692 dwOptions |= XFA_PRINTOPT_AsImage;
693 }
694 FX_BOOL bReverseOrder = TRUE;
695 if (iLength >= 7) {
696 bAsImage = pArguments->GetInt32(5) == 0 ? FALSE : TRUE;
697 }
698 bReverseOrder = pArguments->GetInt32(6) == 0 ? FALSE : TRUE;
699 if (bReverseOrder) {
700 dwOptions |= XFA_PRINTOPT_ReverseOrder;
701 }
702 FX_BOOL bPrintAnnot = TRUE;
703 if (iLength >= 8) {
704 bPrintAnnot = pArguments->GetInt32(7) == 0 ? FALSE : TRUE;
705 }
706 if (bPrintAnnot) {
707 dwOptions |= XFA_PRINTOPT_PrintAnnot;
708 }
709 pNotify->GetDocProvider()->Print(hDoc, nStartPage, nEndPage, dwOptions);
710 }
Script_HostPseudoModel_ImportData(CFXJSE_Arguments * pArguments)711 void CScript_HostPseudoModel::Script_HostPseudoModel_ImportData(
712 CFXJSE_Arguments* pArguments) {
713 int32_t iLength = pArguments->GetLength();
714 if (iLength < 0 || iLength > 1) {
715 ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"importData");
716 return;
717 }
718 IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
719 if (!pNotify) {
720 return;
721 }
722 CFX_WideString wsFilePath;
723 if (iLength > 0) {
724 CFX_ByteString bsFilePath = pArguments->GetUTF8String(0);
725 wsFilePath = CFX_WideString::FromUTF8(bsFilePath, bsFilePath.GetLength());
726 }
727 IXFA_Doc* hDoc = pNotify->GetHDOC();
728 pNotify->GetDocProvider()->ImportData(hDoc, wsFilePath);
729 }
Script_HostPseudoModel_ExportData(CFXJSE_Arguments * pArguments)730 void CScript_HostPseudoModel::Script_HostPseudoModel_ExportData(
731 CFXJSE_Arguments* pArguments) {
732 int32_t iLength = pArguments->GetLength();
733 if (iLength < 0 || iLength > 2) {
734 ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"exportData");
735 return;
736 }
737 IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
738 if (!pNotify) {
739 return;
740 }
741 IXFA_Doc* hDoc = pNotify->GetHDOC();
742 CFX_WideString wsFilePath;
743 FX_BOOL bXDP = TRUE;
744 if (iLength >= 1) {
745 CFX_ByteString bsFilePath = pArguments->GetUTF8String(0);
746 wsFilePath = CFX_WideString::FromUTF8(bsFilePath, bsFilePath.GetLength());
747 }
748 if (iLength >= 2) {
749 bXDP = pArguments->GetInt32(1) == 0 ? FALSE : TRUE;
750 }
751 pNotify->GetDocProvider()->ExportData(hDoc, wsFilePath, bXDP);
752 }
Script_HostPseudoModel_PageUp(CFXJSE_Arguments * pArguments)753 void CScript_HostPseudoModel::Script_HostPseudoModel_PageUp(
754 CFXJSE_Arguments* pArguments) {
755 IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
756 if (!pNotify) {
757 return;
758 }
759 IXFA_Doc* hDoc = pNotify->GetHDOC();
760 int32_t nCurPage = pNotify->GetDocProvider()->GetCurrentPage(hDoc);
761 int32_t nNewPage = 0;
762 if (nCurPage <= 1) {
763 return;
764 }
765 nNewPage = nCurPage - 1;
766 pNotify->GetDocProvider()->SetCurrentPage(hDoc, nNewPage);
767 }
Script_HostPseudoModel_PageDown(CFXJSE_Arguments * pArguments)768 void CScript_HostPseudoModel::Script_HostPseudoModel_PageDown(
769 CFXJSE_Arguments* pArguments) {
770 IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
771 if (!pNotify) {
772 return;
773 }
774 IXFA_Doc* hDoc = pNotify->GetHDOC();
775 int32_t nCurPage = pNotify->GetDocProvider()->GetCurrentPage(hDoc);
776 int32_t nPageCount = pNotify->GetDocProvider()->CountPages(hDoc);
777 if (!nPageCount || nCurPage == nPageCount) {
778 return;
779 }
780 int32_t nNewPage = 0;
781 if (nCurPage >= nPageCount) {
782 nNewPage = nPageCount - 1;
783 } else {
784 nNewPage = nCurPage + 1;
785 }
786 pNotify->GetDocProvider()->SetCurrentPage(hDoc, nNewPage);
787 }
Script_HostPseudoModel_CurrentDateTime(CFXJSE_Arguments * pArguments)788 void CScript_HostPseudoModel::Script_HostPseudoModel_CurrentDateTime(
789 CFXJSE_Arguments* pArguments) {
790 IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
791 if (!pNotify) {
792 return;
793 }
794 CFX_WideString wsDataTime = pNotify->GetCurrentDateTime();
795 FXJSE_HVALUE hValue = pArguments->GetReturnValue();
796 if (hValue) {
797 FXJSE_Value_SetUTF8String(hValue, FX_UTF8Encode(wsDataTime));
798 }
799 }
800