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/fxfa/parser/cscript_hostpseudomodel.h"
8
9 #include <memory>
10
11 #include "fxjs/cfxjse_arguments.h"
12 #include "xfa/fxfa/app/xfa_ffnotify.h"
13 #include "xfa/fxfa/parser/cxfa_document.h"
14 #include "xfa/fxfa/parser/cxfa_layoutprocessor.h"
15 #include "xfa/fxfa/parser/cxfa_scriptcontext.h"
16 #include "xfa/fxfa/parser/xfa_localemgr.h"
17 #include "xfa/fxfa/parser/xfa_object.h"
18 #include "xfa/fxfa/parser/xfa_resolvenode_rs.h"
19 #include "xfa/fxfa/parser/xfa_utils.h"
20
21 namespace {
22
ToNode(CFXJSE_Value * pValue,CFXJSE_Class * pClass)23 CXFA_Node* ToNode(CFXJSE_Value* pValue, CFXJSE_Class* pClass) {
24 return static_cast<CXFA_Node*>(pValue->ToHostObject(pClass));
25 }
26
27 } // namespace
28
CScript_HostPseudoModel(CXFA_Document * pDocument)29 CScript_HostPseudoModel::CScript_HostPseudoModel(CXFA_Document* pDocument)
30 : CXFA_Object(pDocument,
31 XFA_ObjectType::Object,
32 XFA_Element::HostPseudoModel,
33 CFX_WideStringC(L"hostPseudoModel")) {}
34
~CScript_HostPseudoModel()35 CScript_HostPseudoModel::~CScript_HostPseudoModel() {}
36
AppType(CFXJSE_Value * pValue,bool bSetting,XFA_ATTRIBUTE eAttribute)37 void CScript_HostPseudoModel::AppType(CFXJSE_Value* pValue,
38 bool bSetting,
39 XFA_ATTRIBUTE eAttribute) {
40 CXFA_FFNotify* pNotify = m_pDocument->GetNotify();
41 if (!pNotify)
42 return;
43 if (bSetting) {
44 ThrowInvalidPropertyException();
45 return;
46 }
47 pValue->SetString("Exchange");
48 }
49
CalculationsEnabled(CFXJSE_Value * pValue,bool bSetting,XFA_ATTRIBUTE eAttribute)50 void CScript_HostPseudoModel::CalculationsEnabled(CFXJSE_Value* pValue,
51 bool bSetting,
52 XFA_ATTRIBUTE eAttribute) {
53 CXFA_FFNotify* pNotify = m_pDocument->GetNotify();
54 if (!pNotify) {
55 return;
56 }
57 CXFA_FFDoc* hDoc = pNotify->GetHDOC();
58 if (bSetting) {
59 pNotify->GetDocEnvironment()->SetCalculationsEnabled(hDoc,
60 pValue->ToBoolean());
61 return;
62 }
63 pValue->SetBoolean(pNotify->GetDocEnvironment()->IsCalculationsEnabled(hDoc));
64 }
65
CurrentPage(CFXJSE_Value * pValue,bool bSetting,XFA_ATTRIBUTE eAttribute)66 void CScript_HostPseudoModel::CurrentPage(CFXJSE_Value* pValue,
67 bool bSetting,
68 XFA_ATTRIBUTE eAttribute) {
69 CXFA_FFNotify* pNotify = m_pDocument->GetNotify();
70 if (!pNotify) {
71 return;
72 }
73 CXFA_FFDoc* hDoc = pNotify->GetHDOC();
74 if (bSetting) {
75 pNotify->GetDocEnvironment()->SetCurrentPage(hDoc, pValue->ToInteger());
76 return;
77 }
78 pValue->SetInteger(pNotify->GetDocEnvironment()->GetCurrentPage(hDoc));
79 }
80
Language(CFXJSE_Value * pValue,bool bSetting,XFA_ATTRIBUTE eAttribute)81 void CScript_HostPseudoModel::Language(CFXJSE_Value* pValue,
82 bool bSetting,
83 XFA_ATTRIBUTE eAttribute) {
84 CXFA_FFNotify* pNotify = m_pDocument->GetNotify();
85 if (!pNotify)
86 return;
87 if (bSetting) {
88 ThrowSetLanguageException();
89 return;
90 }
91 pValue->SetString(
92 pNotify->GetAppProvider()->GetLanguage().UTF8Encode().AsStringC());
93 }
94
NumPages(CFXJSE_Value * pValue,bool bSetting,XFA_ATTRIBUTE eAttribute)95 void CScript_HostPseudoModel::NumPages(CFXJSE_Value* pValue,
96 bool bSetting,
97 XFA_ATTRIBUTE eAttribute) {
98 CXFA_FFNotify* pNotify = m_pDocument->GetNotify();
99 if (!pNotify) {
100 return;
101 }
102 CXFA_FFDoc* hDoc = pNotify->GetHDOC();
103 if (bSetting) {
104 ThrowSetNumPagesException();
105 return;
106 }
107 pValue->SetInteger(pNotify->GetDocEnvironment()->CountPages(hDoc));
108 }
109
Platform(CFXJSE_Value * pValue,bool bSetting,XFA_ATTRIBUTE eAttribute)110 void CScript_HostPseudoModel::Platform(CFXJSE_Value* pValue,
111 bool bSetting,
112 XFA_ATTRIBUTE eAttribute) {
113 CXFA_FFNotify* pNotify = m_pDocument->GetNotify();
114 if (!pNotify)
115 return;
116 if (bSetting) {
117 ThrowSetPlatformException();
118 return;
119 }
120 pValue->SetString(
121 pNotify->GetAppProvider()->GetPlatform().UTF8Encode().AsStringC());
122 }
123
Title(CFXJSE_Value * pValue,bool bSetting,XFA_ATTRIBUTE eAttribute)124 void CScript_HostPseudoModel::Title(CFXJSE_Value* pValue,
125 bool bSetting,
126 XFA_ATTRIBUTE eAttribute) {
127 if (!m_pDocument->GetScriptContext()->IsRunAtClient()) {
128 return;
129 }
130 CXFA_FFNotify* pNotify = m_pDocument->GetNotify();
131 if (!pNotify) {
132 return;
133 }
134 CXFA_FFDoc* hDoc = pNotify->GetHDOC();
135 if (bSetting) {
136 pNotify->GetDocEnvironment()->SetTitle(hDoc, pValue->ToWideString());
137 return;
138 }
139 CFX_WideString wsTitle;
140 pNotify->GetDocEnvironment()->GetTitle(hDoc, wsTitle);
141 pValue->SetString(wsTitle.UTF8Encode().AsStringC());
142 }
143
ValidationsEnabled(CFXJSE_Value * pValue,bool bSetting,XFA_ATTRIBUTE eAttribute)144 void CScript_HostPseudoModel::ValidationsEnabled(CFXJSE_Value* pValue,
145 bool bSetting,
146 XFA_ATTRIBUTE eAttribute) {
147 CXFA_FFNotify* pNotify = m_pDocument->GetNotify();
148 if (!pNotify) {
149 return;
150 }
151 CXFA_FFDoc* hDoc = pNotify->GetHDOC();
152 if (bSetting) {
153 pNotify->GetDocEnvironment()->SetValidationsEnabled(hDoc,
154 pValue->ToBoolean());
155 return;
156 }
157 bool bEnabled = pNotify->GetDocEnvironment()->IsValidationsEnabled(hDoc);
158 pValue->SetBoolean(bEnabled);
159 }
160
Variation(CFXJSE_Value * pValue,bool bSetting,XFA_ATTRIBUTE eAttribute)161 void CScript_HostPseudoModel::Variation(CFXJSE_Value* pValue,
162 bool bSetting,
163 XFA_ATTRIBUTE eAttribute) {
164 if (!m_pDocument->GetScriptContext()->IsRunAtClient())
165 return;
166
167 CXFA_FFNotify* pNotify = m_pDocument->GetNotify();
168 if (!pNotify)
169 return;
170 if (bSetting) {
171 ThrowSetVariationException();
172 return;
173 }
174 pValue->SetString("Full");
175 }
176
Version(CFXJSE_Value * pValue,bool bSetting,XFA_ATTRIBUTE eAttribute)177 void CScript_HostPseudoModel::Version(CFXJSE_Value* pValue,
178 bool bSetting,
179 XFA_ATTRIBUTE eAttribute) {
180 CXFA_FFNotify* pNotify = m_pDocument->GetNotify();
181 if (!pNotify) {
182 return;
183 }
184 if (bSetting) {
185 ThrowSetVersionException();
186 return;
187 }
188 pValue->SetString("11");
189 }
190
Name(CFXJSE_Value * pValue,bool bSetting,XFA_ATTRIBUTE eAttribute)191 void CScript_HostPseudoModel::Name(CFXJSE_Value* pValue,
192 bool bSetting,
193 XFA_ATTRIBUTE eAttribute) {
194 CXFA_FFNotify* pNotify = m_pDocument->GetNotify();
195 if (!pNotify) {
196 return;
197 }
198 if (bSetting) {
199 ThrowInvalidPropertyException();
200 return;
201 }
202 pValue->SetString(
203 pNotify->GetAppProvider()->GetAppName().UTF8Encode().AsStringC());
204 }
205
GotoURL(CFXJSE_Arguments * pArguments)206 void CScript_HostPseudoModel::GotoURL(CFXJSE_Arguments* pArguments) {
207 if (!m_pDocument->GetScriptContext()->IsRunAtClient()) {
208 return;
209 }
210 int32_t iLength = pArguments->GetLength();
211 if (iLength != 1) {
212 ThrowParamCountMismatchException(L"gotoURL");
213 return;
214 }
215 CXFA_FFNotify* pNotify = m_pDocument->GetNotify();
216 if (!pNotify) {
217 return;
218 }
219 CXFA_FFDoc* hDoc = pNotify->GetHDOC();
220 CFX_WideString wsURL;
221 if (iLength >= 1) {
222 CFX_ByteString bsURL = pArguments->GetUTF8String(0);
223 wsURL = CFX_WideString::FromUTF8(bsURL.AsStringC());
224 }
225 pNotify->GetDocEnvironment()->GotoURL(hDoc, wsURL);
226 }
OpenList(CFXJSE_Arguments * pArguments)227 void CScript_HostPseudoModel::OpenList(CFXJSE_Arguments* pArguments) {
228 if (!m_pDocument->GetScriptContext()->IsRunAtClient()) {
229 return;
230 }
231 int32_t iLength = pArguments->GetLength();
232 if (iLength != 1) {
233 ThrowParamCountMismatchException(L"openList");
234 return;
235 }
236 CXFA_FFNotify* pNotify = m_pDocument->GetNotify();
237 if (!pNotify) {
238 return;
239 }
240 CXFA_Node* pNode = nullptr;
241 if (iLength >= 1) {
242 std::unique_ptr<CFXJSE_Value> pValue(pArguments->GetValue(0));
243 if (pValue->IsObject()) {
244 pNode = ToNode(pValue.get(), nullptr);
245 } else if (pValue->IsString()) {
246 CXFA_ScriptContext* pScriptContext = m_pDocument->GetScriptContext();
247 if (!pScriptContext)
248 return;
249
250 CXFA_Object* pObject = pScriptContext->GetThisObject();
251 if (!pObject)
252 return;
253
254 uint32_t dwFlag = XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Parent |
255 XFA_RESOLVENODE_Siblings;
256 XFA_RESOLVENODE_RS resoveNodeRS;
257 int32_t iRet = pScriptContext->ResolveObjects(
258 pObject, pValue->ToWideString().AsStringC(), resoveNodeRS, dwFlag);
259 if (iRet < 1 || !resoveNodeRS.nodes[0]->IsNode())
260 return;
261
262 pNode = resoveNodeRS.nodes[0]->AsNode();
263 }
264 }
265 CXFA_LayoutProcessor* pDocLayout = m_pDocument->GetDocLayout();
266 if (!pDocLayout) {
267 return;
268 }
269 CXFA_FFWidget* hWidget =
270 pNotify->GetHWidget(pDocLayout->GetLayoutItem(pNode));
271 if (!hWidget) {
272 return;
273 }
274 pNotify->GetDocEnvironment()->SetFocusWidget(pNotify->GetHDOC(), hWidget);
275 pNotify->OpenDropDownList(hWidget);
276 }
Response(CFXJSE_Arguments * pArguments)277 void CScript_HostPseudoModel::Response(CFXJSE_Arguments* pArguments) {
278 int32_t iLength = pArguments->GetLength();
279 if (iLength < 1 || iLength > 4) {
280 ThrowParamCountMismatchException(L"response");
281 return;
282 }
283 CXFA_FFNotify* pNotify = m_pDocument->GetNotify();
284 if (!pNotify) {
285 return;
286 }
287 CFX_WideString wsQuestion;
288 CFX_WideString wsTitle;
289 CFX_WideString wsDefaultAnswer;
290 bool bMark = false;
291 if (iLength >= 1) {
292 CFX_ByteString bsQuestion = pArguments->GetUTF8String(0);
293 wsQuestion = CFX_WideString::FromUTF8(bsQuestion.AsStringC());
294 }
295 if (iLength >= 2) {
296 CFX_ByteString bsTitle = pArguments->GetUTF8String(1);
297 wsTitle = CFX_WideString::FromUTF8(bsTitle.AsStringC());
298 }
299 if (iLength >= 3) {
300 CFX_ByteString bsDefaultAnswer = pArguments->GetUTF8String(2);
301 wsDefaultAnswer = CFX_WideString::FromUTF8(bsDefaultAnswer.AsStringC());
302 }
303 if (iLength >= 4) {
304 bMark = pArguments->GetInt32(3) == 0 ? false : true;
305 }
306 CFX_WideString wsAnswer = pNotify->GetAppProvider()->Response(
307 wsQuestion, wsTitle, wsDefaultAnswer, bMark);
308 CFXJSE_Value* pValue = pArguments->GetReturnValue();
309 if (pValue)
310 pValue->SetString(wsAnswer.UTF8Encode().AsStringC());
311 }
312
DocumentInBatch(CFXJSE_Arguments * pArguments)313 void CScript_HostPseudoModel::DocumentInBatch(CFXJSE_Arguments* pArguments) {
314 if (CFXJSE_Value* pValue = pArguments->GetReturnValue())
315 pValue->SetInteger(0);
316 }
XFA_FilterName(const CFX_WideStringC & wsExpression,int32_t nStart,CFX_WideString & wsFilter)317 static int32_t XFA_FilterName(const CFX_WideStringC& wsExpression,
318 int32_t nStart,
319 CFX_WideString& wsFilter) {
320 ASSERT(nStart > -1);
321 int32_t iLength = wsExpression.GetLength();
322 if (nStart >= iLength) {
323 return iLength;
324 }
325 FX_WCHAR* pBuf = wsFilter.GetBuffer(iLength - nStart);
326 int32_t nCount = 0;
327 const FX_WCHAR* pSrc = wsExpression.c_str();
328 FX_WCHAR wCur;
329 while (nStart < iLength) {
330 wCur = pSrc[nStart++];
331 if (wCur == ',') {
332 break;
333 }
334 pBuf[nCount++] = wCur;
335 }
336 wsFilter.ReleaseBuffer(nCount);
337 wsFilter.TrimLeft();
338 wsFilter.TrimRight();
339 return nStart;
340 }
ResetData(CFXJSE_Arguments * pArguments)341 void CScript_HostPseudoModel::ResetData(CFXJSE_Arguments* pArguments) {
342 int32_t iLength = pArguments->GetLength();
343 if (iLength < 0 || iLength > 1) {
344 ThrowParamCountMismatchException(L"resetData");
345 return;
346 }
347 CXFA_FFNotify* pNotify = m_pDocument->GetNotify();
348 if (!pNotify) {
349 return;
350 }
351 CFX_WideString wsExpression;
352 if (iLength >= 1) {
353 CFX_ByteString bsExpression = pArguments->GetUTF8String(0);
354 wsExpression = CFX_WideString::FromUTF8(bsExpression.AsStringC());
355 }
356 if (wsExpression.IsEmpty()) {
357 pNotify->ResetData();
358 return;
359 }
360 int32_t iStart = 0;
361 CFX_WideString wsName;
362 CXFA_Node* pNode = nullptr;
363 int32_t iExpLength = wsExpression.GetLength();
364 while (iStart < iExpLength) {
365 iStart = XFA_FilterName(wsExpression.AsStringC(), iStart, wsName);
366 CXFA_ScriptContext* pScriptContext = m_pDocument->GetScriptContext();
367 if (!pScriptContext) {
368 return;
369 }
370 CXFA_Object* pObject = pScriptContext->GetThisObject();
371 if (!pObject) {
372 return;
373 }
374 uint32_t dwFlag = XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Parent |
375 XFA_RESOLVENODE_Siblings;
376 XFA_RESOLVENODE_RS resoveNodeRS;
377 int32_t iRet = pScriptContext->ResolveObjects(pObject, wsName.AsStringC(),
378 resoveNodeRS, dwFlag);
379 if (iRet < 1 || !resoveNodeRS.nodes[0]->IsNode()) {
380 continue;
381 }
382 pNode = resoveNodeRS.nodes[0]->AsNode();
383 pNotify->ResetData(pNode->GetWidgetData());
384 }
385 if (!pNode) {
386 pNotify->ResetData();
387 }
388 }
Beep(CFXJSE_Arguments * pArguments)389 void CScript_HostPseudoModel::Beep(CFXJSE_Arguments* pArguments) {
390 if (!m_pDocument->GetScriptContext()->IsRunAtClient()) {
391 return;
392 }
393 int32_t iLength = pArguments->GetLength();
394 if (iLength < 0 || iLength > 1) {
395 ThrowParamCountMismatchException(L"beep");
396 return;
397 }
398 CXFA_FFNotify* pNotify = m_pDocument->GetNotify();
399 if (!pNotify) {
400 return;
401 }
402 uint32_t dwType = 4;
403 if (iLength >= 1) {
404 dwType = pArguments->GetInt32(0);
405 }
406 pNotify->GetAppProvider()->Beep(dwType);
407 }
SetFocus(CFXJSE_Arguments * pArguments)408 void CScript_HostPseudoModel::SetFocus(CFXJSE_Arguments* pArguments) {
409 if (!m_pDocument->GetScriptContext()->IsRunAtClient()) {
410 return;
411 }
412 int32_t iLength = pArguments->GetLength();
413 if (iLength != 1) {
414 ThrowParamCountMismatchException(L"setFocus");
415 return;
416 }
417 CXFA_FFNotify* pNotify = m_pDocument->GetNotify();
418 if (!pNotify) {
419 return;
420 }
421 CXFA_Node* pNode = nullptr;
422 if (iLength >= 1) {
423 std::unique_ptr<CFXJSE_Value> pValue(pArguments->GetValue(0));
424 if (pValue->IsObject()) {
425 pNode = ToNode(pValue.get(), nullptr);
426 } else if (pValue->IsString()) {
427 CXFA_ScriptContext* pScriptContext = m_pDocument->GetScriptContext();
428 if (!pScriptContext)
429 return;
430
431 CXFA_Object* pObject = pScriptContext->GetThisObject();
432 if (!pObject)
433 return;
434
435 uint32_t dwFlag = XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Parent |
436 XFA_RESOLVENODE_Siblings;
437 XFA_RESOLVENODE_RS resoveNodeRS;
438 int32_t iRet = pScriptContext->ResolveObjects(
439 pObject, pValue->ToWideString().AsStringC(), resoveNodeRS, dwFlag);
440 if (iRet < 1 || !resoveNodeRS.nodes[0]->IsNode())
441 return;
442
443 pNode = resoveNodeRS.nodes[0]->AsNode();
444 }
445 }
446 pNotify->SetFocusWidgetNode(pNode);
447 }
448
GetFocus(CFXJSE_Arguments * pArguments)449 void CScript_HostPseudoModel::GetFocus(CFXJSE_Arguments* pArguments) {
450 CXFA_FFNotify* pNotify = m_pDocument->GetNotify();
451 if (!pNotify) {
452 return;
453 }
454 CXFA_Node* pNode = pNotify->GetFocusWidgetNode();
455 if (!pNode) {
456 return;
457 }
458 pArguments->GetReturnValue()->Assign(
459 m_pDocument->GetScriptContext()->GetJSValueFromMap(pNode));
460 }
MessageBox(CFXJSE_Arguments * pArguments)461 void CScript_HostPseudoModel::MessageBox(CFXJSE_Arguments* pArguments) {
462 if (!m_pDocument->GetScriptContext()->IsRunAtClient()) {
463 return;
464 }
465 int32_t iLength = pArguments->GetLength();
466 if (iLength < 1 || iLength > 4) {
467 ThrowParamCountMismatchException(L"messageBox");
468 return;
469 }
470 CXFA_FFNotify* pNotify = m_pDocument->GetNotify();
471 if (!pNotify) {
472 return;
473 }
474 CFX_WideString wsMessage;
475 CFX_WideString bsTitle;
476 uint32_t dwMessageType = XFA_MBICON_Error;
477 uint32_t dwButtonType = XFA_MB_OK;
478 if (iLength >= 1) {
479 if (!ValidateArgsForMsg(pArguments, 0, wsMessage)) {
480 return;
481 }
482 }
483 if (iLength >= 2) {
484 if (!ValidateArgsForMsg(pArguments, 1, bsTitle)) {
485 return;
486 }
487 }
488 if (iLength >= 3) {
489 dwMessageType = pArguments->GetInt32(2);
490 if (dwMessageType > XFA_MBICON_Status) {
491 dwMessageType = XFA_MBICON_Error;
492 }
493 }
494 if (iLength >= 4) {
495 dwButtonType = pArguments->GetInt32(3);
496 if (dwButtonType > XFA_MB_YesNoCancel) {
497 dwButtonType = XFA_MB_OK;
498 }
499 }
500 int32_t iValue = pNotify->GetAppProvider()->MsgBox(
501 wsMessage, bsTitle, dwMessageType, dwButtonType);
502 CFXJSE_Value* pValue = pArguments->GetReturnValue();
503 if (pValue)
504 pValue->SetInteger(iValue);
505 }
ValidateArgsForMsg(CFXJSE_Arguments * pArguments,int32_t iArgIndex,CFX_WideString & wsValue)506 bool CScript_HostPseudoModel::ValidateArgsForMsg(CFXJSE_Arguments* pArguments,
507 int32_t iArgIndex,
508 CFX_WideString& wsValue) {
509 if (!pArguments || iArgIndex < 0) {
510 return false;
511 }
512 bool bIsJsType = false;
513 if (m_pDocument->GetScriptContext()->GetType() ==
514 XFA_SCRIPTLANGTYPE_Javascript) {
515 bIsJsType = true;
516 }
517 std::unique_ptr<CFXJSE_Value> pValueArg(pArguments->GetValue(iArgIndex));
518 if (!pValueArg->IsString() && bIsJsType) {
519 ThrowArgumentMismatchException();
520 return false;
521 }
522 if (pValueArg->IsNull()) {
523 wsValue = L"";
524 } else {
525 wsValue = pValueArg->ToWideString();
526 }
527 return true;
528 }
DocumentCountInBatch(CFXJSE_Arguments * pArguments)529 void CScript_HostPseudoModel::DocumentCountInBatch(
530 CFXJSE_Arguments* pArguments) {
531 if (CFXJSE_Value* pValue = pArguments->GetReturnValue())
532 pValue->SetInteger(0);
533 }
Print(CFXJSE_Arguments * pArguments)534 void CScript_HostPseudoModel::Print(CFXJSE_Arguments* pArguments) {
535 if (!m_pDocument->GetScriptContext()->IsRunAtClient()) {
536 return;
537 }
538 int32_t iLength = pArguments->GetLength();
539 if (iLength != 8) {
540 ThrowParamCountMismatchException(L"print");
541 return;
542 }
543 CXFA_FFNotify* pNotify = m_pDocument->GetNotify();
544 if (!pNotify) {
545 return;
546 }
547 CXFA_FFDoc* hDoc = pNotify->GetHDOC();
548 uint32_t dwOptions = 0;
549 bool bShowDialog = true;
550 if (iLength >= 1) {
551 bShowDialog = pArguments->GetInt32(0) == 0 ? false : true;
552 }
553 if (bShowDialog) {
554 dwOptions |= XFA_PRINTOPT_ShowDialog;
555 }
556 int32_t nStartPage = 0;
557 if (iLength >= 2) {
558 nStartPage = pArguments->GetInt32(1);
559 }
560 int32_t nEndPage = 0;
561 if (iLength >= 3) {
562 nEndPage = pArguments->GetInt32(2);
563 }
564 bool bCanCancel = true;
565 if (iLength >= 4) {
566 bCanCancel = pArguments->GetInt32(3) == 0 ? false : true;
567 }
568 if (bCanCancel) {
569 dwOptions |= XFA_PRINTOPT_CanCancel;
570 }
571 bool bShrinkPage = true;
572 if (iLength >= 5) {
573 bShrinkPage = pArguments->GetInt32(4) == 0 ? false : true;
574 }
575 if (bShrinkPage) {
576 dwOptions |= XFA_PRINTOPT_ShrinkPage;
577 }
578 bool bAsImage = true;
579 if (iLength >= 6) {
580 bAsImage = pArguments->GetInt32(5) == 0 ? false : true;
581 }
582 if (bAsImage) {
583 dwOptions |= XFA_PRINTOPT_AsImage;
584 }
585 bool bReverseOrder = true;
586 if (iLength >= 7) {
587 bAsImage = pArguments->GetInt32(5) == 0 ? false : true;
588 }
589 bReverseOrder = pArguments->GetInt32(6) == 0 ? false : true;
590 if (bReverseOrder) {
591 dwOptions |= XFA_PRINTOPT_ReverseOrder;
592 }
593 bool bPrintAnnot = true;
594 if (iLength >= 8) {
595 bPrintAnnot = pArguments->GetInt32(7) == 0 ? false : true;
596 }
597 if (bPrintAnnot) {
598 dwOptions |= XFA_PRINTOPT_PrintAnnot;
599 }
600 pNotify->GetDocEnvironment()->Print(hDoc, nStartPage, nEndPage, dwOptions);
601 }
602
ImportData(CFXJSE_Arguments * pArguments)603 void CScript_HostPseudoModel::ImportData(CFXJSE_Arguments* pArguments) {
604 int32_t iLength = pArguments->GetLength();
605 if (iLength < 0 || iLength > 1) {
606 ThrowParamCountMismatchException(L"importData");
607 return;
608 }
609 // Not implemented.
610 }
611
ExportData(CFXJSE_Arguments * pArguments)612 void CScript_HostPseudoModel::ExportData(CFXJSE_Arguments* pArguments) {
613 int32_t iLength = pArguments->GetLength();
614 if (iLength < 0 || iLength > 2) {
615 ThrowParamCountMismatchException(L"exportData");
616 return;
617 }
618 CXFA_FFNotify* pNotify = m_pDocument->GetNotify();
619 if (!pNotify) {
620 return;
621 }
622 CXFA_FFDoc* hDoc = pNotify->GetHDOC();
623 CFX_WideString wsFilePath;
624 bool bXDP = true;
625 if (iLength >= 1) {
626 CFX_ByteString bsFilePath = pArguments->GetUTF8String(0);
627 wsFilePath = CFX_WideString::FromUTF8(bsFilePath.AsStringC());
628 }
629 if (iLength >= 2) {
630 bXDP = pArguments->GetInt32(1) == 0 ? false : true;
631 }
632 pNotify->GetDocEnvironment()->ExportData(hDoc, wsFilePath, bXDP);
633 }
634
PageUp(CFXJSE_Arguments * pArguments)635 void CScript_HostPseudoModel::PageUp(CFXJSE_Arguments* pArguments) {
636 CXFA_FFNotify* pNotify = m_pDocument->GetNotify();
637 if (!pNotify) {
638 return;
639 }
640 CXFA_FFDoc* hDoc = pNotify->GetHDOC();
641 int32_t nCurPage = pNotify->GetDocEnvironment()->GetCurrentPage(hDoc);
642 int32_t nNewPage = 0;
643 if (nCurPage <= 1) {
644 return;
645 }
646 nNewPage = nCurPage - 1;
647 pNotify->GetDocEnvironment()->SetCurrentPage(hDoc, nNewPage);
648 }
649
PageDown(CFXJSE_Arguments * pArguments)650 void CScript_HostPseudoModel::PageDown(CFXJSE_Arguments* pArguments) {
651 CXFA_FFNotify* pNotify = m_pDocument->GetNotify();
652 if (!pNotify) {
653 return;
654 }
655 CXFA_FFDoc* hDoc = pNotify->GetHDOC();
656 int32_t nCurPage = pNotify->GetDocEnvironment()->GetCurrentPage(hDoc);
657 int32_t nPageCount = pNotify->GetDocEnvironment()->CountPages(hDoc);
658 if (!nPageCount || nCurPage == nPageCount) {
659 return;
660 }
661 int32_t nNewPage = 0;
662 if (nCurPage >= nPageCount) {
663 nNewPage = nPageCount - 1;
664 } else {
665 nNewPage = nCurPage + 1;
666 }
667 pNotify->GetDocEnvironment()->SetCurrentPage(hDoc, nNewPage);
668 }
669
CurrentDateTime(CFXJSE_Arguments * pArguments)670 void CScript_HostPseudoModel::CurrentDateTime(CFXJSE_Arguments* pArguments) {
671 CXFA_FFNotify* pNotify = m_pDocument->GetNotify();
672 if (!pNotify) {
673 return;
674 }
675 CFX_WideString wsDataTime = pNotify->GetCurrentDateTime();
676 CFXJSE_Value* pValue = pArguments->GetReturnValue();
677 if (pValue)
678 pValue->SetString(wsDataTime.UTF8Encode().AsStringC());
679 }
680
ThrowSetLanguageException() const681 void CScript_HostPseudoModel::ThrowSetLanguageException() const {
682 ThrowException(L"Unable to set language value.");
683 }
684
ThrowSetNumPagesException() const685 void CScript_HostPseudoModel::ThrowSetNumPagesException() const {
686 ThrowException(L"Unable to set numPages value.");
687 }
688
ThrowSetPlatformException() const689 void CScript_HostPseudoModel::ThrowSetPlatformException() const {
690 ThrowException(L"Unable to set platform value.");
691 }
692
ThrowSetVariationException() const693 void CScript_HostPseudoModel::ThrowSetVariationException() const {
694 ThrowException(L"Unable to set variation value.");
695 }
696
ThrowSetVersionException() const697 void CScript_HostPseudoModel::ThrowSetVersionException() const {
698 ThrowException(L"Unable to set version value.");
699 }
700