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