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
21namespace {
22
23CXFA_Node* ToNode(CFXJSE_Value* pValue, CFXJSE_Class* pClass) {
24  return static_cast<CXFA_Node*>(pValue->ToHostObject(pClass));
25}
26
27}  // namespace
28
29CScript_HostPseudoModel::CScript_HostPseudoModel(CXFA_Document* pDocument)
30    : CXFA_Object(pDocument,
31                  XFA_ObjectType::Object,
32                  XFA_Element::HostPseudoModel,
33                  CFX_WideStringC(L"hostPseudoModel")) {}
34
35CScript_HostPseudoModel::~CScript_HostPseudoModel() {}
36
37void 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
50void 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
66void 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
81void 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
95void 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
110void 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
124void 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
144void 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
161void 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
177void 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
191void 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
206void 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}
227void 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}
277void 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
313void CScript_HostPseudoModel::DocumentInBatch(CFXJSE_Arguments* pArguments) {
314  if (CFXJSE_Value* pValue = pArguments->GetReturnValue())
315    pValue->SetInteger(0);
316}
317static 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}
341void 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}
389void 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}
408void 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
449void 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}
461void 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}
506bool 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}
529void CScript_HostPseudoModel::DocumentCountInBatch(
530    CFXJSE_Arguments* pArguments) {
531  if (CFXJSE_Value* pValue = pArguments->GetReturnValue())
532    pValue->SetInteger(0);
533}
534void 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
603void 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
612void 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
635void 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
650void 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
670void 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
681void CScript_HostPseudoModel::ThrowSetLanguageException() const {
682  ThrowException(L"Unable to set language value.");
683}
684
685void CScript_HostPseudoModel::ThrowSetNumPagesException() const {
686  ThrowException(L"Unable to set numPages value.");
687}
688
689void CScript_HostPseudoModel::ThrowSetPlatformException() const {
690  ThrowException(L"Unable to set platform value.");
691}
692
693void CScript_HostPseudoModel::ThrowSetVariationException() const {
694  ThrowException(L"Unable to set variation value.");
695}
696
697void CScript_HostPseudoModel::ThrowSetVersionException() const {
698  ThrowException(L"Unable to set version value.");
699}
700