OLD | NEW |
| (Empty) |
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/fxfa/fm2js/xfa_simpleexpression.h" | |
8 | |
9 #include "core/include/fxcrt/fx_ext.h" | |
10 | |
11 namespace { | |
12 | |
13 const CFX_WideStringC gs_lpStrExpFuncName[] = { | |
14 FX_WSTRC(L"foxit_xfa_formcalc_runtime.assign_value_operator"), | |
15 FX_WSTRC(L"foxit_xfa_formcalc_runtime.logical_or_operator"), | |
16 FX_WSTRC(L"foxit_xfa_formcalc_runtime.logical_and_operator"), | |
17 FX_WSTRC(L"foxit_xfa_formcalc_runtime.equality_operator"), | |
18 FX_WSTRC(L"foxit_xfa_formcalc_runtime.notequality_operator"), | |
19 FX_WSTRC(L"foxit_xfa_formcalc_runtime.less_operator"), | |
20 FX_WSTRC(L"foxit_xfa_formcalc_runtime.lessequal_operator"), | |
21 FX_WSTRC(L"foxit_xfa_formcalc_runtime.greater_operator"), | |
22 FX_WSTRC(L"foxit_xfa_formcalc_runtime.greaterequal_operator"), | |
23 FX_WSTRC(L"foxit_xfa_formcalc_runtime.plus_operator"), | |
24 FX_WSTRC(L"foxit_xfa_formcalc_runtime.minus_operator"), | |
25 FX_WSTRC(L"foxit_xfa_formcalc_runtime.multiple_operator"), | |
26 FX_WSTRC(L"foxit_xfa_formcalc_runtime.divide_operator"), | |
27 FX_WSTRC(L"foxit_xfa_formcalc_runtime.positive_operator"), | |
28 FX_WSTRC(L"foxit_xfa_formcalc_runtime.negative_operator"), | |
29 FX_WSTRC(L"foxit_xfa_formcalc_runtime.logical_not_operator"), | |
30 FX_WSTRC(L"foxit_xfa_formcalc_runtime."), | |
31 FX_WSTRC(L"foxit_xfa_formcalc_runtime.dot_accessor"), | |
32 FX_WSTRC(L"foxit_xfa_formcalc_runtime.dotdot_accessor"), | |
33 FX_WSTRC(L"foxit_xfa_formcalc_runtime.concat_fm_object"), | |
34 FX_WSTRC(L"foxit_xfa_formcalc_runtime.is_fm_object"), | |
35 FX_WSTRC(L"foxit_xfa_formcalc_runtime.is_fm_array"), | |
36 FX_WSTRC(L"foxit_xfa_formcalc_runtime.get_fm_value"), | |
37 FX_WSTRC(L"foxit_xfa_formcalc_runtime.get_fm_jsobj"), | |
38 FX_WSTRC(L"foxit_xfa_formcalc_runtime.fm_var_filter"), | |
39 }; | |
40 | |
41 struct XFA_FMBuildInFunc { | |
42 uint32_t m_uHash; | |
43 const FX_WCHAR* m_buildinfunc; | |
44 }; | |
45 const XFA_FMBuildInFunc g_BuildInFuncs[] = { | |
46 {0x0001f1f5, L"At"}, {0x00020b9c, L"FV"}, | |
47 {0x00021aef, L"If"}, {0x00023ee6, L"PV"}, | |
48 {0x04b5c9ee, L"Encode"}, {0x08e96685, L"DateFmt"}, | |
49 {0x09f99db6, L"Abs"}, {0x09f9e583, L"Apr"}, | |
50 {0x09fa043e, L"Avg"}, {0x0a9782a0, L"Get"}, | |
51 {0x0b1b09df, L"Len"}, {0x0b3543a6, L"Max"}, | |
52 {0x0b356ca4, L"Min"}, {0x0b358b60, L"Mod"}, | |
53 {0x0b4fded4, L"NPV"}, {0x0b846bf1, L"Pmt"}, | |
54 {0x0b8494f9, L"Put"}, {0x0bb8df5d, L"Ref"}, | |
55 {0x0bd37a99, L"Str"}, {0x0bd37fb5, L"Sum"}, | |
56 {0x1048469b, L"Cterm"}, {0x11e03660, L"Exists"}, | |
57 {0x126236e6, L"Post"}, {0x127c6661, L"PPmt"}, | |
58 {0x193ade3e, L"Right"}, {0x1ec8ab2c, L"Rate"}, | |
59 {0x20e476dc, L"IsoTime2Num"}, {0x23eb6816, L"TimeFmt"}, | |
60 {0x24fb17b0, L"LocalDateFmt"}, {0x28dee6e9, L"Format"}, | |
61 {0x2d0890b8, L"Term"}, {0x2d71b00f, L"Time"}, | |
62 {0x2f890fb1, L"Num2Time"}, {0x3767511d, L"Ceil"}, | |
63 {0x3ffd1941, L"LocalTimeFmt"}, {0x442f68c8, L"Round"}, | |
64 {0x46fd1128, L"Eval"}, {0x4d629440, L"Date2Num"}, | |
65 {0x4dcf25f8, L"Concat"}, {0x4e00255d, L"UnitValue"}, | |
66 {0x55a5cc29, L"Lower"}, {0x5e43e04c, L"WordNum"}, | |
67 {0x620ce6ba, L"Ipmt"}, {0x6f544d49, L"Count"}, | |
68 {0x7e241013, L"Within"}, {0x9b9a6e2b, L"IsoDate2Num"}, | |
69 {0xb2c941c2, L"UnitType"}, {0xb598a1f7, L"Uuid"}, | |
70 {0xbde9abde, L"Date"}, {0xc0010b80, L"Num2Date"}, | |
71 {0xc1f6144c, L"Upper"}, {0xc44028f7, L"Oneof"}, | |
72 {0xc62c1b2c, L"Space"}, {0xd0ff50f9, L"HasValue"}, | |
73 {0xd1537042, L"Floor"}, {0xd2ac9cf1, L"Time2Num"}, | |
74 {0xd907aee5, L"Num2GMTime"}, {0xdf24f7c4, L"Decode"}, | |
75 {0xe2664803, L"Substr"}, {0xe3e7b528, L"Stuff"}, | |
76 {0xe6792d4e, L"Rtrim"}, {0xe8c23f5b, L"Parse"}, | |
77 {0xea18d121, L"Choose"}, {0xebfef69c, L"Replace"}, | |
78 {0xf5ad782b, L"Left"}, {0xf7bb2248, L"Ltrim"}, | |
79 }; | |
80 | |
81 struct XFA_FMSOMMethod { | |
82 uint32_t m_uHash; | |
83 const FX_WCHAR* m_wsSomMethodName; | |
84 FX_DWORD m_dParameters; | |
85 }; | |
86 const XFA_FMSOMMethod gs_FMSomMethods[] = { | |
87 {0x00000068, L"h", 0x01}, | |
88 {0x00000077, L"w", 0x01}, | |
89 {0x00000078, L"x", 0x01}, | |
90 {0x00000079, L"y", 0x01}, | |
91 {0x05eb5b0f, L"pageSpan", 0x01}, | |
92 {0x10f1b1bd, L"page", 0x01}, | |
93 {0x3bf1c2a5, L"absPageSpan", 0x01}, | |
94 {0x3c752495, L"verify", 0x0d}, | |
95 {0x44c352ad, L"formNodes", 0x01}, | |
96 {0x5775c2cc, L"absPageInBatch", 0x01}, | |
97 {0x5ee00996, L"setElement", 0x01}, | |
98 {0x7033bfd5, L"insert", 0x03}, | |
99 {0x8c5feb32, L"sheetInBatch", 0x01}, | |
100 {0x8f3a8379, L"sheet", 0x01}, | |
101 {0x92dada4f, L"saveFilteredXML", 0x01}, | |
102 {0x9cab7cae, L"remove", 0x01}, | |
103 {0xa68635f1, L"sign", 0x61}, | |
104 {0xaac241c8, L"isRecordGroup", 0x01}, | |
105 {0xd8ed1467, L"clear", 0x01}, | |
106 {0xda12e518, L"append", 0x01}, | |
107 {0xe74f0653, L"absPage", 0x01}, | |
108 }; | |
109 | |
110 } // namespace | |
111 | |
112 CFX_WideStringC XFA_FM_EXPTypeToString( | |
113 XFA_FM_SimpleExpressionType simpleExpType) { | |
114 return gs_lpStrExpFuncName[simpleExpType]; | |
115 } | |
116 | |
117 CXFA_FMSimpleExpression::CXFA_FMSimpleExpression(FX_DWORD line, XFA_FM_TOKEN op) | |
118 : m_line(line), m_op(op) {} | |
119 | |
120 void CXFA_FMSimpleExpression::ToJavaScript(CFX_WideTextBuf& javascript) {} | |
121 | |
122 void CXFA_FMSimpleExpression::ToImpliedReturnJS(CFX_WideTextBuf& javascript) {} | |
123 | |
124 XFA_FM_TOKEN CXFA_FMSimpleExpression::GetOperatorToken() const { | |
125 return m_op; | |
126 } | |
127 | |
128 CXFA_FMNullExpression::CXFA_FMNullExpression(FX_DWORD line) | |
129 : CXFA_FMSimpleExpression(line, TOKnull) {} | |
130 | |
131 void CXFA_FMNullExpression::ToJavaScript(CFX_WideTextBuf& javascript) { | |
132 javascript << FX_WSTRC(L"null"); | |
133 } | |
134 | |
135 CXFA_FMNumberExpression::CXFA_FMNumberExpression(FX_DWORD line, | |
136 CFX_WideStringC wsNumber) | |
137 : CXFA_FMSimpleExpression(line, TOKnumber), m_wsNumber(wsNumber) {} | |
138 | |
139 void CXFA_FMNumberExpression::ToJavaScript(CFX_WideTextBuf& javascript) { | |
140 javascript << m_wsNumber; | |
141 } | |
142 | |
143 CXFA_FMStringExpression::CXFA_FMStringExpression(FX_DWORD line, | |
144 CFX_WideStringC wsString) | |
145 : CXFA_FMSimpleExpression(line, TOKstring), m_wsString(wsString) {} | |
146 | |
147 void CXFA_FMStringExpression::ToJavaScript(CFX_WideTextBuf& javascript) { | |
148 CFX_WideString tempStr = m_wsString; | |
149 if (tempStr.GetLength() > 2) { | |
150 javascript.AppendChar(L'\"'); | |
151 FX_WCHAR oneChar; | |
152 for (int16_t i = 1; i < tempStr.GetLength() - 1; i++) { | |
153 oneChar = tempStr[i]; | |
154 switch (oneChar) { | |
155 case L'\"': { | |
156 i++; | |
157 javascript << FX_WSTRC(L"\\\""); | |
158 } break; | |
159 case 0x0d: | |
160 break; | |
161 case 0x0a: { | |
162 javascript << FX_WSTRC(L"\\n"); | |
163 } break; | |
164 default: { javascript.AppendChar(oneChar); } break; | |
165 } | |
166 } | |
167 javascript.AppendChar(L'\"'); | |
168 } else { | |
169 javascript << tempStr; | |
170 } | |
171 } | |
172 | |
173 CXFA_FMIdentifierExpressionn::CXFA_FMIdentifierExpressionn( | |
174 FX_DWORD line, | |
175 CFX_WideStringC wsIdentifier) | |
176 : CXFA_FMSimpleExpression(line, TOKidentifier), | |
177 m_wsIdentifier(wsIdentifier) {} | |
178 | |
179 void CXFA_FMIdentifierExpressionn::ToJavaScript(CFX_WideTextBuf& javascript) { | |
180 CFX_WideString tempStr = m_wsIdentifier; | |
181 if (tempStr.Equal(FX_WSTRC(L"$"))) { | |
182 tempStr = FX_WSTRC(L"this"); | |
183 } else if (tempStr.Equal(FX_WSTRC(L"!"))) { | |
184 tempStr = FX_WSTRC(L"xfa.datasets"); | |
185 } else if (tempStr.Equal(FX_WSTRC(L"$data"))) { | |
186 tempStr = FX_WSTRC(L"xfa.datasets.data"); | |
187 } else if (tempStr.Equal(FX_WSTRC(L"$event"))) { | |
188 tempStr = FX_WSTRC(L"xfa.event"); | |
189 } else if (tempStr.Equal(FX_WSTRC(L"$form"))) { | |
190 tempStr = FX_WSTRC(L"xfa.form"); | |
191 } else if (tempStr.Equal(FX_WSTRC(L"$host"))) { | |
192 tempStr = FX_WSTRC(L"xfa.host"); | |
193 } else if (tempStr.Equal(FX_WSTRC(L"$layout"))) { | |
194 tempStr = FX_WSTRC(L"xfa.layout"); | |
195 } else if (tempStr.Equal(FX_WSTRC(L"$template"))) { | |
196 tempStr = FX_WSTRC(L"xfa.template"); | |
197 } else if (tempStr[0] == L'!') { | |
198 tempStr = EXCLAMATION_IN_IDENTIFIER + tempStr.Mid(1); | |
199 } | |
200 javascript << tempStr; | |
201 } | |
202 | |
203 CXFA_FMUnaryExpression::CXFA_FMUnaryExpression(FX_DWORD line, | |
204 XFA_FM_TOKEN op, | |
205 CXFA_FMSimpleExpression* pExp) | |
206 : CXFA_FMSimpleExpression(line, op), m_pExp(pExp) {} | |
207 | |
208 void CXFA_FMUnaryExpression::ToJavaScript(CFX_WideTextBuf& javascript) {} | |
209 | |
210 CXFA_FMBinExpression::CXFA_FMBinExpression(FX_DWORD line, | |
211 XFA_FM_TOKEN op, | |
212 CXFA_FMSimpleExpression* pExp1, | |
213 CXFA_FMSimpleExpression* pExp2) | |
214 : CXFA_FMSimpleExpression(line, op), m_pExp1(pExp1), m_pExp2(pExp2) {} | |
215 | |
216 void CXFA_FMBinExpression::ToJavaScript(CFX_WideTextBuf& javascript) {} | |
217 | |
218 CXFA_FMAssignExpression::CXFA_FMAssignExpression(FX_DWORD line, | |
219 XFA_FM_TOKEN op, | |
220 CXFA_FMSimpleExpression* pExp1, | |
221 CXFA_FMSimpleExpression* pExp2) | |
222 : CXFA_FMBinExpression(line, op, pExp1, pExp2) {} | |
223 | |
224 void CXFA_FMAssignExpression::ToJavaScript(CFX_WideTextBuf& javascript) { | |
225 javascript << FX_WSTRC(L"if ("); | |
226 javascript << gs_lpStrExpFuncName[ISFMOBJECT]; | |
227 javascript << FX_WSTRC(L"("); | |
228 m_pExp1->ToJavaScript(javascript); | |
229 javascript << FX_WSTRC(L"))\n{\n"); | |
230 javascript << gs_lpStrExpFuncName[ASSIGN]; | |
231 javascript << FX_WSTRC(L"("); | |
232 m_pExp1->ToJavaScript(javascript); | |
233 javascript << FX_WSTRC(L", "); | |
234 m_pExp2->ToJavaScript(javascript); | |
235 javascript << FX_WSTRC(L");\n}\n"); | |
236 CFX_WideTextBuf tempExp1; | |
237 m_pExp1->ToJavaScript(tempExp1); | |
238 if (m_pExp1->GetOperatorToken() == TOKidentifier && | |
239 tempExp1.GetWideString() != FX_WSTRC(L"this")) { | |
240 javascript << FX_WSTRC(L"else\n{\n"); | |
241 javascript << tempExp1; | |
242 javascript << FX_WSTRC(L" = "); | |
243 javascript << gs_lpStrExpFuncName[ASSIGN]; | |
244 javascript << FX_WSTRC(L"("); | |
245 m_pExp1->ToJavaScript(javascript); | |
246 javascript << FX_WSTRC(L", "); | |
247 m_pExp2->ToJavaScript(javascript); | |
248 javascript << FX_WSTRC(L");\n}\n"); | |
249 } | |
250 } | |
251 | |
252 void CXFA_FMAssignExpression::ToImpliedReturnJS(CFX_WideTextBuf& javascript) { | |
253 javascript << FX_WSTRC(L"if ("); | |
254 javascript << gs_lpStrExpFuncName[ISFMOBJECT]; | |
255 javascript << FX_WSTRC(L"("); | |
256 m_pExp1->ToJavaScript(javascript); | |
257 javascript << FX_WSTRC(L"))\n{\n"); | |
258 javascript << RUNTIMEFUNCTIONRETURNVALUE; | |
259 javascript << FX_WSTRC(L" = "); | |
260 javascript << gs_lpStrExpFuncName[ASSIGN]; | |
261 javascript << FX_WSTRC(L"("); | |
262 m_pExp1->ToJavaScript(javascript); | |
263 javascript << FX_WSTRC(L", "); | |
264 m_pExp2->ToJavaScript(javascript); | |
265 javascript << FX_WSTRC(L");\n}\n"); | |
266 CFX_WideTextBuf tempExp1; | |
267 m_pExp1->ToJavaScript(tempExp1); | |
268 if (m_pExp1->GetOperatorToken() == TOKidentifier && | |
269 tempExp1.GetWideString() != FX_WSTRC(L"this")) { | |
270 javascript << FX_WSTRC(L"else\n{\n"); | |
271 javascript << RUNTIMEFUNCTIONRETURNVALUE; | |
272 javascript << FX_WSTRC(L" = "); | |
273 javascript << tempExp1; | |
274 javascript << FX_WSTRC(L" = "); | |
275 javascript << gs_lpStrExpFuncName[ASSIGN]; | |
276 javascript << FX_WSTRC(L"("); | |
277 m_pExp1->ToJavaScript(javascript); | |
278 javascript << FX_WSTRC(L", "); | |
279 m_pExp2->ToJavaScript(javascript); | |
280 javascript << FX_WSTRC(L");\n}\n"); | |
281 } | |
282 } | |
283 | |
284 CXFA_FMLogicalOrExpression::CXFA_FMLogicalOrExpression( | |
285 FX_DWORD line, | |
286 XFA_FM_TOKEN op, | |
287 CXFA_FMSimpleExpression* pExp1, | |
288 CXFA_FMSimpleExpression* pExp2) | |
289 : CXFA_FMBinExpression(line, op, pExp1, pExp2) {} | |
290 | |
291 void CXFA_FMLogicalOrExpression::ToJavaScript(CFX_WideTextBuf& javascript) { | |
292 javascript << gs_lpStrExpFuncName[LOGICALOR]; | |
293 javascript << FX_WSTRC(L"("); | |
294 m_pExp1->ToJavaScript(javascript); | |
295 javascript << FX_WSTRC(L", "); | |
296 m_pExp2->ToJavaScript(javascript); | |
297 javascript << FX_WSTRC(L")"); | |
298 } | |
299 | |
300 CXFA_FMLogicalAndExpression::CXFA_FMLogicalAndExpression( | |
301 FX_DWORD line, | |
302 XFA_FM_TOKEN op, | |
303 CXFA_FMSimpleExpression* pExp1, | |
304 CXFA_FMSimpleExpression* pExp2) | |
305 : CXFA_FMBinExpression(line, op, pExp1, pExp2) {} | |
306 | |
307 void CXFA_FMLogicalAndExpression::ToJavaScript(CFX_WideTextBuf& javascript) { | |
308 javascript << gs_lpStrExpFuncName[LOGICALAND]; | |
309 javascript << FX_WSTRC(L"("); | |
310 m_pExp1->ToJavaScript(javascript); | |
311 javascript << FX_WSTRC(L", "); | |
312 m_pExp2->ToJavaScript(javascript); | |
313 javascript << FX_WSTRC(L")"); | |
314 } | |
315 | |
316 CXFA_FMEqualityExpression::CXFA_FMEqualityExpression( | |
317 FX_DWORD line, | |
318 XFA_FM_TOKEN op, | |
319 CXFA_FMSimpleExpression* pExp1, | |
320 CXFA_FMSimpleExpression* pExp2) | |
321 : CXFA_FMBinExpression(line, op, pExp1, pExp2) {} | |
322 | |
323 void CXFA_FMEqualityExpression::ToJavaScript(CFX_WideTextBuf& javascript) { | |
324 switch (m_op) { | |
325 case TOKeq: | |
326 case TOKkseq: | |
327 javascript << gs_lpStrExpFuncName[EQUALITY]; | |
328 break; | |
329 case TOKne: | |
330 case TOKksne: | |
331 javascript << gs_lpStrExpFuncName[NOTEQUALITY]; | |
332 break; | |
333 default: | |
334 FXSYS_assert(FALSE); | |
335 break; | |
336 } | |
337 javascript << FX_WSTRC(L"("); | |
338 m_pExp1->ToJavaScript(javascript); | |
339 javascript << FX_WSTRC(L", "); | |
340 m_pExp2->ToJavaScript(javascript); | |
341 javascript << FX_WSTRC(L")"); | |
342 } | |
343 | |
344 CXFA_FMRelationalExpression::CXFA_FMRelationalExpression( | |
345 FX_DWORD line, | |
346 XFA_FM_TOKEN op, | |
347 CXFA_FMSimpleExpression* pExp1, | |
348 CXFA_FMSimpleExpression* pExp2) | |
349 : CXFA_FMBinExpression(line, op, pExp1, pExp2) {} | |
350 | |
351 void CXFA_FMRelationalExpression::ToJavaScript(CFX_WideTextBuf& javascript) { | |
352 switch (m_op) { | |
353 case TOKlt: | |
354 case TOKkslt: | |
355 javascript << gs_lpStrExpFuncName[LESS]; | |
356 break; | |
357 case TOKgt: | |
358 case TOKksgt: | |
359 javascript << gs_lpStrExpFuncName[GREATER]; | |
360 break; | |
361 case TOKle: | |
362 case TOKksle: | |
363 javascript << gs_lpStrExpFuncName[LESSEQUAL]; | |
364 break; | |
365 case TOKge: | |
366 case TOKksge: | |
367 javascript << gs_lpStrExpFuncName[GREATEREQUAL]; | |
368 break; | |
369 default: | |
370 FXSYS_assert(FALSE); | |
371 break; | |
372 } | |
373 javascript << FX_WSTRC(L"("); | |
374 m_pExp1->ToJavaScript(javascript); | |
375 javascript << FX_WSTRC(L", "); | |
376 m_pExp2->ToJavaScript(javascript); | |
377 javascript << FX_WSTRC(L")"); | |
378 } | |
379 | |
380 CXFA_FMAdditiveExpression::CXFA_FMAdditiveExpression( | |
381 FX_DWORD line, | |
382 XFA_FM_TOKEN op, | |
383 CXFA_FMSimpleExpression* pExp1, | |
384 CXFA_FMSimpleExpression* pExp2) | |
385 : CXFA_FMBinExpression(line, op, pExp1, pExp2) {} | |
386 | |
387 void CXFA_FMAdditiveExpression::ToJavaScript(CFX_WideTextBuf& javascript) { | |
388 switch (m_op) { | |
389 case TOKplus: | |
390 javascript << gs_lpStrExpFuncName[PLUS]; | |
391 break; | |
392 case TOKminus: | |
393 javascript << gs_lpStrExpFuncName[MINUS]; | |
394 break; | |
395 default: | |
396 FXSYS_assert(FALSE); | |
397 break; | |
398 } | |
399 javascript << FX_WSTRC(L"("); | |
400 m_pExp1->ToJavaScript(javascript); | |
401 javascript << FX_WSTRC(L", "); | |
402 m_pExp2->ToJavaScript(javascript); | |
403 javascript << FX_WSTRC(L")"); | |
404 } | |
405 | |
406 CXFA_FMMultiplicativeExpression::CXFA_FMMultiplicativeExpression( | |
407 FX_DWORD line, | |
408 XFA_FM_TOKEN op, | |
409 CXFA_FMSimpleExpression* pExp1, | |
410 CXFA_FMSimpleExpression* pExp2) | |
411 : CXFA_FMBinExpression(line, op, pExp1, pExp2) {} | |
412 | |
413 void CXFA_FMMultiplicativeExpression::ToJavaScript( | |
414 CFX_WideTextBuf& javascript) { | |
415 switch (m_op) { | |
416 case TOKmul: | |
417 javascript << gs_lpStrExpFuncName[MULTIPLE]; | |
418 break; | |
419 case TOKdiv: | |
420 javascript << gs_lpStrExpFuncName[DIVIDE]; | |
421 break; | |
422 default: | |
423 FXSYS_assert(FALSE); | |
424 break; | |
425 } | |
426 javascript << FX_WSTRC(L"("); | |
427 m_pExp1->ToJavaScript(javascript); | |
428 javascript << FX_WSTRC(L", "); | |
429 m_pExp2->ToJavaScript(javascript); | |
430 javascript << FX_WSTRC(L")"); | |
431 } | |
432 | |
433 CXFA_FMPosExpression::CXFA_FMPosExpression(FX_DWORD line, | |
434 CXFA_FMSimpleExpression* pExp) | |
435 : CXFA_FMUnaryExpression(line, TOKplus, pExp) {} | |
436 | |
437 void CXFA_FMPosExpression::ToJavaScript(CFX_WideTextBuf& javascript) { | |
438 javascript << gs_lpStrExpFuncName[POSITIVE]; | |
439 javascript << FX_WSTRC(L"("); | |
440 m_pExp->ToJavaScript(javascript); | |
441 javascript << FX_WSTRC(L")"); | |
442 } | |
443 | |
444 CXFA_FMNegExpression::CXFA_FMNegExpression(FX_DWORD line, | |
445 CXFA_FMSimpleExpression* pExp) | |
446 : CXFA_FMUnaryExpression(line, TOKminus, pExp) {} | |
447 | |
448 void CXFA_FMNegExpression::ToJavaScript(CFX_WideTextBuf& javascript) { | |
449 javascript << gs_lpStrExpFuncName[NEGATIVE]; | |
450 javascript << FX_WSTRC(L"("); | |
451 m_pExp->ToJavaScript(javascript); | |
452 javascript << FX_WSTRC(L")"); | |
453 } | |
454 | |
455 CXFA_FMNotExpression::CXFA_FMNotExpression(FX_DWORD line, | |
456 CXFA_FMSimpleExpression* pExp) | |
457 : CXFA_FMUnaryExpression(line, TOKksnot, pExp) {} | |
458 | |
459 void CXFA_FMNotExpression::ToJavaScript(CFX_WideTextBuf& javascript) { | |
460 javascript << gs_lpStrExpFuncName[NOT]; | |
461 javascript << FX_WSTRC(L"("); | |
462 m_pExp->ToJavaScript(javascript); | |
463 javascript << FX_WSTRC(L")"); | |
464 } | |
465 | |
466 CXFA_FMCallExpression::CXFA_FMCallExpression(FX_DWORD line, | |
467 CXFA_FMSimpleExpression* pExp, | |
468 CFX_PtrArray* pArguments, | |
469 FX_BOOL bIsSomMethod) | |
470 : CXFA_FMUnaryExpression(line, TOKcall, pExp), | |
471 m_bIsSomMethod(bIsSomMethod), | |
472 m_pArguments(pArguments) {} | |
473 | |
474 CXFA_FMCallExpression::~CXFA_FMCallExpression() { | |
475 if (m_pArguments) { | |
476 for (int i = 0; i < m_pArguments->GetSize(); ++i) { | |
477 delete reinterpret_cast<CXFA_FMSimpleExpression*>(m_pArguments->GetAt(i)); | |
478 } | |
479 m_pArguments->RemoveAll(); | |
480 delete m_pArguments; | |
481 } | |
482 } | |
483 | |
484 bool CXFA_FMCallExpression::IsBuildInFunc(CFX_WideTextBuf* funcName) { | |
485 uint32_t uHash = FX_HashCode_String_GetW(funcName->GetBuffer(), | |
486 funcName->GetLength(), TRUE); | |
487 const XFA_FMBuildInFunc* pEnd = g_BuildInFuncs + FX_ArraySize(g_BuildInFuncs); | |
488 const XFA_FMBuildInFunc* pFunc = | |
489 std::lower_bound(g_BuildInFuncs, pEnd, uHash, | |
490 [](const XFA_FMBuildInFunc& func, uint32_t hash) { | |
491 return func.m_uHash < hash; | |
492 }); | |
493 if (pFunc < pEnd && uHash == pFunc->m_uHash) { | |
494 funcName->Clear(); | |
495 *funcName << pFunc->m_buildinfunc; | |
496 return true; | |
497 } | |
498 return false; | |
499 } | |
500 | |
501 FX_DWORD CXFA_FMCallExpression::IsMethodWithObjParam( | |
502 const CFX_WideStringC& methodName) { | |
503 int32_t iLength = methodName.GetLength(); | |
504 uint32_t uHash = FX_HashCode_String_GetW(methodName.GetPtr(), iLength); | |
505 XFA_FMSOMMethod somMethodWithObjPara; | |
506 FX_DWORD parameters = 0x00; | |
507 int32_t iStart = 0, | |
508 iEnd = (sizeof(gs_FMSomMethods) / sizeof(gs_FMSomMethods[0])) - 1; | |
509 int32_t iMid = (iStart + iEnd) / 2; | |
510 do { | |
511 iMid = (iStart + iEnd) / 2; | |
512 somMethodWithObjPara = gs_FMSomMethods[iMid]; | |
513 if (uHash == somMethodWithObjPara.m_uHash) { | |
514 parameters = somMethodWithObjPara.m_dParameters; | |
515 break; | |
516 } else if (uHash < somMethodWithObjPara.m_uHash) { | |
517 iEnd = iMid - 1; | |
518 } else { | |
519 iStart = iMid + 1; | |
520 } | |
521 } while (iStart <= iEnd); | |
522 return parameters; | |
523 } | |
524 | |
525 void CXFA_FMCallExpression::ToJavaScript(CFX_WideTextBuf& javascript) { | |
526 CFX_WideTextBuf funcName; | |
527 m_pExp->ToJavaScript(funcName); | |
528 if (m_bIsSomMethod) { | |
529 javascript << funcName; | |
530 javascript << FX_WSTRC(L"("); | |
531 if (m_pArguments) { | |
532 FX_DWORD methodPara = IsMethodWithObjParam(funcName.GetWideString()); | |
533 if (methodPara > 0) { | |
534 for (int i = 0; i < m_pArguments->GetSize(); ++i) { | |
535 if ((methodPara & (0x01 << i)) > 0) { | |
536 javascript << gs_lpStrExpFuncName[GETFMJSOBJ]; | |
537 } else { | |
538 javascript << gs_lpStrExpFuncName[GETFMVALUE]; | |
539 } | |
540 javascript << FX_WSTRC(L"("); | |
541 CXFA_FMSimpleExpression* e = | |
542 reinterpret_cast<CXFA_FMSimpleExpression*>( | |
543 m_pArguments->GetAt(i)); | |
544 e->ToJavaScript(javascript); | |
545 javascript << FX_WSTRC(L")"); | |
546 if (i + 1 < m_pArguments->GetSize()) { | |
547 javascript << FX_WSTRC(L", "); | |
548 } | |
549 } | |
550 } else { | |
551 for (int i = 0; i < m_pArguments->GetSize(); ++i) { | |
552 javascript << gs_lpStrExpFuncName[GETFMVALUE]; | |
553 javascript << FX_WSTRC(L"("); | |
554 CXFA_FMSimpleExpression* e = | |
555 reinterpret_cast<CXFA_FMSimpleExpression*>( | |
556 m_pArguments->GetAt(i)); | |
557 e->ToJavaScript(javascript); | |
558 javascript << FX_WSTRC(L")"); | |
559 if (i + 1 < m_pArguments->GetSize()) { | |
560 javascript << FX_WSTRC(L", "); | |
561 } | |
562 } | |
563 } | |
564 } | |
565 javascript << FX_WSTRC(L")"); | |
566 } else { | |
567 bool isEvalFunc = false; | |
568 bool isExistsFunc = false; | |
569 if (IsBuildInFunc(&funcName)) { | |
570 if (funcName.GetWideString() == FX_WSTRC(L"Eval")) { | |
571 isEvalFunc = true; | |
572 javascript << FX_WSTRC(L"eval.call(this, "); | |
573 javascript << gs_lpStrExpFuncName[CALL]; | |
574 javascript << FX_WSTRC(L"Translate"); | |
575 } else if (funcName.GetWideString() == FX_WSTRC(L"Exists")) { | |
576 isExistsFunc = true; | |
577 javascript << gs_lpStrExpFuncName[CALL]; | |
578 javascript << funcName; | |
579 } else { | |
580 javascript << gs_lpStrExpFuncName[CALL]; | |
581 javascript << funcName; | |
582 } | |
583 } else { | |
584 javascript << funcName; | |
585 } | |
586 javascript << FX_WSTRC(L"("); | |
587 if (isExistsFunc) { | |
588 javascript << FX_WSTRC(L"\n(\nfunction ()\n{\ntry\n{\n"); | |
589 if (m_pArguments && m_pArguments->GetSize() > 0) { | |
590 CXFA_FMSimpleExpression* e = | |
591 reinterpret_cast<CXFA_FMSimpleExpression*>(m_pArguments->GetAt(0)); | |
592 javascript << FX_WSTRC(L"return "); | |
593 e->ToJavaScript(javascript); | |
594 javascript << FX_WSTRC(L";\n}\n"); | |
595 } else { | |
596 javascript << FX_WSTRC(L"return 0;\n}\n"); | |
597 } | |
598 javascript << FX_WSTRC( | |
599 L"catch(accessExceptions)\n{\nreturn 0;\n}\n}\n).call(this)\n"); | |
600 } else if (m_pArguments) { | |
601 for (int i = 0; i < m_pArguments->GetSize(); ++i) { | |
602 CXFA_FMSimpleExpression* e = | |
603 reinterpret_cast<CXFA_FMSimpleExpression*>(m_pArguments->GetAt(i)); | |
604 e->ToJavaScript(javascript); | |
605 if (i + 1 < m_pArguments->GetSize()) { | |
606 javascript << FX_WSTRC(L", "); | |
607 } | |
608 } | |
609 } | |
610 javascript << FX_WSTRC(L")"); | |
611 if (isEvalFunc) { | |
612 javascript << FX_WSTRC(L")"); | |
613 } | |
614 } | |
615 } | |
616 | |
617 CXFA_FMDotAccessorExpression::CXFA_FMDotAccessorExpression( | |
618 FX_DWORD line, | |
619 CXFA_FMSimpleExpression* pAccessor, | |
620 XFA_FM_TOKEN op, | |
621 CFX_WideStringC wsIdentifier, | |
622 CXFA_FMSimpleExpression* pIndexExp) | |
623 : CXFA_FMBinExpression(line, op, pAccessor, pIndexExp), | |
624 m_wsIdentifier(wsIdentifier) {} | |
625 | |
626 void CXFA_FMDotAccessorExpression::ToJavaScript(CFX_WideTextBuf& javascript) { | |
627 javascript << gs_lpStrExpFuncName[DOT]; | |
628 javascript << FX_WSTRC(L"("); | |
629 if (m_pExp1) { | |
630 m_pExp1->ToJavaScript(javascript); | |
631 } else { | |
632 javascript << FX_WSTRC(L"null"); | |
633 } | |
634 javascript << FX_WSTRC(L", "); | |
635 javascript << FX_WSTRC(L"\""); | |
636 if (m_pExp1 && m_pExp1->GetOperatorToken() == TOKidentifier) { | |
637 m_pExp1->ToJavaScript(javascript); | |
638 } | |
639 javascript << FX_WSTRC(L"\", "); | |
640 if (m_op == TOKdotscream) { | |
641 javascript << FX_WSTRC(L"\"#"); | |
642 javascript << m_wsIdentifier; | |
643 javascript << FX_WSTRC(L"\", "); | |
644 } else if (m_op == TOKdotstar) { | |
645 javascript << FX_WSTRC(L"\"*\", "); | |
646 } else if (m_op == TOKcall) { | |
647 javascript << FX_WSTRC(L"\"\", "); | |
648 } else { | |
649 javascript << FX_WSTRC(L"\""); | |
650 javascript << m_wsIdentifier; | |
651 javascript << FX_WSTRC(L"\", "); | |
652 } | |
653 m_pExp2->ToJavaScript(javascript); | |
654 javascript << FX_WSTRC(L")"); | |
655 } | |
656 | |
657 CXFA_FMIndexExpression::CXFA_FMIndexExpression( | |
658 FX_DWORD line, | |
659 XFA_FM_AccessorIndex accessorIndex, | |
660 CXFA_FMSimpleExpression* pIndexExp, | |
661 FX_BOOL bIsStarIndex) | |
662 : CXFA_FMUnaryExpression(line, TOKlbracket, pIndexExp), | |
663 m_accessorIndex(accessorIndex), | |
664 m_bIsStarIndex(bIsStarIndex) {} | |
665 | |
666 void CXFA_FMIndexExpression::ToJavaScript(CFX_WideTextBuf& javascript) { | |
667 switch (m_accessorIndex) { | |
668 case ACCESSOR_NO_INDEX: | |
669 javascript << FX_WSTRC(L"0"); | |
670 break; | |
671 case ACCESSOR_NO_RELATIVEINDEX: | |
672 javascript << FX_WSTRC(L"1"); | |
673 break; | |
674 case ACCESSOR_POSITIVE_INDEX: | |
675 javascript << FX_WSTRC(L"2"); | |
676 break; | |
677 case ACCESSOR_NEGATIVE_INDEX: | |
678 javascript << FX_WSTRC(L"3"); | |
679 break; | |
680 default: | |
681 javascript << FX_WSTRC(L"0"); | |
682 } | |
683 if (!m_bIsStarIndex) { | |
684 javascript << FX_WSTRC(L", "); | |
685 if (m_pExp) { | |
686 m_pExp->ToJavaScript(javascript); | |
687 } else { | |
688 javascript << FX_WSTRC(L"0"); | |
689 } | |
690 } | |
691 } | |
692 | |
693 CXFA_FMDotDotAccessorExpression::CXFA_FMDotDotAccessorExpression( | |
694 FX_DWORD line, | |
695 CXFA_FMSimpleExpression* pAccessor, | |
696 XFA_FM_TOKEN op, | |
697 CFX_WideStringC wsIdentifier, | |
698 CXFA_FMSimpleExpression* pIndexExp) | |
699 : CXFA_FMBinExpression(line, op, pAccessor, pIndexExp), | |
700 m_wsIdentifier(wsIdentifier) {} | |
701 | |
702 void CXFA_FMDotDotAccessorExpression::ToJavaScript( | |
703 CFX_WideTextBuf& javascript) { | |
704 javascript << gs_lpStrExpFuncName[DOTDOT]; | |
705 javascript << FX_WSTRC(L"("); | |
706 m_pExp1->ToJavaScript(javascript); | |
707 javascript << FX_WSTRC(L", "); | |
708 javascript << FX_WSTRC(L"\""); | |
709 if (m_pExp1 && m_pExp1->GetOperatorToken() == TOKidentifier) { | |
710 m_pExp1->ToJavaScript(javascript); | |
711 } | |
712 javascript << FX_WSTRC(L"\", "); | |
713 javascript << FX_WSTRC(L"\""); | |
714 javascript << m_wsIdentifier; | |
715 javascript << FX_WSTRC(L"\", "); | |
716 m_pExp2->ToJavaScript(javascript); | |
717 javascript << FX_WSTRC(L")"); | |
718 } | |
719 | |
720 CXFA_FMMethodCallExpression::CXFA_FMMethodCallExpression( | |
721 FX_DWORD line, | |
722 CXFA_FMSimpleExpression* pAccessorExp1, | |
723 CXFA_FMSimpleExpression* pCallExp) | |
724 : CXFA_FMBinExpression(line, TOKdot, pAccessorExp1, pCallExp) {} | |
725 | |
726 void CXFA_FMMethodCallExpression::ToJavaScript(CFX_WideTextBuf& javascript) { | |
727 javascript << FX_WSTRC(L"(\nfunction ()\n{\n"); | |
728 javascript << FX_WSTRC(L"var method_return_value = null;\n"); | |
729 javascript << FX_WSTRC(L"var accessor_object = "); | |
730 m_pExp1->ToJavaScript(javascript); | |
731 javascript << FX_WSTRC(L";\n"); | |
732 javascript << FX_WSTRC(L"if ("); | |
733 javascript << gs_lpStrExpFuncName[ISFMARRAY]; | |
734 javascript << FX_WSTRC(L"(accessor_object))\n{\n"); | |
735 javascript << FX_WSTRC( | |
736 L"for(var index = accessor_object.length - 1; index > 1; index--)\n{\n"); | |
737 javascript << FX_WSTRC(L"method_return_value = accessor_object[index]."); | |
738 m_pExp2->ToJavaScript(javascript); | |
739 javascript << FX_WSTRC(L";\n}\n}\n"); | |
740 javascript << FX_WSTRC(L"else\n{\nmethod_return_value = accessor_object."); | |
741 m_pExp2->ToJavaScript(javascript); | |
742 javascript << FX_WSTRC(L";\n}\n"); | |
743 javascript << FX_WSTRC(L"return method_return_value;\n"); | |
744 javascript << FX_WSTRC(L"}\n).call(this)"); | |
745 } | |
OLD | NEW |