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_fm2jscontext.h" | |
8 | |
9 #include <time.h> | |
10 | |
11 #include "core/include/fxcrt/fx_ext.h" | |
12 #include "xfa/src/fgas/localization/fgas_locale.h" | |
13 #include "xfa/src/fxfa/fm2js/xfa_fm2jsapi.h" | |
14 #include "xfa/src/fxfa/parser/xfa_document.h" | |
15 #include "xfa/src/fxfa/parser/xfa_localevalue.h" | |
16 #include "xfa/src/fxfa/parser/xfa_parser.h" | |
17 | |
18 #define FINANCIAL_PRECISION 0.00000001 | |
19 | |
20 namespace { | |
21 | |
22 struct XFA_FMHtmlReserveCode { | |
23 uint32_t m_uCode; | |
24 const FX_WCHAR* m_htmlReserve; | |
25 }; | |
26 struct XFA_FMHtmlHashedReserveCode { | |
27 uint32_t m_uHash; | |
28 const FX_WCHAR* m_htmlReserve; | |
29 uint32_t m_uCode; | |
30 }; | |
31 | |
32 const XFA_FMHtmlHashedReserveCode reservesForDecode[] = { | |
33 {0x00018b62, L"Mu", 924}, {0x00019083, L"Nu", 925}, | |
34 {0x00019ab9, L"Pi", 928}, {0x0001c3c1, L"Xi", 926}, | |
35 {0x000210ac, L"ge", 8805}, {0x000210bb, L"gt", 62}, | |
36 {0x00022a51, L"le", 8804}, {0x00022a60, L"lt", 60}, | |
37 {0x00022f82, L"mu", 956}, {0x00023493, L"ne", 8800}, | |
38 {0x00023497, L"ni", 8715}, {0x000234a3, L"nu", 957}, | |
39 {0x000239c1, L"or", 8744}, {0x00023ed9, L"pi", 960}, | |
40 {0x000267e1, L"xi", 958}, {0x00c41789, L"lceil", 8968}, | |
41 {0x00eef34f, L"thetasym", 977}, {0x012d7ead, L"lcirc", 206}, | |
42 {0x01637b56, L"agrave", 224}, {0x020856da, L"crarr", 8629}, | |
43 {0x022188c3, L"gamma", 947}, {0x033586d3, L"nbsp", 160}, | |
44 {0x04f4c358, L"nsub", 8836}, {0x0581466a, L"dagger", 8224}, | |
45 {0x06b1f790, L"oelig", 339}, {0x06e490d4, L"Chi", 935}, | |
46 {0x0718c6a1, L"ETH", 208}, {0x07196ada, L"Eta", 919}, | |
47 {0x07f667ca, L"Ugrave", 217}, {0x083a8a21, L"Phi", 934}, | |
48 {0x083ac28c, L"Psi", 936}, {0x086f26a9, L"Rho", 929}, | |
49 {0x089b5b51, L"aring", 229}, {0x08a39f4a, L"Tau", 932}, | |
50 {0x08b6188b, L"THORN", 222}, {0x09ce792a, L"icirc", 238}, | |
51 {0x09f9d61e, L"amp", 38}, {0x09f9db33, L"and", 8743}, | |
52 {0x09f9db36, L"ang", 8736}, {0x0a2e3514, L"cap", 8745}, | |
53 {0x0a2e58f4, L"chi", 967}, {0x0a2e9ba8, L"cup", 8746}, | |
54 {0x0a4897d0, L"deg", 176}, {0x0a6332fa, L"eta", 951}, | |
55 {0x0a633301, L"eth", 240}, {0x0acc4d4b, L"int", 8747}, | |
56 {0x0b1b3d35, L"loz", 9674}, {0x0b1b4c8b, L"lrm", 8206}, | |
57 {0x0b4fd9b1, L"not", 172}, {0x0b845241, L"phi", 966}, | |
58 {0x0b84576f, L"piv", 982}, {0x0b848aac, L"psi", 968}, | |
59 {0x0bb8df5e, L"reg", 174}, {0x0bb8eec9, L"rho", 961}, | |
60 {0x0bb9034b, L"rlm", 8207}, {0x0bd33d14, L"shy", 173}, | |
61 {0x0bd34229, L"sim", 8764}, {0x0bd37faa, L"sub", 8834}, | |
62 {0x0bd37fb5, L"sum", 8721}, {0x0bd37fb8, L"sup", 8835}, | |
63 {0x0bed676a, L"tau", 964}, {0x0c07f32e, L"uml", 168}, | |
64 {0x0c71032c, L"yen", 165}, {0x0c7f2889, L"szlig", 223}, | |
65 {0x0c8badbb, L"zwj", 8205}, {0x10ba4dba, L"Egrave", 200}, | |
66 {0x10f1ea24, L"para", 182}, {0x10f1ea37, L"part", 8706}, | |
67 {0x115b2337, L"perp", 8869}, {0x12b10d15, L"prod", 8719}, | |
68 {0x12b10d21, L"prop", 8733}, {0x12dfa9f4, L"rfloor", 8971}, | |
69 {0x12eb4736, L"Agrave", 192}, {0x12fff2b7, L"pund", 163}, | |
70 {0x13fda9f2, L"tilde", 732}, {0x1417fd62, L"times", 215}, | |
71 {0x154fc726, L"ecirc", 234}, {0x165aa451, L"sigma", 963}, | |
72 {0x1709124a, L"Dagger", 8225}, {0x192f78d5, L"iexcl", 161}, | |
73 {0x1b7ed8d7, L"rArr", 8658}, {0x1ec88c68, L"rang", 9002}, | |
74 {0x1ec8a0f7, L"rarr", 8594}, {0x1eda07f3, L"atilde", 227}, | |
75 {0x1f3182c4, L"real", 8476}, {0x1fc34f8b, L"yacute", 253}, | |
76 {0x20d11522, L"acirc", 226}, {0x21933a9b, L"rsaquo", 8250}, | |
77 {0x21f44907, L"uacute", 250}, {0x220cca72, L"acute", 180}, | |
78 {0x242cded1, L"alefsym", 8501}, {0x2655c66a, L"delta", 948}, | |
79 {0x269e4b4d, L"exist", 8707}, {0x273379fa, L"micro", 181}, | |
80 {0x27a37440, L"forall", 8704}, {0x2854e62c, L"minus", 8722}, | |
81 {0x28636f81, L"cedil", 184}, {0x2887357b, L"iacute", 237}, | |
82 {0x2994d5ff, L"frac12", 189}, {0x2994d601, L"frac14", 188}, | |
83 {0x2994e043, L"frac34", 190}, {0x2a1feb41, L"lambda", 955}, | |
84 {0x2ab215f3, L"apos", 39}, {0x2ab82ef7, L"eacute", 233}, | |
85 {0x2b3592ef, L"auml", 228}, {0x2ce92873, L"aacute", 225}, | |
86 {0x2daff48a, L"oslash", 248}, {0x2ef68882, L"aelig", 230}, | |
87 {0x3061d3d3, L"Atilde", 195}, {0x314b1b6b, L"Yacute", 221}, | |
88 {0x337c14e7, L"Uacute", 218}, {0x37676aca, L"cent", 162}, | |
89 {0x37d0b841, L"circ", 710}, {0x386e7947, L"cong", 8773}, | |
90 {0x386e839b, L"copy", 169}, {0x3a0e225a, L"Epsilon", 917}, | |
91 {0x3ba7b721, L"Lambda", 923}, {0x3bd9abe6, L"Alpha", 913}, | |
92 {0x3c3ffad7, L"Eacute", 201}, {0x3cfaf69f, L"brvbar", 166}, | |
93 {0x3d54a489, L"omega", 969}, {0x3e70f453, L"Aacute", 193}, | |
94 {0x3f37c06a, L"Oslash", 216}, {0x40e1b34e, L"diams", 9830}, | |
95 {0x416596df, L"plusmn", 177}, {0x4354ff16, L"Ucirc", 219}, | |
96 {0x454fce6a, L"Upsilon", 933}, {0x4610ad35, L"emsp", 8195}, | |
97 {0x462afb76, L"ensp", 8194}, {0x46e30073, L"euml", 235}, | |
98 {0x46e31a1b, L"euro", 8364}, {0x46f2eada, L"lowast", 8727}, | |
99 {0x4dca26cf, L"Auml", 196}, {0x4e2d6083, L"image", 8465}, | |
100 {0x4f964ee8, L"notin", 8713}, {0x50917a7a, L"epsilon", 949}, | |
101 {0x52f9a4cd, L"Kappa", 922}, {0x5496f410, L"Ocirc", 212}, | |
102 {0x568cbf34, L"zeta", 950}, {0x57badd20, L"ntilde", 241}, | |
103 {0x58662109, L"zwnj", 8204}, {0x5b39870f, L"empty", 8709}, | |
104 {0x5bd3268a, L"upsilon", 965}, {0x5e2bf8a3, L"Gamma", 915}, | |
105 {0x5f73c13a, L"rsquo", 8217}, {0x61f2bc4d, L"iota", 953}, | |
106 {0x625bbcf3, L"isin", 8712}, {0x62906df7, L"iuml", 239}, | |
107 {0x64a5cb31, L"Aring", 197}, {0x66f25c4a, L"sbquo", 8218}, | |
108 {0x6851ab60, L"spades", 9824}, {0x6942a900, L"Ntilde", 209}, | |
109 {0x69779453, L"Euml", 203}, {0x6cda6e23, L"current", 164}, | |
110 {0x70b5b634, L"lsquo", 8216}, {0x715a3706, L"Ecirc", 202}, | |
111 {0x71e8bf8d, L"tdquo", 8221}, {0x72651431, L"Sigma", 931}, | |
112 {0x7569813b, L"iquest", 191}, {0x776a436a, L"equiv", 8801}, | |
113 {0x79215314, L"Zeta", 918}, {0x79b81224, L"ograve", 242}, | |
114 {0x7c2f8b23, L"macr", 175}, {0x7cdb8502, L"Acirc", 194}, | |
115 {0x8185c62e, L"ndash", 8211}, {0x8260364a, L"Delta", 916}, | |
116 {0x846619ad, L"mdash", 8212}, {0x8550fb50, L"OElig", 338}, | |
117 {0x88eb5b85, L"ldquo", 8220}, {0x8b3fde04, L"Ograve", 210}, | |
118 {0x8bc5794b, L"ordf", 170}, {0x8bc57952, L"ordm", 186}, | |
119 {0x8c14923d, L"ouml", 246}, {0x8c5a7cd6, L"theta", 952}, | |
120 {0x8d61812b, L"thorn", 254}, {0x912b95aa, L"asymp", 8776}, | |
121 {0x947faf81, L"middot", 183}, {0x9629202e, L"lfloor", 8970}, | |
122 {0x972e9ec1, L"otilde", 245}, {0x9748f231, L"otimes", 8855}, | |
123 {0x995f1469, L"Omega", 937}, {0x99eb5349, L"quot", 34}, | |
124 {0x9aeb639e, L"hellip", 8230}, {0xa0ae2f86, L"Scaron", 352}, | |
125 {0xa4dcb0d5, L"lsaquo", 8249}, {0xa53dbf41, L"oacute", 243}, | |
126 {0xa5ae9e7b, L"bdquo", 8222}, {0xa602d7ba, L"sdot", 8901}, | |
127 {0xa61ce86f, L"sect", 167}, {0xa6e4c3d7, L"sigmaf", 962}, | |
128 {0xa7c1c74f, L"sube", 8838}, {0xa7c20ee9, L"sup1", 185}, | |
129 {0xa7c20eea, L"sup2", 178}, {0xa7c20eeb, L"sup3", 179}, | |
130 {0xa7c20f1d, L"supe", 8839}, {0xa8b66aa1, L"Otilde", 213}, | |
131 {0xad958c42, L"AElig", 198}, {0xaea9261d, L"Ouml", 214}, | |
132 {0xb040eafa, L"uArr", 8657}, {0xb07c2e1c, L"beta", 946}, | |
133 {0xb220e92f, L"bull", 8226}, {0xb22750c4, L"ccedil", 231}, | |
134 {0xb38ab31a, L"uarr", 8593}, {0xb598b683, L"uuml", 252}, | |
135 {0xb6c58b21, L"Oacute", 211}, {0xb6d2a617, L"oline", 8254}, | |
136 {0xba9fd989, L"dArr", 8659}, {0xbb5ccd41, L"lgrave", 204}, | |
137 {0xbd39b44c, L"weierp", 8472}, {0xbde9a1a9, L"darr", 8595}, | |
138 {0xc027e329, L"permil", 8240}, {0xc2451389, L"upsih", 978}, | |
139 {0xc3af1ca4, L"Ccedil", 199}, {0xcd164249, L"fnof", 402}, | |
140 {0xcf6c8467, L"hearts", 9829}, {0xd1228390, L"trade", 8482}, | |
141 {0xd1462407, L"yuml", 255}, {0xd2cf2253, L"oplus", 8853}, | |
142 {0xd310c1fc, L"Beta", 914}, {0xd59c4d74, L"infin", 8734}, | |
143 {0xd64d470d, L"hArr", 8660}, {0xd67d9c75, L"divide", 247}, | |
144 {0xd698dd37, L"Omicron", 927}, {0xd82d4a63, L"Uuml", 220}, | |
145 {0xd9970f2d, L"harr", 8596}, {0xda91fd99, L"clubs", 9827}, | |
146 {0xdbe5bdcc, L"there4", 8756}, {0xdd7671bd, L"prime", 8242}, | |
147 {0xdfcf3c06, L"alpha", 945}, {0xe0213063, L"saron", 353}, | |
148 {0xe1911d83, L"radic", 8730}, {0xe2e75468, L"raquo", 187}, | |
149 {0xe6e27a5e, L"lacute", 205}, {0xe74a8f36, L"ucirc", 251}, | |
150 {0xe864ecb6, L"Theta", 920}, {0xecddde5e, L"nabla", 8711}, | |
151 {0xed1c3557, L"omicron", 959}, {0xef82228f, L"rceil", 8969}, | |
152 {0xf1fab491, L"lArr", 8656}, {0xf3dab7e7, L"Yuml", 376}, | |
153 {0xf4294962, L"laquo", 171}, {0xf5446822, L"lang", 9001}, | |
154 {0xf5447cb1, L"larr", 8592}, {0xf66e9bea, L"ugrave", 249}, | |
155 {0xf6b4ce70, L"lota", 921}, {0xf6ef34ed, L"kappa", 954}, | |
156 {0xf72a3a56, L"thinsp", 8201}, {0xf752801a, L"luml", 207}, | |
157 {0xf88c8430, L"ocirc", 244}, {0xf9676178, L"frasl", 8260}, | |
158 {0xfd01885e, L"igrave", 236}, {0xff3281da, L"egrave", 232}, | |
159 }; | |
160 | |
161 const XFA_FMHtmlReserveCode reservesForEncode[] = { | |
162 {34, L"quot"}, {38, L"amp"}, {39, L"apos"}, | |
163 {60, L"lt"}, {62, L"gt"}, {160, L"nbsp"}, | |
164 {161, L"iexcl"}, {162, L"cent"}, {163, L"pund"}, | |
165 {164, L"current"}, {165, L"yen"}, {166, L"brvbar"}, | |
166 {167, L"sect"}, {168, L"uml"}, {169, L"copy"}, | |
167 {170, L"ordf"}, {171, L"laquo"}, {172, L"not"}, | |
168 {173, L"shy"}, {174, L"reg"}, {175, L"macr"}, | |
169 {176, L"deg"}, {177, L"plusmn"}, {178, L"sup2"}, | |
170 {179, L"sup3"}, {180, L"acute"}, {181, L"micro"}, | |
171 {182, L"para"}, {183, L"middot"}, {184, L"cedil"}, | |
172 {185, L"sup1"}, {186, L"ordm"}, {187, L"raquo"}, | |
173 {188, L"frac14"}, {189, L"frac12"}, {190, L"frac34"}, | |
174 {191, L"iquest"}, {192, L"Agrave"}, {193, L"Aacute"}, | |
175 {194, L"Acirc"}, {195, L"Atilde"}, {196, L"Auml"}, | |
176 {197, L"Aring"}, {198, L"AElig"}, {199, L"Ccedil"}, | |
177 {200, L"Egrave"}, {201, L"Eacute"}, {202, L"Ecirc"}, | |
178 {203, L"Euml"}, {204, L"lgrave"}, {205, L"lacute"}, | |
179 {206, L"lcirc"}, {207, L"luml"}, {208, L"ETH"}, | |
180 {209, L"Ntilde"}, {210, L"Ograve"}, {211, L"Oacute"}, | |
181 {212, L"Ocirc"}, {213, L"Otilde"}, {214, L"Ouml"}, | |
182 {215, L"times"}, {216, L"Oslash"}, {217, L"Ugrave"}, | |
183 {218, L"Uacute"}, {219, L"Ucirc"}, {220, L"Uuml"}, | |
184 {221, L"Yacute"}, {222, L"THORN"}, {223, L"szlig"}, | |
185 {224, L"agrave"}, {225, L"aacute"}, {226, L"acirc"}, | |
186 {227, L"atilde"}, {228, L"auml"}, {229, L"aring"}, | |
187 {230, L"aelig"}, {231, L"ccedil"}, {232, L"egrave"}, | |
188 {233, L"eacute"}, {234, L"ecirc"}, {235, L"euml"}, | |
189 {236, L"igrave"}, {237, L"iacute"}, {238, L"icirc"}, | |
190 {239, L"iuml"}, {240, L"eth"}, {241, L"ntilde"}, | |
191 {242, L"ograve"}, {243, L"oacute"}, {244, L"ocirc"}, | |
192 {245, L"otilde"}, {246, L"ouml"}, {247, L"divide"}, | |
193 {248, L"oslash"}, {249, L"ugrave"}, {250, L"uacute"}, | |
194 {251, L"ucirc"}, {252, L"uuml"}, {253, L"yacute"}, | |
195 {254, L"thorn"}, {255, L"yuml"}, {338, L"OElig"}, | |
196 {339, L"oelig"}, {352, L"Scaron"}, {353, L"saron"}, | |
197 {376, L"Yuml"}, {402, L"fnof"}, {710, L"circ"}, | |
198 {732, L"tilde"}, {913, L"Alpha"}, {914, L"Beta"}, | |
199 {915, L"Gamma"}, {916, L"Delta"}, {917, L"Epsilon"}, | |
200 {918, L"Zeta"}, {919, L"Eta"}, {920, L"Theta"}, | |
201 {921, L"lota"}, {922, L"Kappa"}, {923, L"Lambda"}, | |
202 {924, L"Mu"}, {925, L"Nu"}, {926, L"Xi"}, | |
203 {927, L"Omicron"}, {928, L"Pi"}, {929, L"Rho"}, | |
204 {931, L"Sigma"}, {932, L"Tau"}, {933, L"Upsilon"}, | |
205 {934, L"Phi"}, {935, L"Chi"}, {936, L"Psi"}, | |
206 {937, L"Omega"}, {945, L"alpha"}, {946, L"beta"}, | |
207 {947, L"gamma"}, {948, L"delta"}, {949, L"epsilon"}, | |
208 {950, L"zeta"}, {951, L"eta"}, {952, L"theta"}, | |
209 {953, L"iota"}, {954, L"kappa"}, {955, L"lambda"}, | |
210 {956, L"mu"}, {957, L"nu"}, {958, L"xi"}, | |
211 {959, L"omicron"}, {960, L"pi"}, {961, L"rho"}, | |
212 {962, L"sigmaf"}, {963, L"sigma"}, {964, L"tau"}, | |
213 {965, L"upsilon"}, {966, L"phi"}, {967, L"chi"}, | |
214 {968, L"psi"}, {969, L"omega"}, {977, L"thetasym"}, | |
215 {978, L"upsih"}, {982, L"piv"}, {8194, L"ensp"}, | |
216 {8195, L"emsp"}, {8201, L"thinsp"}, {8204, L"zwnj"}, | |
217 {8205, L"zwj"}, {8206, L"lrm"}, {8207, L"rlm"}, | |
218 {8211, L"ndash"}, {8212, L"mdash"}, {8216, L"lsquo"}, | |
219 {8217, L"rsquo"}, {8218, L"sbquo"}, {8220, L"ldquo"}, | |
220 {8221, L"tdquo"}, {8222, L"bdquo"}, {8224, L"dagger"}, | |
221 {8225, L"Dagger"}, {8226, L"bull"}, {8230, L"hellip"}, | |
222 {8240, L"permil"}, {8242, L"prime"}, {8249, L"lsaquo"}, | |
223 {8250, L"rsaquo"}, {8254, L"oline"}, {8260, L"frasl"}, | |
224 {8364, L"euro"}, {8465, L"image"}, {8472, L"weierp"}, | |
225 {8476, L"real"}, {8482, L"trade"}, {8501, L"alefsym"}, | |
226 {8592, L"larr"}, {8593, L"uarr"}, {8594, L"rarr"}, | |
227 {8595, L"darr"}, {8596, L"harr"}, {8629, L"crarr"}, | |
228 {8656, L"lArr"}, {8657, L"uArr"}, {8658, L"rArr"}, | |
229 {8659, L"dArr"}, {8660, L"hArr"}, {8704, L"forall"}, | |
230 {8706, L"part"}, {8707, L"exist"}, {8709, L"empty"}, | |
231 {8711, L"nabla"}, {8712, L"isin"}, {8713, L"notin"}, | |
232 {8715, L"ni"}, {8719, L"prod"}, {8721, L"sum"}, | |
233 {8722, L"minus"}, {8727, L"lowast"}, {8730, L"radic"}, | |
234 {8733, L"prop"}, {8734, L"infin"}, {8736, L"ang"}, | |
235 {8743, L"and"}, {8744, L"or"}, {8745, L"cap"}, | |
236 {8746, L"cup"}, {8747, L"int"}, {8756, L"there4"}, | |
237 {8764, L"sim"}, {8773, L"cong"}, {8776, L"asymp"}, | |
238 {8800, L"ne"}, {8801, L"equiv"}, {8804, L"le"}, | |
239 {8805, L"ge"}, {8834, L"sub"}, {8835, L"sup"}, | |
240 {8836, L"nsub"}, {8838, L"sube"}, {8839, L"supe"}, | |
241 {8853, L"oplus"}, {8855, L"otimes"}, {8869, L"perp"}, | |
242 {8901, L"sdot"}, {8968, L"lceil"}, {8969, L"rceil"}, | |
243 {8970, L"lfloor"}, {8971, L"rfloor"}, {9001, L"lang"}, | |
244 {9002, L"rang"}, {9674, L"loz"}, {9824, L"spades"}, | |
245 {9827, L"clubs"}, {9829, L"hearts"}, {9830, L"diams"}, | |
246 }; | |
247 | |
248 } // namespace | |
249 | |
250 void CXFA_FM2JSContext::Abs(FXJSE_HOBJECT hThis, | |
251 const CFX_ByteStringC& szFuncName, | |
252 CFXJSE_Arguments& args) { | |
253 if (args.GetLength() == 1) { | |
254 FXJSE_HVALUE argOne = args.GetValue(0); | |
255 if (HValueIsNull(hThis, argOne)) { | |
256 FXJSE_Value_SetNull(args.GetReturnValue()); | |
257 } else { | |
258 FX_DOUBLE dValue = HValueToDouble(hThis, argOne); | |
259 if (dValue < 0) { | |
260 dValue = -dValue; | |
261 } | |
262 FXJSE_Value_SetDouble(args.GetReturnValue(), dValue); | |
263 } | |
264 FXJSE_Value_Release(argOne); | |
265 } else { | |
266 CXFA_FM2JSContext* pContext = | |
267 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
268 pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | |
269 L"Abs"); | |
270 } | |
271 } | |
272 void CXFA_FM2JSContext::Avg(FXJSE_HOBJECT hThis, | |
273 const CFX_ByteStringC& szFuncName, | |
274 CFXJSE_Arguments& args) { | |
275 CXFA_FM2JSContext* pContext = | |
276 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
277 FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime(); | |
278 int32_t argc = args.GetLength(); | |
279 uint32_t uCount = 0; | |
280 FX_DOUBLE dSum = 0.0; | |
281 if (argc >= 1) { | |
282 FXJSE_HVALUE argValue = 0; | |
283 for (int32_t i = 0; i < argc; i++) { | |
284 argValue = args.GetValue(i); | |
285 if (FXJSE_Value_IsNull(argValue)) { | |
286 FXJSE_Value_Release(argValue); | |
287 continue; | |
288 } else if (FXJSE_Value_IsArray(argValue)) { | |
289 FXJSE_HVALUE lengthValue = FXJSE_Value_Create(hruntime); | |
290 FXJSE_Value_GetObjectProp(argValue, "length", lengthValue); | |
291 int32_t iLength = FXJSE_Value_ToInteger(lengthValue); | |
292 FXJSE_Value_Release(lengthValue); | |
293 if (iLength > 2) { | |
294 FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime); | |
295 FXJSE_Value_GetObjectPropByIdx(argValue, 1, propertyValue); | |
296 FXJSE_HVALUE jsObjectValue = FXJSE_Value_Create(hruntime); | |
297 if (FXJSE_Value_IsNull(propertyValue)) { | |
298 for (int32_t j = 2; j < iLength; j++) { | |
299 FXJSE_Value_GetObjectPropByIdx(argValue, j, jsObjectValue); | |
300 FXJSE_HVALUE defaultPropValue = FXJSE_Value_Create(hruntime); | |
301 GetObjectDefaultValue(jsObjectValue, defaultPropValue); | |
302 if (!FXJSE_Value_IsNull(defaultPropValue)) { | |
303 dSum += HValueToDouble(hThis, defaultPropValue); | |
304 uCount++; | |
305 } | |
306 FXJSE_Value_Release(defaultPropValue); | |
307 } | |
308 } else { | |
309 CFX_ByteString propertyStr; | |
310 FXJSE_Value_ToUTF8String(propertyValue, propertyStr); | |
311 FXJSE_HVALUE newPropertyValue = FXJSE_Value_Create(hruntime); | |
312 for (int32_t j = 2; j < iLength; j++) { | |
313 FXJSE_Value_GetObjectPropByIdx(argValue, j, jsObjectValue); | |
314 FXJSE_Value_GetObjectProp(jsObjectValue, propertyStr, | |
315 newPropertyValue); | |
316 if (!FXJSE_Value_IsNull(newPropertyValue)) { | |
317 dSum += HValueToDouble(hThis, newPropertyValue); | |
318 uCount++; | |
319 } | |
320 } | |
321 FXJSE_Value_Release(newPropertyValue); | |
322 } | |
323 FXJSE_Value_Release(jsObjectValue); | |
324 FXJSE_Value_Release(propertyValue); | |
325 } | |
326 } else { | |
327 dSum += HValueToDouble(hThis, argValue); | |
328 uCount++; | |
329 } | |
330 FXJSE_Value_Release(argValue); | |
331 } | |
332 argValue = 0; | |
333 } | |
334 if (0 == uCount) { | |
335 FXJSE_Value_SetNull(args.GetReturnValue()); | |
336 } else { | |
337 FXJSE_Value_SetDouble(args.GetReturnValue(), dSum / uCount); | |
338 } | |
339 } | |
340 void CXFA_FM2JSContext::Ceil(FXJSE_HOBJECT hThis, | |
341 const CFX_ByteStringC& szFuncName, | |
342 CFXJSE_Arguments& args) { | |
343 CXFA_FM2JSContext* pContext = | |
344 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
345 if (args.GetLength() == 1) { | |
346 FXJSE_HVALUE argValue = GetSimpleHValue(hThis, args, 0); | |
347 if (HValueIsNull(hThis, argValue)) { | |
348 FXJSE_Value_SetNull(args.GetReturnValue()); | |
349 } else { | |
350 FXJSE_Value_SetFloat(args.GetReturnValue(), | |
351 FXSYS_ceil(HValueToFloat(hThis, argValue))); | |
352 } | |
353 FXJSE_Value_Release(argValue); | |
354 } else { | |
355 pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | |
356 L"Ceil"); | |
357 } | |
358 } | |
359 void CXFA_FM2JSContext::Count(FXJSE_HOBJECT hThis, | |
360 const CFX_ByteStringC& szFuncName, | |
361 CFXJSE_Arguments& args) { | |
362 CXFA_FM2JSContext* pContext = | |
363 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
364 FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime(); | |
365 int32_t argc = args.GetLength(); | |
366 uint32_t uCount = 0; | |
367 FXJSE_HVALUE argValue = 0; | |
368 for (int32_t i = 0; i < argc; i++) { | |
369 argValue = args.GetValue(i); | |
370 if (FXJSE_Value_IsNull(argValue)) { | |
371 FXJSE_Value_Release(argValue); | |
372 continue; | |
373 } else if (FXJSE_Value_IsArray(argValue)) { | |
374 FXJSE_HVALUE lengthValue = FXJSE_Value_Create(hruntime); | |
375 FXJSE_Value_GetObjectProp(argValue, "length", lengthValue); | |
376 int32_t iLength = FXJSE_Value_ToInteger(lengthValue); | |
377 FXJSE_Value_Release(lengthValue); | |
378 if (iLength > 2) { | |
379 FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime); | |
380 FXJSE_HVALUE jsObjectValue = FXJSE_Value_Create(hruntime); | |
381 FXJSE_HVALUE newPropertyValue = FXJSE_Value_Create(hruntime); | |
382 FXJSE_Value_GetObjectPropByIdx(argValue, 1, propertyValue); | |
383 FXJSE_Value_GetObjectPropByIdx(argValue, 2, jsObjectValue); | |
384 if (FXJSE_Value_IsNull(propertyValue)) { | |
385 for (int32_t i = 2; i < iLength; i++) { | |
386 FXJSE_Value_GetObjectPropByIdx(argValue, i, jsObjectValue); | |
387 GetObjectDefaultValue(jsObjectValue, newPropertyValue); | |
388 if (!FXJSE_Value_IsNull(newPropertyValue)) { | |
389 uCount++; | |
390 } | |
391 } | |
392 } else { | |
393 CFX_ByteString propertyStr; | |
394 FXJSE_Value_ToUTF8String(propertyValue, propertyStr); | |
395 for (int32_t i = 2; i < iLength; i++) { | |
396 FXJSE_Value_GetObjectPropByIdx(argValue, i, jsObjectValue); | |
397 FXJSE_Value_GetObjectProp(jsObjectValue, propertyStr, | |
398 newPropertyValue); | |
399 uCount += (FXJSE_Value_IsNull(newPropertyValue) ? 0 : 1); | |
400 } | |
401 } | |
402 FXJSE_Value_Release(propertyValue); | |
403 FXJSE_Value_Release(jsObjectValue); | |
404 FXJSE_Value_Release(newPropertyValue); | |
405 } else { | |
406 pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH); | |
407 } | |
408 } else if (FXJSE_Value_IsObject(argValue)) { | |
409 FXJSE_HVALUE newPropertyValue = FXJSE_Value_Create(hruntime); | |
410 GetObjectDefaultValue(argValue, newPropertyValue); | |
411 if (!FXJSE_Value_IsNull(newPropertyValue)) { | |
412 uCount++; | |
413 } | |
414 FXJSE_Value_Release(newPropertyValue); | |
415 } else { | |
416 uCount++; | |
417 } | |
418 FXJSE_Value_Release(argValue); | |
419 } | |
420 argValue = 0; | |
421 FXJSE_Value_SetInteger(args.GetReturnValue(), (int32_t)uCount); | |
422 } | |
423 void CXFA_FM2JSContext::Floor(FXJSE_HOBJECT hThis, | |
424 const CFX_ByteStringC& szFuncName, | |
425 CFXJSE_Arguments& args) { | |
426 CXFA_FM2JSContext* pContext = | |
427 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
428 if (args.GetLength() == 1) { | |
429 FXJSE_HVALUE argValue = GetSimpleHValue(hThis, args, 0); | |
430 if (HValueIsNull(hThis, argValue)) { | |
431 FXJSE_Value_SetNull(args.GetReturnValue()); | |
432 } else { | |
433 FXJSE_Value_SetFloat(args.GetReturnValue(), | |
434 FXSYS_floor(HValueToFloat(hThis, argValue))); | |
435 } | |
436 FXJSE_Value_Release(argValue); | |
437 } else { | |
438 pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | |
439 L"Floor"); | |
440 } | |
441 } | |
442 void CXFA_FM2JSContext::Max(FXJSE_HOBJECT hThis, | |
443 const CFX_ByteStringC& szFuncName, | |
444 CFXJSE_Arguments& args) { | |
445 CXFA_FM2JSContext* pContext = | |
446 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
447 FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime(); | |
448 int32_t argc = args.GetLength(); | |
449 uint32_t uCount = 0; | |
450 FX_DOUBLE dMaxValue = 0.0; | |
451 FXJSE_HVALUE argValue = 0; | |
452 for (int32_t i = 0; i < argc; i++) { | |
453 argValue = args.GetValue(i); | |
454 if (FXJSE_Value_IsNull(argValue)) { | |
455 FXJSE_Value_Release(argValue); | |
456 continue; | |
457 } else if (FXJSE_Value_IsArray(argValue)) { | |
458 FXJSE_HVALUE lengthValue = FXJSE_Value_Create(hruntime); | |
459 FXJSE_Value_GetObjectProp(argValue, "length", lengthValue); | |
460 int32_t iLength = FXJSE_Value_ToInteger(lengthValue); | |
461 FXJSE_Value_Release(lengthValue); | |
462 if (iLength > 2) { | |
463 FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime); | |
464 FXJSE_HVALUE jsObjectValue = FXJSE_Value_Create(hruntime); | |
465 FXJSE_HVALUE newPropertyValue = FXJSE_Value_Create(hruntime); | |
466 FXJSE_Value_GetObjectPropByIdx(argValue, 1, propertyValue); | |
467 FXJSE_Value_GetObjectPropByIdx(argValue, 2, jsObjectValue); | |
468 if (FXJSE_Value_IsNull(propertyValue)) { | |
469 for (int32_t i = 2; i < iLength; i++) { | |
470 FXJSE_Value_GetObjectPropByIdx(argValue, i, jsObjectValue); | |
471 GetObjectDefaultValue(jsObjectValue, newPropertyValue); | |
472 if (!FXJSE_Value_IsNull(newPropertyValue)) { | |
473 uCount++; | |
474 if (uCount == 1) { | |
475 dMaxValue = HValueToDouble(hThis, newPropertyValue); | |
476 } else { | |
477 FX_DOUBLE dValue = HValueToDouble(hThis, newPropertyValue); | |
478 if (dMaxValue < dValue) { | |
479 dMaxValue = dValue; | |
480 } | |
481 } | |
482 } | |
483 } | |
484 } else { | |
485 CFX_ByteString propertyStr; | |
486 FXJSE_Value_ToUTF8String(propertyValue, propertyStr); | |
487 for (int32_t i = 2; i < iLength; i++) { | |
488 FXJSE_Value_GetObjectPropByIdx(argValue, i, jsObjectValue); | |
489 FXJSE_Value_GetObjectProp(jsObjectValue, propertyStr, | |
490 newPropertyValue); | |
491 if (!FXJSE_Value_IsNull(newPropertyValue)) { | |
492 uCount++; | |
493 if (uCount == 1) { | |
494 dMaxValue = HValueToDouble(hThis, newPropertyValue); | |
495 } else { | |
496 FX_DOUBLE dValue = HValueToDouble(hThis, newPropertyValue); | |
497 if (dMaxValue < dValue) { | |
498 dMaxValue = dValue; | |
499 } | |
500 } | |
501 } | |
502 } | |
503 } | |
504 FXJSE_Value_Release(propertyValue); | |
505 FXJSE_Value_Release(jsObjectValue); | |
506 FXJSE_Value_Release(newPropertyValue); | |
507 } else { | |
508 pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH); | |
509 } | |
510 } else if (FXJSE_Value_IsObject(argValue)) { | |
511 FXJSE_HVALUE newPropertyValue = FXJSE_Value_Create(hruntime); | |
512 GetObjectDefaultValue(argValue, newPropertyValue); | |
513 if (!FXJSE_Value_IsNull(newPropertyValue)) { | |
514 uCount++; | |
515 if (uCount == 1) { | |
516 dMaxValue = HValueToDouble(hThis, newPropertyValue); | |
517 } else { | |
518 FX_DOUBLE dValue = HValueToDouble(hThis, newPropertyValue); | |
519 if (dMaxValue < dValue) { | |
520 dMaxValue = dValue; | |
521 } | |
522 } | |
523 } | |
524 FXJSE_Value_Release(newPropertyValue); | |
525 } else { | |
526 uCount++; | |
527 if (uCount == 1) { | |
528 dMaxValue = HValueToDouble(hThis, argValue); | |
529 } else { | |
530 FX_DOUBLE dValue = HValueToDouble(hThis, argValue); | |
531 if (dMaxValue < dValue) { | |
532 dMaxValue = dValue; | |
533 } | |
534 } | |
535 } | |
536 FXJSE_Value_Release(argValue); | |
537 } | |
538 argValue = 0; | |
539 if (uCount) { | |
540 FXJSE_Value_SetDouble(args.GetReturnValue(), dMaxValue); | |
541 } else { | |
542 FXJSE_Value_SetNull(args.GetReturnValue()); | |
543 } | |
544 } | |
545 void CXFA_FM2JSContext::Min(FXJSE_HOBJECT hThis, | |
546 const CFX_ByteStringC& szFuncName, | |
547 CFXJSE_Arguments& args) { | |
548 CXFA_FM2JSContext* pContext = | |
549 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
550 FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime(); | |
551 int32_t argc = args.GetLength(); | |
552 uint32_t uCount = 0; | |
553 FX_DOUBLE dMinValue = 0.0; | |
554 FXJSE_HVALUE argValue = 0; | |
555 for (int32_t i = 0; i < argc; i++) { | |
556 argValue = args.GetValue(i); | |
557 if (FXJSE_Value_IsNull(argValue)) { | |
558 FXJSE_Value_Release(argValue); | |
559 continue; | |
560 } else if (FXJSE_Value_IsArray(argValue)) { | |
561 FXJSE_HVALUE lengthValue = FXJSE_Value_Create(hruntime); | |
562 FXJSE_Value_GetObjectProp(argValue, "length", lengthValue); | |
563 int32_t iLength = FXJSE_Value_ToInteger(lengthValue); | |
564 FXJSE_Value_Release(lengthValue); | |
565 if (iLength > 2) { | |
566 FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime); | |
567 FXJSE_HVALUE jsObjectValue = FXJSE_Value_Create(hruntime); | |
568 FXJSE_HVALUE newPropertyValue = FXJSE_Value_Create(hruntime); | |
569 FXJSE_Value_GetObjectPropByIdx(argValue, 1, propertyValue); | |
570 FXJSE_Value_GetObjectPropByIdx(argValue, 2, jsObjectValue); | |
571 if (FXJSE_Value_IsNull(propertyValue)) { | |
572 for (int32_t i = 2; i < iLength; i++) { | |
573 FXJSE_Value_GetObjectPropByIdx(argValue, i, jsObjectValue); | |
574 GetObjectDefaultValue(jsObjectValue, newPropertyValue); | |
575 if (!FXJSE_Value_IsNull(newPropertyValue)) { | |
576 uCount++; | |
577 if (uCount == 1) { | |
578 dMinValue = HValueToDouble(hThis, newPropertyValue); | |
579 } else { | |
580 FX_DOUBLE dValue = HValueToDouble(hThis, newPropertyValue); | |
581 if (dMinValue > dValue) { | |
582 dMinValue = dValue; | |
583 } | |
584 } | |
585 } | |
586 } | |
587 } else { | |
588 CFX_ByteString propertyStr; | |
589 FXJSE_Value_ToUTF8String(propertyValue, propertyStr); | |
590 for (int32_t i = 2; i < iLength; i++) { | |
591 FXJSE_Value_GetObjectPropByIdx(argValue, i, jsObjectValue); | |
592 FXJSE_Value_GetObjectProp(jsObjectValue, propertyStr, | |
593 newPropertyValue); | |
594 if (!FXJSE_Value_IsNull(newPropertyValue)) { | |
595 uCount++; | |
596 if (uCount == 1) { | |
597 dMinValue = HValueToDouble(hThis, newPropertyValue); | |
598 } else { | |
599 FX_DOUBLE dValue = HValueToDouble(hThis, newPropertyValue); | |
600 if (dMinValue > dValue) { | |
601 dMinValue = dValue; | |
602 } | |
603 } | |
604 } | |
605 } | |
606 } | |
607 FXJSE_Value_Release(propertyValue); | |
608 FXJSE_Value_Release(jsObjectValue); | |
609 FXJSE_Value_Release(newPropertyValue); | |
610 } else { | |
611 pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH); | |
612 } | |
613 } else if (FXJSE_Value_IsObject(argValue)) { | |
614 FXJSE_HVALUE newPropertyValue = FXJSE_Value_Create(hruntime); | |
615 GetObjectDefaultValue(argValue, newPropertyValue); | |
616 if (!FXJSE_Value_IsNull(newPropertyValue)) { | |
617 uCount++; | |
618 if (uCount == 1) { | |
619 dMinValue = HValueToDouble(hThis, newPropertyValue); | |
620 } else { | |
621 FX_DOUBLE dValue = HValueToDouble(hThis, newPropertyValue); | |
622 if (dMinValue > dValue) { | |
623 dMinValue = dValue; | |
624 } | |
625 } | |
626 } | |
627 FXJSE_Value_Release(newPropertyValue); | |
628 } else { | |
629 uCount++; | |
630 if (uCount == 1) { | |
631 dMinValue = HValueToDouble(hThis, argValue); | |
632 } else { | |
633 FX_DOUBLE dValue = HValueToDouble(hThis, argValue); | |
634 if (dMinValue > dValue) { | |
635 dMinValue = dValue; | |
636 } | |
637 } | |
638 } | |
639 FXJSE_Value_Release(argValue); | |
640 } | |
641 argValue = 0; | |
642 if (uCount) { | |
643 FXJSE_Value_SetDouble(args.GetReturnValue(), dMinValue); | |
644 } else { | |
645 FXJSE_Value_SetNull(args.GetReturnValue()); | |
646 } | |
647 } | |
648 void CXFA_FM2JSContext::Mod(FXJSE_HOBJECT hThis, | |
649 const CFX_ByteStringC& szFuncName, | |
650 CFXJSE_Arguments& args) { | |
651 CXFA_FM2JSContext* pContext = | |
652 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
653 FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime(); | |
654 if (args.GetLength() == 2) { | |
655 FXJSE_HVALUE argOne = args.GetValue(0); | |
656 FXJSE_HVALUE argTwo = args.GetValue(1); | |
657 if (FXJSE_Value_IsNull(argOne) || FXJSE_Value_IsNull(argTwo)) { | |
658 FXJSE_Value_SetNull(args.GetReturnValue()); | |
659 } else { | |
660 FX_DOUBLE dDividend = 0.0; | |
661 FX_DOUBLE dDividor = 0.0; | |
662 if (FXJSE_Value_IsArray(argOne)) { | |
663 FXJSE_HVALUE lengthValue = FXJSE_Value_Create(hruntime); | |
664 FXJSE_Value_GetObjectProp(argOne, "length", lengthValue); | |
665 int32_t iLength = FXJSE_Value_ToInteger(lengthValue); | |
666 FXJSE_Value_Release(lengthValue); | |
667 if (iLength > 2) { | |
668 FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime); | |
669 FXJSE_HVALUE jsObjectValue = FXJSE_Value_Create(hruntime); | |
670 FXJSE_Value_GetObjectPropByIdx(argOne, 1, propertyValue); | |
671 FXJSE_Value_GetObjectPropByIdx(argOne, 2, jsObjectValue); | |
672 if (FXJSE_Value_IsNull(propertyValue)) { | |
673 dDividend = HValueToDouble(hThis, jsObjectValue); | |
674 } else { | |
675 CFX_ByteString propertyStr; | |
676 FXJSE_Value_ToUTF8String(propertyValue, propertyStr); | |
677 FXJSE_HVALUE newPropertyValue = FXJSE_Value_Create(hruntime); | |
678 FXJSE_Value_GetObjectProp(jsObjectValue, propertyStr, | |
679 newPropertyValue); | |
680 dDividend = HValueToDouble(hThis, newPropertyValue); | |
681 FXJSE_Value_Release(newPropertyValue); | |
682 } | |
683 FXJSE_Value_Release(propertyValue); | |
684 FXJSE_Value_Release(jsObjectValue); | |
685 } else { | |
686 pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH); | |
687 } | |
688 } else { | |
689 dDividend = HValueToDouble(hThis, argOne); | |
690 } | |
691 if (FXJSE_Value_IsArray(argTwo)) { | |
692 FXJSE_HVALUE lengthValue = FXJSE_Value_Create(hruntime); | |
693 FXJSE_Value_GetObjectProp(argTwo, "length", lengthValue); | |
694 int32_t iLength = FXJSE_Value_ToInteger(lengthValue); | |
695 FXJSE_Value_Release(lengthValue); | |
696 if (iLength > 2) { | |
697 FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime); | |
698 FXJSE_HVALUE jsObjectValue = FXJSE_Value_Create(hruntime); | |
699 FXJSE_Value_GetObjectPropByIdx(argTwo, 1, propertyValue); | |
700 FXJSE_Value_GetObjectPropByIdx(argTwo, 2, jsObjectValue); | |
701 if (FXJSE_Value_IsNull(propertyValue)) { | |
702 dDividor = HValueToDouble(hThis, jsObjectValue); | |
703 } else { | |
704 CFX_ByteString propertyStr; | |
705 FXJSE_Value_ToUTF8String(propertyValue, propertyStr); | |
706 FXJSE_HVALUE newPropertyValue = FXJSE_Value_Create(hruntime); | |
707 FXJSE_Value_GetObjectProp(jsObjectValue, propertyStr, | |
708 newPropertyValue); | |
709 dDividor = HValueToDouble(hThis, newPropertyValue); | |
710 FXJSE_Value_Release(newPropertyValue); | |
711 } | |
712 FXJSE_Value_Release(propertyValue); | |
713 FXJSE_Value_Release(jsObjectValue); | |
714 } else { | |
715 pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH); | |
716 } | |
717 } else { | |
718 dDividor = HValueToDouble(hThis, argTwo); | |
719 } | |
720 if (dDividor) { | |
721 FXJSE_Value_SetDouble( | |
722 args.GetReturnValue(), | |
723 dDividend - dDividor * (int32_t)(dDividend / dDividor)); | |
724 } else { | |
725 pContext->ThrowScriptErrorMessage(XFA_IDS_DIVIDE_ZERO); | |
726 } | |
727 } | |
728 FXJSE_Value_Release(argOne); | |
729 FXJSE_Value_Release(argTwo); | |
730 } else { | |
731 pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | |
732 L"Mod"); | |
733 } | |
734 } | |
735 void CXFA_FM2JSContext::Round(FXJSE_HOBJECT hThis, | |
736 const CFX_ByteStringC& szFuncName, | |
737 CFXJSE_Arguments& args) { | |
738 CXFA_FM2JSContext* pContext = | |
739 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
740 FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime(); | |
741 int32_t argc = args.GetLength(); | |
742 uint8_t uPrecision = 0; | |
743 if (argc == 1) { | |
744 FXJSE_HVALUE argOne = args.GetValue(0); | |
745 if (FXJSE_Value_IsNull(argOne)) { | |
746 FXJSE_Value_SetNull(args.GetReturnValue()); | |
747 } else { | |
748 FX_DOUBLE dValue = 0.0; | |
749 if (FXJSE_Value_IsArray(argOne)) { | |
750 FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime); | |
751 FXJSE_HVALUE jsObjectValue = FXJSE_Value_Create(hruntime); | |
752 FXJSE_Value_GetObjectPropByIdx(argOne, 1, propertyValue); | |
753 FXJSE_Value_GetObjectPropByIdx(argOne, 2, jsObjectValue); | |
754 if (FXJSE_Value_IsNull(propertyValue)) { | |
755 dValue = HValueToDouble(hThis, jsObjectValue); | |
756 } else { | |
757 CFX_ByteString propertyStr; | |
758 FXJSE_Value_ToUTF8String(propertyValue, propertyStr); | |
759 FXJSE_HVALUE newPropertyValue = FXJSE_Value_Create(hruntime); | |
760 FXJSE_Value_GetObjectProp(jsObjectValue, propertyStr, | |
761 newPropertyValue); | |
762 dValue = HValueToDouble(hThis, newPropertyValue); | |
763 FXJSE_Value_Release(newPropertyValue); | |
764 } | |
765 FXJSE_Value_Release(propertyValue); | |
766 FXJSE_Value_Release(jsObjectValue); | |
767 } else { | |
768 dValue = HValueToDouble(hThis, argOne); | |
769 } | |
770 CFX_Decimal decimalValue((FX_FLOAT)dValue, uPrecision); | |
771 CFX_WideString wsValue = decimalValue; | |
772 FXJSE_Value_SetUTF8String(args.GetReturnValue(), wsValue.UTF8Encode()); | |
773 } | |
774 FXJSE_Value_Release(argOne); | |
775 } else if (argc == 2) { | |
776 FXJSE_HVALUE argOne = args.GetValue(0); | |
777 FXJSE_HVALUE argTwo = args.GetValue(1); | |
778 if (FXJSE_Value_IsNull(argOne) || FXJSE_Value_IsNull(argTwo)) { | |
779 FXJSE_Value_SetNull(args.GetReturnValue()); | |
780 } else { | |
781 FX_DOUBLE dValue = 0.0; | |
782 if (FXJSE_Value_IsArray(argOne)) { | |
783 FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime); | |
784 FXJSE_HVALUE jsObjectValue = FXJSE_Value_Create(hruntime); | |
785 FXJSE_Value_GetObjectPropByIdx(argOne, 1, propertyValue); | |
786 FXJSE_Value_GetObjectPropByIdx(argOne, 2, jsObjectValue); | |
787 if (FXJSE_Value_IsNull(propertyValue)) { | |
788 dValue = HValueToDouble(hThis, jsObjectValue); | |
789 } else { | |
790 CFX_ByteString propertyStr; | |
791 FXJSE_Value_ToUTF8String(propertyValue, propertyStr); | |
792 FXJSE_HVALUE newPropertyValue = FXJSE_Value_Create(hruntime); | |
793 FXJSE_Value_GetObjectProp(jsObjectValue, propertyStr, | |
794 newPropertyValue); | |
795 dValue = HValueToDouble(hThis, newPropertyValue); | |
796 FXJSE_Value_Release(newPropertyValue); | |
797 } | |
798 FXJSE_Value_Release(propertyValue); | |
799 FXJSE_Value_Release(jsObjectValue); | |
800 } else { | |
801 dValue = HValueToDouble(hThis, argOne); | |
802 } | |
803 FX_DOUBLE dPrecision = 0.0; | |
804 if (FXJSE_Value_IsArray(argTwo)) { | |
805 FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime); | |
806 FXJSE_HVALUE jsObjectValue = FXJSE_Value_Create(hruntime); | |
807 FXJSE_Value_GetObjectPropByIdx(argTwo, 1, propertyValue); | |
808 FXJSE_Value_GetObjectPropByIdx(argTwo, 2, jsObjectValue); | |
809 if (FXJSE_Value_IsNull(propertyValue)) { | |
810 dPrecision = HValueToDouble(hThis, jsObjectValue); | |
811 } else { | |
812 CFX_ByteString propertyStr; | |
813 FXJSE_Value_ToUTF8String(propertyValue, propertyStr); | |
814 FXJSE_HVALUE newPropertyValue = FXJSE_Value_Create(hruntime); | |
815 FXJSE_Value_GetObjectProp(jsObjectValue, propertyStr, | |
816 newPropertyValue); | |
817 dPrecision = HValueToDouble(hThis, newPropertyValue); | |
818 FXJSE_Value_Release(newPropertyValue); | |
819 } | |
820 FXJSE_Value_Release(propertyValue); | |
821 FXJSE_Value_Release(jsObjectValue); | |
822 } else { | |
823 dPrecision = HValueToDouble(hThis, argTwo); | |
824 } | |
825 if (dPrecision < 0) { | |
826 uPrecision = 0; | |
827 } else if (dPrecision > 12.0) { | |
828 uPrecision = 12; | |
829 } else { | |
830 uPrecision = (uint8_t)dPrecision; | |
831 } | |
832 CFX_Decimal decimalValue((FX_FLOAT)dValue, uPrecision); | |
833 CFX_WideString wsValue = decimalValue; | |
834 FXJSE_Value_SetUTF8String(args.GetReturnValue(), wsValue.UTF8Encode()); | |
835 } | |
836 FXJSE_Value_Release(argOne); | |
837 FXJSE_Value_Release(argTwo); | |
838 } else { | |
839 pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | |
840 L"Round"); | |
841 } | |
842 } | |
843 void CXFA_FM2JSContext::Sum(FXJSE_HOBJECT hThis, | |
844 const CFX_ByteStringC& szFuncName, | |
845 CFXJSE_Arguments& args) { | |
846 CXFA_FM2JSContext* pContext = | |
847 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
848 FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime(); | |
849 int32_t argc = args.GetLength(); | |
850 uint32_t uCount = 0; | |
851 FX_DOUBLE dSum = 0.0; | |
852 if (argc) { | |
853 FXJSE_HVALUE argValue = 0; | |
854 for (int32_t i = 0; i < argc; i++) { | |
855 argValue = args.GetValue(i); | |
856 if (FXJSE_Value_IsNull(argValue)) { | |
857 FXJSE_Value_Release(argValue); | |
858 continue; | |
859 } else if (FXJSE_Value_IsArray(argValue)) { | |
860 FXJSE_HVALUE lengthValue = FXJSE_Value_Create(hruntime); | |
861 FXJSE_Value_GetObjectProp(argValue, "length", lengthValue); | |
862 int32_t iLength = FXJSE_Value_ToInteger(lengthValue); | |
863 FXJSE_Value_Release(lengthValue); | |
864 if (iLength > 2) { | |
865 FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime); | |
866 FXJSE_Value_GetObjectPropByIdx(argValue, 1, propertyValue); | |
867 FXJSE_HVALUE jsObjectValue = FXJSE_Value_Create(hruntime); | |
868 FXJSE_HVALUE newPropertyValue = FXJSE_Value_Create(hruntime); | |
869 if (FXJSE_Value_IsNull(propertyValue)) { | |
870 for (int32_t j = 2; j < iLength; j++) { | |
871 FXJSE_Value_GetObjectPropByIdx(argValue, j, jsObjectValue); | |
872 GetObjectDefaultValue(jsObjectValue, newPropertyValue); | |
873 if (!FXJSE_Value_IsNull(newPropertyValue)) { | |
874 dSum += HValueToDouble(hThis, jsObjectValue); | |
875 uCount++; | |
876 } | |
877 } | |
878 } else { | |
879 CFX_ByteString propertyStr; | |
880 FXJSE_Value_ToUTF8String(propertyValue, propertyStr); | |
881 for (int32_t j = 2; j < iLength; j++) { | |
882 FXJSE_Value_GetObjectPropByIdx(argValue, j, jsObjectValue); | |
883 FXJSE_Value_GetObjectProp(jsObjectValue, propertyStr, | |
884 newPropertyValue); | |
885 if (!FXJSE_Value_IsNull(newPropertyValue)) { | |
886 dSum += HValueToDouble(hThis, newPropertyValue); | |
887 uCount++; | |
888 } | |
889 } | |
890 } | |
891 FXJSE_Value_Release(newPropertyValue); | |
892 FXJSE_Value_Release(jsObjectValue); | |
893 FXJSE_Value_Release(propertyValue); | |
894 } else { | |
895 pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH); | |
896 } | |
897 } else if (FXJSE_Value_IsObject(argValue)) { | |
898 FXJSE_HVALUE newPropertyValue = FXJSE_Value_Create(hruntime); | |
899 GetObjectDefaultValue(argValue, newPropertyValue); | |
900 if (!FXJSE_Value_IsNull(newPropertyValue)) { | |
901 dSum += HValueToDouble(hThis, argValue); | |
902 uCount++; | |
903 } | |
904 FXJSE_Value_Release(newPropertyValue); | |
905 } else { | |
906 dSum += HValueToDouble(hThis, argValue); | |
907 uCount++; | |
908 } | |
909 FXJSE_Value_Release(argValue); | |
910 } | |
911 argValue = 0; | |
912 } | |
913 if (uCount < 1) { | |
914 FXJSE_Value_SetNull(args.GetReturnValue()); | |
915 } else { | |
916 FXJSE_Value_SetDouble(args.GetReturnValue(), dSum); | |
917 } | |
918 } | |
919 void CXFA_FM2JSContext::Date(FXJSE_HOBJECT hThis, | |
920 const CFX_ByteStringC& szFuncName, | |
921 CFXJSE_Arguments& args) { | |
922 if (args.GetLength() == 0) { | |
923 struct tm* pTmStruct = 0; | |
924 time_t currentTime; | |
925 time(¤tTime); | |
926 pTmStruct = gmtime(¤tTime); | |
927 CFX_ByteString bufferYear; | |
928 CFX_ByteString bufferMon; | |
929 CFX_ByteString bufferDay; | |
930 bufferYear.Format("%d", pTmStruct->tm_year + 1900); | |
931 bufferMon.Format("%02d", pTmStruct->tm_mon + 1); | |
932 bufferDay.Format("%02d", pTmStruct->tm_mday); | |
933 CFX_ByteString bufferCurrent = bufferYear + bufferMon + bufferDay; | |
934 int32_t dDays = DateString2Num(bufferCurrent); | |
935 FXJSE_Value_SetInteger(args.GetReturnValue(), dDays); | |
936 } else { | |
937 CXFA_FM2JSContext* pContext = | |
938 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
939 pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | |
940 L"Date"); | |
941 } | |
942 } | |
943 void CXFA_FM2JSContext::Date2Num(FXJSE_HOBJECT hThis, | |
944 const CFX_ByteStringC& szFuncName, | |
945 CFXJSE_Arguments& args) { | |
946 int32_t argc = args.GetLength(); | |
947 if ((argc > 0) && (argc < 4)) { | |
948 FX_BOOL bFlags = FALSE; | |
949 CFX_ByteString dateString; | |
950 CFX_ByteString formatString; | |
951 CFX_ByteString localString; | |
952 FXJSE_HVALUE dateValue = GetSimpleHValue(hThis, args, 0); | |
953 FXJSE_HVALUE formatValue = 0; | |
954 FXJSE_HVALUE localValue = 0; | |
955 if (HValueIsNull(hThis, dateValue)) { | |
956 bFlags = TRUE; | |
957 } else { | |
958 HValueToUTF8String(dateValue, dateString); | |
959 } | |
960 if (argc > 1) { | |
961 formatValue = GetSimpleHValue(hThis, args, 1); | |
962 if (HValueIsNull(hThis, formatValue)) { | |
963 bFlags = TRUE; | |
964 } else { | |
965 HValueToUTF8String(formatValue, formatString); | |
966 } | |
967 } | |
968 if (argc == 3) { | |
969 localValue = GetSimpleHValue(hThis, args, 2); | |
970 if (HValueIsNull(hThis, localValue)) { | |
971 bFlags = TRUE; | |
972 } else { | |
973 HValueToUTF8String(localValue, localString); | |
974 } | |
975 } | |
976 if (!bFlags) { | |
977 CFX_ByteString szIsoDateString; | |
978 FX_BOOL bRet = Local2IsoDate(hThis, dateString, formatString, localString, | |
979 szIsoDateString); | |
980 if (bRet) { | |
981 FXJSE_Value_SetInteger(args.GetReturnValue(), | |
982 DateString2Num(szIsoDateString)); | |
983 } else { | |
984 FXJSE_Value_SetInteger(args.GetReturnValue(), 0); | |
985 } | |
986 } else { | |
987 FXJSE_Value_SetNull(args.GetReturnValue()); | |
988 } | |
989 FXJSE_Value_Release(dateValue); | |
990 if (argc > 1) { | |
991 FXJSE_Value_Release(formatValue); | |
992 if (argc == 3) { | |
993 FXJSE_Value_Release(localValue); | |
994 } | |
995 } | |
996 } else { | |
997 CXFA_FM2JSContext* pContext = | |
998 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
999 pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | |
1000 L"Date2Num"); | |
1001 } | |
1002 } | |
1003 void CXFA_FM2JSContext::DateFmt(FXJSE_HOBJECT hThis, | |
1004 const CFX_ByteStringC& szFuncName, | |
1005 CFXJSE_Arguments& args) { | |
1006 int32_t argc = args.GetLength(); | |
1007 if (argc < 3) { | |
1008 FX_BOOL bFlags = FALSE; | |
1009 int32_t iStyle = 0; | |
1010 CFX_ByteString szLocal; | |
1011 FXJSE_HVALUE argStyle = 0; | |
1012 FXJSE_HVALUE argLocal = 0; | |
1013 if (argc > 0) { | |
1014 argStyle = GetSimpleHValue(hThis, args, 0); | |
1015 if (FXJSE_Value_IsNull(argStyle)) { | |
1016 bFlags = TRUE; | |
1017 } | |
1018 iStyle = (int32_t)HValueToFloat(hThis, argStyle); | |
1019 if (iStyle > 4 || iStyle < 0) { | |
1020 iStyle = 0; | |
1021 } | |
1022 } | |
1023 if (argc == 2) { | |
1024 argLocal = GetSimpleHValue(hThis, args, 1); | |
1025 if (FXJSE_Value_IsNull(argLocal)) { | |
1026 bFlags = TRUE; | |
1027 } else { | |
1028 HValueToUTF8String(argLocal, szLocal); | |
1029 } | |
1030 } | |
1031 if (!bFlags) { | |
1032 CFX_ByteString formatStr; | |
1033 GetStandardDateFormat(hThis, iStyle, szLocal, formatStr); | |
1034 if (formatStr.IsEmpty()) { | |
1035 formatStr = ""; | |
1036 } | |
1037 FXJSE_Value_SetUTF8String(args.GetReturnValue(), formatStr); | |
1038 } else { | |
1039 FXJSE_Value_SetNull(args.GetReturnValue()); | |
1040 } | |
1041 if (argc > 0) { | |
1042 FXJSE_Value_Release(argStyle); | |
1043 if (argc == 2) { | |
1044 FXJSE_Value_Release(argLocal); | |
1045 } | |
1046 } | |
1047 } else { | |
1048 CXFA_FM2JSContext* pContext = | |
1049 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
1050 pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | |
1051 L"Date2Num"); | |
1052 } | |
1053 } | |
1054 void CXFA_FM2JSContext::IsoDate2Num(FXJSE_HOBJECT hThis, | |
1055 const CFX_ByteStringC& szFuncName, | |
1056 CFXJSE_Arguments& args) { | |
1057 if (args.GetLength() == 1) { | |
1058 FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0); | |
1059 if (FXJSE_Value_IsNull(argOne)) { | |
1060 FXJSE_Value_SetNull(args.GetReturnValue()); | |
1061 } else { | |
1062 CFX_ByteString szArgString; | |
1063 HValueToUTF8String(argOne, szArgString); | |
1064 int32_t dDays = DateString2Num(szArgString); | |
1065 FXJSE_Value_SetInteger(args.GetReturnValue(), (int32_t)dDays); | |
1066 } | |
1067 FXJSE_Value_Release(argOne); | |
1068 } else { | |
1069 CXFA_FM2JSContext* pContext = | |
1070 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
1071 pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | |
1072 L"IsoDate2Num"); | |
1073 } | |
1074 } | |
1075 void CXFA_FM2JSContext::IsoTime2Num(FXJSE_HOBJECT hThis, | |
1076 const CFX_ByteStringC& szFuncName, | |
1077 CFXJSE_Arguments& args) { | |
1078 CXFA_FM2JSContext* pContext = | |
1079 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
1080 if (args.GetLength() == 1) { | |
1081 FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0); | |
1082 if (HValueIsNull(hThis, argOne)) { | |
1083 FXJSE_Value_SetNull(args.GetReturnValue()); | |
1084 } else { | |
1085 CXFA_Document* pDoc = pContext->GetDocument(); | |
1086 FXSYS_assert(pDoc); | |
1087 IFX_LocaleMgr* pMgr = (IFX_LocaleMgr*)pDoc->GetLocalMgr(); | |
1088 CFX_ByteString szArgString; | |
1089 HValueToUTF8String(argOne, szArgString); | |
1090 szArgString = szArgString.Mid(szArgString.Find('T', 0) + 1); | |
1091 if (szArgString.IsEmpty()) { | |
1092 FXJSE_Value_SetInteger(args.GetReturnValue(), 0); | |
1093 FXJSE_Value_Release(argOne); | |
1094 return; | |
1095 } | |
1096 CXFA_LocaleValue timeValue( | |
1097 XFA_VT_TIME, | |
1098 CFX_WideString::FromUTF8(szArgString, szArgString.GetLength()), | |
1099 (CXFA_LocaleMgr*)pMgr); | |
1100 if (timeValue.IsValid()) { | |
1101 CFX_Unitime uniTime = timeValue.GetTime(); | |
1102 int32_t hour = uniTime.GetHour(); | |
1103 int32_t min = uniTime.GetMinute(); | |
1104 int32_t second = uniTime.GetSecond(); | |
1105 int32_t milSecond = uniTime.GetMillisecond(); | |
1106 IFX_Locale* pDefLocale = pMgr->GetDefLocale(); | |
1107 FXSYS_assert(pDefLocale); | |
1108 FX_TIMEZONE tzLocale; | |
1109 pDefLocale->GetTimeZone(tzLocale); | |
1110 int32_t mins = hour * 60 + min; | |
1111 mins -= (tzLocale.tzHour * 60); | |
1112 while (mins > 1440) { | |
1113 mins -= 1440; | |
1114 } | |
1115 while (mins < 0) { | |
1116 mins += 1440; | |
1117 } | |
1118 hour = mins / 60; | |
1119 min = mins % 60; | |
1120 int32_t iResult = | |
1121 hour * 3600000 + min * 60000 + second * 1000 + milSecond + 1; | |
1122 FXJSE_Value_SetInteger(args.GetReturnValue(), iResult); | |
1123 } else { | |
1124 FXJSE_Value_SetInteger(args.GetReturnValue(), 0); | |
1125 } | |
1126 } | |
1127 FXJSE_Value_Release(argOne); | |
1128 } else { | |
1129 pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | |
1130 L"IsoTime2Num"); | |
1131 } | |
1132 } | |
1133 void CXFA_FM2JSContext::LocalDateFmt(FXJSE_HOBJECT hThis, | |
1134 const CFX_ByteStringC& szFuncName, | |
1135 CFXJSE_Arguments& args) { | |
1136 int32_t argc = args.GetLength(); | |
1137 if (argc < 3) { | |
1138 FX_BOOL bFlags = FALSE; | |
1139 int32_t iStyle = 0; | |
1140 CFX_ByteString szLocal; | |
1141 FXJSE_HVALUE argStyle = 0; | |
1142 FXJSE_HVALUE argLocal = 0; | |
1143 if (argc > 0) { | |
1144 argStyle = GetSimpleHValue(hThis, args, 0); | |
1145 if (FXJSE_Value_IsNull(argStyle)) { | |
1146 bFlags = TRUE; | |
1147 } | |
1148 iStyle = (int32_t)HValueToFloat(hThis, argStyle); | |
1149 if (iStyle > 4 || iStyle < 0) { | |
1150 iStyle = 0; | |
1151 } | |
1152 } | |
1153 if (argc == 2) { | |
1154 argLocal = GetSimpleHValue(hThis, args, 1); | |
1155 if (FXJSE_Value_IsNull(argLocal)) { | |
1156 bFlags = TRUE; | |
1157 } else { | |
1158 HValueToUTF8String(argLocal, szLocal); | |
1159 } | |
1160 } | |
1161 if (!bFlags) { | |
1162 CFX_ByteString formatStr; | |
1163 GetLocalDateFormat(hThis, iStyle, szLocal, formatStr, FALSE); | |
1164 if (formatStr.IsEmpty()) { | |
1165 formatStr = ""; | |
1166 } | |
1167 FXJSE_Value_SetUTF8String(args.GetReturnValue(), formatStr); | |
1168 } else { | |
1169 FXJSE_Value_SetNull(args.GetReturnValue()); | |
1170 } | |
1171 if (argc > 0) { | |
1172 FXJSE_Value_Release(argStyle); | |
1173 if (argc == 2) { | |
1174 FXJSE_Value_Release(argLocal); | |
1175 } | |
1176 } | |
1177 } else { | |
1178 CXFA_FM2JSContext* pContext = | |
1179 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
1180 pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | |
1181 L"LocalDateFmt"); | |
1182 } | |
1183 } | |
1184 void CXFA_FM2JSContext::LocalTimeFmt(FXJSE_HOBJECT hThis, | |
1185 const CFX_ByteStringC& szFuncName, | |
1186 CFXJSE_Arguments& args) { | |
1187 int32_t argc = args.GetLength(); | |
1188 if (argc < 3) { | |
1189 FX_BOOL bFlags = FALSE; | |
1190 int32_t iStyle = 0; | |
1191 CFX_ByteString szLocal; | |
1192 FXJSE_HVALUE argStyle = 0; | |
1193 FXJSE_HVALUE argLocal = 0; | |
1194 if (argc > 0) { | |
1195 argStyle = GetSimpleHValue(hThis, args, 0); | |
1196 if (FXJSE_Value_IsNull(argStyle)) { | |
1197 bFlags = TRUE; | |
1198 } | |
1199 iStyle = (int32_t)HValueToFloat(hThis, argStyle); | |
1200 if (iStyle > 4 || iStyle < 0) { | |
1201 iStyle = 0; | |
1202 } | |
1203 } | |
1204 if (argc == 2) { | |
1205 argLocal = GetSimpleHValue(hThis, args, 1); | |
1206 if (FXJSE_Value_IsNull(argLocal)) { | |
1207 bFlags = TRUE; | |
1208 } else { | |
1209 HValueToUTF8String(argLocal, szLocal); | |
1210 } | |
1211 } | |
1212 if (!bFlags) { | |
1213 CFX_ByteString formatStr; | |
1214 GetLocalTimeFormat(hThis, iStyle, szLocal, formatStr, FALSE); | |
1215 if (formatStr.IsEmpty()) { | |
1216 formatStr = ""; | |
1217 } | |
1218 FXJSE_Value_SetUTF8String(args.GetReturnValue(), formatStr); | |
1219 } else { | |
1220 FXJSE_Value_SetNull(args.GetReturnValue()); | |
1221 } | |
1222 if (argc > 0) { | |
1223 FXJSE_Value_Release(argStyle); | |
1224 if (argc == 2) { | |
1225 FXJSE_Value_Release(argLocal); | |
1226 } | |
1227 } | |
1228 } else { | |
1229 CXFA_FM2JSContext* pContext = | |
1230 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
1231 pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | |
1232 L"LocalTimeFmt"); | |
1233 } | |
1234 } | |
1235 void CXFA_FM2JSContext::Num2Date(FXJSE_HOBJECT hThis, | |
1236 const CFX_ByteStringC& szFuncName, | |
1237 CFXJSE_Arguments& args) { | |
1238 int32_t argc = args.GetLength(); | |
1239 if ((argc > 0) && (argc < 4)) { | |
1240 FX_BOOL bFlags = FALSE; | |
1241 int32_t dDate; | |
1242 CFX_ByteString formatString; | |
1243 CFX_ByteString localString; | |
1244 FXJSE_HVALUE dateValue = GetSimpleHValue(hThis, args, 0); | |
1245 FXJSE_HVALUE formatValue = 0; | |
1246 FXJSE_HVALUE localValue = 0; | |
1247 if (HValueIsNull(hThis, dateValue)) { | |
1248 bFlags = TRUE; | |
1249 } else { | |
1250 dDate = (int32_t)HValueToFloat(hThis, dateValue); | |
1251 bFlags = dDate < 1; | |
1252 } | |
1253 if (argc > 1) { | |
1254 formatValue = GetSimpleHValue(hThis, args, 1); | |
1255 if (HValueIsNull(hThis, formatValue)) { | |
1256 bFlags = TRUE; | |
1257 } else { | |
1258 HValueToUTF8String(formatValue, formatString); | |
1259 } | |
1260 } | |
1261 if (argc == 3) { | |
1262 localValue = GetSimpleHValue(hThis, args, 2); | |
1263 if (HValueIsNull(hThis, localValue)) { | |
1264 bFlags = TRUE; | |
1265 } else { | |
1266 HValueToUTF8String(localValue, localString); | |
1267 } | |
1268 } | |
1269 if (!bFlags) { | |
1270 int32_t iYear = 1900; | |
1271 int32_t iMonth = 1; | |
1272 int32_t iDay = 1; | |
1273 int32_t i = 0; | |
1274 while (dDate > 0) { | |
1275 if (iMonth == 2) { | |
1276 if ((!((iYear + i) % 4) && ((iYear + i) % 100)) || | |
1277 !((iYear + i) % 400)) { | |
1278 if (dDate > 29) { | |
1279 ++iMonth; | |
1280 if (iMonth > 12) { | |
1281 iMonth = 1; | |
1282 ++i; | |
1283 } | |
1284 iDay = 1; | |
1285 dDate -= 29; | |
1286 } else { | |
1287 iDay += static_cast<int32_t>(dDate) - 1; | |
1288 dDate = 0; | |
1289 } | |
1290 } else { | |
1291 if (dDate > 28) { | |
1292 ++iMonth; | |
1293 if (iMonth > 12) { | |
1294 iMonth = 1; | |
1295 ++i; | |
1296 } | |
1297 iDay = 1; | |
1298 dDate -= 28; | |
1299 } else { | |
1300 iDay += static_cast<int32_t>(dDate) - 1; | |
1301 dDate = 0; | |
1302 } | |
1303 } | |
1304 } else if (iMonth < 8) { | |
1305 if ((iMonth % 2 == 0)) { | |
1306 if (dDate > 30) { | |
1307 ++iMonth; | |
1308 if (iMonth > 12) { | |
1309 iMonth = 1; | |
1310 ++i; | |
1311 } | |
1312 iDay = 1; | |
1313 dDate -= 30; | |
1314 } else { | |
1315 iDay += static_cast<int32_t>(dDate) - 1; | |
1316 dDate = 0; | |
1317 } | |
1318 } else { | |
1319 if (dDate > 31) { | |
1320 ++iMonth; | |
1321 if (iMonth > 12) { | |
1322 iMonth = 1; | |
1323 ++i; | |
1324 } | |
1325 iDay = 1; | |
1326 dDate -= 31; | |
1327 } else { | |
1328 iDay += static_cast<int32_t>(dDate) - 1; | |
1329 dDate = 0; | |
1330 } | |
1331 } | |
1332 } else { | |
1333 if (iMonth % 2 != 0) { | |
1334 if (dDate > 30) { | |
1335 ++iMonth; | |
1336 if (iMonth > 12) { | |
1337 iMonth = 1; | |
1338 ++i; | |
1339 } | |
1340 iDay = 1; | |
1341 dDate -= 30; | |
1342 } else { | |
1343 iDay += static_cast<int32_t>(dDate) - 1; | |
1344 dDate = 0; | |
1345 } | |
1346 } else { | |
1347 if (dDate > 31) { | |
1348 ++iMonth; | |
1349 if (iMonth > 12) { | |
1350 iMonth = 1; | |
1351 ++i; | |
1352 } | |
1353 iDay = 1; | |
1354 dDate -= 31; | |
1355 } else { | |
1356 iDay += static_cast<int32_t>(dDate) - 1; | |
1357 dDate = 0; | |
1358 } | |
1359 } | |
1360 } | |
1361 } | |
1362 CFX_ByteString szIsoDateString; | |
1363 szIsoDateString.Format("%d%02d%02d", iYear + i, iMonth, iDay); | |
1364 CFX_ByteString szLocalDateString; | |
1365 IsoDate2Local(hThis, szIsoDateString, formatString, localString, | |
1366 szLocalDateString); | |
1367 if (szLocalDateString.IsEmpty()) { | |
1368 szLocalDateString = ""; | |
1369 } | |
1370 FXJSE_Value_SetUTF8String(args.GetReturnValue(), szLocalDateString); | |
1371 } else { | |
1372 FXJSE_Value_SetNull(args.GetReturnValue()); | |
1373 } | |
1374 FXJSE_Value_Release(dateValue); | |
1375 if (argc > 1) { | |
1376 FXJSE_Value_Release(formatValue); | |
1377 if (argc == 3) { | |
1378 FXJSE_Value_Release(localValue); | |
1379 } | |
1380 } | |
1381 } else { | |
1382 CXFA_FM2JSContext* pContext = | |
1383 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
1384 pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | |
1385 L"Num2Date"); | |
1386 } | |
1387 } | |
1388 void CXFA_FM2JSContext::Num2GMTime(FXJSE_HOBJECT hThis, | |
1389 const CFX_ByteStringC& szFuncName, | |
1390 CFXJSE_Arguments& args) { | |
1391 int32_t argc = args.GetLength(); | |
1392 if ((argc > 0) && (argc < 4)) { | |
1393 FX_BOOL bFlags = FALSE; | |
1394 int32_t iTime; | |
1395 CFX_ByteString formatString; | |
1396 CFX_ByteString localString; | |
1397 FXJSE_HVALUE timeValue = GetSimpleHValue(hThis, args, 0); | |
1398 FXJSE_HVALUE formatValue = 0; | |
1399 FXJSE_HVALUE localValue = 0; | |
1400 if (FXJSE_Value_IsNull(timeValue)) { | |
1401 bFlags = TRUE; | |
1402 } else { | |
1403 iTime = (int32_t)HValueToFloat(hThis, timeValue); | |
1404 if (FXSYS_abs(iTime) < 1.0) { | |
1405 bFlags = TRUE; | |
1406 } | |
1407 } | |
1408 if (argc > 1) { | |
1409 formatValue = GetSimpleHValue(hThis, args, 1); | |
1410 if (FXJSE_Value_IsNull(formatValue)) { | |
1411 bFlags = TRUE; | |
1412 } else { | |
1413 HValueToUTF8String(formatValue, formatString); | |
1414 } | |
1415 } | |
1416 if (argc == 3) { | |
1417 localValue = GetSimpleHValue(hThis, args, 2); | |
1418 if (FXJSE_Value_IsNull(localValue)) { | |
1419 bFlags = TRUE; | |
1420 } else { | |
1421 HValueToUTF8String(localValue, localString); | |
1422 } | |
1423 } | |
1424 if (!bFlags) { | |
1425 CFX_ByteString szGMTTimeString; | |
1426 Num2AllTime(hThis, iTime, formatString, localString, TRUE, | |
1427 szGMTTimeString); | |
1428 if (szGMTTimeString.IsEmpty()) { | |
1429 szGMTTimeString = ""; | |
1430 } | |
1431 FXJSE_Value_SetUTF8String(args.GetReturnValue(), szGMTTimeString); | |
1432 } else { | |
1433 FXJSE_Value_SetNull(args.GetReturnValue()); | |
1434 } | |
1435 FXJSE_Value_Release(timeValue); | |
1436 if (argc > 1) { | |
1437 FXJSE_Value_Release(formatValue); | |
1438 if (argc == 3) { | |
1439 FXJSE_Value_Release(localValue); | |
1440 } | |
1441 } | |
1442 } else { | |
1443 CXFA_FM2JSContext* pContext = | |
1444 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
1445 pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | |
1446 L"Num2GMTime"); | |
1447 } | |
1448 } | |
1449 void CXFA_FM2JSContext::Num2Time(FXJSE_HOBJECT hThis, | |
1450 const CFX_ByteStringC& szFuncName, | |
1451 CFXJSE_Arguments& args) { | |
1452 int32_t argc = args.GetLength(); | |
1453 if ((argc > 0) && (argc < 4)) { | |
1454 FX_BOOL bFlags = FALSE; | |
1455 FX_FLOAT fTime; | |
1456 CFX_ByteString formatString; | |
1457 CFX_ByteString localString; | |
1458 FXJSE_HVALUE timeValue = GetSimpleHValue(hThis, args, 0); | |
1459 FXJSE_HVALUE formatValue = 0; | |
1460 FXJSE_HVALUE localValue = 0; | |
1461 if (FXJSE_Value_IsNull(timeValue)) { | |
1462 bFlags = TRUE; | |
1463 } else { | |
1464 fTime = HValueToFloat(hThis, timeValue); | |
1465 if (FXSYS_fabs(fTime) < 1.0) { | |
1466 bFlags = TRUE; | |
1467 } | |
1468 } | |
1469 if (argc > 1) { | |
1470 formatValue = GetSimpleHValue(hThis, args, 1); | |
1471 if (FXJSE_Value_IsNull(formatValue)) { | |
1472 bFlags = TRUE; | |
1473 } else { | |
1474 HValueToUTF8String(formatValue, formatString); | |
1475 } | |
1476 } | |
1477 if (argc == 3) { | |
1478 localValue = GetSimpleHValue(hThis, args, 2); | |
1479 if (FXJSE_Value_IsNull(localValue)) { | |
1480 bFlags = TRUE; | |
1481 } else { | |
1482 HValueToUTF8String(localValue, localString); | |
1483 } | |
1484 } | |
1485 if (!bFlags) { | |
1486 CFX_ByteString szLocalTimeString; | |
1487 Num2AllTime(hThis, (int32_t)fTime, formatString, localString, FALSE, | |
1488 szLocalTimeString); | |
1489 if (szLocalTimeString.IsEmpty()) { | |
1490 szLocalTimeString = ""; | |
1491 } | |
1492 FXJSE_Value_SetUTF8String(args.GetReturnValue(), szLocalTimeString); | |
1493 } else { | |
1494 FXJSE_Value_SetNull(args.GetReturnValue()); | |
1495 } | |
1496 FXJSE_Value_Release(timeValue); | |
1497 if (argc > 1) { | |
1498 FXJSE_Value_Release(formatValue); | |
1499 if (argc == 3) { | |
1500 FXJSE_Value_Release(localValue); | |
1501 } | |
1502 } | |
1503 } else { | |
1504 CXFA_FM2JSContext* pContext = | |
1505 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
1506 pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | |
1507 L"Num2Time"); | |
1508 } | |
1509 } | |
1510 void CXFA_FM2JSContext::Time(FXJSE_HOBJECT hThis, | |
1511 const CFX_ByteStringC& szFuncName, | |
1512 CFXJSE_Arguments& args) { | |
1513 if (args.GetLength() == 0) { | |
1514 time_t now; | |
1515 time(&now); | |
1516 struct tm* pGmt = gmtime(&now); | |
1517 int32_t iGMHour = pGmt->tm_hour; | |
1518 int32_t iGMMin = pGmt->tm_min; | |
1519 int32_t iGMSec = pGmt->tm_sec; | |
1520 FXJSE_Value_SetInteger(args.GetReturnValue(), | |
1521 ((iGMHour * 3600 + iGMMin * 60 + iGMSec) * 1000)); | |
1522 } else { | |
1523 CXFA_FM2JSContext* pContext = | |
1524 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
1525 pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | |
1526 L"Time"); | |
1527 } | |
1528 } | |
1529 void CXFA_FM2JSContext::Time2Num(FXJSE_HOBJECT hThis, | |
1530 const CFX_ByteStringC& szFuncName, | |
1531 CFXJSE_Arguments& args) { | |
1532 int32_t argc = args.GetLength(); | |
1533 if ((argc > 0) && (argc < 4)) { | |
1534 FX_BOOL bFlags = FALSE; | |
1535 CFX_ByteString timeString; | |
1536 CFX_ByteString formatString; | |
1537 CFX_ByteString localString; | |
1538 FXJSE_HVALUE timeValue = GetSimpleHValue(hThis, args, 0); | |
1539 FXJSE_HVALUE formatValue = 0; | |
1540 FXJSE_HVALUE localValue = 0; | |
1541 if (HValueIsNull(hThis, timeValue)) { | |
1542 bFlags = TRUE; | |
1543 } else { | |
1544 HValueToUTF8String(timeValue, timeString); | |
1545 } | |
1546 if (argc > 1) { | |
1547 formatValue = GetSimpleHValue(hThis, args, 1); | |
1548 if (HValueIsNull(hThis, formatValue)) { | |
1549 bFlags = TRUE; | |
1550 } else { | |
1551 HValueToUTF8String(formatValue, formatString); | |
1552 } | |
1553 } | |
1554 if (argc == 3) { | |
1555 localValue = GetSimpleHValue(hThis, args, 2); | |
1556 if (HValueIsNull(hThis, localValue)) { | |
1557 bFlags = TRUE; | |
1558 } else { | |
1559 HValueToUTF8String(localValue, localString); | |
1560 } | |
1561 } | |
1562 if (!bFlags) { | |
1563 CXFA_FM2JSContext* pContext = | |
1564 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
1565 CXFA_Document* pDoc = pContext->GetDocument(); | |
1566 IFX_LocaleMgr* pMgr = (IFX_LocaleMgr*)pDoc->GetLocalMgr(); | |
1567 IFX_Locale* pLocale = NULL; | |
1568 if (localString.IsEmpty()) { | |
1569 CXFA_Node* pThisNode = | |
1570 ToNode(pDoc->GetScriptContext()->GetThisObject()); | |
1571 FXSYS_assert(pThisNode); | |
1572 CXFA_WidgetData widgetData(pThisNode); | |
1573 pLocale = widgetData.GetLocal(); | |
1574 } else { | |
1575 pLocale = pMgr->GetLocaleByName( | |
1576 CFX_WideString::FromUTF8(localString, localString.GetLength())); | |
1577 } | |
1578 CFX_WideString wsFormat; | |
1579 if (formatString.IsEmpty()) { | |
1580 pLocale->GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY_Default, wsFormat); | |
1581 } else { | |
1582 wsFormat = | |
1583 CFX_WideString::FromUTF8(formatString, formatString.GetLength()); | |
1584 } | |
1585 wsFormat = FX_WSTRC(L"time{") + wsFormat; | |
1586 wsFormat += FX_WSTRC(L"}"); | |
1587 CXFA_LocaleValue timeValue( | |
1588 XFA_VT_TIME, | |
1589 CFX_WideString::FromUTF8(timeString, timeString.GetLength()), | |
1590 wsFormat, pLocale, (CXFA_LocaleMgr*)pMgr); | |
1591 if (timeValue.IsValid()) { | |
1592 CFX_Unitime uniTime = timeValue.GetTime(); | |
1593 int32_t hour = uniTime.GetHour(); | |
1594 int32_t min = uniTime.GetMinute(); | |
1595 int32_t second = uniTime.GetSecond(); | |
1596 int32_t milSecond = uniTime.GetMillisecond(); | |
1597 int32_t mins = hour * 60 + min; | |
1598 IXFA_TimeZoneProvider* pProvider = IXFA_TimeZoneProvider::Get(); | |
1599 if (pProvider) { | |
1600 FX_TIMEZONE tz; | |
1601 pProvider->GetTimeZone(tz); | |
1602 mins -= (tz.tzHour * 60); | |
1603 while (mins > 1440) { | |
1604 mins -= 1440; | |
1605 } | |
1606 while (mins < 0) { | |
1607 mins += 1440; | |
1608 } | |
1609 hour = mins / 60; | |
1610 min = mins % 60; | |
1611 } | |
1612 int32_t iResult = | |
1613 hour * 3600000 + min * 60000 + second * 1000 + milSecond + 1; | |
1614 FXJSE_Value_SetInteger(args.GetReturnValue(), iResult); | |
1615 } else { | |
1616 FXJSE_Value_SetInteger(args.GetReturnValue(), 0); | |
1617 } | |
1618 } else { | |
1619 FXJSE_Value_SetNull(args.GetReturnValue()); | |
1620 } | |
1621 FXJSE_Value_Release(timeValue); | |
1622 if (argc > 1) { | |
1623 FXJSE_Value_Release(formatValue); | |
1624 if (argc == 3) { | |
1625 FXJSE_Value_Release(localValue); | |
1626 } | |
1627 } | |
1628 } else { | |
1629 CXFA_FM2JSContext* pContext = | |
1630 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
1631 pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | |
1632 L"Time2Num"); | |
1633 } | |
1634 } | |
1635 void CXFA_FM2JSContext::TimeFmt(FXJSE_HOBJECT hThis, | |
1636 const CFX_ByteStringC& szFuncName, | |
1637 CFXJSE_Arguments& args) { | |
1638 int32_t argc = args.GetLength(); | |
1639 if (argc < 3) { | |
1640 FX_BOOL bFlags = FALSE; | |
1641 int32_t iStyle = 0; | |
1642 CFX_ByteString szLocal; | |
1643 FXJSE_HVALUE argStyle = 0; | |
1644 FXJSE_HVALUE argLocal = 0; | |
1645 if (argc > 0) { | |
1646 argStyle = GetSimpleHValue(hThis, args, 0); | |
1647 if (FXJSE_Value_IsNull(argStyle)) { | |
1648 bFlags = TRUE; | |
1649 } | |
1650 iStyle = (int32_t)HValueToFloat(hThis, argStyle); | |
1651 if (iStyle > 4 || iStyle < 0) { | |
1652 iStyle = 0; | |
1653 } | |
1654 } | |
1655 if (argc == 2) { | |
1656 argLocal = GetSimpleHValue(hThis, args, 1); | |
1657 if (FXJSE_Value_IsNull(argLocal)) { | |
1658 bFlags = TRUE; | |
1659 } else { | |
1660 HValueToUTF8String(argLocal, szLocal); | |
1661 } | |
1662 } | |
1663 if (!bFlags) { | |
1664 CFX_ByteString formatStr; | |
1665 GetStandardTimeFormat(hThis, iStyle, szLocal, formatStr); | |
1666 if (formatStr.IsEmpty()) { | |
1667 formatStr = ""; | |
1668 } | |
1669 FXJSE_Value_SetUTF8String(args.GetReturnValue(), formatStr); | |
1670 } else { | |
1671 FXJSE_Value_SetNull(args.GetReturnValue()); | |
1672 } | |
1673 if (argc > 0) { | |
1674 FXJSE_Value_Release(argStyle); | |
1675 if (argc == 2) { | |
1676 FXJSE_Value_Release(argLocal); | |
1677 } | |
1678 } | |
1679 } else { | |
1680 CXFA_FM2JSContext* pContext = | |
1681 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
1682 pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | |
1683 L"TimeFmt"); | |
1684 } | |
1685 } | |
1686 FX_BOOL CXFA_FM2JSContext::IsIsoDateFormat(const FX_CHAR* pData, | |
1687 int32_t iLength, | |
1688 int32_t& iStyle, | |
1689 int32_t& iYear, | |
1690 int32_t& iMonth, | |
1691 int32_t& iDay) { | |
1692 iYear = 0; | |
1693 iMonth = 1; | |
1694 iDay = 1; | |
1695 FX_BOOL iRet = FALSE; | |
1696 if (iLength < 4) { | |
1697 return iRet; | |
1698 } | |
1699 FX_CHAR strYear[5]; | |
1700 strYear[4] = '\0'; | |
1701 for (int32_t i = 0; i < 4; ++i) { | |
1702 if (*(pData + i) <= '9' && *(pData + i) >= '0') { | |
1703 strYear[i] = *(pData + i); | |
1704 } else { | |
1705 return iRet; | |
1706 } | |
1707 } | |
1708 iYear = FXSYS_atoi(strYear); | |
1709 iStyle = 0; | |
1710 if (iLength > 4) { | |
1711 if (*(pData + 4) == '-') { | |
1712 iStyle = 1; | |
1713 } else { | |
1714 iStyle = 0; | |
1715 } | |
1716 } else { | |
1717 iRet = TRUE; | |
1718 return iRet; | |
1719 } | |
1720 FX_CHAR strTemp[3]; | |
1721 strTemp[2] = '\0'; | |
1722 int32_t iPosOff = 0; | |
1723 if (iStyle == 0) { | |
1724 iPosOff = 4; | |
1725 if (iLength == 4) { | |
1726 iRet = TRUE; | |
1727 return iRet; | |
1728 } | |
1729 } else { | |
1730 iPosOff = 5; | |
1731 if (iLength == 4) { | |
1732 iRet = TRUE; | |
1733 return iRet; | |
1734 } | |
1735 } | |
1736 if ((*(pData + iPosOff) > '9' || *(pData + iPosOff) < '0') || | |
1737 (*(pData + iPosOff + 1) > '9' || *(pData + iPosOff + 1) < '0')) { | |
1738 return iRet; | |
1739 } | |
1740 strTemp[0] = *(pData + iPosOff); | |
1741 strTemp[1] = *(pData + iPosOff + 1); | |
1742 iMonth = FXSYS_atoi(strTemp); | |
1743 if (iMonth > 12 || iMonth < 1) { | |
1744 return iRet; | |
1745 } | |
1746 if (iStyle == 0) { | |
1747 iPosOff += 2; | |
1748 if (iLength == 6) { | |
1749 iRet = 1; | |
1750 return iRet; | |
1751 } | |
1752 } else { | |
1753 iPosOff += 3; | |
1754 if (iLength == 7) { | |
1755 iRet = 1; | |
1756 return iRet; | |
1757 } | |
1758 } | |
1759 if ((*(pData + iPosOff) > '9' || *(pData + iPosOff) < '0') || | |
1760 (*(pData + iPosOff + 1) > '9' || *(pData + iPosOff + 1) < '0')) { | |
1761 return iRet; | |
1762 } | |
1763 strTemp[0] = *(pData + iPosOff); | |
1764 strTemp[1] = *(pData + iPosOff + 1); | |
1765 iDay = FXSYS_atoi(strTemp); | |
1766 if (iPosOff + 2 < iLength) { | |
1767 return iRet; | |
1768 } | |
1769 if ((!(iYear % 4) && (iYear % 100)) || !(iYear % 400)) { | |
1770 if (iMonth == 2) { | |
1771 if (iDay > 29) { | |
1772 return iRet; | |
1773 } | |
1774 } else { | |
1775 if (iMonth < 8) { | |
1776 if (iDay > (iMonth % 2 == 0 ? 30 : 31)) { | |
1777 return iRet; | |
1778 } | |
1779 } else { | |
1780 if (iDay > (iMonth % 2 == 0 ? 31 : 30)) { | |
1781 return iRet; | |
1782 } | |
1783 } | |
1784 } | |
1785 } else { | |
1786 if (iMonth == 2) { | |
1787 if (iDay > 28) { | |
1788 return iRet; | |
1789 } | |
1790 } else { | |
1791 if (iMonth < 8) { | |
1792 if (iDay > (iMonth % 2 == 0 ? 30 : 31)) { | |
1793 return iRet; | |
1794 } | |
1795 } else { | |
1796 if (iDay > (iMonth % 2 == 0 ? 31 : 30)) { | |
1797 return iRet; | |
1798 } | |
1799 } | |
1800 } | |
1801 } | |
1802 iRet = TRUE; | |
1803 return iRet; | |
1804 } | |
1805 FX_BOOL CXFA_FM2JSContext::IsIsoTimeFormat(const FX_CHAR* pData, | |
1806 int32_t iLength, | |
1807 int32_t& iHour, | |
1808 int32_t& iMinute, | |
1809 int32_t& iSecond, | |
1810 int32_t& iMilliSecond, | |
1811 int32_t& iZoneHour, | |
1812 int32_t& iZoneMinute) { | |
1813 iHour = 0; | |
1814 iMinute = 0; | |
1815 iSecond = 0; | |
1816 iMilliSecond = 0; | |
1817 iZoneHour = 0; | |
1818 iZoneMinute = 0; | |
1819 if (!pData) { | |
1820 return FALSE; | |
1821 } | |
1822 int32_t iRet = FALSE; | |
1823 FX_CHAR strTemp[3]; | |
1824 strTemp[2] = '\0'; | |
1825 int32_t iIndex = 0; | |
1826 int32_t iZone = 0; | |
1827 int32_t i = iIndex; | |
1828 while (i < iLength) { | |
1829 if ((*(pData + i) > '9' || *(pData + i) < '0') && *(pData + i) != ':') { | |
1830 iZone = i; | |
1831 break; | |
1832 } | |
1833 ++i; | |
1834 } | |
1835 if (i == iLength) { | |
1836 iZone = iLength; | |
1837 } | |
1838 int32_t iPos = 0; | |
1839 while (iIndex < iZone) { | |
1840 if (iIndex >= iZone) { | |
1841 break; | |
1842 } | |
1843 if (*(pData + iIndex) > '9' || *(pData + iIndex) < '0') { | |
1844 return iRet; | |
1845 } | |
1846 strTemp[0] = *(pData + iIndex); | |
1847 if (*(pData + iIndex + 1) > '9' || *(pData + iIndex + 1) < '0') { | |
1848 return iRet; | |
1849 } | |
1850 strTemp[1] = *(pData + iIndex + 1); | |
1851 if (FXSYS_atoi(strTemp) > 60) { | |
1852 return iRet; | |
1853 } | |
1854 if (*(pData + 2) == ':') { | |
1855 if (iPos == 0) { | |
1856 iHour = FXSYS_atoi(strTemp); | |
1857 ++iPos; | |
1858 } else if (iPos == 1) { | |
1859 iMinute = FXSYS_atoi(strTemp); | |
1860 ++iPos; | |
1861 } else { | |
1862 iSecond = FXSYS_atoi(strTemp); | |
1863 } | |
1864 iIndex += 3; | |
1865 } else { | |
1866 if (iPos == 0) { | |
1867 iHour = FXSYS_atoi(strTemp); | |
1868 ++iPos; | |
1869 } else if (iPos == 1) { | |
1870 iMinute = FXSYS_atoi(strTemp); | |
1871 ++iPos; | |
1872 } else if (iPos == 2) { | |
1873 iSecond = FXSYS_atoi(strTemp); | |
1874 ++iPos; | |
1875 } | |
1876 iIndex += 2; | |
1877 } | |
1878 } | |
1879 if (*(pData + iIndex) == '.') { | |
1880 ++iIndex; | |
1881 FX_CHAR strTemp[4]; | |
1882 strTemp[3] = '\0'; | |
1883 if (*(pData + iIndex) > '9' || *(pData + iIndex) < '0') { | |
1884 return iRet; | |
1885 } | |
1886 strTemp[0] = *(pData + iIndex); | |
1887 if (*(pData + iIndex + 1) > '9' || *(pData + iIndex + 1) < '0') { | |
1888 return iRet; | |
1889 } | |
1890 strTemp[1] = *(pData + iIndex + 1); | |
1891 if (*(pData + iIndex + 2) > '9' || *(pData + iIndex + 2) < '0') { | |
1892 return iRet; | |
1893 } | |
1894 strTemp[2] = *(pData + iIndex + 2); | |
1895 iMilliSecond = FXSYS_atoi(strTemp); | |
1896 if (iMilliSecond > 100) { | |
1897 iMilliSecond = 0; | |
1898 return iRet; | |
1899 } | |
1900 iIndex += 3; | |
1901 } | |
1902 int32_t iSign = 1; | |
1903 if (*(pData + iIndex) == 'z' || *(pData + iIndex) == 'Z') { | |
1904 iRet = 1; | |
1905 return iRet; | |
1906 } else if (*(pData + iIndex) == '+') { | |
1907 ++iIndex; | |
1908 } else if (*(pData + iIndex) == '-') { | |
1909 iSign = -1; | |
1910 ++iIndex; | |
1911 } | |
1912 iPos = 0; | |
1913 while (iIndex < iLength) { | |
1914 if (iIndex >= iLength) { | |
1915 return iRet; | |
1916 } | |
1917 if (*(pData + iIndex) > '9' || *(pData + iIndex) < '0') { | |
1918 return iRet; | |
1919 } | |
1920 strTemp[0] = *(pData + iIndex); | |
1921 if (*(pData + iIndex + 1) > '9' || *(pData + iIndex + 1) < '0') { | |
1922 return iRet; | |
1923 } | |
1924 strTemp[1] = *(pData + iIndex + 1); | |
1925 if (FXSYS_atoi(strTemp) > 60) { | |
1926 return iRet; | |
1927 } | |
1928 if (*(pData + 2) == ':') { | |
1929 if (iPos == 0) { | |
1930 iZoneHour = FXSYS_atoi(strTemp); | |
1931 } else if (iPos == 1) { | |
1932 iZoneMinute = FXSYS_atoi(strTemp); | |
1933 } | |
1934 iIndex += 3; | |
1935 } else { | |
1936 if (!iPos) { | |
1937 iZoneHour = FXSYS_atoi(strTemp); | |
1938 ++iPos; | |
1939 } else if (iPos == 1) { | |
1940 iZoneMinute = FXSYS_atoi(strTemp); | |
1941 ++iPos; | |
1942 } | |
1943 iIndex += 2; | |
1944 } | |
1945 } | |
1946 if (iIndex < iLength) { | |
1947 return iRet; | |
1948 } | |
1949 iZoneHour *= iSign; | |
1950 iRet = TRUE; | |
1951 return iRet; | |
1952 } | |
1953 FX_BOOL CXFA_FM2JSContext::IsIsoDateTimeFormat(const FX_CHAR* pData, | |
1954 int32_t iLength, | |
1955 int32_t& iYear, | |
1956 int32_t& iMonth, | |
1957 int32_t& iDay, | |
1958 int32_t& iHour, | |
1959 int32_t& iMinute, | |
1960 int32_t& iSecond, | |
1961 int32_t& iMillionSecond, | |
1962 int32_t& iZoneHour, | |
1963 int32_t& iZoneMinute) { | |
1964 iYear = 0; | |
1965 iMonth = 0; | |
1966 iDay = 0; | |
1967 iHour = 0; | |
1968 iMinute = 0; | |
1969 iSecond = 0; | |
1970 if (!pData) { | |
1971 return FALSE; | |
1972 } | |
1973 int32_t iRet = FALSE; | |
1974 int32_t iIndex = 0; | |
1975 while (*(pData + iIndex) != 'T' && *(pData + iIndex) != 't') { | |
1976 if (iIndex >= iLength) { | |
1977 return iRet; | |
1978 } | |
1979 ++iIndex; | |
1980 } | |
1981 if (iIndex != 8 && iIndex != 10) { | |
1982 return iRet; | |
1983 } | |
1984 int32_t iStyle = -1; | |
1985 iRet = IsIsoDateFormat(pData, iIndex, iStyle, iYear, iMonth, iDay); | |
1986 if (!iRet) { | |
1987 return iRet; | |
1988 } | |
1989 if (*(pData + iIndex) != 'T' && *(pData + iIndex) != 't') { | |
1990 return iRet; | |
1991 } | |
1992 ++iIndex; | |
1993 if (((iLength - iIndex > 13) && (iLength - iIndex < 6)) && | |
1994 (iLength - iIndex != 15)) { | |
1995 return iRet; | |
1996 } | |
1997 iRet = IsIsoTimeFormat(pData + iIndex, iLength - iIndex, iHour, iMinute, | |
1998 iSecond, iMillionSecond, iZoneHour, iZoneMinute); | |
1999 if (!iRet) { | |
2000 return iRet; | |
2001 } | |
2002 iRet = TRUE; | |
2003 return iRet; | |
2004 } | |
2005 FX_BOOL CXFA_FM2JSContext::Local2IsoDate(FXJSE_HOBJECT hThis, | |
2006 const CFX_ByteStringC& szDate, | |
2007 const CFX_ByteStringC& szFormat, | |
2008 const CFX_ByteStringC& szLocale, | |
2009 CFX_ByteString& strIsoDate) { | |
2010 CXFA_FM2JSContext* pContext = | |
2011 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
2012 CXFA_Document* pDoc = pContext->GetDocument(); | |
2013 if (!pDoc) { | |
2014 return FALSE; | |
2015 } | |
2016 IFX_LocaleMgr* pMgr = (IFX_LocaleMgr*)pDoc->GetLocalMgr(); | |
2017 IFX_Locale* pLocale = NULL; | |
2018 if (szLocale.IsEmpty()) { | |
2019 CXFA_Node* pThisNode = ToNode(pDoc->GetScriptContext()->GetThisObject()); | |
2020 FXSYS_assert(pThisNode); | |
2021 CXFA_WidgetData widgetData(pThisNode); | |
2022 pLocale = widgetData.GetLocal(); | |
2023 } else { | |
2024 pLocale = pMgr->GetLocaleByName( | |
2025 CFX_WideString::FromUTF8(szLocale.GetCStr(), szLocale.GetLength())); | |
2026 } | |
2027 if (!pLocale) { | |
2028 return FALSE; | |
2029 } | |
2030 CFX_WideString wsFormat; | |
2031 if (szFormat.IsEmpty()) { | |
2032 pLocale->GetDatePattern(FX_LOCALEDATETIMESUBCATEGORY_Default, wsFormat); | |
2033 } else { | |
2034 wsFormat = | |
2035 CFX_WideString::FromUTF8(szFormat.GetCStr(), szFormat.GetLength()); | |
2036 } | |
2037 CXFA_LocaleValue widgetValue( | |
2038 XFA_VT_DATE, | |
2039 CFX_WideString::FromUTF8(szDate.GetCStr(), szDate.GetLength()), wsFormat, | |
2040 pLocale, (CXFA_LocaleMgr*)pMgr); | |
2041 CFX_Unitime dt = widgetValue.GetDate(); | |
2042 strIsoDate.Format("%4d-%02d-%02d", dt.GetYear(), dt.GetMonth(), dt.GetDay()); | |
2043 return TRUE; | |
2044 } | |
2045 FX_BOOL CXFA_FM2JSContext::Local2IsoTime(FXJSE_HOBJECT hThis, | |
2046 const CFX_ByteStringC& szTime, | |
2047 const CFX_ByteStringC& szFormat, | |
2048 const CFX_ByteStringC& szLocale, | |
2049 CFX_ByteString& strIsoTime) { | |
2050 CXFA_FM2JSContext* pContext = | |
2051 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
2052 CXFA_Document* pDoc = pContext->GetDocument(); | |
2053 if (!pDoc) { | |
2054 return FALSE; | |
2055 } | |
2056 IFX_LocaleMgr* pMgr = (IFX_LocaleMgr*)pDoc->GetLocalMgr(); | |
2057 IFX_Locale* pLocale = NULL; | |
2058 if (szLocale.IsEmpty()) { | |
2059 CXFA_Node* pThisNode = ToNode(pDoc->GetScriptContext()->GetThisObject()); | |
2060 FXSYS_assert(pThisNode); | |
2061 CXFA_WidgetData widgetData(pThisNode); | |
2062 pLocale = widgetData.GetLocal(); | |
2063 } else { | |
2064 pLocale = pMgr->GetLocaleByName( | |
2065 CFX_WideString::FromUTF8(szLocale.GetCStr(), szLocale.GetLength())); | |
2066 } | |
2067 if (!pLocale) { | |
2068 return FALSE; | |
2069 } | |
2070 CFX_WideString wsFormat; | |
2071 if (szFormat.IsEmpty()) { | |
2072 pLocale->GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY_Default, wsFormat); | |
2073 } else { | |
2074 wsFormat = | |
2075 CFX_WideString::FromUTF8(szFormat.GetCStr(), szFormat.GetLength()); | |
2076 } | |
2077 wsFormat = FX_WSTRC(L"time{") + wsFormat; | |
2078 wsFormat += FX_WSTRC(L"}"); | |
2079 CXFA_LocaleValue widgetValue( | |
2080 XFA_VT_TIME, | |
2081 CFX_WideString::FromUTF8(szTime.GetCStr(), szTime.GetLength()), wsFormat, | |
2082 pLocale, (CXFA_LocaleMgr*)pMgr); | |
2083 CFX_Unitime utime = widgetValue.GetTime(); | |
2084 strIsoTime.Format("%02d:%02d:%02d.%03d", utime.GetHour(), utime.GetMinute(), | |
2085 utime.GetSecond(), utime.GetMillisecond()); | |
2086 return TRUE; | |
2087 } | |
2088 FX_BOOL CXFA_FM2JSContext::IsoDate2Local(FXJSE_HOBJECT hThis, | |
2089 const CFX_ByteStringC& szDate, | |
2090 const CFX_ByteStringC& szFormat, | |
2091 const CFX_ByteStringC& szLocale, | |
2092 CFX_ByteString& strLocalDate) { | |
2093 CXFA_FM2JSContext* pContext = | |
2094 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
2095 CXFA_Document* pDoc = pContext->GetDocument(); | |
2096 if (!pDoc) { | |
2097 return FALSE; | |
2098 } | |
2099 IFX_LocaleMgr* pMgr = (IFX_LocaleMgr*)pDoc->GetLocalMgr(); | |
2100 IFX_Locale* pLocale = NULL; | |
2101 if (szLocale.IsEmpty()) { | |
2102 CXFA_Node* pThisNode = ToNode(pDoc->GetScriptContext()->GetThisObject()); | |
2103 FXSYS_assert(pThisNode); | |
2104 CXFA_WidgetData widgetData(pThisNode); | |
2105 pLocale = widgetData.GetLocal(); | |
2106 } else { | |
2107 pLocale = pMgr->GetLocaleByName( | |
2108 CFX_WideString::FromUTF8(szLocale.GetCStr(), szLocale.GetLength())); | |
2109 } | |
2110 if (!pLocale) { | |
2111 return FALSE; | |
2112 } | |
2113 CFX_WideString wsFormat; | |
2114 if (szFormat.IsEmpty()) { | |
2115 pLocale->GetDatePattern(FX_LOCALEDATETIMESUBCATEGORY_Default, wsFormat); | |
2116 } else { | |
2117 wsFormat = | |
2118 CFX_WideString::FromUTF8(szFormat.GetCStr(), szFormat.GetLength()); | |
2119 } | |
2120 CXFA_LocaleValue widgetValue( | |
2121 XFA_VT_DATE, | |
2122 CFX_WideString::FromUTF8(szDate.GetCStr(), szDate.GetLength()), | |
2123 (CXFA_LocaleMgr*)pMgr); | |
2124 CFX_WideString wsRet; | |
2125 widgetValue.FormatPatterns(wsRet, wsFormat, pLocale, | |
2126 XFA_VALUEPICTURE_Display); | |
2127 strLocalDate = FX_UTF8Encode(wsRet, wsRet.GetLength()); | |
2128 return TRUE; | |
2129 } | |
2130 FX_BOOL CXFA_FM2JSContext::IsoTime2Local(FXJSE_HOBJECT hThis, | |
2131 const CFX_ByteStringC& szTime, | |
2132 const CFX_ByteStringC& szFormat, | |
2133 const CFX_ByteStringC& szLocale, | |
2134 CFX_ByteString& strLocalTime) { | |
2135 CXFA_FM2JSContext* pContext = | |
2136 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
2137 CXFA_Document* pDoc = pContext->GetDocument(); | |
2138 if (!pDoc) { | |
2139 return FALSE; | |
2140 } | |
2141 IFX_LocaleMgr* pMgr = (IFX_LocaleMgr*)pDoc->GetLocalMgr(); | |
2142 IFX_Locale* pLocale = NULL; | |
2143 if (szLocale.IsEmpty()) { | |
2144 CXFA_Node* pThisNode = ToNode(pDoc->GetScriptContext()->GetThisObject()); | |
2145 FXSYS_assert(pThisNode); | |
2146 CXFA_WidgetData widgetData(pThisNode); | |
2147 pLocale = widgetData.GetLocal(); | |
2148 } else { | |
2149 pLocale = pMgr->GetLocaleByName( | |
2150 CFX_WideString::FromUTF8(szLocale.GetCStr(), szLocale.GetLength())); | |
2151 } | |
2152 if (!pLocale) { | |
2153 return FALSE; | |
2154 } | |
2155 CFX_WideString wsFormat; | |
2156 if (szFormat.IsEmpty()) { | |
2157 pLocale->GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY_Default, wsFormat); | |
2158 } else { | |
2159 wsFormat = | |
2160 CFX_WideString::FromUTF8(szFormat.GetCStr(), szFormat.GetLength()); | |
2161 } | |
2162 wsFormat = FX_WSTRC(L"time{") + wsFormat; | |
2163 wsFormat += FX_WSTRC(L"}"); | |
2164 CXFA_LocaleValue widgetValue( | |
2165 XFA_VT_TIME, | |
2166 CFX_WideString::FromUTF8(szTime.GetCStr(), szTime.GetLength()), | |
2167 (CXFA_LocaleMgr*)pMgr); | |
2168 CFX_WideString wsRet; | |
2169 widgetValue.FormatPatterns(wsRet, wsFormat, pLocale, | |
2170 XFA_VALUEPICTURE_Display); | |
2171 strLocalTime = FX_UTF8Encode(wsRet, wsRet.GetLength()); | |
2172 return TRUE; | |
2173 } | |
2174 FX_BOOL CXFA_FM2JSContext::GetGMTTime(FXJSE_HOBJECT hThis, | |
2175 const CFX_ByteStringC& szTime, | |
2176 const CFX_ByteStringC& szFormat, | |
2177 const CFX_ByteStringC& szLocale, | |
2178 CFX_ByteString& strGMTTime) { | |
2179 CXFA_FM2JSContext* pContext = | |
2180 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
2181 CXFA_Document* pDoc = pContext->GetDocument(); | |
2182 if (!pDoc) { | |
2183 return FALSE; | |
2184 } | |
2185 IFX_LocaleMgr* pMgr = (IFX_LocaleMgr*)pDoc->GetLocalMgr(); | |
2186 IFX_Locale* pLocale = NULL; | |
2187 if (szLocale.IsEmpty()) { | |
2188 CXFA_Node* pThisNode = ToNode(pDoc->GetScriptContext()->GetThisObject()); | |
2189 FXSYS_assert(pThisNode); | |
2190 CXFA_WidgetData widgetData(pThisNode); | |
2191 pLocale = widgetData.GetLocal(); | |
2192 } else { | |
2193 pLocale = pMgr->GetLocaleByName( | |
2194 CFX_WideString::FromUTF8(szLocale.GetCStr(), szLocale.GetLength())); | |
2195 } | |
2196 if (!pLocale) { | |
2197 return FALSE; | |
2198 } | |
2199 CFX_WideString wsFormat; | |
2200 if (szFormat.IsEmpty()) { | |
2201 pLocale->GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY_Default, wsFormat); | |
2202 } else { | |
2203 wsFormat = | |
2204 CFX_WideString::FromUTF8(szFormat.GetCStr(), szFormat.GetLength()); | |
2205 } | |
2206 wsFormat = FX_WSTRC(L"time{") + wsFormat; | |
2207 wsFormat += FX_WSTRC(L"}"); | |
2208 CXFA_LocaleValue widgetValue( | |
2209 XFA_VT_TIME, | |
2210 CFX_WideString::FromUTF8(szTime.GetCStr(), szTime.GetLength()), | |
2211 (CXFA_LocaleMgr*)pMgr); | |
2212 CFX_WideString wsRet; | |
2213 widgetValue.FormatPatterns(wsRet, wsFormat, pLocale, | |
2214 XFA_VALUEPICTURE_Display); | |
2215 strGMTTime = FX_UTF8Encode(wsRet, wsRet.GetLength()); | |
2216 return TRUE; | |
2217 } | |
2218 int32_t CXFA_FM2JSContext::DateString2Num(const CFX_ByteStringC& szDateString) { | |
2219 FX_BOOL bFlags = FALSE; | |
2220 int32_t iLength = szDateString.GetLength(); | |
2221 FX_BOOL iRet = FALSE; | |
2222 int32_t iStyle = -1; | |
2223 int32_t iYear = 0; | |
2224 int32_t iMonth = 0; | |
2225 int32_t iDay = 0; | |
2226 int32_t iHour = 0; | |
2227 int32_t iMinute = 0; | |
2228 int32_t iSecond = 0; | |
2229 int32_t iMillionSecond = 0; | |
2230 int32_t iZoneHour = 0; | |
2231 int32_t iZoneMinute = 0; | |
2232 if (iLength <= 10) { | |
2233 iRet = IsIsoDateFormat(szDateString.GetCStr(), iLength, iStyle, iYear, | |
2234 iMonth, iDay); | |
2235 } else { | |
2236 iRet = IsIsoDateTimeFormat(szDateString.GetCStr(), iLength, iYear, iMonth, | |
2237 iDay, iHour, iMinute, iSecond, iMillionSecond, | |
2238 iZoneHour, iZoneMinute); | |
2239 } | |
2240 if (!iRet) { | |
2241 bFlags = TRUE; | |
2242 } | |
2243 FX_FLOAT dDays = 0; | |
2244 int32_t i = 1; | |
2245 if (iYear < 1900) { | |
2246 bFlags = TRUE; | |
2247 } | |
2248 if (!bFlags) { | |
2249 while (iYear - i >= 1900) { | |
2250 if ((!((iYear - i) % 4) && ((iYear - i) % 100)) || !((iYear - i) % 400)) { | |
2251 dDays += 366; | |
2252 } else { | |
2253 dDays += 365; | |
2254 } | |
2255 ++i; | |
2256 } | |
2257 i = 1; | |
2258 while (i < iMonth) { | |
2259 if (i == 2) { | |
2260 if ((!(iYear % 4) && (iYear % 100)) || !(iYear % 400)) { | |
2261 dDays += 29; | |
2262 } else { | |
2263 dDays += 28; | |
2264 } | |
2265 } else if (i <= 7) { | |
2266 if (i % 2 == 0) { | |
2267 dDays += 30; | |
2268 } else { | |
2269 dDays += 31; | |
2270 } | |
2271 } else { | |
2272 if (i % 2 == 0) { | |
2273 dDays += 31; | |
2274 } else { | |
2275 dDays += 30; | |
2276 } | |
2277 } | |
2278 ++i; | |
2279 } | |
2280 i = 0; | |
2281 while (iDay - i > 0) { | |
2282 dDays += 1; | |
2283 ++i; | |
2284 } | |
2285 } else { | |
2286 dDays = 0; | |
2287 } | |
2288 return (int32_t)dDays; | |
2289 } | |
2290 #define XFA_N 19 | |
2291 static uint8_t g_sAltTable_Date[] = { | |
2292 XFA_N, XFA_N, XFA_N, 3, 9, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, | |
2293 XFA_N, 2, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, | |
2294 XFA_N, XFA_N, 1, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, | |
2295 XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, | |
2296 XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, | |
2297 XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, | |
2298 }; | |
2299 static uint8_t g_sAltTable_Time[] = { | |
2300 14, XFA_N, XFA_N, 3, 9, XFA_N, XFA_N, 15, XFA_N, XFA_N, XFA_N, | |
2301 XFA_N, 6, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, 7, XFA_N, XFA_N, XFA_N, | |
2302 XFA_N, XFA_N, 1, 17, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, | |
2303 XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, 15, XFA_N, XFA_N, XFA_N, XFA_N, | |
2304 XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, | |
2305 XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, XFA_N, | |
2306 }; | |
2307 static void XFA_FM_AlternateDateTimeSymbols(CFX_WideString& wsPattern, | |
2308 const CFX_WideString& wsAltSymbols, | |
2309 uint8_t* pAltTable) { | |
2310 int32_t nLength = wsPattern.GetLength(); | |
2311 FX_BOOL bInConstRange = FALSE; | |
2312 FX_BOOL bEscape = FALSE; | |
2313 int32_t i = 0, n = 0; | |
2314 while (i < nLength) { | |
2315 FX_WCHAR wc = wsPattern[i]; | |
2316 if (wc == L'\'') { | |
2317 bInConstRange = !bInConstRange; | |
2318 if (bEscape) { | |
2319 i++; | |
2320 } else { | |
2321 wsPattern.Delete(i); | |
2322 nLength--; | |
2323 } | |
2324 bEscape = !bEscape; | |
2325 continue; | |
2326 } | |
2327 if (!bInConstRange && (n = wc - L'A') >= 0 && n <= (L'a' - L'A')) { | |
2328 int32_t nAlt = (int32_t)pAltTable[n]; | |
2329 if (nAlt != XFA_N) { | |
2330 wsPattern.SetAt(i, wsAltSymbols[nAlt]); | |
2331 } | |
2332 } | |
2333 i++; | |
2334 bEscape = FALSE; | |
2335 } | |
2336 } | |
2337 #undef XFA_N | |
2338 void CXFA_FM2JSContext::GetLocalDateFormat(FXJSE_HOBJECT hThis, | |
2339 int32_t iStyle, | |
2340 const CFX_ByteStringC& szLocalStr, | |
2341 CFX_ByteString& strFormat, | |
2342 FX_BOOL bStandard) { | |
2343 FX_LOCALEDATETIMESUBCATEGORY strStyle; | |
2344 switch (iStyle) { | |
2345 case 0: | |
2346 strStyle = FX_LOCALEDATETIMESUBCATEGORY_Medium; | |
2347 break; | |
2348 case 1: | |
2349 strStyle = FX_LOCALEDATETIMESUBCATEGORY_Short; | |
2350 break; | |
2351 case 2: | |
2352 strStyle = FX_LOCALEDATETIMESUBCATEGORY_Medium; | |
2353 break; | |
2354 case 3: | |
2355 strStyle = FX_LOCALEDATETIMESUBCATEGORY_Long; | |
2356 break; | |
2357 case 4: | |
2358 strStyle = FX_LOCALEDATETIMESUBCATEGORY_Full; | |
2359 break; | |
2360 default: | |
2361 strStyle = FX_LOCALEDATETIMESUBCATEGORY_Medium; | |
2362 break; | |
2363 } | |
2364 CXFA_FM2JSContext* pContext = | |
2365 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
2366 CXFA_Document* pDoc = pContext->GetDocument(); | |
2367 if (!pDoc) { | |
2368 return; | |
2369 } | |
2370 IFX_LocaleMgr* pMgr = (IFX_LocaleMgr*)pDoc->GetLocalMgr(); | |
2371 IFX_Locale* pLocale = NULL; | |
2372 if (szLocalStr.IsEmpty()) { | |
2373 CXFA_Node* pThisNode = ToNode(pDoc->GetScriptContext()->GetThisObject()); | |
2374 FXSYS_assert(pThisNode); | |
2375 CXFA_WidgetData widgetData(pThisNode); | |
2376 pLocale = widgetData.GetLocal(); | |
2377 } else { | |
2378 pLocale = pMgr->GetLocaleByName( | |
2379 CFX_WideString::FromUTF8(szLocalStr.GetCStr(), szLocalStr.GetLength())); | |
2380 } | |
2381 if (!pLocale) { | |
2382 return; | |
2383 } | |
2384 CFX_WideString strRet; | |
2385 pLocale->GetDatePattern(strStyle, strRet); | |
2386 if (!bStandard) { | |
2387 CFX_WideString wsSymbols; | |
2388 pLocale->GetDateTimeSymbols(wsSymbols); | |
2389 XFA_FM_AlternateDateTimeSymbols(strRet, wsSymbols, g_sAltTable_Date); | |
2390 } | |
2391 strFormat = FX_UTF8Encode(strRet, strRet.GetLength()); | |
2392 } | |
2393 void CXFA_FM2JSContext::GetLocalTimeFormat(FXJSE_HOBJECT hThis, | |
2394 int32_t iStyle, | |
2395 const CFX_ByteStringC& szLocalStr, | |
2396 CFX_ByteString& strFormat, | |
2397 FX_BOOL bStandard) { | |
2398 FX_LOCALEDATETIMESUBCATEGORY strStyle; | |
2399 switch (iStyle) { | |
2400 case 0: | |
2401 strStyle = FX_LOCALEDATETIMESUBCATEGORY_Medium; | |
2402 break; | |
2403 case 1: | |
2404 strStyle = FX_LOCALEDATETIMESUBCATEGORY_Short; | |
2405 break; | |
2406 case 2: | |
2407 strStyle = FX_LOCALEDATETIMESUBCATEGORY_Medium; | |
2408 break; | |
2409 case 3: | |
2410 strStyle = FX_LOCALEDATETIMESUBCATEGORY_Long; | |
2411 break; | |
2412 case 4: | |
2413 strStyle = FX_LOCALEDATETIMESUBCATEGORY_Full; | |
2414 break; | |
2415 default: | |
2416 strStyle = FX_LOCALEDATETIMESUBCATEGORY_Medium; | |
2417 break; | |
2418 } | |
2419 CXFA_FM2JSContext* pContext = | |
2420 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
2421 CXFA_Document* pDoc = pContext->GetDocument(); | |
2422 if (!pDoc) { | |
2423 return; | |
2424 } | |
2425 IFX_LocaleMgr* pMgr = (IFX_LocaleMgr*)pDoc->GetLocalMgr(); | |
2426 IFX_Locale* pLocale = NULL; | |
2427 if (szLocalStr.IsEmpty()) { | |
2428 CXFA_Node* pThisNode = ToNode(pDoc->GetScriptContext()->GetThisObject()); | |
2429 FXSYS_assert(pThisNode); | |
2430 CXFA_WidgetData widgetData(pThisNode); | |
2431 pLocale = widgetData.GetLocal(); | |
2432 } else { | |
2433 pLocale = pMgr->GetLocaleByName( | |
2434 CFX_WideString::FromUTF8(szLocalStr.GetCStr(), szLocalStr.GetLength())); | |
2435 } | |
2436 if (!pLocale) { | |
2437 return; | |
2438 } | |
2439 CFX_WideString strRet; | |
2440 pLocale->GetTimePattern(strStyle, strRet); | |
2441 if (!bStandard) { | |
2442 CFX_WideString wsSymbols; | |
2443 pLocale->GetDateTimeSymbols(wsSymbols); | |
2444 XFA_FM_AlternateDateTimeSymbols(strRet, wsSymbols, g_sAltTable_Time); | |
2445 } | |
2446 strFormat = FX_UTF8Encode(strRet, strRet.GetLength()); | |
2447 } | |
2448 void CXFA_FM2JSContext::GetStandardDateFormat(FXJSE_HOBJECT hThis, | |
2449 int32_t iStyle, | |
2450 const CFX_ByteStringC& szLocalStr, | |
2451 CFX_ByteString& strFormat) { | |
2452 GetLocalDateFormat(hThis, iStyle, szLocalStr, strFormat, TRUE); | |
2453 } | |
2454 void CXFA_FM2JSContext::GetStandardTimeFormat(FXJSE_HOBJECT hThis, | |
2455 int32_t iStyle, | |
2456 const CFX_ByteStringC& szLocalStr, | |
2457 CFX_ByteString& strFormat) { | |
2458 GetLocalTimeFormat(hThis, iStyle, szLocalStr, strFormat, TRUE); | |
2459 } | |
2460 void CXFA_FM2JSContext::Num2AllTime(FXJSE_HOBJECT hThis, | |
2461 int32_t iTime, | |
2462 const CFX_ByteStringC& szFormat, | |
2463 const CFX_ByteStringC& szLocale, | |
2464 FX_BOOL bGM, | |
2465 CFX_ByteString& strTime) { | |
2466 int32_t iHour = 0; | |
2467 int32_t iMin = 0; | |
2468 int32_t iSec = 0; | |
2469 int32_t iZoneHour = 0; | |
2470 int32_t iZoneMin = 0; | |
2471 int32_t iZoneSec = 0; | |
2472 iHour = static_cast<int>(iTime) / 3600000; | |
2473 iMin = (static_cast<int>(iTime) - iHour * 3600000) / 60000; | |
2474 iSec = (static_cast<int>(iTime) - iHour * 3600000 - iMin * 60000) / 1000; | |
2475 if (!bGM) { | |
2476 GetLocalTimeZone(iZoneHour, iZoneMin, iZoneSec); | |
2477 iHour += iZoneHour; | |
2478 iMin += iZoneMin; | |
2479 iSec += iZoneSec; | |
2480 } | |
2481 int32_t iRet = 0; | |
2482 CFX_ByteString strIsoTime; | |
2483 strIsoTime.Format("%02d:%02d:%02d", iHour, iMin, iSec); | |
2484 if (bGM) { | |
2485 iRet = GetGMTTime(hThis, strIsoTime, szFormat, szLocale, strTime); | |
2486 } else { | |
2487 iRet = IsoTime2Local(hThis, strIsoTime, szFormat, szLocale, strTime); | |
2488 } | |
2489 if (!iRet) { | |
2490 strTime = ""; | |
2491 } | |
2492 } | |
2493 | |
2494 void CXFA_FM2JSContext::GetLocalTimeZone(int32_t& iHour, | |
2495 int32_t& iMin, | |
2496 int32_t& iSec) { | |
2497 time_t now; | |
2498 time(&now); | |
2499 struct tm* pGmt = gmtime(&now); | |
2500 int32_t iGMHour = pGmt->tm_hour; | |
2501 int32_t iGMMin = pGmt->tm_min; | |
2502 int32_t iGMSec = pGmt->tm_sec; | |
2503 struct tm* pLocal = localtime(&now); | |
2504 int32_t iLocalHour = pLocal->tm_hour; | |
2505 int32_t iLocalMin = pLocal->tm_min; | |
2506 int32_t iLocalSec = pLocal->tm_sec; | |
2507 iHour = iLocalHour - iGMHour; | |
2508 iMin = iLocalMin - iGMMin; | |
2509 iSec = iLocalSec - iGMSec; | |
2510 } | |
2511 void CXFA_FM2JSContext::Apr(FXJSE_HOBJECT hThis, | |
2512 const CFX_ByteStringC& szFuncName, | |
2513 CFXJSE_Arguments& args) { | |
2514 CXFA_FM2JSContext* pContext = | |
2515 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
2516 if (args.GetLength() == 3) { | |
2517 FX_BOOL bFlags = FALSE; | |
2518 FX_DOUBLE nPrincipal = 0; | |
2519 FX_DOUBLE nPayment = 0; | |
2520 FX_DOUBLE nPeriods = 0; | |
2521 FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0); | |
2522 FXJSE_HVALUE argTwo = GetSimpleHValue(hThis, args, 1); | |
2523 FXJSE_HVALUE argThree = GetSimpleHValue(hThis, args, 2); | |
2524 bFlags = (HValueIsNull(hThis, argOne) || HValueIsNull(hThis, argTwo) || | |
2525 HValueIsNull(hThis, argThree)); | |
2526 if (bFlags) { | |
2527 FXJSE_Value_SetNull(args.GetReturnValue()); | |
2528 } else { | |
2529 nPrincipal = HValueToDouble(hThis, argOne); | |
2530 nPayment = HValueToDouble(hThis, argTwo); | |
2531 nPeriods = HValueToDouble(hThis, argThree); | |
2532 bFlags = ((nPrincipal <= 0) || (nPayment <= 0) || (nPeriods <= 0)); | |
2533 if (bFlags) { | |
2534 pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH); | |
2535 } else { | |
2536 FX_DOUBLE r = | |
2537 2 * (nPeriods * nPayment - nPrincipal) / (nPeriods * nPrincipal); | |
2538 FX_DOUBLE nTemp = 1; | |
2539 for (int32_t i = 0; i < nPeriods; ++i) { | |
2540 nTemp *= (1 + r); | |
2541 } | |
2542 FX_DOUBLE nRet = r * nTemp / (nTemp - 1) - nPayment / nPrincipal; | |
2543 while ((nRet > FINANCIAL_PRECISION || nRet < -FINANCIAL_PRECISION) && | |
2544 (!bFlags)) { | |
2545 FX_DOUBLE nDerivative = 0; | |
2546 nDerivative = | |
2547 ((nTemp + r * nPeriods * (nTemp / (1 + r))) * (nTemp - 1) - | |
2548 (r * nTemp * nPeriods * (nTemp / (1 + r)))) / | |
2549 ((nTemp - 1) * (nTemp - 1)); | |
2550 if (nDerivative == 0) { | |
2551 bFlags = TRUE; | |
2552 continue; | |
2553 } | |
2554 r = r - nRet / nDerivative; | |
2555 nTemp = 1; | |
2556 for (int32_t i = 0; i < nPeriods; ++i) { | |
2557 nTemp *= (1 + r); | |
2558 } | |
2559 nRet = r * nTemp / (nTemp - 1) - nPayment / nPrincipal; | |
2560 } | |
2561 if (bFlags) { | |
2562 FXJSE_Value_SetNull(args.GetReturnValue()); | |
2563 } else { | |
2564 r = r * 12; | |
2565 FXJSE_Value_SetDouble(args.GetReturnValue(), r); | |
2566 } | |
2567 } | |
2568 } | |
2569 FXJSE_Value_Release(argOne); | |
2570 FXJSE_Value_Release(argTwo); | |
2571 FXJSE_Value_Release(argThree); | |
2572 } else { | |
2573 pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | |
2574 L"Apr"); | |
2575 } | |
2576 } | |
2577 void CXFA_FM2JSContext::CTerm(FXJSE_HOBJECT hThis, | |
2578 const CFX_ByteStringC& szFuncName, | |
2579 CFXJSE_Arguments& args) { | |
2580 CXFA_FM2JSContext* pContext = | |
2581 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
2582 if (args.GetLength() == 3) { | |
2583 FX_BOOL bFlags = FALSE; | |
2584 FX_FLOAT nRate = 0; | |
2585 FX_FLOAT nFutureValue = 0; | |
2586 FX_FLOAT nInitAmount = 0; | |
2587 FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0); | |
2588 FXJSE_HVALUE argTwo = GetSimpleHValue(hThis, args, 1); | |
2589 FXJSE_HVALUE argThree = GetSimpleHValue(hThis, args, 2); | |
2590 bFlags = (HValueIsNull(hThis, argOne) || HValueIsNull(hThis, argTwo) || | |
2591 HValueIsNull(hThis, argThree)); | |
2592 if (bFlags) { | |
2593 FXJSE_Value_SetNull(args.GetReturnValue()); | |
2594 } else { | |
2595 nRate = HValueToFloat(hThis, argOne); | |
2596 nFutureValue = HValueToFloat(hThis, argTwo); | |
2597 nInitAmount = HValueToFloat(hThis, argThree); | |
2598 bFlags = ((nRate <= 0) || (nFutureValue <= 0) || (nInitAmount <= 0)); | |
2599 if (bFlags) { | |
2600 pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH); | |
2601 } else { | |
2602 FXJSE_Value_SetFloat(args.GetReturnValue(), | |
2603 FXSYS_log((FX_FLOAT)(nFutureValue / nInitAmount)) / | |
2604 FXSYS_log((FX_FLOAT)(1 + nRate))); | |
2605 } | |
2606 } | |
2607 FXJSE_Value_Release(argOne); | |
2608 FXJSE_Value_Release(argTwo); | |
2609 FXJSE_Value_Release(argThree); | |
2610 } else { | |
2611 pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | |
2612 L"CTerm"); | |
2613 } | |
2614 } | |
2615 void CXFA_FM2JSContext::FV(FXJSE_HOBJECT hThis, | |
2616 const CFX_ByteStringC& szFuncName, | |
2617 CFXJSE_Arguments& args) { | |
2618 CXFA_FM2JSContext* pContext = | |
2619 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
2620 if (args.GetLength() == 3) { | |
2621 FX_BOOL bFlags = FALSE; | |
2622 FX_DOUBLE nAmount = 0; | |
2623 FX_DOUBLE nRate = 0; | |
2624 FX_DOUBLE nPeriod = 0; | |
2625 FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0); | |
2626 FXJSE_HVALUE argTwo = GetSimpleHValue(hThis, args, 1); | |
2627 FXJSE_HVALUE argThree = GetSimpleHValue(hThis, args, 2); | |
2628 bFlags = (HValueIsNull(hThis, argOne) || HValueIsNull(hThis, argTwo) || | |
2629 HValueIsNull(hThis, argThree)); | |
2630 if (bFlags) { | |
2631 FXJSE_Value_SetNull(args.GetReturnValue()); | |
2632 } else { | |
2633 nAmount = HValueToDouble(hThis, argOne); | |
2634 nRate = HValueToDouble(hThis, argTwo); | |
2635 nPeriod = HValueToDouble(hThis, argThree); | |
2636 bFlags = ((nRate < 0) || (nPeriod <= 0) || (nAmount <= 0)); | |
2637 if (bFlags) { | |
2638 pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH); | |
2639 } else { | |
2640 FX_DOUBLE dResult = 0; | |
2641 if (!nRate) { | |
2642 dResult = nAmount * nPeriod; | |
2643 } else { | |
2644 FX_DOUBLE nTemp = 1; | |
2645 for (int i = 0; i < nPeriod; ++i) { | |
2646 nTemp *= 1 + nRate; | |
2647 } | |
2648 dResult = nAmount * (nTemp - 1) / nRate; | |
2649 } | |
2650 FXJSE_Value_SetDouble(args.GetReturnValue(), dResult); | |
2651 } | |
2652 } | |
2653 FXJSE_Value_Release(argOne); | |
2654 FXJSE_Value_Release(argTwo); | |
2655 FXJSE_Value_Release(argThree); | |
2656 } else { | |
2657 pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | |
2658 L"FV"); | |
2659 } | |
2660 } | |
2661 void CXFA_FM2JSContext::IPmt(FXJSE_HOBJECT hThis, | |
2662 const CFX_ByteStringC& szFuncName, | |
2663 CFXJSE_Arguments& args) { | |
2664 CXFA_FM2JSContext* pContext = | |
2665 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
2666 if (args.GetLength() == 5) { | |
2667 FX_BOOL bFlags = FALSE; | |
2668 FX_FLOAT nPrincpalAmount = 0; | |
2669 FX_FLOAT nRate = 0; | |
2670 FX_FLOAT nPayment = 0; | |
2671 FX_FLOAT nFirstMonth = 0; | |
2672 FX_FLOAT nNumberOfMonths = 0; | |
2673 FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0); | |
2674 FXJSE_HVALUE argTwo = GetSimpleHValue(hThis, args, 1); | |
2675 FXJSE_HVALUE argThree = GetSimpleHValue(hThis, args, 2); | |
2676 FXJSE_HVALUE argFour = GetSimpleHValue(hThis, args, 3); | |
2677 FXJSE_HVALUE argFive = GetSimpleHValue(hThis, args, 4); | |
2678 bFlags = (HValueIsNull(hThis, argOne) || HValueIsNull(hThis, argTwo) || | |
2679 HValueIsNull(hThis, argThree) || HValueIsNull(hThis, argFour) || | |
2680 HValueIsNull(hThis, argFive)); | |
2681 if (bFlags) { | |
2682 FXJSE_Value_SetNull(args.GetReturnValue()); | |
2683 } else { | |
2684 nPrincpalAmount = HValueToFloat(hThis, argOne); | |
2685 nRate = HValueToFloat(hThis, argTwo); | |
2686 nPayment = HValueToFloat(hThis, argThree); | |
2687 nFirstMonth = HValueToFloat(hThis, argFour); | |
2688 nNumberOfMonths = HValueToFloat(hThis, argFive); | |
2689 bFlags = ((nPrincpalAmount <= 0) || (nRate <= 0) || (nPayment <= 0) || | |
2690 (nFirstMonth < 0) || (nNumberOfMonths < 0)); | |
2691 if (bFlags) { | |
2692 pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH); | |
2693 } else { | |
2694 FX_FLOAT fResult = 0; | |
2695 FX_FLOAT nRateOfMonth = nRate / 12; | |
2696 int32_t iNums = | |
2697 (int32_t)((FXSYS_log10((FX_FLOAT)(nPayment / nPrincpalAmount)) - | |
2698 FXSYS_log10((FX_FLOAT)(nPayment / nPrincpalAmount - | |
2699 nRateOfMonth))) / | |
2700 FXSYS_log10((FX_FLOAT)(1 + nRateOfMonth))); | |
2701 int32_t iEnd = (int32_t)(nFirstMonth + nNumberOfMonths - 1); | |
2702 if (iEnd > iNums) { | |
2703 iEnd = iNums; | |
2704 } | |
2705 FX_FLOAT nSum = 0; | |
2706 if (nPayment < nPrincpalAmount * nRateOfMonth) { | |
2707 bFlags = TRUE; | |
2708 fResult = 0; | |
2709 } | |
2710 if (!bFlags) { | |
2711 int32_t i = 0; | |
2712 for (i = 0; i < nFirstMonth - 1; ++i) { | |
2713 nPrincpalAmount -= nPayment - nPrincpalAmount * nRateOfMonth; | |
2714 } | |
2715 for (; i < iEnd; ++i) { | |
2716 nSum += nPrincpalAmount * nRateOfMonth; | |
2717 nPrincpalAmount -= nPayment - nPrincpalAmount * nRateOfMonth; | |
2718 } | |
2719 fResult = nSum; | |
2720 } | |
2721 FXJSE_Value_SetFloat(args.GetReturnValue(), fResult); | |
2722 } | |
2723 } | |
2724 FXJSE_Value_Release(argOne); | |
2725 FXJSE_Value_Release(argTwo); | |
2726 FXJSE_Value_Release(argThree); | |
2727 FXJSE_Value_Release(argFour); | |
2728 FXJSE_Value_Release(argFive); | |
2729 } else { | |
2730 pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | |
2731 L"IPmt"); | |
2732 } | |
2733 } | |
2734 void CXFA_FM2JSContext::NPV(FXJSE_HOBJECT hThis, | |
2735 const CFX_ByteStringC& szFuncName, | |
2736 CFXJSE_Arguments& args) { | |
2737 CXFA_FM2JSContext* pContext = | |
2738 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
2739 int32_t argc = args.GetLength(); | |
2740 if (argc > 2) { | |
2741 FX_BOOL bFlags = FALSE; | |
2742 FXJSE_HVALUE* argValues = FX_Alloc(FXJSE_HVALUE, argc); | |
2743 for (int32_t i = 0; i < argc; i++) { | |
2744 argValues[i] = GetSimpleHValue(hThis, args, i); | |
2745 if (HValueIsNull(hThis, argValues[i])) { | |
2746 bFlags = TRUE; | |
2747 } | |
2748 } | |
2749 if (!bFlags) { | |
2750 FX_DOUBLE nRate = 0; | |
2751 nRate = HValueToDouble(hThis, argValues[0]); | |
2752 if (nRate <= 0) { | |
2753 pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH); | |
2754 } else { | |
2755 FX_DOUBLE* pData = FX_Alloc(FX_DOUBLE, argc - 1); | |
2756 for (int32_t i = 1; i < argc; i++) { | |
2757 pData[i - 1] = HValueToDouble(hThis, argValues[i]); | |
2758 } | |
2759 FX_DOUBLE nSum = 0; | |
2760 int32_t iIndex = 0; | |
2761 for (int32_t i = 0; i < argc - 1; i++) { | |
2762 FX_DOUBLE nTemp = 1; | |
2763 for (int32_t j = 0; j <= i; j++) { | |
2764 nTemp *= 1 + nRate; | |
2765 } | |
2766 FX_DOUBLE nNum = *(pData + iIndex++); | |
2767 nSum += nNum / nTemp; | |
2768 } | |
2769 FXJSE_Value_SetDouble(args.GetReturnValue(), nSum); | |
2770 FX_Free(pData); | |
2771 pData = 0; | |
2772 } | |
2773 } else { | |
2774 FXJSE_Value_SetNull(args.GetReturnValue()); | |
2775 } | |
2776 for (int32_t i = 0; i < argc; i++) { | |
2777 FXJSE_Value_Release(argValues[i]); | |
2778 } | |
2779 FX_Free(argValues); | |
2780 } else { | |
2781 pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | |
2782 L"NPV"); | |
2783 } | |
2784 } | |
2785 void CXFA_FM2JSContext::Pmt(FXJSE_HOBJECT hThis, | |
2786 const CFX_ByteStringC& szFuncName, | |
2787 CFXJSE_Arguments& args) { | |
2788 CXFA_FM2JSContext* pContext = | |
2789 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
2790 if (args.GetLength() == 3) { | |
2791 FX_BOOL bFlags = FALSE; | |
2792 FX_FLOAT nPrincipal = 0; | |
2793 FX_FLOAT nRate = 0; | |
2794 FX_FLOAT nPeriods = 0; | |
2795 FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0); | |
2796 FXJSE_HVALUE argTwo = GetSimpleHValue(hThis, args, 1); | |
2797 FXJSE_HVALUE argThree = GetSimpleHValue(hThis, args, 2); | |
2798 bFlags = (HValueIsNull(hThis, argOne) || HValueIsNull(hThis, argTwo) || | |
2799 HValueIsNull(hThis, argThree)); | |
2800 if (bFlags) { | |
2801 FXJSE_Value_SetNull(args.GetReturnValue()); | |
2802 } else { | |
2803 nPrincipal = HValueToFloat(hThis, argOne); | |
2804 nRate = HValueToFloat(hThis, argTwo); | |
2805 nPeriods = HValueToFloat(hThis, argThree); | |
2806 bFlags = ((nPrincipal <= 0) || (nRate <= 0) || (nPeriods <= 0)); | |
2807 if (bFlags) { | |
2808 pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH); | |
2809 } else { | |
2810 FX_FLOAT nSum = 0; | |
2811 FX_FLOAT nTmp = 1 + nRate; | |
2812 nSum = nTmp; | |
2813 for (int32_t i = 0; i < nPeriods - 1; ++i) { | |
2814 nSum *= nTmp; | |
2815 } | |
2816 FXJSE_Value_SetFloat(args.GetReturnValue(), | |
2817 (nPrincipal * nRate * nSum) / (nSum - 1)); | |
2818 } | |
2819 } | |
2820 FXJSE_Value_Release(argOne); | |
2821 FXJSE_Value_Release(argTwo); | |
2822 FXJSE_Value_Release(argThree); | |
2823 } else { | |
2824 pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | |
2825 L"Pmt"); | |
2826 } | |
2827 } | |
2828 void CXFA_FM2JSContext::PPmt(FXJSE_HOBJECT hThis, | |
2829 const CFX_ByteStringC& szFuncName, | |
2830 CFXJSE_Arguments& args) { | |
2831 CXFA_FM2JSContext* pContext = | |
2832 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
2833 if (args.GetLength() == 5) { | |
2834 FX_BOOL bFlags = FALSE; | |
2835 FX_FLOAT nPrincpalAmount = 0; | |
2836 FX_FLOAT nRate = 0; | |
2837 FX_FLOAT nPayment = 0; | |
2838 FX_FLOAT nFirstMonth = 0; | |
2839 FX_FLOAT nNumberOfMonths = 0; | |
2840 FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0); | |
2841 FXJSE_HVALUE argTwo = GetSimpleHValue(hThis, args, 1); | |
2842 FXJSE_HVALUE argThree = GetSimpleHValue(hThis, args, 2); | |
2843 FXJSE_HVALUE argFour = GetSimpleHValue(hThis, args, 3); | |
2844 FXJSE_HVALUE argFive = GetSimpleHValue(hThis, args, 4); | |
2845 bFlags = (HValueIsNull(hThis, argOne) || HValueIsNull(hThis, argTwo) || | |
2846 HValueIsNull(hThis, argThree) || HValueIsNull(hThis, argFour) || | |
2847 HValueIsNull(hThis, argFive)); | |
2848 if (bFlags) { | |
2849 FXJSE_Value_SetNull(args.GetReturnValue()); | |
2850 } else { | |
2851 nPrincpalAmount = HValueToFloat(hThis, argOne); | |
2852 nRate = HValueToFloat(hThis, argTwo); | |
2853 nPayment = HValueToFloat(hThis, argThree); | |
2854 nFirstMonth = HValueToFloat(hThis, argFour); | |
2855 nNumberOfMonths = HValueToFloat(hThis, argFive); | |
2856 bFlags = ((nPrincpalAmount <= 0) || (nRate <= 0) || (nPayment <= 0) || | |
2857 (nFirstMonth < 0) || (nNumberOfMonths < 0)); | |
2858 if (bFlags) { | |
2859 pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH); | |
2860 } else { | |
2861 int32_t iEnd = (int32_t)(nFirstMonth + nNumberOfMonths - 1); | |
2862 FX_FLOAT nSum = 0; | |
2863 FX_FLOAT nRateOfMonth = nRate / 12; | |
2864 int32_t iNums = | |
2865 (int32_t)((FXSYS_log10((FX_FLOAT)(nPayment / nPrincpalAmount)) - | |
2866 FXSYS_log10((FX_FLOAT)(nPayment / nPrincpalAmount - | |
2867 nRateOfMonth))) / | |
2868 FXSYS_log10((FX_FLOAT)(1 + nRateOfMonth))); | |
2869 if (iEnd > iNums) { | |
2870 iEnd = iNums; | |
2871 } | |
2872 if (nPayment < nPrincpalAmount * nRateOfMonth) { | |
2873 bFlags = TRUE; | |
2874 } | |
2875 if (!bFlags) { | |
2876 int32_t i = 0; | |
2877 for (i = 0; i < nFirstMonth - 1; ++i) { | |
2878 nPrincpalAmount -= nPayment - nPrincpalAmount * nRateOfMonth; | |
2879 } | |
2880 FX_FLOAT nTemp = 0; | |
2881 for (; i < iEnd; ++i) { | |
2882 nTemp = nPayment - nPrincpalAmount * nRateOfMonth; | |
2883 nSum += nTemp; | |
2884 nPrincpalAmount -= nTemp; | |
2885 } | |
2886 FXJSE_Value_SetFloat(args.GetReturnValue(), nSum); | |
2887 } else { | |
2888 pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH); | |
2889 } | |
2890 } | |
2891 } | |
2892 FXJSE_Value_Release(argOne); | |
2893 FXJSE_Value_Release(argTwo); | |
2894 FXJSE_Value_Release(argThree); | |
2895 FXJSE_Value_Release(argFour); | |
2896 FXJSE_Value_Release(argFive); | |
2897 } else { | |
2898 pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | |
2899 L"PPmt"); | |
2900 } | |
2901 } | |
2902 void CXFA_FM2JSContext::PV(FXJSE_HOBJECT hThis, | |
2903 const CFX_ByteStringC& szFuncName, | |
2904 CFXJSE_Arguments& args) { | |
2905 CXFA_FM2JSContext* pContext = | |
2906 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
2907 if (args.GetLength() == 3) { | |
2908 FX_BOOL bFlags = FALSE; | |
2909 FX_DOUBLE nAmount = 0; | |
2910 FX_DOUBLE nRate = 0; | |
2911 FX_DOUBLE nPeriod = 0; | |
2912 FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0); | |
2913 FXJSE_HVALUE argTwo = GetSimpleHValue(hThis, args, 1); | |
2914 FXJSE_HVALUE argThree = GetSimpleHValue(hThis, args, 2); | |
2915 bFlags = (HValueIsNull(hThis, argOne) || HValueIsNull(hThis, argTwo) || | |
2916 HValueIsNull(hThis, argThree)); | |
2917 if (bFlags) { | |
2918 FXJSE_Value_SetNull(args.GetReturnValue()); | |
2919 } else { | |
2920 nAmount = HValueToDouble(hThis, argOne); | |
2921 nRate = HValueToDouble(hThis, argTwo); | |
2922 nPeriod = HValueToDouble(hThis, argThree); | |
2923 bFlags = ((nAmount <= 0) || (nRate < 0) || (nPeriod <= 0)); | |
2924 if (bFlags) { | |
2925 pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH); | |
2926 } else { | |
2927 FX_DOUBLE nTemp = 1; | |
2928 for (int32_t i = 0; i < nPeriod; ++i) { | |
2929 nTemp *= 1 + nRate; | |
2930 } | |
2931 nTemp = 1 / nTemp; | |
2932 FXJSE_Value_SetDouble(args.GetReturnValue(), | |
2933 nAmount * ((1 - nTemp) / nRate)); | |
2934 } | |
2935 } | |
2936 FXJSE_Value_Release(argOne); | |
2937 FXJSE_Value_Release(argTwo); | |
2938 FXJSE_Value_Release(argThree); | |
2939 } else { | |
2940 pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | |
2941 L"PV"); | |
2942 } | |
2943 } | |
2944 void CXFA_FM2JSContext::Rate(FXJSE_HOBJECT hThis, | |
2945 const CFX_ByteStringC& szFuncName, | |
2946 CFXJSE_Arguments& args) { | |
2947 CXFA_FM2JSContext* pContext = | |
2948 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
2949 if (args.GetLength() == 3) { | |
2950 FX_BOOL bFlags = FALSE; | |
2951 FX_FLOAT nFuture = 0; | |
2952 FX_FLOAT nPresent = 0; | |
2953 FX_FLOAT nTotalNumber = 0; | |
2954 FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0); | |
2955 FXJSE_HVALUE argTwo = GetSimpleHValue(hThis, args, 1); | |
2956 FXJSE_HVALUE argThree = GetSimpleHValue(hThis, args, 2); | |
2957 bFlags = (HValueIsNull(hThis, argOne) || HValueIsNull(hThis, argTwo) || | |
2958 HValueIsNull(hThis, argThree)); | |
2959 if (bFlags) { | |
2960 FXJSE_Value_SetNull(args.GetReturnValue()); | |
2961 } else { | |
2962 nFuture = HValueToFloat(hThis, argOne); | |
2963 nPresent = HValueToFloat(hThis, argTwo); | |
2964 nTotalNumber = HValueToFloat(hThis, argThree); | |
2965 bFlags = ((nFuture <= 0) || (nPresent < 0) || (nTotalNumber <= 0)); | |
2966 if (bFlags) { | |
2967 pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH); | |
2968 } else { | |
2969 FXJSE_Value_SetFloat(args.GetReturnValue(), | |
2970 (FXSYS_pow((FX_FLOAT)(nFuture / nPresent), | |
2971 (FX_FLOAT)(1 / nTotalNumber)) - | |
2972 1)); | |
2973 } | |
2974 } | |
2975 FXJSE_Value_Release(argOne); | |
2976 FXJSE_Value_Release(argTwo); | |
2977 FXJSE_Value_Release(argThree); | |
2978 } else { | |
2979 pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | |
2980 L"Rate"); | |
2981 } | |
2982 } | |
2983 void CXFA_FM2JSContext::Term(FXJSE_HOBJECT hThis, | |
2984 const CFX_ByteStringC& szFuncName, | |
2985 CFXJSE_Arguments& args) { | |
2986 CXFA_FM2JSContext* pContext = | |
2987 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
2988 if (args.GetLength() == 3) { | |
2989 FX_BOOL bFlags = FALSE; | |
2990 FX_FLOAT nMount = 0; | |
2991 FX_FLOAT nRate = 0; | |
2992 FX_FLOAT nFuture = 0; | |
2993 FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0); | |
2994 FXJSE_HVALUE argTwo = GetSimpleHValue(hThis, args, 1); | |
2995 FXJSE_HVALUE argThree = GetSimpleHValue(hThis, args, 2); | |
2996 bFlags = (FXJSE_Value_IsNull(argOne) || FXJSE_Value_IsNull(argTwo) || | |
2997 FXJSE_Value_IsNull(argThree)); | |
2998 if (bFlags) { | |
2999 FXJSE_Value_SetNull(args.GetReturnValue()); | |
3000 } else { | |
3001 nMount = HValueToFloat(hThis, argOne); | |
3002 nRate = HValueToFloat(hThis, argTwo); | |
3003 nFuture = HValueToFloat(hThis, argThree); | |
3004 bFlags = ((nMount <= 0) || (nRate <= 0) || (nFuture <= 0)); | |
3005 if (bFlags) { | |
3006 pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH); | |
3007 } else { | |
3008 FXJSE_Value_SetFloat( | |
3009 args.GetReturnValue(), | |
3010 (FXSYS_log((FX_FLOAT)(nFuture / nMount * nRate) + 1) / | |
3011 FXSYS_log((FX_FLOAT)(1 + nRate)))); | |
3012 } | |
3013 } | |
3014 FXJSE_Value_Release(argOne); | |
3015 FXJSE_Value_Release(argTwo); | |
3016 FXJSE_Value_Release(argThree); | |
3017 } else { | |
3018 pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | |
3019 L"Term"); | |
3020 } | |
3021 } | |
3022 void CXFA_FM2JSContext::Choose(FXJSE_HOBJECT hThis, | |
3023 const CFX_ByteStringC& szFuncName, | |
3024 CFXJSE_Arguments& args) { | |
3025 CXFA_FM2JSContext* pContext = | |
3026 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
3027 FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime(); | |
3028 int32_t argc = args.GetLength(); | |
3029 if (argc > 1) { | |
3030 FXJSE_HVALUE argOne = args.GetValue(0); | |
3031 FX_BOOL argOneIsNull = FALSE; | |
3032 int32_t iIndex = 0; | |
3033 argOneIsNull = HValueIsNull(hThis, argOne); | |
3034 if (!argOneIsNull) { | |
3035 iIndex = (int32_t)HValueToFloat(hThis, argOne); | |
3036 } | |
3037 FXJSE_Value_Release(argOne); | |
3038 if (argOneIsNull) { | |
3039 FXJSE_Value_SetNull(args.GetReturnValue()); | |
3040 } else if (iIndex < 1) { | |
3041 FXJSE_Value_SetUTF8String(args.GetReturnValue(), ""); | |
3042 } else { | |
3043 FX_BOOL bFound = FALSE; | |
3044 FX_BOOL bStopCounterFlags = FALSE; | |
3045 int32_t iArgIndex = 1; | |
3046 int32_t iValueIndex = 0; | |
3047 while (!bFound && !bStopCounterFlags && (iArgIndex < argc)) { | |
3048 FXJSE_HVALUE argIndexValue = args.GetValue(iArgIndex); | |
3049 if (FXJSE_Value_IsArray(argIndexValue)) { | |
3050 FXJSE_HVALUE lengthValue = FXJSE_Value_Create(hruntime); | |
3051 FXJSE_Value_GetObjectProp(argIndexValue, "length", lengthValue); | |
3052 int32_t iLength = FXJSE_Value_ToInteger(lengthValue); | |
3053 FXJSE_Value_Release(lengthValue); | |
3054 if (iLength > 3) { | |
3055 bStopCounterFlags = TRUE; | |
3056 } | |
3057 iValueIndex += (iLength - 2); | |
3058 if (iValueIndex >= iIndex) { | |
3059 FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime); | |
3060 FXJSE_HVALUE jsobjectValue = FXJSE_Value_Create(hruntime); | |
3061 FXJSE_HVALUE newProperty = FXJSE_Value_Create(hruntime); | |
3062 FXJSE_Value_GetObjectPropByIdx(argIndexValue, 1, propertyValue); | |
3063 FXJSE_Value_GetObjectPropByIdx( | |
3064 argIndexValue, ((iLength - 1) - (iValueIndex - iIndex)), | |
3065 jsobjectValue); | |
3066 if (FXJSE_Value_IsNull(propertyValue)) { | |
3067 GetObjectDefaultValue(jsobjectValue, newProperty); | |
3068 } else { | |
3069 CFX_ByteString propStr; | |
3070 FXJSE_Value_ToUTF8String(propertyValue, propStr); | |
3071 FXJSE_Value_GetObjectProp(jsobjectValue, propStr, newProperty); | |
3072 } | |
3073 CFX_ByteString bsChoosed; | |
3074 HValueToUTF8String(newProperty, bsChoosed); | |
3075 FXJSE_Value_SetUTF8String(args.GetReturnValue(), bsChoosed); | |
3076 FXJSE_Value_Release(newProperty); | |
3077 FXJSE_Value_Release(jsobjectValue); | |
3078 FXJSE_Value_Release(propertyValue); | |
3079 bFound = TRUE; | |
3080 } | |
3081 } else { | |
3082 iValueIndex++; | |
3083 if (iValueIndex == iIndex) { | |
3084 CFX_ByteString bsChoosed; | |
3085 HValueToUTF8String(argIndexValue, bsChoosed); | |
3086 FXJSE_Value_SetUTF8String(args.GetReturnValue(), bsChoosed); | |
3087 bFound = TRUE; | |
3088 } | |
3089 } | |
3090 FXJSE_Value_Release(argIndexValue); | |
3091 iArgIndex++; | |
3092 } | |
3093 if (!bFound) { | |
3094 FXJSE_Value_SetUTF8String(args.GetReturnValue(), ""); | |
3095 } | |
3096 } | |
3097 } else { | |
3098 CXFA_FM2JSContext* pContext = | |
3099 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
3100 pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | |
3101 L"Choose"); | |
3102 } | |
3103 } | |
3104 void CXFA_FM2JSContext::Exists(FXJSE_HOBJECT hThis, | |
3105 const CFX_ByteStringC& szFuncName, | |
3106 CFXJSE_Arguments& args) { | |
3107 if (args.GetLength() == 1) { | |
3108 FXJSE_HVALUE argOne = args.GetValue(0); | |
3109 FXJSE_Value_SetInteger(args.GetReturnValue(), FXJSE_Value_IsObject(argOne)); | |
3110 FXJSE_Value_Release(argOne); | |
3111 } else { | |
3112 CXFA_FM2JSContext* pContext = | |
3113 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
3114 pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | |
3115 L"Exists"); | |
3116 } | |
3117 } | |
3118 void CXFA_FM2JSContext::HasValue(FXJSE_HOBJECT hThis, | |
3119 const CFX_ByteStringC& szFuncName, | |
3120 CFXJSE_Arguments& args) { | |
3121 if (args.GetLength() == 1) { | |
3122 FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0); | |
3123 if (FXJSE_Value_IsUTF8String(argOne)) { | |
3124 CFX_ByteString valueStr; | |
3125 FXJSE_Value_ToUTF8String(argOne, valueStr); | |
3126 valueStr.TrimLeft(); | |
3127 FXJSE_Value_SetInteger(args.GetReturnValue(), (!valueStr.IsEmpty())); | |
3128 } else if (FXJSE_Value_IsNumber(argOne) || FXJSE_Value_IsBoolean(argOne)) { | |
3129 FXJSE_Value_SetInteger(args.GetReturnValue(), TRUE); | |
3130 } else { | |
3131 FXJSE_Value_SetInteger(args.GetReturnValue(), FALSE); | |
3132 } | |
3133 FXJSE_Value_Release(argOne); | |
3134 } else { | |
3135 CXFA_FM2JSContext* pContext = | |
3136 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
3137 pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | |
3138 L"HasValue"); | |
3139 } | |
3140 } | |
3141 void CXFA_FM2JSContext::Oneof(FXJSE_HOBJECT hThis, | |
3142 const CFX_ByteStringC& szFuncName, | |
3143 CFXJSE_Arguments& args) { | |
3144 int32_t argc = args.GetLength(); | |
3145 if (argc > 1) { | |
3146 FX_BOOL bFlags = FALSE; | |
3147 FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0); | |
3148 FXJSE_HVALUE* parametersValue = 0; | |
3149 int32_t iCount = 0; | |
3150 unfoldArgs(hThis, args, parametersValue, iCount, 1); | |
3151 for (int32_t i = 0; i < iCount; i++) { | |
3152 if (simpleValueCompare(hThis, argOne, parametersValue[i])) { | |
3153 bFlags = TRUE; | |
3154 break; | |
3155 } | |
3156 } | |
3157 FXJSE_Value_SetInteger(args.GetReturnValue(), bFlags); | |
3158 FXJSE_Value_Release(argOne); | |
3159 for (int32_t i = 0; i < iCount; i++) { | |
3160 FXJSE_Value_Release(parametersValue[i]); | |
3161 } | |
3162 FX_Free(parametersValue); | |
3163 parametersValue = 0; | |
3164 } else { | |
3165 CXFA_FM2JSContext* pContext = | |
3166 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
3167 pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | |
3168 L"Oneof"); | |
3169 } | |
3170 } | |
3171 void CXFA_FM2JSContext::Within(FXJSE_HOBJECT hThis, | |
3172 const CFX_ByteStringC& szFuncName, | |
3173 CFXJSE_Arguments& args) { | |
3174 int32_t argc = args.GetLength(); | |
3175 if (argc == 3) { | |
3176 FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0); | |
3177 if (FXJSE_Value_IsNull(argOne)) { | |
3178 FXJSE_Value_SetUndefined(args.GetReturnValue()); | |
3179 } else { | |
3180 FXJSE_HVALUE argLow = GetSimpleHValue(hThis, args, 1); | |
3181 FXJSE_HVALUE argHeight = GetSimpleHValue(hThis, args, 2); | |
3182 if (FXJSE_Value_IsNumber(argOne)) { | |
3183 FX_FLOAT oneNumber = HValueToFloat(hThis, argOne); | |
3184 FX_FLOAT lowNumber = HValueToFloat(hThis, argLow); | |
3185 FX_FLOAT heightNumber = HValueToFloat(hThis, argHeight); | |
3186 FXJSE_Value_SetInteger( | |
3187 args.GetReturnValue(), | |
3188 ((oneNumber >= lowNumber) && (oneNumber <= heightNumber))); | |
3189 } else { | |
3190 CFX_ByteString oneString; | |
3191 CFX_ByteString lowString; | |
3192 CFX_ByteString heightString; | |
3193 HValueToUTF8String(argOne, oneString); | |
3194 HValueToUTF8String(argLow, lowString); | |
3195 HValueToUTF8String(argHeight, heightString); | |
3196 FXJSE_Value_SetInteger(args.GetReturnValue(), | |
3197 ((oneString.Compare(lowString) >= 0) && | |
3198 (oneString.Compare(heightString) <= 0))); | |
3199 } | |
3200 FXJSE_Value_Release(argLow); | |
3201 FXJSE_Value_Release(argHeight); | |
3202 } | |
3203 FXJSE_Value_Release(argOne); | |
3204 } else { | |
3205 CXFA_FM2JSContext* pContext = | |
3206 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
3207 pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | |
3208 L"Within"); | |
3209 } | |
3210 } | |
3211 void CXFA_FM2JSContext::If(FXJSE_HOBJECT hThis, | |
3212 const CFX_ByteStringC& szFuncName, | |
3213 CFXJSE_Arguments& args) { | |
3214 if (args.GetLength() == 3) { | |
3215 FXJSE_HVALUE argCondition = GetSimpleHValue(hThis, args, 0); | |
3216 FXJSE_HVALUE argFirstValue = GetSimpleHValue(hThis, args, 1); | |
3217 FXJSE_HVALUE argSecondValue = GetSimpleHValue(hThis, args, 2); | |
3218 FX_BOOL bCondition = FXJSE_Value_ToBoolean(argCondition); | |
3219 FXJSE_Value_Set(args.GetReturnValue(), | |
3220 bCondition ? argFirstValue : argSecondValue); | |
3221 FXJSE_Value_Release(argSecondValue); | |
3222 FXJSE_Value_Release(argFirstValue); | |
3223 FXJSE_Value_Release(argCondition); | |
3224 } else { | |
3225 CXFA_FM2JSContext* pContext = | |
3226 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
3227 pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | |
3228 L"If"); | |
3229 } | |
3230 } | |
3231 void CXFA_FM2JSContext::Eval(FXJSE_HOBJECT hThis, | |
3232 const CFX_ByteStringC& szFuncName, | |
3233 CFXJSE_Arguments& args) { | |
3234 CXFA_FM2JSContext* pContext = | |
3235 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
3236 FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime(); | |
3237 if (args.GetLength() == 1) { | |
3238 FXJSE_HVALUE scriptValue = GetSimpleHValue(hThis, args, 0); | |
3239 CFX_ByteString utf8ScriptString; | |
3240 HValueToUTF8String(scriptValue, utf8ScriptString); | |
3241 if (utf8ScriptString.IsEmpty()) { | |
3242 FXJSE_Value_SetNull(args.GetReturnValue()); | |
3243 } else { | |
3244 CFX_WideTextBuf wsJavaScriptBuf; | |
3245 CFX_WideString javaScript; | |
3246 CFX_WideString wsError; | |
3247 XFA_FM2JS_Translate(CFX_WideString::FromUTF8( | |
3248 utf8ScriptString, utf8ScriptString.GetLength()), | |
3249 wsJavaScriptBuf, wsError); | |
3250 FXJSE_HCONTEXT hContext = FXJSE_Context_Create(hruntime); | |
3251 FXJSE_HVALUE returnValue = FXJSE_Value_Create(hruntime); | |
3252 javaScript = wsJavaScriptBuf.GetWideString(); | |
3253 FXJSE_ExecuteScript(hContext, | |
3254 FX_UTF8Encode(javaScript, javaScript.GetLength()), | |
3255 returnValue); | |
3256 FXJSE_Value_Set(args.GetReturnValue(), returnValue); | |
3257 FXJSE_Value_Release(returnValue); | |
3258 FXJSE_Context_Release(hContext); | |
3259 } | |
3260 FXJSE_Value_Release(scriptValue); | |
3261 } else { | |
3262 pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | |
3263 L"Eval"); | |
3264 } | |
3265 } | |
3266 void CXFA_FM2JSContext::Ref(FXJSE_HOBJECT hThis, | |
3267 const CFX_ByteStringC& szFuncName, | |
3268 CFXJSE_Arguments& args) { | |
3269 CXFA_FM2JSContext* pContext = | |
3270 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
3271 FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime(); | |
3272 if (args.GetLength() == 1) { | |
3273 FXJSE_HVALUE argOne = args.GetValue(0); | |
3274 if (FXJSE_Value_IsNull(argOne)) { | |
3275 FXJSE_HVALUE rgValues[3]; | |
3276 for (int32_t i = 0; i < 3; i++) { | |
3277 rgValues[i] = FXJSE_Value_Create(hruntime); | |
3278 } | |
3279 FXJSE_Value_SetInteger(rgValues[0], 4); | |
3280 FXJSE_Value_SetNull(rgValues[1]); | |
3281 FXJSE_Value_SetNull(rgValues[2]); | |
3282 FXJSE_Value_SetArray(args.GetReturnValue(), 3, rgValues); | |
3283 for (int32_t i = 0; i < 3; i++) { | |
3284 FXJSE_Value_Release(rgValues[i]); | |
3285 } | |
3286 } else if (FXJSE_Value_IsArray(argOne)) { | |
3287 #ifndef NDEBUG | |
3288 FXJSE_HVALUE lengthValue = FXJSE_Value_Create(hruntime); | |
3289 FXJSE_Value_GetObjectProp(argOne, "length", lengthValue); | |
3290 FXSYS_assert(FXJSE_Value_ToInteger(lengthValue) >= 3); | |
3291 FXJSE_Value_Release(lengthValue); | |
3292 #endif | |
3293 FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime); | |
3294 FXJSE_HVALUE jsObjectValue = FXJSE_Value_Create(hruntime); | |
3295 FXJSE_Value_GetObjectPropByIdx(argOne, 1, propertyValue); | |
3296 FXJSE_Value_GetObjectPropByIdx(argOne, 2, jsObjectValue); | |
3297 if (FXJSE_Value_IsNull(jsObjectValue)) { | |
3298 pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH); | |
3299 } else if (FXJSE_Value_IsNull(propertyValue) && | |
3300 (!FXJSE_Value_IsNull(jsObjectValue))) { | |
3301 FXJSE_HVALUE rgValues[3]; | |
3302 for (int32_t i = 0; i < 3; i++) { | |
3303 rgValues[i] = FXJSE_Value_Create(hruntime); | |
3304 } | |
3305 FXJSE_Value_SetInteger(rgValues[0], 3); | |
3306 FXJSE_Value_SetNull(rgValues[1]); | |
3307 FXJSE_Value_Set(rgValues[2], jsObjectValue); | |
3308 FXJSE_Value_SetArray(args.GetReturnValue(), 3, rgValues); | |
3309 for (int32_t i = 0; i < 3; i++) { | |
3310 FXJSE_Value_Release(rgValues[i]); | |
3311 } | |
3312 } else { | |
3313 pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH); | |
3314 } | |
3315 FXJSE_Value_Release(jsObjectValue); | |
3316 FXJSE_Value_Release(propertyValue); | |
3317 } else if (FXJSE_Value_IsObject(argOne)) { | |
3318 FXJSE_HVALUE rgValues[3]; | |
3319 for (int32_t i = 0; i < 3; i++) { | |
3320 rgValues[i] = FXJSE_Value_Create(hruntime); | |
3321 } | |
3322 FXJSE_Value_SetInteger(rgValues[0], 3); | |
3323 FXJSE_Value_SetNull(rgValues[1]); | |
3324 FXJSE_Value_Set(rgValues[2], argOne); | |
3325 FXJSE_Value_SetArray(args.GetReturnValue(), 3, rgValues); | |
3326 for (int32_t i = 0; i < 3; i++) { | |
3327 FXJSE_Value_Release(rgValues[i]); | |
3328 } | |
3329 } else if (FXJSE_Value_IsBoolean(argOne) || | |
3330 FXJSE_Value_IsUTF8String(argOne) || | |
3331 FXJSE_Value_IsNumber(argOne)) { | |
3332 FXJSE_Value_Set(args.GetReturnValue(), argOne); | |
3333 } else { | |
3334 pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH); | |
3335 } | |
3336 FXJSE_Value_Release(argOne); | |
3337 } else { | |
3338 pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | |
3339 L"Ref"); | |
3340 } | |
3341 } | |
3342 void CXFA_FM2JSContext::UnitType(FXJSE_HOBJECT hThis, | |
3343 const CFX_ByteStringC& szFuncName, | |
3344 CFXJSE_Arguments& args) { | |
3345 if (args.GetLength() == 1) { | |
3346 FXJSE_HVALUE unitspanValue = GetSimpleHValue(hThis, args, 0); | |
3347 if (FXJSE_Value_IsNull(unitspanValue)) { | |
3348 FXJSE_Value_SetNull(args.GetReturnValue()); | |
3349 FXJSE_Value_Release(unitspanValue); | |
3350 return; | |
3351 } | |
3352 CFX_ByteString unitspanString; | |
3353 HValueToUTF8String(unitspanValue, unitspanString); | |
3354 if (unitspanString.IsEmpty()) { | |
3355 FXJSE_Value_SetUTF8String(args.GetReturnValue(), "in"); | |
3356 } else { | |
3357 enum XFA_FM2JS_VALUETYPE_ParserStatus { | |
3358 VALUETYPE_START, | |
3359 VALUETYPE_HAVEINVALIDCHAR, | |
3360 VALUETYPE_HAVEDIGIT, | |
3361 VALUETYPE_HAVEDIGITWHITE, | |
3362 VALUETYPE_ISCM, | |
3363 VALUETYPE_ISMM, | |
3364 VALUETYPE_ISPT, | |
3365 VALUETYPE_ISMP, | |
3366 VALUETYPE_ISIN, | |
3367 }; | |
3368 unitspanString.MakeLower(); | |
3369 CFX_WideString wsTypeString = | |
3370 CFX_WideString::FromUTF8(unitspanString, unitspanString.GetLength()); | |
3371 const FX_WCHAR* pData = wsTypeString; | |
3372 int32_t u = 0; | |
3373 int32_t uLen = wsTypeString.GetLength(); | |
3374 while (*(pData + u) == 0x20 || *(pData + u) == 0x09 || | |
3375 *(pData + u) == 0x0B || *(pData + u) == 0x0C || | |
3376 *(pData + u) == 0x0A || *(pData + u) == 0x0D) { | |
3377 u++; | |
3378 } | |
3379 XFA_FM2JS_VALUETYPE_ParserStatus eParserStatus = VALUETYPE_START; | |
3380 FX_WCHAR typeChar; | |
3381 while (u < uLen) { | |
3382 typeChar = *(pData + u); | |
3383 if (typeChar == 0x20 || typeChar == 0x09 || typeChar == 0x0B || | |
3384 typeChar == 0x0C || typeChar == 0x0A || typeChar == 0x0D) { | |
3385 if (eParserStatus == VALUETYPE_HAVEDIGIT || | |
3386 eParserStatus == VALUETYPE_HAVEDIGITWHITE) { | |
3387 eParserStatus = VALUETYPE_HAVEDIGITWHITE; | |
3388 } else { | |
3389 eParserStatus = VALUETYPE_ISIN; | |
3390 break; | |
3391 } | |
3392 } else if ((typeChar >= '0' && typeChar <= '9') || typeChar == '-' || | |
3393 typeChar == '.') { | |
3394 if (eParserStatus == VALUETYPE_HAVEDIGITWHITE) { | |
3395 eParserStatus = VALUETYPE_ISIN; | |
3396 break; | |
3397 } else { | |
3398 eParserStatus = VALUETYPE_HAVEDIGIT; | |
3399 } | |
3400 } else if ((typeChar == 'c' || typeChar == 'p') && (u + 1 < uLen)) { | |
3401 FX_WCHAR nextChar = *(pData + u + 1); | |
3402 if ((eParserStatus == VALUETYPE_START || | |
3403 eParserStatus == VALUETYPE_HAVEDIGIT || | |
3404 eParserStatus == VALUETYPE_HAVEDIGITWHITE) && | |
3405 (nextChar > '9' || nextChar < '0') && nextChar != '.' && | |
3406 nextChar != '-') { | |
3407 eParserStatus = (typeChar == 'c') ? VALUETYPE_ISCM : VALUETYPE_ISPT; | |
3408 break; | |
3409 } else { | |
3410 eParserStatus = VALUETYPE_HAVEINVALIDCHAR; | |
3411 } | |
3412 } else if (typeChar == 'm' && (u + 1 < uLen)) { | |
3413 FX_WCHAR nextChar = *(pData + u + 1); | |
3414 if ((eParserStatus == VALUETYPE_START || | |
3415 eParserStatus == VALUETYPE_HAVEDIGIT || | |
3416 eParserStatus == VALUETYPE_HAVEDIGITWHITE) && | |
3417 (nextChar > '9' || nextChar < '0') && nextChar != '.' && | |
3418 nextChar != '-') { | |
3419 eParserStatus = VALUETYPE_ISMM; | |
3420 if (nextChar == 'p' || | |
3421 ((u + 5 < uLen) && *(pData + u + 1) == 'i' && | |
3422 *(pData + u + 2) == 'l' && *(pData + u + 3) == 'l' && | |
3423 *(pData + u + 4) == 'i' && *(pData + u + 5) == 'p')) { | |
3424 eParserStatus = VALUETYPE_ISMP; | |
3425 } | |
3426 break; | |
3427 } | |
3428 } else { | |
3429 eParserStatus = VALUETYPE_HAVEINVALIDCHAR; | |
3430 } | |
3431 u++; | |
3432 } | |
3433 switch (eParserStatus) { | |
3434 case VALUETYPE_ISCM: | |
3435 FXJSE_Value_SetUTF8String(args.GetReturnValue(), "cm"); | |
3436 break; | |
3437 case VALUETYPE_ISMM: | |
3438 FXJSE_Value_SetUTF8String(args.GetReturnValue(), "mm"); | |
3439 break; | |
3440 case VALUETYPE_ISPT: | |
3441 FXJSE_Value_SetUTF8String(args.GetReturnValue(), "pt"); | |
3442 break; | |
3443 case VALUETYPE_ISMP: | |
3444 FXJSE_Value_SetUTF8String(args.GetReturnValue(), "mp"); | |
3445 break; | |
3446 default: | |
3447 FXJSE_Value_SetUTF8String(args.GetReturnValue(), "in"); | |
3448 break; | |
3449 } | |
3450 } | |
3451 FXJSE_Value_Release(unitspanValue); | |
3452 } else { | |
3453 CXFA_FM2JSContext* pContext = | |
3454 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
3455 pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | |
3456 L"UnitType"); | |
3457 } | |
3458 } | |
3459 void CXFA_FM2JSContext::UnitValue(FXJSE_HOBJECT hThis, | |
3460 const CFX_ByteStringC& szFuncName, | |
3461 CFXJSE_Arguments& args) { | |
3462 int32_t argc = args.GetLength(); | |
3463 if ((argc == 1) || (argc == 2)) { | |
3464 FXJSE_HVALUE unitspanValue = GetSimpleHValue(hThis, args, 0); | |
3465 FXJSE_HVALUE unitValue = 0; | |
3466 CFX_ByteString unitspanString; | |
3467 FX_DOUBLE dFirstNumber = 0; | |
3468 CFX_ByteString strFirstUnit; | |
3469 CFX_ByteString strUnit; | |
3470 if (FXJSE_Value_IsNull(unitspanValue)) { | |
3471 FXJSE_Value_SetNull(args.GetReturnValue()); | |
3472 } else { | |
3473 HValueToUTF8String(unitspanValue, unitspanString); | |
3474 const FX_CHAR* pData = unitspanString; | |
3475 if (pData) { | |
3476 int32_t u = 0; | |
3477 while (*(pData + u) == 0x20 || *(pData + u) == 0x09 || | |
3478 *(pData + u) == 0x0B || *(pData + u) == 0x0C || | |
3479 *(pData + u) == 0x0A || *(pData + u) == 0x0D) { | |
3480 ++u; | |
3481 } | |
3482 while (u < unitspanString.GetLength()) { | |
3483 if ((*(pData + u) > '9' || *(pData + u) < '0') && | |
3484 *(pData + u) != '.' && *(pData + u) != '-') { | |
3485 break; | |
3486 } | |
3487 ++u; | |
3488 } | |
3489 FX_CHAR* pTemp = NULL; | |
3490 dFirstNumber = strtod(pData, &pTemp); | |
3491 while (*(pData + u) == ' ' || *(pData + u) == 0x09 || | |
3492 *(pData + u) == 0x0B || *(pData + u) == 0x0C || | |
3493 *(pData + u) == 0x0A || *(pData + u) == 0x0D) { | |
3494 ++u; | |
3495 } | |
3496 int32_t uLen = unitspanString.GetLength(); | |
3497 while (u < uLen) { | |
3498 if (*(pData + u) == ' ') { | |
3499 break; | |
3500 } | |
3501 strFirstUnit += (*(pData + u)); | |
3502 ++u; | |
3503 } | |
3504 strFirstUnit.MakeLower(); | |
3505 if (argc == 2) { | |
3506 unitValue = GetSimpleHValue(hThis, args, 1); | |
3507 CFX_ByteString unitTempString; | |
3508 HValueToUTF8String(unitValue, unitTempString); | |
3509 const FX_CHAR* pData = unitTempString; | |
3510 int32_t u = 0; | |
3511 while (*(pData + u) == ' ' || *(pData + u) == 0x09 || | |
3512 *(pData + u) == 0x0B || *(pData + u) == 0x0C || | |
3513 *(pData + u) == 0x0A || *(pData + u) == 0x0D) { | |
3514 ++u; | |
3515 } | |
3516 while (u < unitTempString.GetLength()) { | |
3517 if ((*(pData + u) > '9' || *(pData + u) < '0') && | |
3518 *(pData + u) != '.') { | |
3519 break; | |
3520 } | |
3521 ++u; | |
3522 } | |
3523 while (*(pData + u) == ' ' || *(pData + u) == 0x09 || | |
3524 *(pData + u) == 0x0B || *(pData + u) == 0x0C || | |
3525 *(pData + u) == 0x0A || *(pData + u) == 0x0D) { | |
3526 ++u; | |
3527 } | |
3528 int32_t uLen = unitTempString.GetLength(); | |
3529 while (u < uLen) { | |
3530 if (*(pData + u) == ' ') { | |
3531 break; | |
3532 } | |
3533 strUnit += (*(pData + u)); | |
3534 ++u; | |
3535 } | |
3536 strUnit.MakeLower(); | |
3537 } else { | |
3538 strUnit = strFirstUnit; | |
3539 } | |
3540 FX_DOUBLE dResult = 0; | |
3541 if (strFirstUnit.Equal("in") || strFirstUnit.Equal("inches")) { | |
3542 if (strUnit.Equal("mm") || strUnit.Equal("millimeters")) { | |
3543 dResult = dFirstNumber * 25.4; | |
3544 } else if (strUnit.Equal("cm") || strUnit.Equal("centimeters")) { | |
3545 dResult = dFirstNumber * 2.54; | |
3546 } else if (strUnit.Equal("pt") || strUnit.Equal("points")) { | |
3547 dResult = dFirstNumber / 72; | |
3548 } else if (strUnit.Equal("mp") || strUnit.Equal("millipoints")) { | |
3549 dResult = dFirstNumber / 72000; | |
3550 } else { | |
3551 dResult = dFirstNumber; | |
3552 } | |
3553 } else if (strFirstUnit.Equal("mm") || | |
3554 strFirstUnit.Equal("millimeters")) { | |
3555 if (strUnit.Equal("mm") || strUnit.Equal("millimeters")) { | |
3556 dResult = dFirstNumber; | |
3557 } else if (strUnit.Equal("cm") || strUnit.Equal("centimeters")) { | |
3558 dResult = dFirstNumber / 10; | |
3559 } else if (strUnit.Equal("pt") || strUnit.Equal("points")) { | |
3560 dResult = dFirstNumber / 25.4 / 72; | |
3561 } else if (strUnit.Equal("mp") || strUnit.Equal("millipoints")) { | |
3562 dResult = dFirstNumber / 25.4 / 72000; | |
3563 } else { | |
3564 dResult = dFirstNumber / 25.4; | |
3565 } | |
3566 } else if (strFirstUnit.Equal("cm") || | |
3567 strFirstUnit.Equal("centimeters")) { | |
3568 if (strUnit.Equal("mm") || strUnit.Equal("millimeters")) { | |
3569 dResult = dFirstNumber * 10; | |
3570 } else if (strUnit.Equal("cm") || strUnit.Equal("centimeters")) { | |
3571 dResult = dFirstNumber; | |
3572 } else if (strUnit.Equal("pt") || strUnit.Equal("points")) { | |
3573 dResult = dFirstNumber / 2.54 / 72; | |
3574 } else if (strUnit.Equal("mp") || strUnit.Equal("millipoints")) { | |
3575 dResult = dFirstNumber / 2.54 / 72000; | |
3576 } else { | |
3577 dResult = dFirstNumber / 2.54; | |
3578 } | |
3579 } else if (strFirstUnit.Equal("pt") || strFirstUnit.Equal("points")) { | |
3580 if (strUnit.Equal("mm") || strUnit.Equal("millimeters")) { | |
3581 dResult = dFirstNumber / 72 * 25.4; | |
3582 } else if (strUnit.Equal("cm") || strUnit.Equal("centimeters")) { | |
3583 dResult = dFirstNumber / 72 * 2.54; | |
3584 } else if (strUnit.Equal("pt") || strUnit.Equal("points")) { | |
3585 dResult = dFirstNumber; | |
3586 } else if (strUnit.Equal("mp") || strUnit.Equal("millipoints")) { | |
3587 dResult = dFirstNumber * 1000; | |
3588 } else { | |
3589 dResult = dFirstNumber / 72; | |
3590 } | |
3591 } else if (strFirstUnit.Equal("mp") || | |
3592 strFirstUnit.Equal("millipoints")) { | |
3593 if (strUnit.Equal("mm") || strUnit.Equal("millimeters")) { | |
3594 dResult = dFirstNumber / 72000 * 25.4; | |
3595 } else if (strUnit.Equal("cm") || strUnit.Equal("centimeters")) { | |
3596 dResult = dFirstNumber / 72000 * 2.54; | |
3597 } else if (strUnit.Equal("pt") || strUnit.Equal("points")) { | |
3598 dResult = dFirstNumber / 1000; | |
3599 } else if (strUnit.Equal("mp") || strUnit.Equal("millipoints")) { | |
3600 dResult = dFirstNumber; | |
3601 } else { | |
3602 dResult = dFirstNumber / 72000; | |
3603 } | |
3604 } | |
3605 FXJSE_Value_SetDouble(args.GetReturnValue(), dResult); | |
3606 } else { | |
3607 FXJSE_Value_SetInteger(args.GetReturnValue(), 0); | |
3608 } | |
3609 } | |
3610 FXJSE_Value_Release(unitspanValue); | |
3611 if (argc == 2) { | |
3612 FXJSE_Value_Release(unitValue); | |
3613 } | |
3614 } else { | |
3615 CXFA_FM2JSContext* pContext = | |
3616 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
3617 pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | |
3618 L"UnitValue"); | |
3619 } | |
3620 } | |
3621 void CXFA_FM2JSContext::At(FXJSE_HOBJECT hThis, | |
3622 const CFX_ByteStringC& szFuncName, | |
3623 CFXJSE_Arguments& args) { | |
3624 CXFA_FM2JSContext* pContext = | |
3625 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
3626 if (args.GetLength() == 2) { | |
3627 FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0); | |
3628 FXJSE_HVALUE argTwo = GetSimpleHValue(hThis, args, 1); | |
3629 if (HValueIsNull(hThis, argOne) || HValueIsNull(hThis, argTwo)) { | |
3630 FXJSE_Value_SetNull(args.GetReturnValue()); | |
3631 } else { | |
3632 CFX_ByteString stringTwo; | |
3633 HValueToUTF8String(argTwo, stringTwo); | |
3634 if (stringTwo.IsEmpty()) { | |
3635 FXJSE_Value_SetInteger(args.GetReturnValue(), 1); | |
3636 } else { | |
3637 CFX_ByteString stringOne; | |
3638 HValueToUTF8String(argOne, stringOne); | |
3639 FX_STRSIZE iPosition = stringOne.Find(stringTwo); | |
3640 FXJSE_Value_SetInteger(args.GetReturnValue(), iPosition + 1); | |
3641 } | |
3642 } | |
3643 FXJSE_Value_Release(argOne); | |
3644 FXJSE_Value_Release(argTwo); | |
3645 } else { | |
3646 pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | |
3647 L"At"); | |
3648 } | |
3649 } | |
3650 void CXFA_FM2JSContext::Concat(FXJSE_HOBJECT hThis, | |
3651 const CFX_ByteStringC& szFuncName, | |
3652 CFXJSE_Arguments& args) { | |
3653 CXFA_FM2JSContext* pContext = | |
3654 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
3655 int32_t argc = args.GetLength(); | |
3656 if (argc >= 1) { | |
3657 CFX_ByteString resultString; | |
3658 FX_BOOL bAllNull = TRUE; | |
3659 FXJSE_HVALUE* argValues = FX_Alloc(FXJSE_HVALUE, argc); | |
3660 for (int32_t i = 0; i < argc; i++) { | |
3661 argValues[i] = GetSimpleHValue(hThis, args, i); | |
3662 if (!HValueIsNull(hThis, argValues[i])) { | |
3663 CFX_ByteString valueStr; | |
3664 HValueToUTF8String(argValues[i], valueStr); | |
3665 resultString += valueStr; | |
3666 bAllNull = FALSE; | |
3667 } | |
3668 } | |
3669 for (int32_t i = 0; i < argc; i++) { | |
3670 FXJSE_Value_Release(argValues[i]); | |
3671 } | |
3672 FX_Free(argValues); | |
3673 if (bAllNull) { | |
3674 FXJSE_Value_SetNull(args.GetReturnValue()); | |
3675 } else { | |
3676 FXJSE_Value_SetUTF8String(args.GetReturnValue(), resultString); | |
3677 } | |
3678 } else { | |
3679 pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | |
3680 L"Concat"); | |
3681 } | |
3682 } | |
3683 void CXFA_FM2JSContext::Decode(FXJSE_HOBJECT hThis, | |
3684 const CFX_ByteStringC& szFuncName, | |
3685 CFXJSE_Arguments& args) { | |
3686 CXFA_FM2JSContext* pContext = | |
3687 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
3688 int32_t argc = args.GetLength(); | |
3689 if (argc == 1) { | |
3690 FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0); | |
3691 if (HValueIsNull(hThis, argOne)) { | |
3692 FXJSE_Value_SetNull(args.GetReturnValue()); | |
3693 } else { | |
3694 CFX_ByteString toDecodeString; | |
3695 HValueToUTF8String(argOne, toDecodeString); | |
3696 CFX_ByteTextBuf resultBuf; | |
3697 DecodeURL(toDecodeString, resultBuf); | |
3698 FXJSE_Value_SetUTF8String(args.GetReturnValue(), | |
3699 resultBuf.GetByteString()); | |
3700 } | |
3701 FXJSE_Value_Release(argOne); | |
3702 } else if (argc == 2) { | |
3703 FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0); | |
3704 FXJSE_HVALUE argTwo = GetSimpleHValue(hThis, args, 1); | |
3705 if (HValueIsNull(hThis, argOne) || HValueIsNull(hThis, argTwo)) { | |
3706 FXJSE_Value_SetNull(args.GetReturnValue()); | |
3707 } else { | |
3708 CFX_ByteString toDecodeString; | |
3709 HValueToUTF8String(argOne, toDecodeString); | |
3710 CFX_ByteString identifyString; | |
3711 HValueToUTF8String(argTwo, identifyString); | |
3712 CFX_ByteTextBuf resultBuf; | |
3713 if (identifyString.EqualNoCase("html")) { | |
3714 DecodeHTML(toDecodeString, resultBuf); | |
3715 } else if (identifyString.EqualNoCase("xml")) { | |
3716 DecodeXML(toDecodeString, resultBuf); | |
3717 } else { | |
3718 DecodeURL(toDecodeString, resultBuf); | |
3719 } | |
3720 FXJSE_Value_SetUTF8String(args.GetReturnValue(), | |
3721 resultBuf.GetByteString()); | |
3722 } | |
3723 FXJSE_Value_Release(argOne); | |
3724 FXJSE_Value_Release(argTwo); | |
3725 } else { | |
3726 pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | |
3727 L"Decode"); | |
3728 } | |
3729 } | |
3730 void CXFA_FM2JSContext::DecodeURL(const CFX_ByteStringC& szURLString, | |
3731 CFX_ByteTextBuf& szResultString) { | |
3732 CFX_WideString wsURLString = | |
3733 CFX_WideString::FromUTF8(szURLString.GetCStr(), szURLString.GetLength()); | |
3734 const FX_WCHAR* pData = wsURLString; | |
3735 int32_t iLen = wsURLString.GetLength(); | |
3736 int32_t i = 0; | |
3737 FX_WCHAR ch = 0; | |
3738 FX_WCHAR chTemp = 0; | |
3739 CFX_WideTextBuf wsResultBuf; | |
3740 while (i < iLen) { | |
3741 ch = *(pData + i); | |
3742 if ('%' == ch) { | |
3743 chTemp = 0; | |
3744 int32_t iCount = 0; | |
3745 while (iCount < 2) { | |
3746 ++i; | |
3747 ch = *(pData + i); | |
3748 if (ch <= '9' && ch >= '0') { | |
3749 if (!iCount) { | |
3750 chTemp += (ch - '0') * 16; | |
3751 } else { | |
3752 chTemp += (ch - '0'); | |
3753 } | |
3754 } else { | |
3755 if (ch <= 'F' && ch >= 'A') { | |
3756 if (!iCount) { | |
3757 chTemp += (ch - 'A' + 10) * 16; | |
3758 } else { | |
3759 chTemp += (ch - 'A' + 10); | |
3760 } | |
3761 } else if (ch <= 'f' && ch >= 'a') { | |
3762 if (!iCount) { | |
3763 chTemp += (ch - 'a' + 10) * 16; | |
3764 } else { | |
3765 chTemp += (ch - 'a' + 10); | |
3766 } | |
3767 } else { | |
3768 wsResultBuf.Clear(); | |
3769 return; | |
3770 } | |
3771 } | |
3772 ++iCount; | |
3773 } | |
3774 wsResultBuf.AppendChar(chTemp); | |
3775 } else { | |
3776 wsResultBuf.AppendChar(ch); | |
3777 } | |
3778 ++i; | |
3779 } | |
3780 wsResultBuf.AppendChar(0); | |
3781 szResultString.Clear(); | |
3782 szResultString << FX_UTF8Encode(wsResultBuf.GetBuffer(), | |
3783 wsResultBuf.GetLength()); | |
3784 } | |
3785 void CXFA_FM2JSContext::DecodeHTML(const CFX_ByteStringC& szHTMLString, | |
3786 CFX_ByteTextBuf& szResultString) { | |
3787 CFX_WideString wsHTMLString = CFX_WideString::FromUTF8( | |
3788 szHTMLString.GetCStr(), szHTMLString.GetLength()); | |
3789 FX_WCHAR strString[9]; | |
3790 int32_t iStrIndex = 0; | |
3791 int32_t iLen = wsHTMLString.GetLength(); | |
3792 int32_t i = 0; | |
3793 int32_t iCode = 0; | |
3794 FX_WCHAR ch = 0; | |
3795 const FX_WCHAR* pData = wsHTMLString; | |
3796 CFX_WideTextBuf wsResultBuf; | |
3797 while (i < iLen) { | |
3798 ch = *(pData + i); | |
3799 if (ch == '&') { | |
3800 ++i; | |
3801 ch = *(pData + i); | |
3802 if (ch == '#') { | |
3803 ++i; | |
3804 ch = *(pData + i); | |
3805 if (ch == 'x' || ch == 'X') { | |
3806 ++i; | |
3807 ch = *(pData + i); | |
3808 if ((ch >= '0' && ch <= '9') || (ch <= 'f' && ch >= 'a') || | |
3809 (ch <= 'F' && ch >= 'A')) { | |
3810 while (ch != ';' && i < iLen) { | |
3811 if (ch >= '0' && ch <= '9') { | |
3812 iCode += ch - '0'; | |
3813 } else if (ch <= 'f' && ch >= 'a') { | |
3814 iCode += ch - 'a' + 10; | |
3815 } else if (ch <= 'F' && ch >= 'A') { | |
3816 iCode += ch - 'A' + 10; | |
3817 } else { | |
3818 wsResultBuf.Clear(); | |
3819 return; | |
3820 } | |
3821 ++i; | |
3822 iCode *= 16; | |
3823 ch = *(pData + i); | |
3824 } | |
3825 iCode /= 16; | |
3826 } | |
3827 } else { | |
3828 wsResultBuf.Clear(); | |
3829 return; | |
3830 } | |
3831 } else { | |
3832 while (ch != ';' && i < iLen) { | |
3833 strString[iStrIndex++] = ch; | |
3834 ++i; | |
3835 ch = *(pData + i); | |
3836 } | |
3837 strString[iStrIndex] = 0; | |
3838 } | |
3839 } else { | |
3840 wsResultBuf.AppendChar(ch); | |
3841 ++i; | |
3842 continue; | |
3843 } | |
3844 uint32_t iData = 0; | |
3845 if (HTMLSTR2Code(strString, iData)) { | |
3846 wsResultBuf.AppendChar((FX_WCHAR)iData); | |
3847 } else { | |
3848 wsResultBuf.AppendChar(iCode); | |
3849 } | |
3850 iStrIndex = 0; | |
3851 strString[iStrIndex] = 0; | |
3852 ++i; | |
3853 } | |
3854 wsResultBuf.AppendChar(0); | |
3855 szResultString.Clear(); | |
3856 szResultString << FX_UTF8Encode(wsResultBuf.GetBuffer(), | |
3857 wsResultBuf.GetLength()); | |
3858 } | |
3859 void CXFA_FM2JSContext::DecodeXML(const CFX_ByteStringC& szXMLString, | |
3860 CFX_ByteTextBuf& szResultString) { | |
3861 CFX_WideString wsXMLString = | |
3862 CFX_WideString::FromUTF8(szXMLString.GetCStr(), szXMLString.GetLength()); | |
3863 FX_WCHAR strString[9]; | |
3864 int32_t iStrIndex = 0; | |
3865 int32_t iLen = wsXMLString.GetLength(); | |
3866 int32_t i = 0; | |
3867 int32_t iCode = 0; | |
3868 FX_WCHAR ch = 0; | |
3869 const FX_WCHAR* pData = wsXMLString; | |
3870 CFX_WideTextBuf wsXMLBuf; | |
3871 while (i < iLen) { | |
3872 ch = *(pData + i); | |
3873 if (ch == '&') { | |
3874 ++i; | |
3875 ch = *(pData + i); | |
3876 if (ch == '#') { | |
3877 ++i; | |
3878 ch = *(pData + i); | |
3879 if (ch == 'x' || ch == 'X') { | |
3880 ++i; | |
3881 ch = *(pData + i); | |
3882 if ((ch >= '0' && ch <= '9') || (ch <= 'f' && ch >= 'a') || | |
3883 (ch <= 'F' && ch >= 'A')) { | |
3884 while (ch != ';') { | |
3885 if (ch >= '0' && ch <= '9') { | |
3886 iCode += ch - '0'; | |
3887 } else if (ch <= 'f' && ch >= 'a') { | |
3888 iCode += ch - 'a' + 10; | |
3889 } else if (ch <= 'F' && ch >= 'A') { | |
3890 iCode += ch - 'A' + 10; | |
3891 } else { | |
3892 wsXMLBuf.Clear(); | |
3893 return; | |
3894 } | |
3895 ++i; | |
3896 iCode *= 16; | |
3897 ch = *(pData + i); | |
3898 } | |
3899 iCode /= 16; | |
3900 } | |
3901 } else { | |
3902 wsXMLBuf.Clear(); | |
3903 return; | |
3904 } | |
3905 } else { | |
3906 while (ch != ';' && i < iLen) { | |
3907 strString[iStrIndex++] = ch; | |
3908 ++i; | |
3909 ch = *(pData + i); | |
3910 } | |
3911 strString[iStrIndex] = 0; | |
3912 } | |
3913 } else { | |
3914 wsXMLBuf.AppendChar(ch); | |
3915 ++i; | |
3916 continue; | |
3917 } | |
3918 const FX_WCHAR* const strName[] = {L"quot", L"amp", L"apos", L"lt", L"gt"}; | |
3919 int32_t iIndex = 0; | |
3920 while (iIndex < 5) { | |
3921 if (FXSYS_memcmp(strString, strName[iIndex], | |
3922 FXSYS_wcslen(strName[iIndex])) == 0) { | |
3923 break; | |
3924 } | |
3925 ++iIndex; | |
3926 } | |
3927 switch (iIndex) { | |
3928 case 0: | |
3929 wsXMLBuf.AppendChar('"'); | |
3930 break; | |
3931 case 1: | |
3932 wsXMLBuf.AppendChar('&'); | |
3933 break; | |
3934 case 2: | |
3935 wsXMLBuf.AppendChar('\''); | |
3936 break; | |
3937 case 3: | |
3938 wsXMLBuf.AppendChar('<'); | |
3939 break; | |
3940 case 4: | |
3941 wsXMLBuf.AppendChar('>'); | |
3942 break; | |
3943 default: | |
3944 wsXMLBuf.AppendChar(iCode); | |
3945 break; | |
3946 } | |
3947 iStrIndex = 0; | |
3948 strString[iStrIndex] = 0; | |
3949 ++i; | |
3950 iCode = 0; | |
3951 } | |
3952 wsXMLBuf.AppendChar(0); | |
3953 szResultString.Clear(); | |
3954 szResultString << FX_UTF8Encode(wsXMLBuf.GetBuffer(), wsXMLBuf.GetLength()); | |
3955 } | |
3956 void CXFA_FM2JSContext::Encode(FXJSE_HOBJECT hThis, | |
3957 const CFX_ByteStringC& szFuncName, | |
3958 CFXJSE_Arguments& args) { | |
3959 CXFA_FM2JSContext* pContext = | |
3960 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
3961 int32_t argc = args.GetLength(); | |
3962 if (argc == 1) { | |
3963 FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0); | |
3964 if (HValueIsNull(hThis, argOne)) { | |
3965 FXJSE_Value_SetNull(args.GetReturnValue()); | |
3966 } else { | |
3967 CFX_ByteString toEncodeString; | |
3968 HValueToUTF8String(argOne, toEncodeString); | |
3969 CFX_ByteTextBuf resultBuf; | |
3970 EncodeURL(toEncodeString, resultBuf); | |
3971 FXJSE_Value_SetUTF8String(args.GetReturnValue(), | |
3972 resultBuf.GetByteString()); | |
3973 } | |
3974 FXJSE_Value_Release(argOne); | |
3975 } else if (argc == 2) { | |
3976 FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0); | |
3977 FXJSE_HVALUE argTwo = GetSimpleHValue(hThis, args, 1); | |
3978 if (HValueIsNull(hThis, argOne) || HValueIsNull(hThis, argTwo)) { | |
3979 FXJSE_Value_SetNull(args.GetReturnValue()); | |
3980 } else { | |
3981 CFX_ByteString toEncodeString; | |
3982 HValueToUTF8String(argOne, toEncodeString); | |
3983 CFX_ByteString identifyString; | |
3984 HValueToUTF8String(argTwo, identifyString); | |
3985 CFX_ByteTextBuf resultBuf; | |
3986 if (identifyString.EqualNoCase("html")) { | |
3987 EncodeHTML(toEncodeString, resultBuf); | |
3988 } else if (identifyString.EqualNoCase("xml")) { | |
3989 EncodeXML(toEncodeString, resultBuf); | |
3990 } else { | |
3991 EncodeURL(toEncodeString, resultBuf); | |
3992 } | |
3993 FXJSE_Value_SetUTF8String(args.GetReturnValue(), | |
3994 resultBuf.GetByteString()); | |
3995 } | |
3996 FXJSE_Value_Release(argOne); | |
3997 FXJSE_Value_Release(argTwo); | |
3998 } else { | |
3999 pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | |
4000 L"Encode"); | |
4001 } | |
4002 } | |
4003 void CXFA_FM2JSContext::EncodeURL(const CFX_ByteStringC& szURLString, | |
4004 CFX_ByteTextBuf& szResultBuf) { | |
4005 CFX_WideString wsURLString = | |
4006 CFX_WideString::FromUTF8(szURLString.GetCStr(), szURLString.GetLength()); | |
4007 CFX_WideTextBuf wsResultBuf; | |
4008 FX_WCHAR ch = 0; | |
4009 int32_t iLength = wsURLString.GetLength(); | |
4010 FX_WCHAR strEncode[4]; | |
4011 strEncode[0] = '%'; | |
4012 strEncode[3] = 0; | |
4013 FX_WCHAR strUnsafe[] = {' ', '<', '>', '"', '#', '%', '{', '}', | |
4014 '|', '\\', '^', '~', '[', ']', '`'}; | |
4015 FX_WCHAR strReserved[] = {';', '/', '?', ':', '@', '=', '&'}; | |
4016 FX_WCHAR strSpecial[] = {'$', '-', '+', '!', '*', '\'', '(', ')', ','}; | |
4017 const FX_WCHAR* strCode = L"0123456789abcdef"; | |
4018 for (int32_t u = 0; u < iLength; ++u) { | |
4019 ch = wsURLString.GetAt(u); | |
4020 int32_t i = 0; | |
4021 int32_t iCount = sizeof(strUnsafe) / sizeof(strUnsafe[0]); | |
4022 while (i < iCount) { | |
4023 if (ch == strUnsafe[i]) { | |
4024 int32_t iIndex = ch / 16; | |
4025 strEncode[1] = strCode[iIndex]; | |
4026 strEncode[2] = strCode[ch - iIndex * 16]; | |
4027 wsResultBuf << FX_WSTRC(strEncode); | |
4028 break; | |
4029 } | |
4030 ++i; | |
4031 } | |
4032 if (i < iCount) { | |
4033 continue; | |
4034 } | |
4035 i = 0; | |
4036 iCount = sizeof(strReserved) / sizeof(strReserved[0]); | |
4037 while (i < iCount) { | |
4038 if (ch == strReserved[i]) { | |
4039 int32_t iIndex = ch / 16; | |
4040 strEncode[1] = strCode[iIndex]; | |
4041 strEncode[2] = strCode[ch - iIndex * 16]; | |
4042 wsResultBuf << FX_WSTRC(strEncode); | |
4043 break; | |
4044 } | |
4045 ++i; | |
4046 } | |
4047 if (i < iCount) { | |
4048 continue; | |
4049 } | |
4050 i = 0; | |
4051 iCount = sizeof(strSpecial) / sizeof(strSpecial[0]); | |
4052 while (i < iCount) { | |
4053 if (ch == strSpecial[i]) { | |
4054 wsResultBuf.AppendChar(ch); | |
4055 break; | |
4056 } | |
4057 ++i; | |
4058 } | |
4059 if (i < iCount) { | |
4060 continue; | |
4061 } | |
4062 if (ch >= 0x80 && ch <= 0xff) { | |
4063 int32_t iIndex = ch / 16; | |
4064 strEncode[1] = strCode[iIndex]; | |
4065 strEncode[2] = strCode[ch - iIndex * 16]; | |
4066 wsResultBuf << FX_WSTRC(strEncode); | |
4067 } else if (ch <= 0x1f || ch == 0x7f) { | |
4068 int32_t iIndex = ch / 16; | |
4069 strEncode[1] = strCode[iIndex]; | |
4070 strEncode[2] = strCode[ch - iIndex * 16]; | |
4071 wsResultBuf << FX_WSTRC(strEncode); | |
4072 } else if (ch >= 0x20 && ch <= 0x7e) { | |
4073 wsResultBuf.AppendChar(ch); | |
4074 } else { | |
4075 int32_t iRadix = 16; | |
4076 CFX_WideString strTmp; | |
4077 while (ch >= iRadix) { | |
4078 FX_WCHAR tmp = strCode[ch % iRadix]; | |
4079 ch /= iRadix; | |
4080 strTmp += tmp; | |
4081 } | |
4082 strTmp += strCode[ch]; | |
4083 int32_t iLen = strTmp.GetLength(); | |
4084 if (iLen < 2) { | |
4085 break; | |
4086 } | |
4087 int32_t iIndex = 0; | |
4088 if (iLen % 2 != 0) { | |
4089 strEncode[1] = '0'; | |
4090 strEncode[2] = strTmp.GetAt(iLen - 1); | |
4091 iIndex = iLen - 2; | |
4092 } else { | |
4093 strEncode[1] = strTmp.GetAt(iLen - 1); | |
4094 strEncode[2] = strTmp.GetAt(iLen - 2); | |
4095 iIndex = iLen - 3; | |
4096 } | |
4097 wsResultBuf << FX_WSTRC(strEncode); | |
4098 while (iIndex > 0) { | |
4099 strEncode[1] = strTmp.GetAt(iIndex); | |
4100 strEncode[2] = strTmp.GetAt(iIndex - 1); | |
4101 iIndex -= 2; | |
4102 wsResultBuf << FX_WSTRC(strEncode); | |
4103 } | |
4104 } | |
4105 } | |
4106 wsResultBuf.AppendChar(0); | |
4107 szResultBuf.Clear(); | |
4108 szResultBuf << FX_UTF8Encode(wsResultBuf.GetBuffer(), | |
4109 wsResultBuf.GetLength()); | |
4110 } | |
4111 void CXFA_FM2JSContext::EncodeHTML(const CFX_ByteStringC& szHTMLString, | |
4112 CFX_ByteTextBuf& szResultBuf) { | |
4113 CFX_ByteString str = szHTMLString.GetCStr(); | |
4114 CFX_WideString wsHTMLString = CFX_WideString::FromUTF8(str, str.GetLength()); | |
4115 const FX_WCHAR* strCode = L"0123456789abcdef"; | |
4116 FX_WCHAR strEncode[9]; | |
4117 strEncode[0] = '&'; | |
4118 strEncode[1] = '#'; | |
4119 strEncode[2] = 'x'; | |
4120 strEncode[5] = ';'; | |
4121 strEncode[6] = 0; | |
4122 strEncode[7] = ';'; | |
4123 strEncode[8] = 0; | |
4124 CFX_WideTextBuf wsResultBuf; | |
4125 uint32_t ch = 0; | |
4126 int32_t iLen = wsHTMLString.GetLength(); | |
4127 int32_t i = 0; | |
4128 const FX_WCHAR* pData = wsHTMLString; | |
4129 int32_t iIndex = 0; | |
4130 CFX_WideString htmlReserve; | |
4131 while (i < iLen) { | |
4132 ch = *(pData + i); | |
4133 htmlReserve.Empty(); | |
4134 if (HTMLCode2STR(ch, htmlReserve)) { | |
4135 wsResultBuf.AppendChar(L'&'); | |
4136 wsResultBuf << htmlReserve; | |
4137 wsResultBuf.AppendChar(L';'); | |
4138 } else { | |
4139 if (ch >= 32 && ch <= 126) { | |
4140 wsResultBuf.AppendChar((FX_WCHAR)ch); | |
4141 } else if (ch < 256) { | |
4142 iIndex = ch / 16; | |
4143 strEncode[3] = strCode[iIndex]; | |
4144 strEncode[4] = strCode[ch - iIndex * 16]; | |
4145 strEncode[5] = ';'; | |
4146 strEncode[6] = 0; | |
4147 wsResultBuf << FX_WSTRC(strEncode); | |
4148 } else { | |
4149 int32_t iBigByte = ch / 256; | |
4150 int32_t iLittleByte = ch % 256; | |
4151 strEncode[3] = strCode[iBigByte / 16]; | |
4152 strEncode[4] = strCode[iBigByte % 16]; | |
4153 strEncode[5] = strCode[iLittleByte / 16]; | |
4154 strEncode[6] = strCode[iLittleByte % 16]; | |
4155 wsResultBuf << FX_WSTRC(strEncode); | |
4156 } | |
4157 } | |
4158 ++i; | |
4159 } | |
4160 wsResultBuf.AppendChar(0); | |
4161 szResultBuf.Clear(); | |
4162 szResultBuf << FX_UTF8Encode(wsResultBuf.GetBuffer(), | |
4163 wsResultBuf.GetLength()); | |
4164 } | |
4165 void CXFA_FM2JSContext::EncodeXML(const CFX_ByteStringC& szXMLString, | |
4166 CFX_ByteTextBuf& szResultBuf) { | |
4167 CFX_WideString wsXMLString = | |
4168 CFX_WideString::FromUTF8(szXMLString.GetCStr(), szXMLString.GetLength()); | |
4169 CFX_WideTextBuf wsResultBuf; | |
4170 enum { | |
4171 QUOT, | |
4172 AMP, | |
4173 APOS, | |
4174 LT, | |
4175 GT, | |
4176 }; | |
4177 FX_WCHAR strEncode[9]; | |
4178 strEncode[0] = '&'; | |
4179 strEncode[1] = '#'; | |
4180 strEncode[2] = 'x'; | |
4181 strEncode[5] = ';'; | |
4182 strEncode[6] = 0; | |
4183 strEncode[7] = ';'; | |
4184 strEncode[8] = 0; | |
4185 const FX_WCHAR* const strName[] = {L"quot", L"amp", L"apos", L"lt", L"gt"}; | |
4186 const FX_WCHAR* strCode = L"0123456789abcdef"; | |
4187 FX_WCHAR ch = 0; | |
4188 int32_t iLength = wsXMLString.GetLength(); | |
4189 int32_t iIndex = 0; | |
4190 int32_t u = 0; | |
4191 const FX_WCHAR* pData = wsXMLString; | |
4192 for (u = 0; u < iLength; ++u) { | |
4193 ch = *(pData + u); | |
4194 switch (ch) { | |
4195 case '"': | |
4196 wsResultBuf.AppendChar('&'); | |
4197 wsResultBuf << CFX_WideStringC(strName[QUOT]); | |
4198 wsResultBuf.AppendChar(';'); | |
4199 break; | |
4200 case '&': | |
4201 wsResultBuf.AppendChar('&'); | |
4202 wsResultBuf << CFX_WideStringC(strName[AMP]); | |
4203 wsResultBuf.AppendChar(';'); | |
4204 break; | |
4205 case '\'': | |
4206 wsResultBuf.AppendChar('&'); | |
4207 wsResultBuf << CFX_WideStringC(strName[APOS]); | |
4208 wsResultBuf.AppendChar(';'); | |
4209 break; | |
4210 case '<': | |
4211 wsResultBuf.AppendChar('&'); | |
4212 wsResultBuf << CFX_WideStringC(strName[LT]); | |
4213 wsResultBuf.AppendChar(';'); | |
4214 break; | |
4215 case '>': | |
4216 wsResultBuf.AppendChar('&'); | |
4217 wsResultBuf << CFX_WideStringC(strName[GT]); | |
4218 wsResultBuf.AppendChar(';'); | |
4219 break; | |
4220 default: { | |
4221 if (ch >= 32 && ch <= 126) { | |
4222 wsResultBuf.AppendChar(ch); | |
4223 } else if (ch < 256) { | |
4224 iIndex = ch / 16; | |
4225 strEncode[3] = strCode[iIndex]; | |
4226 strEncode[4] = strCode[ch - iIndex * 16]; | |
4227 strEncode[5] = ';'; | |
4228 strEncode[6] = 0; | |
4229 wsResultBuf << FX_WSTRC(strEncode); | |
4230 } else { | |
4231 int32_t iBigByte = ch / 256; | |
4232 int32_t iLittleByte = ch % 256; | |
4233 strEncode[3] = strCode[iBigByte / 16]; | |
4234 strEncode[4] = strCode[iBigByte % 16]; | |
4235 strEncode[5] = strCode[iLittleByte / 16]; | |
4236 strEncode[6] = strCode[iLittleByte % 16]; | |
4237 wsResultBuf << FX_WSTRC(strEncode); | |
4238 } | |
4239 } break; | |
4240 } | |
4241 } | |
4242 wsResultBuf.AppendChar(0); | |
4243 szResultBuf.Clear(); | |
4244 szResultBuf << FX_UTF8Encode(wsResultBuf.GetBuffer(), | |
4245 wsResultBuf.GetLength()); | |
4246 } | |
4247 FX_BOOL CXFA_FM2JSContext::HTMLSTR2Code(const CFX_WideStringC& pData, | |
4248 uint32_t& iCode) { | |
4249 int32_t iLength = pData.GetLength(); | |
4250 uint32_t uHash = FX_HashCode_String_GetW(pData.GetPtr(), iLength); | |
4251 XFA_FMHtmlHashedReserveCode htmlhashedreservecode; | |
4252 int32_t iStart = 0, | |
4253 iEnd = (sizeof(reservesForDecode) / sizeof(reservesForDecode[0])) - 1; | |
4254 int32_t iMid = (iStart + iEnd) / 2; | |
4255 do { | |
4256 iMid = (iStart + iEnd) / 2; | |
4257 htmlhashedreservecode = reservesForDecode[iMid]; | |
4258 if (uHash == htmlhashedreservecode.m_uHash) { | |
4259 iCode = htmlhashedreservecode.m_uCode; | |
4260 return TRUE; | |
4261 } else if (uHash < htmlhashedreservecode.m_uHash) { | |
4262 iEnd = iMid - 1; | |
4263 } else { | |
4264 iStart = iMid + 1; | |
4265 } | |
4266 } while (iStart <= iEnd); | |
4267 return FALSE; | |
4268 } | |
4269 FX_BOOL CXFA_FM2JSContext::HTMLCode2STR(uint32_t iCode, | |
4270 CFX_WideString& wsHTMLReserve) { | |
4271 XFA_FMHtmlReserveCode htmlreservecode; | |
4272 int32_t iStart = 0, | |
4273 iEnd = (sizeof(reservesForEncode) / sizeof(reservesForEncode[0])) - 1; | |
4274 int32_t iMid = (iStart + iEnd) / 2; | |
4275 do { | |
4276 iMid = (iStart + iEnd) / 2; | |
4277 htmlreservecode = reservesForEncode[iMid]; | |
4278 if (iCode == htmlreservecode.m_uCode) { | |
4279 wsHTMLReserve = htmlreservecode.m_htmlReserve; | |
4280 return TRUE; | |
4281 } else if (iCode < htmlreservecode.m_uCode) { | |
4282 iEnd = iMid - 1; | |
4283 } else { | |
4284 iStart = iMid + 1; | |
4285 } | |
4286 } while (iStart <= iEnd); | |
4287 return FALSE; | |
4288 } | |
4289 static FX_BOOL XFA_PATTERN_STRING_Type(const CFX_ByteStringC& szPattern, | |
4290 FX_DWORD& patternType) { | |
4291 CFX_WideString wsPattern = | |
4292 CFX_WideString::FromUTF8(szPattern.GetCStr(), szPattern.GetLength()); | |
4293 if (FX_WSTRC(L"datetime") == wsPattern.Left(8)) { | |
4294 patternType = XFA_VT_DATETIME; | |
4295 return TRUE; | |
4296 } else if (FX_WSTRC(L"date") == wsPattern.Left(4)) { | |
4297 patternType = wsPattern.Find(L"time") > 0 ? XFA_VT_DATETIME : XFA_VT_DATE; | |
4298 return TRUE; | |
4299 } else if (FX_WSTRC(L"time") == wsPattern.Left(4)) { | |
4300 patternType = XFA_VT_TIME; | |
4301 return TRUE; | |
4302 } else if (FX_WSTRC(L"text") == wsPattern.Left(4)) { | |
4303 patternType = XFA_VT_TEXT; | |
4304 return TRUE; | |
4305 } else if (FX_WSTRC(L"num") == wsPattern.Left(3)) { | |
4306 if (FX_WSTRC(L"integer") == wsPattern.Mid(4, 7)) { | |
4307 patternType = XFA_VT_INTEGER; | |
4308 } else if (FX_WSTRC(L"decimal") == wsPattern.Mid(4, 7)) { | |
4309 patternType = XFA_VT_DECIMAL; | |
4310 } else if (FX_WSTRC(L"currency") == wsPattern.Mid(4, 8)) { | |
4311 patternType = XFA_VT_FLOAT; | |
4312 } else if (FX_WSTRC(L"percent") == wsPattern.Mid(4, 7)) { | |
4313 patternType = XFA_VT_FLOAT; | |
4314 } else { | |
4315 patternType = XFA_VT_FLOAT; | |
4316 } | |
4317 return TRUE; | |
4318 } | |
4319 patternType = XFA_VT_NULL; | |
4320 wsPattern.MakeLower(); | |
4321 const FX_WCHAR* pData = wsPattern; | |
4322 int32_t iLength = wsPattern.GetLength(); | |
4323 int32_t iIndex = 0; | |
4324 FX_BOOL bSingleQuotation = FALSE; | |
4325 FX_WCHAR patternChar; | |
4326 while (iIndex < iLength) { | |
4327 patternChar = *(pData + iIndex); | |
4328 if (patternChar == 0x27) { | |
4329 bSingleQuotation = !bSingleQuotation; | |
4330 } else if (!bSingleQuotation && | |
4331 (patternChar == 'y' || patternChar == 'j')) { | |
4332 patternType = XFA_VT_DATE; | |
4333 iIndex++; | |
4334 FX_WCHAR timePatternChar; | |
4335 while (iIndex < iLength) { | |
4336 timePatternChar = *(pData + iIndex); | |
4337 if (timePatternChar == 0x27) { | |
4338 bSingleQuotation = !bSingleQuotation; | |
4339 } else if (!bSingleQuotation && timePatternChar == 't') { | |
4340 patternType = XFA_VT_DATETIME; | |
4341 break; | |
4342 } | |
4343 iIndex++; | |
4344 } | |
4345 break; | |
4346 } else if (!bSingleQuotation && | |
4347 (patternChar == 'h' || patternChar == 'k')) { | |
4348 patternType = XFA_VT_TIME; | |
4349 break; | |
4350 } else if (!bSingleQuotation && | |
4351 (patternChar == 'a' || patternChar == 'x' || | |
4352 patternChar == 'o' || patternChar == '0')) { | |
4353 patternType = XFA_VT_TEXT; | |
4354 if (patternChar == 'x' || patternChar == 'o' || patternChar == '0') { | |
4355 break; | |
4356 } | |
4357 } else if (!bSingleQuotation && | |
4358 (patternChar == 'z' || patternChar == 's' || | |
4359 patternChar == 'e' || patternChar == 'v' || | |
4360 patternChar == '8' || patternChar == ',' || | |
4361 patternChar == '.' || patternChar == '$')) { | |
4362 patternType = XFA_VT_FLOAT; | |
4363 if (patternChar == 'v' || patternChar == '8' || patternChar == '$') { | |
4364 break; | |
4365 } | |
4366 } | |
4367 iIndex++; | |
4368 } | |
4369 if (patternType == XFA_VT_NULL) { | |
4370 patternType = XFA_VT_TEXT | XFA_VT_FLOAT; | |
4371 } | |
4372 return FALSE; | |
4373 } | |
4374 void CXFA_FM2JSContext::Format(FXJSE_HOBJECT hThis, | |
4375 const CFX_ByteStringC& szFuncName, | |
4376 CFXJSE_Arguments& args) { | |
4377 CXFA_FM2JSContext* pContext = | |
4378 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
4379 int32_t argc = args.GetLength(); | |
4380 if (argc >= 2) { | |
4381 FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0); | |
4382 FXJSE_HVALUE argTwo = GetSimpleHValue(hThis, args, 1); | |
4383 CFX_ByteString szPattern; | |
4384 HValueToUTF8String(argOne, szPattern); | |
4385 CFX_ByteString szValue; | |
4386 HValueToUTF8String(argTwo, szValue); | |
4387 CXFA_Document* pDoc = pContext->GetDocument(); | |
4388 IFX_LocaleMgr* pMgr = (IFX_LocaleMgr*)pDoc->GetLocalMgr(); | |
4389 CXFA_Node* pThisNode = ToNode(pDoc->GetScriptContext()->GetThisObject()); | |
4390 FXSYS_assert(pThisNode); | |
4391 CXFA_WidgetData widgetData(pThisNode); | |
4392 IFX_Locale* pLocale = widgetData.GetLocal(); | |
4393 FX_DWORD patternType; | |
4394 FX_BOOL bCompelte = XFA_PATTERN_STRING_Type(szPattern, patternType); | |
4395 CFX_WideString wsPattern = | |
4396 CFX_WideString::FromUTF8(szPattern, szPattern.GetLength()); | |
4397 CFX_WideString wsValue = | |
4398 CFX_WideString::FromUTF8(szValue, szValue.GetLength()); | |
4399 if (!bCompelte) { | |
4400 switch (patternType) { | |
4401 case XFA_VT_DATETIME: { | |
4402 FX_STRSIZE iTChar = wsPattern.Find(L'T'); | |
4403 CFX_WideString wsDatePattern = FX_WSTRC(L"date{"); | |
4404 wsDatePattern += wsPattern.Left(iTChar); | |
4405 wsDatePattern += FX_WSTRC(L"} "); | |
4406 CFX_WideString wsTimePattern = FX_WSTRC(L"time{"); | |
4407 wsTimePattern += wsPattern.Mid(iTChar + 1); | |
4408 wsTimePattern += FX_WSTRC(L"}"); | |
4409 wsPattern = wsDatePattern + wsTimePattern; | |
4410 } break; | |
4411 case XFA_VT_DATE: { | |
4412 wsPattern = FX_WSTRC(L"date{") + wsPattern; | |
4413 wsPattern += FX_WSTRC(L"}"); | |
4414 } break; | |
4415 case XFA_VT_TIME: { | |
4416 wsPattern = FX_WSTRC(L"time{") + wsPattern; | |
4417 wsPattern += FX_WSTRC(L"}"); | |
4418 } break; | |
4419 case XFA_VT_TEXT: { | |
4420 wsPattern = FX_WSTRC(L"text{") + wsPattern; | |
4421 wsPattern += FX_WSTRC(L"}"); | |
4422 } break; | |
4423 case XFA_VT_FLOAT: { | |
4424 wsPattern = FX_WSTRC(L"num{") + wsPattern; | |
4425 wsPattern += FX_WSTRC(L"}"); | |
4426 } break; | |
4427 default: { | |
4428 CFX_WideString wsTestPattern; | |
4429 wsTestPattern = FX_WSTRC(L"num{") + wsPattern; | |
4430 wsTestPattern += FX_WSTRC(L"}"); | |
4431 CXFA_LocaleValue tempLocaleValue(XFA_VT_FLOAT, wsValue, wsTestPattern, | |
4432 pLocale, (CXFA_LocaleMgr*)pMgr); | |
4433 if (tempLocaleValue.IsValid()) { | |
4434 wsPattern = wsTestPattern; | |
4435 patternType = XFA_VT_FLOAT; | |
4436 } else { | |
4437 wsTestPattern = FX_WSTRC(L"text{") + wsPattern; | |
4438 wsTestPattern += FX_WSTRC(L"}"); | |
4439 wsPattern = wsTestPattern; | |
4440 patternType = XFA_VT_TEXT; | |
4441 } | |
4442 } break; | |
4443 } | |
4444 } | |
4445 CXFA_LocaleValue localeValue(patternType, wsValue, wsPattern, pLocale, | |
4446 (CXFA_LocaleMgr*)pMgr); | |
4447 CFX_WideString wsRet; | |
4448 if (localeValue.FormatPatterns(wsRet, wsPattern, pLocale, | |
4449 XFA_VALUEPICTURE_Display)) { | |
4450 FXJSE_Value_SetUTF8String(args.GetReturnValue(), | |
4451 FX_UTF8Encode(wsRet, wsRet.GetLength())); | |
4452 } else { | |
4453 FXJSE_Value_SetUTF8String(args.GetReturnValue(), ""); | |
4454 } | |
4455 FXJSE_Value_Release(argOne); | |
4456 FXJSE_Value_Release(argTwo); | |
4457 } else { | |
4458 pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | |
4459 L"Format"); | |
4460 } | |
4461 } | |
4462 void CXFA_FM2JSContext::Left(FXJSE_HOBJECT hThis, | |
4463 const CFX_ByteStringC& szFuncName, | |
4464 CFXJSE_Arguments& args) { | |
4465 CXFA_FM2JSContext* pContext = | |
4466 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
4467 if (args.GetLength() == 2) { | |
4468 FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0); | |
4469 FXJSE_HVALUE argTwo = GetSimpleHValue(hThis, args, 1); | |
4470 FX_BOOL argIsNull = FALSE; | |
4471 if ((HValueIsNull(hThis, argOne)) || (HValueIsNull(hThis, argTwo))) { | |
4472 argIsNull = TRUE; | |
4473 } | |
4474 if (argIsNull) { | |
4475 FXJSE_Value_SetNull(args.GetReturnValue()); | |
4476 } else { | |
4477 CFX_ByteString sourceString; | |
4478 HValueToUTF8String(argOne, sourceString); | |
4479 int32_t count = HValueToInteger(hThis, argTwo); | |
4480 if (count < 0) { | |
4481 count = 0; | |
4482 } | |
4483 FXJSE_Value_SetUTF8String(args.GetReturnValue(), | |
4484 sourceString.Left(count)); | |
4485 } | |
4486 FXJSE_Value_Release(argOne); | |
4487 FXJSE_Value_Release(argTwo); | |
4488 } else { | |
4489 pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | |
4490 L"Left"); | |
4491 } | |
4492 } | |
4493 void CXFA_FM2JSContext::Len(FXJSE_HOBJECT hThis, | |
4494 const CFX_ByteStringC& szFuncName, | |
4495 CFXJSE_Arguments& args) { | |
4496 CXFA_FM2JSContext* pContext = | |
4497 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
4498 if (args.GetLength() == 1) { | |
4499 FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0); | |
4500 if (HValueIsNull(hThis, argOne)) { | |
4501 FXJSE_Value_SetNull(args.GetReturnValue()); | |
4502 } else { | |
4503 CFX_ByteString sourceString; | |
4504 HValueToUTF8String(argOne, sourceString); | |
4505 FXJSE_Value_SetInteger(args.GetReturnValue(), sourceString.GetLength()); | |
4506 } | |
4507 FXJSE_Value_Release(argOne); | |
4508 } else { | |
4509 pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | |
4510 L"Len"); | |
4511 } | |
4512 } | |
4513 void CXFA_FM2JSContext::Lower(FXJSE_HOBJECT hThis, | |
4514 const CFX_ByteStringC& szFuncName, | |
4515 CFXJSE_Arguments& args) { | |
4516 int32_t argc = args.GetLength(); | |
4517 if ((argc > 0) && (argc < 3)) { | |
4518 CFX_ByteString argString; | |
4519 FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0); | |
4520 FXJSE_HVALUE localeValue = 0; | |
4521 if (HValueIsNull(hThis, argOne)) { | |
4522 FXJSE_Value_SetNull(args.GetReturnValue()); | |
4523 } else { | |
4524 if (argc == 2) { | |
4525 localeValue = GetSimpleHValue(hThis, args, 1); | |
4526 } | |
4527 HValueToUTF8String(argOne, argString); | |
4528 CFX_WideTextBuf lowStringBuf; | |
4529 CFX_WideString wsArgString = | |
4530 CFX_WideString::FromUTF8(argString, argString.GetLength()); | |
4531 const FX_WCHAR* pData = wsArgString; | |
4532 int32_t iLen = argString.GetLength(); | |
4533 int32_t i = 0; | |
4534 int32_t ch = 0; | |
4535 while (i < iLen) { | |
4536 ch = *(pData + i); | |
4537 if (ch >= 0x41 && ch <= 0x5A) { | |
4538 ch += 32; | |
4539 } else if (ch >= 0xC0 && ch <= 0xDE) { | |
4540 ch += 32; | |
4541 } else if (ch == 0x100 || ch == 0x102 || ch == 0x104) { | |
4542 ch += 1; | |
4543 } | |
4544 lowStringBuf.AppendChar(ch); | |
4545 ++i; | |
4546 } | |
4547 lowStringBuf.AppendChar(0); | |
4548 FXJSE_Value_SetUTF8String( | |
4549 args.GetReturnValue(), | |
4550 FX_UTF8Encode(lowStringBuf.GetBuffer(), lowStringBuf.GetLength())); | |
4551 if (argc == 2) { | |
4552 FXJSE_Value_Release(localeValue); | |
4553 } | |
4554 } | |
4555 FXJSE_Value_Release(argOne); | |
4556 } else { | |
4557 CXFA_FM2JSContext* pContext = | |
4558 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
4559 pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | |
4560 L"Lower"); | |
4561 } | |
4562 } | |
4563 void CXFA_FM2JSContext::Ltrim(FXJSE_HOBJECT hThis, | |
4564 const CFX_ByteStringC& szFuncName, | |
4565 CFXJSE_Arguments& args) { | |
4566 CXFA_FM2JSContext* pContext = | |
4567 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
4568 if (args.GetLength() == 1) { | |
4569 FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0); | |
4570 if (HValueIsNull(hThis, argOne)) { | |
4571 FXJSE_Value_SetNull(args.GetReturnValue()); | |
4572 } else { | |
4573 CFX_ByteString sourceString; | |
4574 HValueToUTF8String(argOne, sourceString); | |
4575 sourceString.TrimLeft(); | |
4576 FXJSE_Value_SetUTF8String(args.GetReturnValue(), sourceString); | |
4577 } | |
4578 FXJSE_Value_Release(argOne); | |
4579 } else { | |
4580 pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | |
4581 L"Ltrim"); | |
4582 } | |
4583 } | |
4584 void CXFA_FM2JSContext::Parse(FXJSE_HOBJECT hThis, | |
4585 const CFX_ByteStringC& szFuncName, | |
4586 CFXJSE_Arguments& args) { | |
4587 CXFA_FM2JSContext* pContext = | |
4588 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
4589 if (args.GetLength() == 2) { | |
4590 FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0); | |
4591 FXJSE_HVALUE argTwo = GetSimpleHValue(hThis, args, 1); | |
4592 if (HValueIsNull(hThis, argTwo)) { | |
4593 FXJSE_Value_SetNull(args.GetReturnValue()); | |
4594 } else { | |
4595 CFX_ByteString szPattern; | |
4596 HValueToUTF8String(argOne, szPattern); | |
4597 CFX_ByteString szValue; | |
4598 HValueToUTF8String(argTwo, szValue); | |
4599 CXFA_Document* pDoc = pContext->GetDocument(); | |
4600 IFX_LocaleMgr* pMgr = (IFX_LocaleMgr*)pDoc->GetLocalMgr(); | |
4601 CXFA_Node* pThisNode = ToNode(pDoc->GetScriptContext()->GetThisObject()); | |
4602 FXSYS_assert(pThisNode); | |
4603 CXFA_WidgetData widgetData(pThisNode); | |
4604 IFX_Locale* pLocale = widgetData.GetLocal(); | |
4605 FX_DWORD patternType; | |
4606 FX_BOOL bCompletePattern = | |
4607 XFA_PATTERN_STRING_Type(szPattern, patternType); | |
4608 CFX_WideString wsPattern = | |
4609 CFX_WideString::FromUTF8(szPattern, szPattern.GetLength()); | |
4610 CFX_WideString wsValue = | |
4611 CFX_WideString::FromUTF8(szValue, szValue.GetLength()); | |
4612 CFX_ByteString szParsedValue; | |
4613 if (bCompletePattern) { | |
4614 CXFA_LocaleValue localeValue(patternType, wsValue, wsPattern, pLocale, | |
4615 (CXFA_LocaleMgr*)pMgr); | |
4616 if (localeValue.IsValid()) { | |
4617 szParsedValue = FX_UTF8Encode(localeValue.GetValue()); | |
4618 FXJSE_Value_SetUTF8String(args.GetReturnValue(), szParsedValue); | |
4619 } else { | |
4620 FXJSE_Value_SetUTF8String(args.GetReturnValue(), ""); | |
4621 } | |
4622 } else { | |
4623 switch (patternType) { | |
4624 case XFA_VT_DATETIME: { | |
4625 FX_STRSIZE iTChar = wsPattern.Find(L'T'); | |
4626 CFX_WideString wsDatePattern = FX_WSTRC(L"date{"); | |
4627 wsDatePattern += wsPattern.Left(iTChar); | |
4628 wsDatePattern += FX_WSTRC(L"} "); | |
4629 CFX_WideString wsTimePattern = FX_WSTRC(L"time{"); | |
4630 wsTimePattern += wsPattern.Mid(iTChar + 1); | |
4631 wsTimePattern += FX_WSTRC(L"}"); | |
4632 wsPattern = wsDatePattern + wsTimePattern; | |
4633 CXFA_LocaleValue localeValue(patternType, wsValue, wsPattern, | |
4634 pLocale, (CXFA_LocaleMgr*)pMgr); | |
4635 if (localeValue.IsValid()) { | |
4636 szParsedValue = FX_UTF8Encode(localeValue.GetValue()); | |
4637 FXJSE_Value_SetUTF8String(args.GetReturnValue(), szParsedValue); | |
4638 } else { | |
4639 FXJSE_Value_SetUTF8String(args.GetReturnValue(), ""); | |
4640 } | |
4641 } break; | |
4642 case XFA_VT_DATE: { | |
4643 wsPattern = FX_WSTRC(L"date{") + wsPattern; | |
4644 wsPattern += FX_WSTRC(L"}"); | |
4645 CXFA_LocaleValue localeValue(patternType, wsValue, wsPattern, | |
4646 pLocale, (CXFA_LocaleMgr*)pMgr); | |
4647 if (localeValue.IsValid()) { | |
4648 szParsedValue = FX_UTF8Encode(localeValue.GetValue()); | |
4649 FXJSE_Value_SetUTF8String(args.GetReturnValue(), szParsedValue); | |
4650 } else { | |
4651 FXJSE_Value_SetUTF8String(args.GetReturnValue(), ""); | |
4652 } | |
4653 } break; | |
4654 case XFA_VT_TIME: { | |
4655 wsPattern = FX_WSTRC(L"time{") + wsPattern; | |
4656 wsPattern += FX_WSTRC(L"}"); | |
4657 CXFA_LocaleValue localeValue(patternType, wsValue, wsPattern, | |
4658 pLocale, (CXFA_LocaleMgr*)pMgr); | |
4659 if (localeValue.IsValid()) { | |
4660 szParsedValue = FX_UTF8Encode(localeValue.GetValue()); | |
4661 FXJSE_Value_SetUTF8String(args.GetReturnValue(), szParsedValue); | |
4662 } else { | |
4663 FXJSE_Value_SetUTF8String(args.GetReturnValue(), ""); | |
4664 } | |
4665 } break; | |
4666 case XFA_VT_TEXT: { | |
4667 wsPattern = FX_WSTRC(L"text{") + wsPattern; | |
4668 wsPattern += FX_WSTRC(L"}"); | |
4669 CXFA_LocaleValue localeValue(XFA_VT_TEXT, wsValue, wsPattern, | |
4670 pLocale, (CXFA_LocaleMgr*)pMgr); | |
4671 if (localeValue.IsValid()) { | |
4672 szParsedValue = FX_UTF8Encode(localeValue.GetValue()); | |
4673 FXJSE_Value_SetUTF8String(args.GetReturnValue(), szParsedValue); | |
4674 } else { | |
4675 FXJSE_Value_SetUTF8String(args.GetReturnValue(), ""); | |
4676 } | |
4677 } break; | |
4678 case XFA_VT_FLOAT: { | |
4679 wsPattern = FX_WSTRC(L"num{") + wsPattern; | |
4680 wsPattern += FX_WSTRC(L"}"); | |
4681 CXFA_LocaleValue localeValue(XFA_VT_FLOAT, wsValue, wsPattern, | |
4682 pLocale, (CXFA_LocaleMgr*)pMgr); | |
4683 if (localeValue.IsValid()) { | |
4684 FXJSE_Value_SetDouble(args.GetReturnValue(), | |
4685 localeValue.GetDoubleNum()); | |
4686 } else { | |
4687 FXJSE_Value_SetUTF8String(args.GetReturnValue(), ""); | |
4688 } | |
4689 } break; | |
4690 default: { | |
4691 CFX_WideString wsTestPattern; | |
4692 wsTestPattern = FX_WSTRC(L"num{") + wsPattern; | |
4693 wsTestPattern += FX_WSTRC(L"}"); | |
4694 CXFA_LocaleValue localeValue(XFA_VT_FLOAT, wsValue, wsTestPattern, | |
4695 pLocale, (CXFA_LocaleMgr*)pMgr); | |
4696 if (localeValue.IsValid()) { | |
4697 FXJSE_Value_SetDouble(args.GetReturnValue(), | |
4698 localeValue.GetDoubleNum()); | |
4699 } else { | |
4700 wsTestPattern = FX_WSTRC(L"text{") + wsPattern; | |
4701 wsTestPattern += FX_WSTRC(L"}"); | |
4702 CXFA_LocaleValue localeValue(XFA_VT_TEXT, wsValue, wsTestPattern, | |
4703 pLocale, (CXFA_LocaleMgr*)pMgr); | |
4704 if (localeValue.IsValid()) { | |
4705 szParsedValue = FX_UTF8Encode(localeValue.GetValue()); | |
4706 FXJSE_Value_SetUTF8String(args.GetReturnValue(), szParsedValue); | |
4707 } else { | |
4708 FXJSE_Value_SetUTF8String(args.GetReturnValue(), ""); | |
4709 } | |
4710 } | |
4711 } break; | |
4712 } | |
4713 } | |
4714 } | |
4715 FXJSE_Value_Release(argOne); | |
4716 FXJSE_Value_Release(argTwo); | |
4717 } else { | |
4718 pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | |
4719 L"Parse"); | |
4720 } | |
4721 } | |
4722 void CXFA_FM2JSContext::Replace(FXJSE_HOBJECT hThis, | |
4723 const CFX_ByteStringC& szFuncName, | |
4724 CFXJSE_Arguments& args) { | |
4725 int32_t argc = args.GetLength(); | |
4726 if ((argc == 2) || (argc == 3)) { | |
4727 FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0); | |
4728 FXJSE_HVALUE argTwo = GetSimpleHValue(hThis, args, 1); | |
4729 FXJSE_HVALUE argThree = 0; | |
4730 CFX_ByteString oneString; | |
4731 CFX_ByteString twoString; | |
4732 CFX_ByteString threeString; | |
4733 if (!HValueIsNull(hThis, argOne) && !HValueIsNull(hThis, argTwo)) { | |
4734 HValueToUTF8String(argOne, oneString); | |
4735 HValueToUTF8String(argTwo, twoString); | |
4736 } | |
4737 if (argc == 3) { | |
4738 argThree = GetSimpleHValue(hThis, args, 2); | |
4739 HValueToUTF8String(argThree, threeString); | |
4740 } | |
4741 int32_t iSrcLen = oneString.GetLength(); | |
4742 int32_t iFindLen = twoString.GetLength(); | |
4743 CFX_ByteTextBuf resultString; | |
4744 int32_t iFindIndex = 0; | |
4745 uint8_t ch = 0; | |
4746 for (int32_t u = 0; u < iSrcLen; ++u) { | |
4747 ch = oneString.GetAt(u); | |
4748 if (ch == twoString.GetAt(iFindIndex)) { | |
4749 int32_t iTemp = u + 1; | |
4750 ++iFindIndex; | |
4751 uint8_t chTemp = 0; | |
4752 while (iFindIndex < iFindLen) { | |
4753 chTemp = oneString.GetAt(iTemp); | |
4754 if (chTemp == twoString.GetAt(iFindIndex)) { | |
4755 ++iTemp; | |
4756 ++iFindIndex; | |
4757 } else { | |
4758 iFindIndex = 0; | |
4759 break; | |
4760 } | |
4761 } | |
4762 if (iFindIndex == iFindLen) { | |
4763 resultString << threeString; | |
4764 u += iFindLen - 1; | |
4765 iFindIndex = 0; | |
4766 } else { | |
4767 resultString.AppendChar(ch); | |
4768 } | |
4769 } else { | |
4770 resultString.AppendChar(ch); | |
4771 } | |
4772 } | |
4773 resultString.AppendChar(0); | |
4774 FXJSE_Value_SetUTF8String(args.GetReturnValue(), | |
4775 resultString.GetByteString()); | |
4776 FXJSE_Value_Release(argOne); | |
4777 FXJSE_Value_Release(argTwo); | |
4778 if (argc == 3) { | |
4779 FXJSE_Value_Release(argThree); | |
4780 } | |
4781 } else { | |
4782 CXFA_FM2JSContext* pContext = | |
4783 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
4784 pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | |
4785 L"Replace"); | |
4786 } | |
4787 } | |
4788 void CXFA_FM2JSContext::Right(FXJSE_HOBJECT hThis, | |
4789 const CFX_ByteStringC& szFuncName, | |
4790 CFXJSE_Arguments& args) { | |
4791 CXFA_FM2JSContext* pContext = | |
4792 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
4793 if (args.GetLength() == 2) { | |
4794 FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0); | |
4795 FXJSE_HVALUE argTwo = GetSimpleHValue(hThis, args, 1); | |
4796 FX_BOOL argIsNull = FALSE; | |
4797 if ((HValueIsNull(hThis, argOne)) || (HValueIsNull(hThis, argTwo))) { | |
4798 argIsNull = TRUE; | |
4799 } | |
4800 if (argIsNull) { | |
4801 FXJSE_Value_SetNull(args.GetReturnValue()); | |
4802 } else { | |
4803 CFX_ByteString sourceString; | |
4804 HValueToUTF8String(argOne, sourceString); | |
4805 int32_t count = HValueToInteger(hThis, argTwo); | |
4806 if (count < 0) { | |
4807 count = 0; | |
4808 } | |
4809 FXJSE_Value_SetUTF8String(args.GetReturnValue(), | |
4810 sourceString.Right(count)); | |
4811 } | |
4812 FXJSE_Value_Release(argOne); | |
4813 FXJSE_Value_Release(argTwo); | |
4814 } else { | |
4815 pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | |
4816 L"Right"); | |
4817 } | |
4818 } | |
4819 void CXFA_FM2JSContext::Rtrim(FXJSE_HOBJECT hThis, | |
4820 const CFX_ByteStringC& szFuncName, | |
4821 CFXJSE_Arguments& args) { | |
4822 CXFA_FM2JSContext* pContext = | |
4823 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
4824 if (args.GetLength() == 1) { | |
4825 FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0); | |
4826 if (HValueIsNull(hThis, argOne)) { | |
4827 FXJSE_Value_SetNull(args.GetReturnValue()); | |
4828 } else { | |
4829 CFX_ByteString sourceString; | |
4830 HValueToUTF8String(argOne, sourceString); | |
4831 sourceString.TrimRight(); | |
4832 FXJSE_Value_SetUTF8String(args.GetReturnValue(), sourceString); | |
4833 } | |
4834 FXJSE_Value_Release(argOne); | |
4835 } else { | |
4836 pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | |
4837 L"Rtrim"); | |
4838 } | |
4839 } | |
4840 void CXFA_FM2JSContext::Space(FXJSE_HOBJECT hThis, | |
4841 const CFX_ByteStringC& szFuncName, | |
4842 CFXJSE_Arguments& args) { | |
4843 CXFA_FM2JSContext* pContext = | |
4844 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
4845 if (args.GetLength() == 1) { | |
4846 FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0); | |
4847 if (FXJSE_Value_IsNull(argOne)) { | |
4848 FXJSE_Value_SetNull(args.GetReturnValue()); | |
4849 } else { | |
4850 int32_t count = 0; | |
4851 count = HValueToInteger(hThis, argOne); | |
4852 count = (count < 0) ? 0 : count; | |
4853 CFX_ByteTextBuf spaceString; | |
4854 int32_t index = 0; | |
4855 while (index < count) { | |
4856 spaceString.AppendByte(' '); | |
4857 index++; | |
4858 } | |
4859 spaceString.AppendByte(0); | |
4860 FXJSE_Value_SetUTF8String(args.GetReturnValue(), | |
4861 spaceString.GetByteString()); | |
4862 } | |
4863 FXJSE_Value_Release(argOne); | |
4864 } else { | |
4865 pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | |
4866 L"Space"); | |
4867 } | |
4868 } | |
4869 void CXFA_FM2JSContext::Str(FXJSE_HOBJECT hThis, | |
4870 const CFX_ByteStringC& szFuncName, | |
4871 CFXJSE_Arguments& args) { | |
4872 int32_t argc = args.GetLength(); | |
4873 if ((argc > 0) && (argc < 4)) { | |
4874 FX_BOOL bFlags = FALSE; | |
4875 FX_FLOAT fNumber; | |
4876 int32_t iWidth = 10; | |
4877 int32_t iPrecision = 0; | |
4878 FXJSE_HVALUE numberValue = GetSimpleHValue(hThis, args, 0); | |
4879 FXJSE_HVALUE widthValue = 0; | |
4880 FXJSE_HVALUE precisionValue = 0; | |
4881 if (FXJSE_Value_IsNull(numberValue)) { | |
4882 bFlags = TRUE; | |
4883 } else { | |
4884 fNumber = HValueToFloat(hThis, numberValue); | |
4885 } | |
4886 if (argc > 1) { | |
4887 widthValue = GetSimpleHValue(hThis, args, 1); | |
4888 iWidth = (int32_t)HValueToFloat(hThis, widthValue); | |
4889 } | |
4890 if (argc == 3) { | |
4891 precisionValue = GetSimpleHValue(hThis, args, 2); | |
4892 iPrecision = (int32_t)HValueToFloat(hThis, precisionValue); | |
4893 if (iPrecision < 0) { | |
4894 iPrecision = 0; | |
4895 } | |
4896 } | |
4897 if (!bFlags) { | |
4898 CFX_ByteString numberString; | |
4899 CFX_ByteString formatStr = "%"; | |
4900 if (iPrecision) { | |
4901 formatStr += "."; | |
4902 formatStr += CFX_ByteString::FormatInteger(iPrecision); | |
4903 } | |
4904 formatStr += "f"; | |
4905 numberString.Format(formatStr, fNumber); | |
4906 const FX_CHAR* pData = numberString; | |
4907 int32_t iLength = numberString.GetLength(); | |
4908 int32_t u = 0; | |
4909 while (u < iLength) { | |
4910 if (*(pData + u) == '.') { | |
4911 break; | |
4912 } | |
4913 ++u; | |
4914 } | |
4915 CFX_ByteTextBuf resultBuf; | |
4916 if (u > iWidth || (iPrecision + u) >= iWidth) { | |
4917 int32_t i = 0; | |
4918 while (i < iWidth) { | |
4919 resultBuf.AppendChar('*'); | |
4920 ++i; | |
4921 } | |
4922 resultBuf.AppendChar(0); | |
4923 } else { | |
4924 if (u == iLength) { | |
4925 if (iLength > iWidth) { | |
4926 int32_t i = 0; | |
4927 while (i < iWidth) { | |
4928 resultBuf.AppendChar('*'); | |
4929 ++i; | |
4930 } | |
4931 } else { | |
4932 int32_t i = 0; | |
4933 int32_t iSpace = iWidth - iLength; | |
4934 while (i < iSpace) { | |
4935 resultBuf.AppendChar(' '); | |
4936 ++i; | |
4937 } | |
4938 resultBuf << pData; | |
4939 } | |
4940 } else { | |
4941 int32_t iLeavingSpace = 0; | |
4942 if (iPrecision == 0) { | |
4943 iLeavingSpace = iWidth - (u + iPrecision); | |
4944 } else { | |
4945 iLeavingSpace = iWidth - (u + iPrecision + 1); | |
4946 } | |
4947 int32_t i = 0; | |
4948 while (i < iLeavingSpace) { | |
4949 resultBuf.AppendChar(' '); | |
4950 ++i; | |
4951 } | |
4952 i = 0; | |
4953 while (i < u) { | |
4954 resultBuf.AppendChar(*(pData + i)); | |
4955 ++i; | |
4956 } | |
4957 if (iPrecision != 0) { | |
4958 resultBuf.AppendChar('.'); | |
4959 } | |
4960 u++; | |
4961 i = 0; | |
4962 while (u < iLength) { | |
4963 if (i >= iPrecision) { | |
4964 break; | |
4965 } | |
4966 resultBuf.AppendChar(*(pData + u)); | |
4967 ++i; | |
4968 ++u; | |
4969 } | |
4970 while (i < iPrecision) { | |
4971 resultBuf.AppendChar('0'); | |
4972 ++i; | |
4973 } | |
4974 resultBuf.AppendChar(0); | |
4975 } | |
4976 } | |
4977 FXJSE_Value_SetUTF8String(args.GetReturnValue(), | |
4978 resultBuf.GetByteString()); | |
4979 } else { | |
4980 FXJSE_Value_SetNull(args.GetReturnValue()); | |
4981 } | |
4982 FXJSE_Value_Release(numberValue); | |
4983 if (argc > 1) { | |
4984 FXJSE_Value_Release(widthValue); | |
4985 if (argc == 3) { | |
4986 FXJSE_Value_Release(precisionValue); | |
4987 } | |
4988 } | |
4989 } else { | |
4990 CXFA_FM2JSContext* pContext = | |
4991 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
4992 pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | |
4993 L"Str"); | |
4994 } | |
4995 } | |
4996 void CXFA_FM2JSContext::Stuff(FXJSE_HOBJECT hThis, | |
4997 const CFX_ByteStringC& szFuncName, | |
4998 CFXJSE_Arguments& args) { | |
4999 int32_t argc = args.GetLength(); | |
5000 if ((argc == 3) || (argc == 4)) { | |
5001 CFX_ByteString sourceString; | |
5002 CFX_ByteString insertString; | |
5003 int32_t iLength = 0; | |
5004 int32_t iStart = 0; | |
5005 int32_t iDelete = 0; | |
5006 FXJSE_HVALUE sourceValue = GetSimpleHValue(hThis, args, 0); | |
5007 FXJSE_HVALUE startValue = GetSimpleHValue(hThis, args, 1); | |
5008 FXJSE_HVALUE deleteValue = GetSimpleHValue(hThis, args, 2); | |
5009 FXJSE_HVALUE insertValue = 0; | |
5010 if (!FXJSE_Value_IsNull(sourceValue) && !FXJSE_Value_IsNull(startValue) && | |
5011 !FXJSE_Value_IsNull(deleteValue)) { | |
5012 HValueToUTF8String(sourceValue, sourceString); | |
5013 iLength = sourceString.GetLength(); | |
5014 iStart = (int32_t)HValueToFloat(hThis, startValue); | |
5015 if (iStart < 1) { | |
5016 iStart = 1; | |
5017 } | |
5018 if (iStart > iLength) { | |
5019 iStart = iLength; | |
5020 } | |
5021 iDelete = (int32_t)HValueToFloat(hThis, deleteValue); | |
5022 if (iDelete <= 0) { | |
5023 iDelete = 0; | |
5024 } | |
5025 } | |
5026 if (argc == 4) { | |
5027 insertValue = GetSimpleHValue(hThis, args, 3); | |
5028 HValueToUTF8String(insertValue, insertString); | |
5029 } | |
5030 iStart -= 1; | |
5031 CFX_ByteTextBuf resultString; | |
5032 int32_t i = 0; | |
5033 while (i < iStart) { | |
5034 resultString.AppendChar(sourceString.GetAt(i)); | |
5035 ++i; | |
5036 } | |
5037 resultString << insertString; | |
5038 i = iStart + iDelete; | |
5039 while (i < iLength) { | |
5040 resultString.AppendChar(sourceString.GetAt(i)); | |
5041 ++i; | |
5042 } | |
5043 resultString.AppendChar(0); | |
5044 FXJSE_Value_SetUTF8String(args.GetReturnValue(), | |
5045 resultString.GetByteString()); | |
5046 FXJSE_Value_Release(sourceValue); | |
5047 FXJSE_Value_Release(startValue); | |
5048 FXJSE_Value_Release(deleteValue); | |
5049 if (argc == 4) { | |
5050 FXJSE_Value_Release(insertValue); | |
5051 } | |
5052 } else { | |
5053 CXFA_FM2JSContext* pContext = | |
5054 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
5055 pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | |
5056 L"Stuff"); | |
5057 } | |
5058 } | |
5059 void CXFA_FM2JSContext::Substr(FXJSE_HOBJECT hThis, | |
5060 const CFX_ByteStringC& szFuncName, | |
5061 CFXJSE_Arguments& args) { | |
5062 int32_t argc = args.GetLength(); | |
5063 if (argc == 3) { | |
5064 FXJSE_HVALUE stringValue = GetSimpleHValue(hThis, args, 0); | |
5065 FXJSE_HVALUE startValue = GetSimpleHValue(hThis, args, 1); | |
5066 FXJSE_HVALUE endValue = GetSimpleHValue(hThis, args, 2); | |
5067 if (HValueIsNull(hThis, stringValue) || (HValueIsNull(hThis, startValue)) || | |
5068 (HValueIsNull(hThis, endValue))) { | |
5069 FXJSE_Value_SetNull(args.GetReturnValue()); | |
5070 } else { | |
5071 CFX_ByteString szSourceStr; | |
5072 int32_t iStart = 0; | |
5073 int32_t iCount = 0; | |
5074 HValueToUTF8String(stringValue, szSourceStr); | |
5075 int32_t iLength = szSourceStr.GetLength(); | |
5076 if (iLength == 0) { | |
5077 FXJSE_Value_SetUTF8String(args.GetReturnValue(), ""); | |
5078 } else { | |
5079 iStart = (int32_t)HValueToFloat(hThis, startValue); | |
5080 iCount = (int32_t)HValueToFloat(hThis, endValue); | |
5081 if (iStart < 1) { | |
5082 iStart = 1; | |
5083 } | |
5084 if (iStart > iLength) { | |
5085 iStart = iLength; | |
5086 } | |
5087 if (iCount <= 0) { | |
5088 iCount = 0; | |
5089 } | |
5090 iStart -= 1; | |
5091 FXJSE_Value_SetUTF8String(args.GetReturnValue(), | |
5092 szSourceStr.Mid(iStart, iCount)); | |
5093 } | |
5094 } | |
5095 FXJSE_Value_Release(stringValue); | |
5096 FXJSE_Value_Release(startValue); | |
5097 FXJSE_Value_Release(endValue); | |
5098 } else { | |
5099 CXFA_FM2JSContext* pContext = | |
5100 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
5101 pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | |
5102 L"Substr"); | |
5103 } | |
5104 } | |
5105 void CXFA_FM2JSContext::Uuid(FXJSE_HOBJECT hThis, | |
5106 const CFX_ByteStringC& szFuncName, | |
5107 CFXJSE_Arguments& args) { | |
5108 int32_t argc = args.GetLength(); | |
5109 if ((argc == 0) || (argc == 1)) { | |
5110 int32_t iNum = 0; | |
5111 FXJSE_HVALUE argOne = 0; | |
5112 if (argc == 1) { | |
5113 argOne = GetSimpleHValue(hThis, args, 0); | |
5114 iNum = (int32_t)HValueToFloat(hThis, argOne); | |
5115 } | |
5116 FX_GUID guid; | |
5117 FX_GUID_CreateV4(&guid); | |
5118 CFX_ByteString bsUId; | |
5119 FX_GUID_ToString(&guid, bsUId, iNum); | |
5120 FXJSE_Value_SetUTF8String(args.GetReturnValue(), bsUId); | |
5121 if (argc == 1) { | |
5122 FXJSE_Value_Release(argOne); | |
5123 } | |
5124 } else { | |
5125 CXFA_FM2JSContext* pContext = | |
5126 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
5127 pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | |
5128 L"Uuid"); | |
5129 } | |
5130 } | |
5131 void CXFA_FM2JSContext::Upper(FXJSE_HOBJECT hThis, | |
5132 const CFX_ByteStringC& szFuncName, | |
5133 CFXJSE_Arguments& args) { | |
5134 int32_t argc = args.GetLength(); | |
5135 if ((argc > 0) && (argc < 3)) { | |
5136 CFX_ByteString argString; | |
5137 FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0); | |
5138 FXJSE_HVALUE localeValue = 0; | |
5139 if (HValueIsNull(hThis, argOne)) { | |
5140 FXJSE_Value_SetNull(args.GetReturnValue()); | |
5141 } else { | |
5142 if (argc == 2) { | |
5143 localeValue = GetSimpleHValue(hThis, args, 1); | |
5144 } | |
5145 HValueToUTF8String(argOne, argString); | |
5146 CFX_WideTextBuf upperStringBuf; | |
5147 CFX_WideString wsArgString = | |
5148 CFX_WideString::FromUTF8(argString, argString.GetLength()); | |
5149 const FX_WCHAR* pData = wsArgString; | |
5150 int32_t iLen = wsArgString.GetLength(); | |
5151 int32_t i = 0; | |
5152 int32_t ch = 0; | |
5153 while (i < iLen) { | |
5154 ch = *(pData + i); | |
5155 if (ch >= 0x61 && ch <= 0x7A) { | |
5156 ch -= 32; | |
5157 } else if (ch >= 0xE0 && ch <= 0xFE) { | |
5158 ch -= 32; | |
5159 } else if (ch == 0x101 || ch == 0x103 || ch == 0x105) { | |
5160 ch -= 1; | |
5161 } | |
5162 upperStringBuf.AppendChar(ch); | |
5163 ++i; | |
5164 } | |
5165 upperStringBuf.AppendChar(0); | |
5166 FXJSE_Value_SetUTF8String(args.GetReturnValue(), | |
5167 FX_UTF8Encode(upperStringBuf.GetBuffer(), | |
5168 upperStringBuf.GetLength())); | |
5169 if (argc == 2) { | |
5170 FXJSE_Value_Release(localeValue); | |
5171 } | |
5172 } | |
5173 FXJSE_Value_Release(argOne); | |
5174 } else { | |
5175 CXFA_FM2JSContext* pContext = | |
5176 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
5177 pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | |
5178 L"Upper"); | |
5179 } | |
5180 } | |
5181 void CXFA_FM2JSContext::WordNum(FXJSE_HOBJECT hThis, | |
5182 const CFX_ByteStringC& szFuncName, | |
5183 CFXJSE_Arguments& args) { | |
5184 int32_t argc = args.GetLength(); | |
5185 if ((argc > 0) && (argc < 4)) { | |
5186 FX_BOOL bFlags = FALSE; | |
5187 FX_FLOAT fNumber; | |
5188 int32_t iIdentifier = 0; | |
5189 CFX_ByteString localeString; | |
5190 FXJSE_HVALUE numberValue = GetSimpleHValue(hThis, args, 0); | |
5191 FXJSE_HVALUE identifierValue = 0; | |
5192 FXJSE_HVALUE localeValue = 0; | |
5193 if (FXJSE_Value_IsNull(numberValue)) { | |
5194 bFlags = TRUE; | |
5195 } else { | |
5196 fNumber = HValueToFloat(hThis, numberValue); | |
5197 } | |
5198 if (argc > 1) { | |
5199 identifierValue = GetSimpleHValue(hThis, args, 1); | |
5200 if (FXJSE_Value_IsNull(identifierValue)) { | |
5201 bFlags = TRUE; | |
5202 } else { | |
5203 iIdentifier = (int32_t)HValueToFloat(hThis, identifierValue); | |
5204 } | |
5205 } | |
5206 if (argc == 3) { | |
5207 localeValue = GetSimpleHValue(hThis, args, 2); | |
5208 if (FXJSE_Value_IsNull(localeValue)) { | |
5209 bFlags = TRUE; | |
5210 } else { | |
5211 HValueToUTF8String(localeValue, localeString); | |
5212 } | |
5213 } | |
5214 if (!bFlags) { | |
5215 if ((fNumber < 0) || (fNumber > 922337203685477550)) { | |
5216 FXJSE_Value_SetUTF8String(args.GetReturnValue(), "*"); | |
5217 } else { | |
5218 CFX_ByteTextBuf resultBuf; | |
5219 CFX_ByteString numberString; | |
5220 numberString.Format("%.2f", fNumber); | |
5221 WordUS(numberString, iIdentifier, resultBuf); | |
5222 FXJSE_Value_SetUTF8String(args.GetReturnValue(), | |
5223 resultBuf.GetByteString()); | |
5224 } | |
5225 } else { | |
5226 FXJSE_Value_SetNull(args.GetReturnValue()); | |
5227 } | |
5228 FXJSE_Value_Release(numberValue); | |
5229 if (argc > 1) { | |
5230 FXJSE_Value_Release(identifierValue); | |
5231 if (argc == 3) { | |
5232 FXJSE_Value_Release(localeValue); | |
5233 } | |
5234 } | |
5235 } else { | |
5236 CXFA_FM2JSContext* pContext = | |
5237 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
5238 pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | |
5239 L"WordNum"); | |
5240 } | |
5241 } | |
5242 void CXFA_FM2JSContext::TrillionUS(const CFX_ByteStringC& szData, | |
5243 CFX_ByteTextBuf& strBuf) { | |
5244 CFX_ByteStringC pUnits[] = {"zero", "one", "two", "three", "four", | |
5245 "five", "six", "seven", "eight", "nine"}; | |
5246 CFX_ByteStringC pCapUnits[] = {"Zero", "One", "Two", "Three", "Four", | |
5247 "Five", "Six", "Seven", "Eight", "Nine"}; | |
5248 CFX_ByteStringC pTens[] = {"Ten", "Eleven", "Twelve", "Thirteen", | |
5249 "Fourteen", "Fifteen", "Sixteen", "Seventeen", | |
5250 "Eighteen", "Nineteen"}; | |
5251 CFX_ByteStringC pLastTens[] = {"Twenty", "Thirty", "Forty", "Fifty", | |
5252 "Sixty", "Seventy", "Eighty", "Ninety"}; | |
5253 CFX_ByteStringC pComm[] = {" Hundred ", " Thousand ", " Million ", | |
5254 " Billion ", "Trillion"}; | |
5255 int32_t iComm = 0; | |
5256 const FX_CHAR* pData = szData.GetCStr(); | |
5257 int32_t iLength = szData.GetLength(); | |
5258 if (iLength > 12) { | |
5259 iComm = 4; | |
5260 } else if (iLength > 9) { | |
5261 iComm = 3; | |
5262 } else if (iLength > 6) { | |
5263 iComm = 2; | |
5264 } else if (iLength > 3) { | |
5265 iComm = 1; | |
5266 } | |
5267 int32_t iIndex = 0; | |
5268 int32_t iFirstCount = iLength % 3; | |
5269 if (iFirstCount == 0) { | |
5270 iFirstCount = 3; | |
5271 } | |
5272 if (iFirstCount == 3) { | |
5273 if (*(pData + iIndex) != '0') { | |
5274 strBuf << pCapUnits[*(pData + iIndex) - '0']; | |
5275 strBuf << pComm[0]; | |
5276 } | |
5277 if (*(pData + iIndex + 1) == '0') { | |
5278 strBuf << pCapUnits[*(pData + iIndex + 2) - '0']; | |
5279 } else { | |
5280 if (*(pData + iIndex + 1) > '1') { | |
5281 strBuf << pLastTens[*(pData + iIndex + 1) - '2']; | |
5282 strBuf << "-"; | |
5283 strBuf << pUnits[*(pData + iIndex + 2) - '0']; | |
5284 } else if (*(pData + iIndex + 1) == '1') { | |
5285 strBuf << pTens[*(pData + iIndex + 2) - '0']; | |
5286 } else if (*(pData + iIndex + 1) == '0') { | |
5287 strBuf << pCapUnits[*(pData + iIndex + 2) - '0']; | |
5288 } | |
5289 } | |
5290 iIndex += 3; | |
5291 } else if (iFirstCount == 2) { | |
5292 if (*(pData + iIndex) == '0') { | |
5293 strBuf << pCapUnits[*(pData + iIndex + 1) - '0']; | |
5294 } else { | |
5295 if (*(pData + iIndex) > '1') { | |
5296 strBuf << pLastTens[*(pData + iIndex) - '2']; | |
5297 strBuf << "-"; | |
5298 strBuf << pUnits[*(pData + iIndex + 1) - '0']; | |
5299 } else if (*(pData + iIndex) == '1') { | |
5300 strBuf << pTens[*(pData + iIndex + 1) - '0']; | |
5301 } else if (*(pData + iIndex) == '0') { | |
5302 strBuf << pCapUnits[*(pData + iIndex + 1) - '0']; | |
5303 } | |
5304 } | |
5305 iIndex += 2; | |
5306 } else if (iFirstCount == 1) { | |
5307 strBuf << pCapUnits[*(pData + iIndex) - '0']; | |
5308 iIndex += 1; | |
5309 } | |
5310 if (iLength > 3 && iFirstCount > 0) { | |
5311 strBuf << pComm[iComm]; | |
5312 --iComm; | |
5313 } | |
5314 while (iIndex < iLength) { | |
5315 if (*(pData + iIndex) != '0') { | |
5316 strBuf << pCapUnits[*(pData + iIndex) - '0']; | |
5317 strBuf << pComm[0]; | |
5318 } | |
5319 if (*(pData + iIndex + 1) == '0') { | |
5320 strBuf << pCapUnits[*(pData + iIndex + 2) - '0']; | |
5321 } else { | |
5322 if (*(pData + iIndex + 1) > '1') { | |
5323 strBuf << pLastTens[*(pData + iIndex + 1) - '2']; | |
5324 strBuf << "-"; | |
5325 strBuf << pUnits[*(pData + iIndex + 2) - '0']; | |
5326 } else if (*(pData + iIndex + 1) == '1') { | |
5327 strBuf << pTens[*(pData + iIndex + 2) - '0']; | |
5328 } else if (*(pData + iIndex + 1) == '0') { | |
5329 strBuf << pCapUnits[*(pData + iIndex + 2) - '0']; | |
5330 } | |
5331 } | |
5332 if (iIndex < iLength - 3) { | |
5333 strBuf << pComm[iComm]; | |
5334 --iComm; | |
5335 } | |
5336 iIndex += 3; | |
5337 } | |
5338 } | |
5339 void CXFA_FM2JSContext::WordUS(const CFX_ByteStringC& szData, | |
5340 int32_t iStyle, | |
5341 CFX_ByteTextBuf& strBuf) { | |
5342 const FX_CHAR* pData = szData.GetCStr(); | |
5343 int32_t iLength = szData.GetLength(); | |
5344 switch (iStyle) { | |
5345 case 0: { | |
5346 int32_t iIndex = 0; | |
5347 while (iIndex < iLength) { | |
5348 if (*(pData + iIndex) == '.') { | |
5349 break; | |
5350 } | |
5351 ++iIndex; | |
5352 } | |
5353 iLength = iIndex; | |
5354 iIndex = 0; | |
5355 int32_t iCount = 0; | |
5356 while (iIndex < iLength) { | |
5357 iCount = (iLength - iIndex) % 12; | |
5358 if (!iCount && iLength - iIndex > 0) { | |
5359 iCount = 12; | |
5360 } | |
5361 TrillionUS(CFX_ByteStringC(pData + iIndex, iCount), strBuf); | |
5362 iIndex += iCount; | |
5363 if (iIndex < iLength) { | |
5364 strBuf << " Trillion "; | |
5365 } | |
5366 } | |
5367 } break; | |
5368 case 1: { | |
5369 int32_t iIndex = 0; | |
5370 while (iIndex < iLength) { | |
5371 if (*(pData + iIndex) == '.') { | |
5372 break; | |
5373 } | |
5374 ++iIndex; | |
5375 } | |
5376 iLength = iIndex; | |
5377 iIndex = 0; | |
5378 int32_t iCount = 0; | |
5379 while (iIndex < iLength) { | |
5380 iCount = (iLength - iIndex) % 12; | |
5381 if (!iCount && iLength - iIndex > 0) { | |
5382 iCount = 12; | |
5383 } | |
5384 TrillionUS(CFX_ByteStringC(pData + iIndex, iCount), strBuf); | |
5385 iIndex += iCount; | |
5386 if (iIndex < iLength) { | |
5387 strBuf << " Trillion "; | |
5388 } | |
5389 } | |
5390 strBuf << " Dollars"; | |
5391 } break; | |
5392 case 2: { | |
5393 int32_t iIndex = 0; | |
5394 while (iIndex < iLength) { | |
5395 if (*(pData + iIndex) == '.') { | |
5396 break; | |
5397 } | |
5398 ++iIndex; | |
5399 } | |
5400 int32_t iInteger = iIndex; | |
5401 iIndex = 0; | |
5402 int32_t iCount = 0; | |
5403 while (iIndex < iInteger) { | |
5404 iCount = (iInteger - iIndex) % 12; | |
5405 if (!iCount && iLength - iIndex > 0) { | |
5406 iCount = 12; | |
5407 } | |
5408 TrillionUS(CFX_ByteStringC(pData + iIndex, iCount), strBuf); | |
5409 iIndex += iCount; | |
5410 if (iIndex < iInteger) { | |
5411 strBuf << " Trillion "; | |
5412 } | |
5413 } | |
5414 strBuf << " Dollars"; | |
5415 if (iInteger < iLength) { | |
5416 strBuf << " And "; | |
5417 iIndex = iInteger + 1; | |
5418 int32_t iCount = 0; | |
5419 while (iIndex < iLength) { | |
5420 iCount = (iLength - iIndex) % 12; | |
5421 if (!iCount && iLength - iIndex > 0) { | |
5422 iCount = 12; | |
5423 } | |
5424 TrillionUS(CFX_ByteStringC(pData + iIndex, iCount), strBuf); | |
5425 iIndex += iCount; | |
5426 if (iIndex < iLength) { | |
5427 strBuf << " Trillion "; | |
5428 } | |
5429 } | |
5430 strBuf << " Cents"; | |
5431 } | |
5432 } break; | |
5433 default: | |
5434 break; | |
5435 } | |
5436 } | |
5437 void CXFA_FM2JSContext::Get(FXJSE_HOBJECT hThis, | |
5438 const CFX_ByteStringC& szFuncName, | |
5439 CFXJSE_Arguments& args) { | |
5440 CXFA_FM2JSContext* pContext = | |
5441 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
5442 int32_t argc = args.GetLength(); | |
5443 if (argc == 1) { | |
5444 CXFA_Document* pDoc = pContext->GetDocument(); | |
5445 if (!pDoc) { | |
5446 return; | |
5447 } | |
5448 IXFA_AppProvider* pAppProvider = | |
5449 pDoc->GetParser()->GetNotify()->GetAppProvider(); | |
5450 if (!pAppProvider) { | |
5451 return; | |
5452 } | |
5453 FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0); | |
5454 CFX_ByteString urlString; | |
5455 HValueToUTF8String(argOne, urlString); | |
5456 IFX_FileRead* pFile = pAppProvider->DownloadURL( | |
5457 CFX_WideString::FromUTF8(urlString, urlString.GetLength())); | |
5458 if (pFile) { | |
5459 int32_t size = pFile->GetSize(); | |
5460 uint8_t* pData = FX_Alloc(uint8_t, size); | |
5461 pFile->ReadBlock(pData, size); | |
5462 FXJSE_Value_SetUTF8String(args.GetReturnValue(), | |
5463 CFX_ByteStringC(pData, size)); | |
5464 FX_Free(pData); | |
5465 pFile->Release(); | |
5466 } | |
5467 FXJSE_Value_Release(argOne); | |
5468 } else { | |
5469 pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | |
5470 L"Get"); | |
5471 } | |
5472 } | |
5473 void CXFA_FM2JSContext::Post(FXJSE_HOBJECT hThis, | |
5474 const CFX_ByteStringC& szFuncName, | |
5475 CFXJSE_Arguments& args) { | |
5476 CXFA_FM2JSContext* pContext = | |
5477 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
5478 int32_t argc = args.GetLength(); | |
5479 if ((argc >= 2) && (argc <= 5)) { | |
5480 CXFA_Document* pDoc = pContext->GetDocument(); | |
5481 if (!pDoc) { | |
5482 return; | |
5483 } | |
5484 IXFA_AppProvider* pAppProvider = | |
5485 pDoc->GetParser()->GetNotify()->GetAppProvider(); | |
5486 if (!pAppProvider) { | |
5487 return; | |
5488 } | |
5489 CFX_ByteString bsURL; | |
5490 CFX_ByteString bsData; | |
5491 CFX_ByteString bsContentType; | |
5492 CFX_ByteString bsEncode; | |
5493 CFX_ByteString bsHeader; | |
5494 FXJSE_HVALUE argOne; | |
5495 FXJSE_HVALUE argTwo; | |
5496 FXJSE_HVALUE argThree; | |
5497 FXJSE_HVALUE argFour; | |
5498 FXJSE_HVALUE argFive; | |
5499 argOne = GetSimpleHValue(hThis, args, 0); | |
5500 HValueToUTF8String(argOne, bsURL); | |
5501 argTwo = GetSimpleHValue(hThis, args, 1); | |
5502 HValueToUTF8String(argTwo, bsData); | |
5503 if (argc > 2) { | |
5504 argThree = GetSimpleHValue(hThis, args, 2); | |
5505 HValueToUTF8String(argThree, bsContentType); | |
5506 } | |
5507 if (argc > 3) { | |
5508 argFour = GetSimpleHValue(hThis, args, 3); | |
5509 HValueToUTF8String(argFour, bsEncode); | |
5510 } | |
5511 if (argc > 4) { | |
5512 argFive = GetSimpleHValue(hThis, args, 4); | |
5513 HValueToUTF8String(argFive, bsHeader); | |
5514 } | |
5515 CFX_WideString decodedResponse; | |
5516 FX_BOOL bFlags = pAppProvider->PostRequestURL( | |
5517 CFX_WideString::FromUTF8(bsURL, bsURL.GetLength()), | |
5518 CFX_WideString::FromUTF8(bsData, bsData.GetLength()), | |
5519 CFX_WideString::FromUTF8(bsContentType, bsContentType.GetLength()), | |
5520 CFX_WideString::FromUTF8(bsEncode, bsEncode.GetLength()), | |
5521 CFX_WideString::FromUTF8(bsHeader, bsHeader.GetLength()), | |
5522 decodedResponse); | |
5523 FXJSE_Value_Release(argOne); | |
5524 FXJSE_Value_Release(argTwo); | |
5525 if (argc > 2) { | |
5526 FXJSE_Value_Release(argThree); | |
5527 } | |
5528 if (argc > 3) { | |
5529 FXJSE_Value_Release(argFour); | |
5530 } | |
5531 if (argc > 4) { | |
5532 FXJSE_Value_Release(argFive); | |
5533 } | |
5534 if (bFlags) { | |
5535 FXJSE_Value_SetUTF8String( | |
5536 args.GetReturnValue(), | |
5537 FX_UTF8Encode(decodedResponse, decodedResponse.GetLength())); | |
5538 } else { | |
5539 pContext->ThrowScriptErrorMessage(XFA_IDS_SERVER_DENY); | |
5540 } | |
5541 } else { | |
5542 pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | |
5543 L"Post"); | |
5544 } | |
5545 } | |
5546 void CXFA_FM2JSContext::Put(FXJSE_HOBJECT hThis, | |
5547 const CFX_ByteStringC& szFuncName, | |
5548 CFXJSE_Arguments& args) { | |
5549 CXFA_FM2JSContext* pContext = | |
5550 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
5551 int32_t argc = args.GetLength(); | |
5552 if ((argc == 2) || (argc == 3)) { | |
5553 CXFA_Document* pDoc = pContext->GetDocument(); | |
5554 if (!pDoc) { | |
5555 return; | |
5556 } | |
5557 IXFA_AppProvider* pAppProvider = | |
5558 pDoc->GetParser()->GetNotify()->GetAppProvider(); | |
5559 if (!pAppProvider) { | |
5560 return; | |
5561 } | |
5562 CFX_ByteString bsURL; | |
5563 CFX_ByteString bsData; | |
5564 CFX_ByteString bsEncode; | |
5565 FXJSE_HVALUE argOne; | |
5566 FXJSE_HVALUE argTwo; | |
5567 FXJSE_HVALUE argThree; | |
5568 argOne = GetSimpleHValue(hThis, args, 0); | |
5569 HValueToUTF8String(argOne, bsURL); | |
5570 argTwo = GetSimpleHValue(hThis, args, 1); | |
5571 HValueToUTF8String(argTwo, bsData); | |
5572 if (argc > 2) { | |
5573 argThree = GetSimpleHValue(hThis, args, 2); | |
5574 HValueToUTF8String(argThree, bsEncode); | |
5575 } | |
5576 FX_BOOL bFlags = pAppProvider->PutRequestURL( | |
5577 CFX_WideString::FromUTF8(bsURL, bsURL.GetLength()), | |
5578 CFX_WideString::FromUTF8(bsData, bsData.GetLength()), | |
5579 CFX_WideString::FromUTF8(bsEncode, bsEncode.GetLength())); | |
5580 FXJSE_Value_Release(argOne); | |
5581 FXJSE_Value_Release(argTwo); | |
5582 if (argc > 2) { | |
5583 FXJSE_Value_Release(argThree); | |
5584 } | |
5585 if (bFlags) { | |
5586 FXJSE_Value_SetUTF8String(args.GetReturnValue(), ""); | |
5587 } else { | |
5588 pContext->ThrowScriptErrorMessage(XFA_IDS_SERVER_DENY); | |
5589 } | |
5590 } else { | |
5591 pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | |
5592 L"Put"); | |
5593 } | |
5594 } | |
5595 void CXFA_FM2JSContext::assign_value_operator(FXJSE_HOBJECT hThis, | |
5596 const CFX_ByteStringC& szFuncName, | |
5597 CFXJSE_Arguments& args) { | |
5598 CXFA_FM2JSContext* pContext = | |
5599 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
5600 FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime(); | |
5601 if (args.GetLength() == 2) { | |
5602 FXJSE_HVALUE lValue = args.GetValue(0); | |
5603 FXJSE_HVALUE rValue = GetSimpleHValue(hThis, args, 1); | |
5604 FX_BOOL bSetStatus = TRUE; | |
5605 if (FXJSE_Value_IsArray(lValue)) { | |
5606 FXJSE_HVALUE leftLengthValue = FXJSE_Value_Create(hruntime); | |
5607 FXJSE_Value_GetObjectProp(lValue, "length", leftLengthValue); | |
5608 int32_t iLeftLength = FXJSE_Value_ToInteger(leftLengthValue); | |
5609 FXJSE_Value_Release(leftLengthValue); | |
5610 FXJSE_HVALUE jsObjectValue = FXJSE_Value_Create(hruntime); | |
5611 FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime); | |
5612 FXJSE_Value_GetObjectPropByIdx(lValue, 1, propertyValue); | |
5613 if (FXJSE_Value_IsNull(propertyValue)) { | |
5614 for (int32_t i = 2; i < iLeftLength; i++) { | |
5615 FXJSE_Value_GetObjectPropByIdx(lValue, i, jsObjectValue); | |
5616 bSetStatus = SetObjectDefaultValue(jsObjectValue, rValue); | |
5617 if (!bSetStatus) { | |
5618 pContext->ThrowScriptErrorMessage(XFA_IDS_NOT_DEFAUL_VALUE); | |
5619 break; | |
5620 } | |
5621 } | |
5622 } else { | |
5623 CFX_ByteString propertyStr; | |
5624 FXJSE_Value_ToUTF8String(propertyValue, propertyStr); | |
5625 for (int32_t i = 2; i < iLeftLength; i++) { | |
5626 FXJSE_Value_GetObjectPropByIdx(lValue, i, jsObjectValue); | |
5627 FXJSE_Value_SetObjectProp(jsObjectValue, propertyStr, rValue); | |
5628 } | |
5629 } | |
5630 FXJSE_Value_Release(jsObjectValue); | |
5631 FXJSE_Value_Release(propertyValue); | |
5632 } else if (FXJSE_Value_IsObject(lValue)) { | |
5633 bSetStatus = SetObjectDefaultValue(lValue, rValue); | |
5634 if (!bSetStatus) { | |
5635 pContext->ThrowScriptErrorMessage(XFA_IDS_NOT_DEFAUL_VALUE); | |
5636 } | |
5637 } | |
5638 FXJSE_Value_Set(args.GetReturnValue(), rValue); | |
5639 FXJSE_Value_Release(lValue); | |
5640 FXJSE_Value_Release(rValue); | |
5641 } else { | |
5642 pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR); | |
5643 } | |
5644 } | |
5645 void CXFA_FM2JSContext::logical_or_operator(FXJSE_HOBJECT hThis, | |
5646 const CFX_ByteStringC& szFuncName, | |
5647 CFXJSE_Arguments& args) { | |
5648 if (args.GetLength() == 2) { | |
5649 FXJSE_HVALUE argFirst = GetSimpleHValue(hThis, args, 0); | |
5650 FXJSE_HVALUE argSecond = GetSimpleHValue(hThis, args, 1); | |
5651 if (FXJSE_Value_IsNull(argFirst) && FXJSE_Value_IsNull(argSecond)) { | |
5652 FXJSE_Value_SetNull(args.GetReturnValue()); | |
5653 } else { | |
5654 FX_FLOAT first = HValueToFloat(hThis, argFirst); | |
5655 FX_FLOAT second = HValueToFloat(hThis, argSecond); | |
5656 FXJSE_Value_SetInteger(args.GetReturnValue(), (first || second) ? 1 : 0); | |
5657 } | |
5658 FXJSE_Value_Release(argFirst); | |
5659 FXJSE_Value_Release(argSecond); | |
5660 } else { | |
5661 CXFA_FM2JSContext* pContext = | |
5662 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
5663 pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR); | |
5664 } | |
5665 } | |
5666 void CXFA_FM2JSContext::logical_and_operator(FXJSE_HOBJECT hThis, | |
5667 const CFX_ByteStringC& szFuncName, | |
5668 CFXJSE_Arguments& args) { | |
5669 if (args.GetLength() == 2) { | |
5670 FXJSE_HVALUE argFirst = GetSimpleHValue(hThis, args, 0); | |
5671 FXJSE_HVALUE argSecond = GetSimpleHValue(hThis, args, 1); | |
5672 if (FXJSE_Value_IsNull(argFirst) && FXJSE_Value_IsNull(argSecond)) { | |
5673 FXJSE_Value_SetNull(args.GetReturnValue()); | |
5674 } else { | |
5675 FX_FLOAT first = HValueToFloat(hThis, argFirst); | |
5676 FX_FLOAT second = HValueToFloat(hThis, argSecond); | |
5677 FXJSE_Value_SetInteger(args.GetReturnValue(), (first && second) ? 1 : 0); | |
5678 } | |
5679 FXJSE_Value_Release(argFirst); | |
5680 FXJSE_Value_Release(argSecond); | |
5681 } else { | |
5682 CXFA_FM2JSContext* pContext = | |
5683 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
5684 pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR); | |
5685 } | |
5686 } | |
5687 void CXFA_FM2JSContext::equality_operator(FXJSE_HOBJECT hThis, | |
5688 const CFX_ByteStringC& szFuncName, | |
5689 CFXJSE_Arguments& args) { | |
5690 if (args.GetLength() == 2) { | |
5691 if (fm_ref_equal(hThis, args)) { | |
5692 FXJSE_Value_SetInteger(args.GetReturnValue(), 1); | |
5693 } else { | |
5694 FXJSE_HVALUE argFirst = GetSimpleHValue(hThis, args, 0); | |
5695 FXJSE_HVALUE argSecond = GetSimpleHValue(hThis, args, 1); | |
5696 if (FXJSE_Value_IsNull(argFirst) || FXJSE_Value_IsNull(argSecond)) { | |
5697 FXJSE_Value_SetInteger( | |
5698 args.GetReturnValue(), | |
5699 (FXJSE_Value_IsNull(argFirst) && FXJSE_Value_IsNull(argSecond)) | |
5700 ? 1 | |
5701 : 0); | |
5702 } else if (FXJSE_Value_IsUTF8String(argFirst) && | |
5703 FXJSE_Value_IsUTF8String(argSecond)) { | |
5704 CFX_ByteString firstOutput; | |
5705 CFX_ByteString secondOutput; | |
5706 FXJSE_Value_ToUTF8String(argFirst, firstOutput); | |
5707 FXJSE_Value_ToUTF8String(argSecond, secondOutput); | |
5708 FXJSE_Value_SetInteger(args.GetReturnValue(), | |
5709 firstOutput.Equal(secondOutput) ? 1 : 0); | |
5710 } else { | |
5711 FX_DOUBLE first = HValueToDouble(hThis, argFirst); | |
5712 FX_DOUBLE second = HValueToDouble(hThis, argSecond); | |
5713 FXJSE_Value_SetInteger(args.GetReturnValue(), | |
5714 (first == second) ? 1 : 0); | |
5715 } | |
5716 FXJSE_Value_Release(argFirst); | |
5717 FXJSE_Value_Release(argSecond); | |
5718 } | |
5719 } else { | |
5720 CXFA_FM2JSContext* pContext = | |
5721 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
5722 pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR); | |
5723 } | |
5724 } | |
5725 void CXFA_FM2JSContext::notequality_operator(FXJSE_HOBJECT hThis, | |
5726 const CFX_ByteStringC& szFuncName, | |
5727 CFXJSE_Arguments& args) { | |
5728 if (args.GetLength() == 2) { | |
5729 if (fm_ref_equal(hThis, args)) { | |
5730 FXJSE_Value_SetInteger(args.GetReturnValue(), 0); | |
5731 } else { | |
5732 FXJSE_HVALUE argFirst = GetSimpleHValue(hThis, args, 0); | |
5733 FXJSE_HVALUE argSecond = GetSimpleHValue(hThis, args, 1); | |
5734 if (FXJSE_Value_IsNull(argFirst) || FXJSE_Value_IsNull(argSecond)) { | |
5735 FXJSE_Value_SetInteger( | |
5736 args.GetReturnValue(), | |
5737 (FXJSE_Value_IsNull(argFirst) && FXJSE_Value_IsNull(argSecond)) | |
5738 ? 0 | |
5739 : 1); | |
5740 } else if (FXJSE_Value_IsUTF8String(argFirst) && | |
5741 FXJSE_Value_IsUTF8String(argSecond)) { | |
5742 CFX_ByteString firstOutput; | |
5743 CFX_ByteString secondOutput; | |
5744 FXJSE_Value_ToUTF8String(argFirst, firstOutput); | |
5745 FXJSE_Value_ToUTF8String(argSecond, secondOutput); | |
5746 FXJSE_Value_SetInteger(args.GetReturnValue(), | |
5747 firstOutput.Equal(secondOutput) ? 0 : 1); | |
5748 } else { | |
5749 FX_DOUBLE first = HValueToDouble(hThis, argFirst); | |
5750 FX_DOUBLE second = HValueToDouble(hThis, argSecond); | |
5751 FXJSE_Value_SetInteger(args.GetReturnValue(), | |
5752 (first == second) ? 0 : 1); | |
5753 } | |
5754 FXJSE_Value_Release(argFirst); | |
5755 FXJSE_Value_Release(argSecond); | |
5756 } | |
5757 } else { | |
5758 CXFA_FM2JSContext* pContext = | |
5759 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
5760 pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR); | |
5761 } | |
5762 } | |
5763 FX_BOOL CXFA_FM2JSContext::fm_ref_equal(FXJSE_HOBJECT hThis, | |
5764 CFXJSE_Arguments& args) { | |
5765 FX_BOOL bRet = FALSE; | |
5766 CXFA_FM2JSContext* pContext = | |
5767 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
5768 FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime(); | |
5769 FXJSE_HVALUE argFirst = args.GetValue(0); | |
5770 FXJSE_HVALUE argSecond = args.GetValue(0); | |
5771 if (FXJSE_Value_IsArray(argFirst) && FXJSE_Value_IsArray(argSecond)) { | |
5772 FXJSE_HVALUE firstFlagValue = FXJSE_Value_Create(hruntime); | |
5773 FXJSE_HVALUE secondFlagValue = FXJSE_Value_Create(hruntime); | |
5774 FXJSE_Value_GetObjectPropByIdx(argFirst, 0, firstFlagValue); | |
5775 FXJSE_Value_GetObjectPropByIdx(argSecond, 0, secondFlagValue); | |
5776 if ((FXJSE_Value_ToInteger(firstFlagValue) == 3) && | |
5777 (FXJSE_Value_ToInteger(secondFlagValue) == 3)) { | |
5778 FXJSE_HVALUE firstJSObject = FXJSE_Value_Create(hruntime); | |
5779 FXJSE_HVALUE secondJSObject = FXJSE_Value_Create(hruntime); | |
5780 FXJSE_Value_GetObjectPropByIdx(argFirst, 2, firstJSObject); | |
5781 FXJSE_Value_GetObjectPropByIdx(argSecond, 2, secondJSObject); | |
5782 if (!FXJSE_Value_IsNull(firstJSObject) && | |
5783 !FXJSE_Value_IsNull(secondJSObject)) { | |
5784 bRet = (FXJSE_Value_ToObject(firstJSObject, NULL) == | |
5785 FXJSE_Value_ToObject(secondJSObject, NULL)); | |
5786 } | |
5787 FXJSE_Value_Release(firstJSObject); | |
5788 FXJSE_Value_Release(secondJSObject); | |
5789 } | |
5790 FXJSE_Value_Release(firstFlagValue); | |
5791 FXJSE_Value_Release(secondFlagValue); | |
5792 } | |
5793 FXJSE_Value_Release(argFirst); | |
5794 FXJSE_Value_Release(argSecond); | |
5795 return bRet; | |
5796 } | |
5797 void CXFA_FM2JSContext::less_operator(FXJSE_HOBJECT hThis, | |
5798 const CFX_ByteStringC& szFuncName, | |
5799 CFXJSE_Arguments& args) { | |
5800 if (args.GetLength() == 2) { | |
5801 FXJSE_HVALUE argFirst = GetSimpleHValue(hThis, args, 0); | |
5802 FXJSE_HVALUE argSecond = GetSimpleHValue(hThis, args, 1); | |
5803 if (FXJSE_Value_IsNull(argFirst) || FXJSE_Value_IsNull(argSecond)) { | |
5804 FXJSE_Value_SetInteger(args.GetReturnValue(), 0); | |
5805 } else if (FXJSE_Value_IsUTF8String(argFirst) && | |
5806 FXJSE_Value_IsUTF8String(argSecond)) { | |
5807 CFX_ByteString firstOutput; | |
5808 CFX_ByteString secondOutput; | |
5809 FXJSE_Value_ToUTF8String(argFirst, firstOutput); | |
5810 FXJSE_Value_ToUTF8String(argSecond, secondOutput); | |
5811 FXJSE_Value_SetInteger(args.GetReturnValue(), | |
5812 (firstOutput.Compare(secondOutput) == -1) ? 1 : 0); | |
5813 } else { | |
5814 FX_DOUBLE first = HValueToDouble(hThis, argFirst); | |
5815 FX_DOUBLE second = HValueToDouble(hThis, argSecond); | |
5816 FXJSE_Value_SetInteger(args.GetReturnValue(), (first < second) ? 1 : 0); | |
5817 } | |
5818 FXJSE_Value_Release(argFirst); | |
5819 FXJSE_Value_Release(argSecond); | |
5820 } else { | |
5821 CXFA_FM2JSContext* pContext = | |
5822 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
5823 pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR); | |
5824 } | |
5825 } | |
5826 void CXFA_FM2JSContext::lessequal_operator(FXJSE_HOBJECT hThis, | |
5827 const CFX_ByteStringC& szFuncName, | |
5828 CFXJSE_Arguments& args) { | |
5829 if (args.GetLength() == 2) { | |
5830 FXJSE_HVALUE argFirst = GetSimpleHValue(hThis, args, 0); | |
5831 FXJSE_HVALUE argSecond = GetSimpleHValue(hThis, args, 1); | |
5832 if (FXJSE_Value_IsNull(argFirst) || FXJSE_Value_IsNull(argSecond)) { | |
5833 FXJSE_Value_SetInteger( | |
5834 args.GetReturnValue(), | |
5835 (FXJSE_Value_IsNull(argFirst) && FXJSE_Value_IsNull(argSecond)) ? 1 | |
5836 : 0); | |
5837 } else if (FXJSE_Value_IsUTF8String(argFirst) && | |
5838 FXJSE_Value_IsUTF8String(argSecond)) { | |
5839 CFX_ByteString firstOutput; | |
5840 CFX_ByteString secondOutput; | |
5841 FXJSE_Value_ToUTF8String(argFirst, firstOutput); | |
5842 FXJSE_Value_ToUTF8String(argSecond, secondOutput); | |
5843 FXJSE_Value_SetInteger(args.GetReturnValue(), | |
5844 (firstOutput.Compare(secondOutput) != 1) ? 1 : 0); | |
5845 } else { | |
5846 FX_DOUBLE first = HValueToDouble(hThis, argFirst); | |
5847 FX_DOUBLE second = HValueToDouble(hThis, argSecond); | |
5848 FXJSE_Value_SetInteger(args.GetReturnValue(), (first <= second) ? 1 : 0); | |
5849 } | |
5850 FXJSE_Value_Release(argFirst); | |
5851 FXJSE_Value_Release(argSecond); | |
5852 } else { | |
5853 CXFA_FM2JSContext* pContext = | |
5854 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
5855 pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR); | |
5856 } | |
5857 } | |
5858 void CXFA_FM2JSContext::greater_operator(FXJSE_HOBJECT hThis, | |
5859 const CFX_ByteStringC& szFuncName, | |
5860 CFXJSE_Arguments& args) { | |
5861 if (args.GetLength() == 2) { | |
5862 FXJSE_HVALUE argFirst = GetSimpleHValue(hThis, args, 0); | |
5863 FXJSE_HVALUE argSecond = GetSimpleHValue(hThis, args, 1); | |
5864 if (FXJSE_Value_IsNull(argFirst) || FXJSE_Value_IsNull(argSecond)) { | |
5865 FXJSE_Value_SetInteger(args.GetReturnValue(), 0); | |
5866 } else if (FXJSE_Value_IsUTF8String(argFirst) && | |
5867 FXJSE_Value_IsUTF8String(argSecond)) { | |
5868 CFX_ByteString firstOutput; | |
5869 CFX_ByteString secondOutput; | |
5870 FXJSE_Value_ToUTF8String(argFirst, firstOutput); | |
5871 FXJSE_Value_ToUTF8String(argSecond, secondOutput); | |
5872 FXJSE_Value_SetInteger(args.GetReturnValue(), | |
5873 (firstOutput.Compare(secondOutput) == 1) ? 1 : 0); | |
5874 } else { | |
5875 FX_DOUBLE first = HValueToDouble(hThis, argFirst); | |
5876 FX_DOUBLE second = HValueToDouble(hThis, argSecond); | |
5877 FXJSE_Value_SetInteger(args.GetReturnValue(), (first > second) ? 1 : 0); | |
5878 } | |
5879 FXJSE_Value_Release(argFirst); | |
5880 FXJSE_Value_Release(argSecond); | |
5881 } else { | |
5882 CXFA_FM2JSContext* pContext = | |
5883 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
5884 pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR); | |
5885 } | |
5886 } | |
5887 void CXFA_FM2JSContext::greaterequal_operator(FXJSE_HOBJECT hThis, | |
5888 const CFX_ByteStringC& szFuncName, | |
5889 CFXJSE_Arguments& args) { | |
5890 if (args.GetLength() == 2) { | |
5891 FXJSE_HVALUE argFirst = GetSimpleHValue(hThis, args, 0); | |
5892 FXJSE_HVALUE argSecond = GetSimpleHValue(hThis, args, 1); | |
5893 if (FXJSE_Value_IsNull(argFirst) || FXJSE_Value_IsNull(argSecond)) { | |
5894 FXJSE_Value_SetInteger( | |
5895 args.GetReturnValue(), | |
5896 (FXJSE_Value_IsNull(argFirst) && FXJSE_Value_IsNull(argSecond)) ? 1 | |
5897 : 0); | |
5898 } else if (FXJSE_Value_IsUTF8String(argFirst) && | |
5899 FXJSE_Value_IsUTF8String(argSecond)) { | |
5900 CFX_ByteString firstOutput; | |
5901 CFX_ByteString secondOutput; | |
5902 FXJSE_Value_ToUTF8String(argFirst, firstOutput); | |
5903 FXJSE_Value_ToUTF8String(argSecond, secondOutput); | |
5904 FXJSE_Value_SetInteger(args.GetReturnValue(), | |
5905 (firstOutput.Compare(secondOutput) != -1) ? 1 : 0); | |
5906 } else { | |
5907 FX_DOUBLE first = HValueToDouble(hThis, argFirst); | |
5908 FX_DOUBLE second = HValueToDouble(hThis, argSecond); | |
5909 FXJSE_Value_SetInteger(args.GetReturnValue(), (first >= second) ? 1 : 0); | |
5910 } | |
5911 FXJSE_Value_Release(argFirst); | |
5912 FXJSE_Value_Release(argSecond); | |
5913 } else { | |
5914 CXFA_FM2JSContext* pContext = | |
5915 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
5916 pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR); | |
5917 } | |
5918 } | |
5919 void CXFA_FM2JSContext::plus_operator(FXJSE_HOBJECT hThis, | |
5920 const CFX_ByteStringC& szFuncName, | |
5921 CFXJSE_Arguments& args) { | |
5922 if (args.GetLength() == 2) { | |
5923 FXJSE_HVALUE argFirst = args.GetValue(0); | |
5924 FXJSE_HVALUE argSecond = args.GetValue(1); | |
5925 if (HValueIsNull(hThis, argFirst) && HValueIsNull(hThis, argSecond)) { | |
5926 FXJSE_Value_SetNull(args.GetReturnValue()); | |
5927 } else { | |
5928 FX_DOUBLE first = HValueToDouble(hThis, argFirst); | |
5929 FX_DOUBLE second = HValueToDouble(hThis, argSecond); | |
5930 FXJSE_Value_SetDouble(args.GetReturnValue(), first + second); | |
5931 } | |
5932 FXJSE_Value_Release(argFirst); | |
5933 FXJSE_Value_Release(argSecond); | |
5934 } else { | |
5935 CXFA_FM2JSContext* pContext = | |
5936 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
5937 pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR); | |
5938 } | |
5939 } | |
5940 void CXFA_FM2JSContext::minus_operator(FXJSE_HOBJECT hThis, | |
5941 const CFX_ByteStringC& szFuncName, | |
5942 CFXJSE_Arguments& args) { | |
5943 if (args.GetLength() == 2) { | |
5944 FXJSE_HVALUE argFirst = GetSimpleHValue(hThis, args, 0); | |
5945 FXJSE_HVALUE argSecond = GetSimpleHValue(hThis, args, 1); | |
5946 if (FXJSE_Value_IsNull(argFirst) && FXJSE_Value_IsNull(argSecond)) { | |
5947 FXJSE_Value_SetNull(args.GetReturnValue()); | |
5948 } else { | |
5949 FX_DOUBLE first = HValueToDouble(hThis, argFirst); | |
5950 FX_DOUBLE second = HValueToDouble(hThis, argSecond); | |
5951 FXJSE_Value_SetDouble(args.GetReturnValue(), first - second); | |
5952 } | |
5953 FXJSE_Value_Release(argFirst); | |
5954 FXJSE_Value_Release(argSecond); | |
5955 } else { | |
5956 CXFA_FM2JSContext* pContext = | |
5957 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
5958 pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR); | |
5959 } | |
5960 } | |
5961 void CXFA_FM2JSContext::multiple_operator(FXJSE_HOBJECT hThis, | |
5962 const CFX_ByteStringC& szFuncName, | |
5963 CFXJSE_Arguments& args) { | |
5964 if (args.GetLength() == 2) { | |
5965 FXJSE_HVALUE argFirst = GetSimpleHValue(hThis, args, 0); | |
5966 FXJSE_HVALUE argSecond = GetSimpleHValue(hThis, args, 1); | |
5967 if (FXJSE_Value_IsNull(argFirst) && FXJSE_Value_IsNull(argSecond)) { | |
5968 FXJSE_Value_SetNull(args.GetReturnValue()); | |
5969 } else { | |
5970 FX_DOUBLE first = HValueToDouble(hThis, argFirst); | |
5971 FX_DOUBLE second = HValueToDouble(hThis, argSecond); | |
5972 FXJSE_Value_SetDouble(args.GetReturnValue(), first * second); | |
5973 } | |
5974 FXJSE_Value_Release(argFirst); | |
5975 FXJSE_Value_Release(argSecond); | |
5976 } else { | |
5977 CXFA_FM2JSContext* pContext = | |
5978 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
5979 pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR); | |
5980 } | |
5981 } | |
5982 void CXFA_FM2JSContext::divide_operator(FXJSE_HOBJECT hThis, | |
5983 const CFX_ByteStringC& szFuncName, | |
5984 CFXJSE_Arguments& args) { | |
5985 CXFA_FM2JSContext* pContext = | |
5986 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
5987 if (args.GetLength() == 2) { | |
5988 FXJSE_HVALUE argFirst = GetSimpleHValue(hThis, args, 0); | |
5989 FXJSE_HVALUE argSecond = GetSimpleHValue(hThis, args, 1); | |
5990 if (FXJSE_Value_IsNull(argFirst) && FXJSE_Value_IsNull(argSecond)) { | |
5991 FXJSE_Value_SetNull(args.GetReturnValue()); | |
5992 } else { | |
5993 FX_DOUBLE first = HValueToDouble(hThis, argFirst); | |
5994 FX_DOUBLE second = HValueToDouble(hThis, argSecond); | |
5995 if (second == 0.0) { | |
5996 pContext->ThrowScriptErrorMessage(XFA_IDS_DIVIDE_ZERO); | |
5997 } else { | |
5998 FXJSE_Value_SetDouble(args.GetReturnValue(), first / second); | |
5999 } | |
6000 } | |
6001 FXJSE_Value_Release(argFirst); | |
6002 FXJSE_Value_Release(argSecond); | |
6003 } else { | |
6004 pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR); | |
6005 } | |
6006 } | |
6007 void CXFA_FM2JSContext::positive_operator(FXJSE_HOBJECT hThis, | |
6008 const CFX_ByteStringC& szFuncName, | |
6009 CFXJSE_Arguments& args) { | |
6010 int32_t iLength = args.GetLength(); | |
6011 if (iLength == 1) { | |
6012 FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0); | |
6013 if (FXJSE_Value_IsNull(argOne)) { | |
6014 FXJSE_Value_SetNull(args.GetReturnValue()); | |
6015 } else { | |
6016 FXJSE_Value_SetDouble(args.GetReturnValue(), | |
6017 0.0 + HValueToDouble(hThis, argOne)); | |
6018 } | |
6019 FXJSE_Value_Release(argOne); | |
6020 } else { | |
6021 CXFA_FM2JSContext* pContext = | |
6022 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
6023 pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR); | |
6024 } | |
6025 } | |
6026 void CXFA_FM2JSContext::negative_operator(FXJSE_HOBJECT hThis, | |
6027 const CFX_ByteStringC& szFuncName, | |
6028 CFXJSE_Arguments& args) { | |
6029 int32_t iLength = args.GetLength(); | |
6030 if (iLength == 1) { | |
6031 FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0); | |
6032 if (FXJSE_Value_IsNull(argOne)) { | |
6033 FXJSE_Value_SetNull(args.GetReturnValue()); | |
6034 } else { | |
6035 FXJSE_Value_SetDouble(args.GetReturnValue(), | |
6036 0.0 - HValueToDouble(hThis, argOne)); | |
6037 } | |
6038 FXJSE_Value_Release(argOne); | |
6039 } else { | |
6040 CXFA_FM2JSContext* pContext = | |
6041 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
6042 pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR); | |
6043 } | |
6044 } | |
6045 void CXFA_FM2JSContext::logical_not_operator(FXJSE_HOBJECT hThis, | |
6046 const CFX_ByteStringC& szFuncName, | |
6047 CFXJSE_Arguments& args) { | |
6048 int32_t iLength = args.GetLength(); | |
6049 if (iLength == 1) { | |
6050 FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0); | |
6051 if (FXJSE_Value_IsNull(argOne)) { | |
6052 FXJSE_Value_SetNull(args.GetReturnValue()); | |
6053 } else { | |
6054 FX_DOUBLE first = HValueToDouble(hThis, argOne); | |
6055 FXJSE_Value_SetInteger(args.GetReturnValue(), (first == 0.0) ? 1 : 0); | |
6056 } | |
6057 FXJSE_Value_Release(argOne); | |
6058 } else { | |
6059 CXFA_FM2JSContext* pContext = | |
6060 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
6061 pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR); | |
6062 } | |
6063 } | |
6064 void CXFA_FM2JSContext::dot_accessor(FXJSE_HOBJECT hThis, | |
6065 const CFX_ByteStringC& szFuncName, | |
6066 CFXJSE_Arguments& args) { | |
6067 CXFA_FM2JSContext* pContext = | |
6068 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
6069 FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime(); | |
6070 int32_t argc = args.GetLength(); | |
6071 if ((argc == 4) || (argc == 5)) { | |
6072 FX_BOOL bIsStar = TRUE; | |
6073 FXJSE_HVALUE argAccessor = args.GetValue(0); | |
6074 CFX_ByteString bsAccessorName = args.GetUTF8String(1); | |
6075 CFX_ByteString szName = args.GetUTF8String(2); | |
6076 int32_t iIndexFlags = args.GetInt32(3); | |
6077 int32_t iIndexValue = 0; | |
6078 FXJSE_HVALUE argIndex = NULL; | |
6079 if (argc == 5) { | |
6080 bIsStar = FALSE; | |
6081 argIndex = args.GetValue(4); | |
6082 iIndexValue = HValueToInteger(hThis, argIndex); | |
6083 } | |
6084 CFX_ByteString szSomExp; | |
6085 GenerateSomExpression(szName, iIndexFlags, iIndexValue, bIsStar, szSomExp); | |
6086 if (FXJSE_Value_IsArray(argAccessor)) { | |
6087 FXJSE_HVALUE hLengthValue = FXJSE_Value_Create(hruntime); | |
6088 FXJSE_Value_GetObjectProp(argAccessor, "length", hLengthValue); | |
6089 int32_t iLength = FXJSE_Value_ToInteger(hLengthValue); | |
6090 FXJSE_Value_Release(hLengthValue); | |
6091 int32_t iCounter = 0; | |
6092 FXJSE_HVALUE** hResolveValues = FX_Alloc(FXJSE_HVALUE*, iLength - 2); | |
6093 int32_t* iSizes = FX_Alloc(int32_t, iLength - 2); | |
6094 for (int32_t i = 0; i < (iLength - 2); i++) { | |
6095 iSizes[i] = 0; | |
6096 } | |
6097 FXJSE_HVALUE hJSObjValue = FXJSE_Value_Create(hruntime); | |
6098 FX_BOOL bAttribute = FALSE; | |
6099 for (int32_t i = 2; i < iLength; i++) { | |
6100 FXJSE_Value_GetObjectPropByIdx(argAccessor, i, hJSObjValue); | |
6101 XFA_RESOLVENODE_RS resoveNodeRS; | |
6102 int32_t iRet = ResolveObjects(hThis, hJSObjValue, szSomExp, | |
6103 resoveNodeRS, TRUE, szName.IsEmpty()); | |
6104 if (iRet > 0) { | |
6105 ParseResolveResult(hThis, resoveNodeRS, hJSObjValue, | |
6106 hResolveValues[i - 2], iSizes[i - 2], bAttribute); | |
6107 iCounter += iSizes[i - 2]; | |
6108 } | |
6109 } | |
6110 FXJSE_Value_Release(hJSObjValue); | |
6111 if (iCounter > 0) { | |
6112 FXJSE_HVALUE* rgValues = FX_Alloc(FXJSE_HVALUE, iCounter + 2); | |
6113 for (int32_t i = 0; i < (iCounter + 2); i++) { | |
6114 rgValues[i] = FXJSE_Value_Create(hruntime); | |
6115 } | |
6116 FXJSE_Value_SetInteger(rgValues[0], 1); | |
6117 if (bAttribute) { | |
6118 FXJSE_Value_SetUTF8String(rgValues[1], szName); | |
6119 } else { | |
6120 FXJSE_Value_SetNull(rgValues[1]); | |
6121 } | |
6122 int32_t iIndex = 2; | |
6123 for (int32_t i = 0; i < iLength - 2; i++) { | |
6124 for (int32_t j = 0; j < iSizes[i]; j++) { | |
6125 FXJSE_Value_Set(rgValues[iIndex], hResolveValues[i][j]); | |
6126 iIndex++; | |
6127 } | |
6128 } | |
6129 FXJSE_Value_SetArray(args.GetReturnValue(), (iCounter + 2), rgValues); | |
6130 for (int32_t i = 0; i < (iCounter + 2); i++) { | |
6131 FXJSE_Value_Release(rgValues[i]); | |
6132 } | |
6133 FX_Free(rgValues); | |
6134 } else { | |
6135 CFX_WideString wsPropertyName = | |
6136 CFX_WideString::FromUTF8(szName, szName.GetLength()); | |
6137 CFX_WideString wsSomExpression = | |
6138 CFX_WideString::FromUTF8(szSomExp, szSomExp.GetLength()); | |
6139 pContext->ThrowScriptErrorMessage(XFA_IDS_ACCESS_PROPERTY_IN_NOT_OBJECT, | |
6140 (const FX_WCHAR*)wsPropertyName, | |
6141 (const FX_WCHAR*)wsSomExpression); | |
6142 } | |
6143 for (int32_t i = 0; i < iLength - 2; i++) { | |
6144 for (int32_t j = 0; j < iSizes[i]; j++) { | |
6145 FXJSE_Value_Release(hResolveValues[i][j]); | |
6146 } | |
6147 if (iSizes[i] > 0) { | |
6148 FX_Free(hResolveValues[i]); | |
6149 } | |
6150 } | |
6151 FX_Free(hResolveValues); | |
6152 FX_Free(iSizes); | |
6153 } else { | |
6154 XFA_RESOLVENODE_RS resoveNodeRS; | |
6155 int32_t iRet = 0; | |
6156 if (FXJSE_Value_IsObject(argAccessor) || | |
6157 (FXJSE_Value_IsNull(argAccessor) && bsAccessorName.IsEmpty())) { | |
6158 iRet = ResolveObjects(hThis, argAccessor, szSomExp, resoveNodeRS, TRUE, | |
6159 szName.IsEmpty()); | |
6160 } else if (!FXJSE_Value_IsObject(argAccessor) && | |
6161 !bsAccessorName.IsEmpty()) { | |
6162 FX_BOOL bGetObject = | |
6163 GetObjectByName(hThis, argAccessor, bsAccessorName); | |
6164 if (bGetObject) { | |
6165 iRet = ResolveObjects(hThis, argAccessor, szSomExp, resoveNodeRS, | |
6166 TRUE, szName.IsEmpty()); | |
6167 } | |
6168 } | |
6169 if (iRet > 0) { | |
6170 FXJSE_HVALUE* hResolveValues; | |
6171 int32_t iSize = 0; | |
6172 FX_BOOL bAttribute = FALSE; | |
6173 ParseResolveResult(hThis, resoveNodeRS, argAccessor, hResolveValues, | |
6174 iSize, bAttribute); | |
6175 FXJSE_HVALUE* rgValues = FX_Alloc(FXJSE_HVALUE, iSize + 2); | |
6176 for (int32_t i = 0; i < (iSize + 2); i++) { | |
6177 rgValues[i] = FXJSE_Value_Create(hruntime); | |
6178 } | |
6179 FXJSE_Value_SetInteger(rgValues[0], 1); | |
6180 if (bAttribute) { | |
6181 FXJSE_Value_SetUTF8String(rgValues[1], szName); | |
6182 } else { | |
6183 FXJSE_Value_SetNull(rgValues[1]); | |
6184 } | |
6185 for (int32_t i = 0; i < iSize; i++) { | |
6186 FXJSE_Value_Set(rgValues[i + 2], hResolveValues[i]); | |
6187 } | |
6188 FXJSE_Value_SetArray(args.GetReturnValue(), (iSize + 2), rgValues); | |
6189 for (int32_t i = 0; i < (iSize + 2); i++) { | |
6190 FXJSE_Value_Release(rgValues[i]); | |
6191 } | |
6192 FX_Free(rgValues); | |
6193 for (int32_t i = 0; i < iSize; i++) { | |
6194 FXJSE_Value_Release(hResolveValues[i]); | |
6195 } | |
6196 FX_Free(hResolveValues); | |
6197 } else { | |
6198 CFX_WideString wsPropertyName = | |
6199 CFX_WideString::FromUTF8(szName, szName.GetLength()); | |
6200 CFX_WideString wsSomExpression = | |
6201 CFX_WideString::FromUTF8(szSomExp, szSomExp.GetLength()); | |
6202 pContext->ThrowScriptErrorMessage(XFA_IDS_ACCESS_PROPERTY_IN_NOT_OBJECT, | |
6203 (const FX_WCHAR*)wsPropertyName, | |
6204 (const FX_WCHAR*)wsSomExpression); | |
6205 } | |
6206 } | |
6207 if (argc == 5) { | |
6208 FXJSE_Value_Release(argIndex); | |
6209 } | |
6210 FXJSE_Value_Release(argAccessor); | |
6211 } else { | |
6212 pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR); | |
6213 } | |
6214 } | |
6215 void CXFA_FM2JSContext::dotdot_accessor(FXJSE_HOBJECT hThis, | |
6216 const CFX_ByteStringC& szFuncName, | |
6217 CFXJSE_Arguments& args) { | |
6218 CXFA_FM2JSContext* pContext = | |
6219 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
6220 FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime(); | |
6221 int32_t argc = args.GetLength(); | |
6222 if ((argc == 4) || (argc == 5)) { | |
6223 FX_BOOL bIsStar = TRUE; | |
6224 FXJSE_HVALUE argAccessor = args.GetValue(0); | |
6225 CFX_ByteString bsAccessorName = args.GetUTF8String(1); | |
6226 CFX_ByteString szName = args.GetUTF8String(2); | |
6227 int32_t iIndexFlags = args.GetInt32(3); | |
6228 int32_t iIndexValue = 0; | |
6229 FXJSE_HVALUE argIndex = NULL; | |
6230 if (argc == 5) { | |
6231 bIsStar = FALSE; | |
6232 argIndex = args.GetValue(4); | |
6233 iIndexValue = HValueToInteger(hThis, argIndex); | |
6234 } | |
6235 CFX_ByteString szSomExp; | |
6236 GenerateSomExpression(szName, iIndexFlags, iIndexValue, bIsStar, szSomExp); | |
6237 if (FXJSE_Value_IsArray(argAccessor)) { | |
6238 FXJSE_HVALUE hLengthValue = FXJSE_Value_Create(hruntime); | |
6239 FXJSE_Value_GetObjectProp(argAccessor, "length", hLengthValue); | |
6240 int32_t iLength = FXJSE_Value_ToInteger(hLengthValue); | |
6241 int32_t iCounter = 0; | |
6242 FXJSE_HVALUE** hResolveValues = FX_Alloc(FXJSE_HVALUE*, iLength - 2); | |
6243 int32_t* iSizes = FX_Alloc(int32_t, iLength - 2); | |
6244 FXJSE_HVALUE hJSObjValue = FXJSE_Value_Create(hruntime); | |
6245 FX_BOOL bAttribute = FALSE; | |
6246 for (int32_t i = 2; i < iLength; i++) { | |
6247 FXJSE_Value_GetObjectPropByIdx(argAccessor, i, hJSObjValue); | |
6248 XFA_RESOLVENODE_RS resoveNodeRS; | |
6249 int32_t iRet = | |
6250 ResolveObjects(hThis, hJSObjValue, szSomExp, resoveNodeRS, FALSE); | |
6251 if (iRet > 0) { | |
6252 ParseResolveResult(hThis, resoveNodeRS, hJSObjValue, | |
6253 hResolveValues[i - 2], iSizes[i - 2], bAttribute); | |
6254 iCounter += iSizes[i - 2]; | |
6255 } | |
6256 } | |
6257 FXJSE_Value_Release(hJSObjValue); | |
6258 if (iCounter > 0) { | |
6259 FXJSE_HVALUE* rgValues = FX_Alloc(FXJSE_HVALUE, iCounter + 2); | |
6260 for (int32_t i = 0; i < (iCounter + 2); i++) { | |
6261 rgValues[i] = FXJSE_Value_Create(hruntime); | |
6262 } | |
6263 FXJSE_Value_SetInteger(rgValues[0], 1); | |
6264 if (bAttribute) { | |
6265 FXJSE_Value_SetUTF8String(rgValues[1], szName); | |
6266 } else { | |
6267 FXJSE_Value_SetNull(rgValues[1]); | |
6268 } | |
6269 int32_t iIndex = 2; | |
6270 for (int32_t i = 0; i < iLength - 2; i++) { | |
6271 for (int32_t j = 0; j < iSizes[i]; j++) { | |
6272 FXJSE_Value_Set(rgValues[iIndex], hResolveValues[i][j]); | |
6273 iIndex++; | |
6274 } | |
6275 } | |
6276 FXJSE_Value_SetArray(args.GetReturnValue(), (iCounter + 2), rgValues); | |
6277 for (int32_t i = 0; i < (iCounter + 2); i++) { | |
6278 FXJSE_Value_Release(rgValues[i]); | |
6279 } | |
6280 FX_Free(rgValues); | |
6281 } else { | |
6282 CFX_WideString wsPropertyName = | |
6283 CFX_WideString::FromUTF8(szName, szName.GetLength()); | |
6284 CFX_WideString wsSomExpression = | |
6285 CFX_WideString::FromUTF8(szSomExp, szSomExp.GetLength()); | |
6286 pContext->ThrowScriptErrorMessage(XFA_IDS_ACCESS_PROPERTY_IN_NOT_OBJECT, | |
6287 (const FX_WCHAR*)wsPropertyName, | |
6288 (const FX_WCHAR*)wsSomExpression); | |
6289 } | |
6290 for (int32_t i = 0; i < iLength - 2; i++) { | |
6291 for (int32_t j = 0; j < iSizes[i]; j++) { | |
6292 FXJSE_Value_Release(hResolveValues[i][j]); | |
6293 } | |
6294 FX_Free(hResolveValues[i]); | |
6295 } | |
6296 FX_Free(hResolveValues); | |
6297 FX_Free(iSizes); | |
6298 FXJSE_Value_Release(hLengthValue); | |
6299 } else { | |
6300 XFA_RESOLVENODE_RS resoveNodeRS; | |
6301 int32_t iRet = 0; | |
6302 if (FXJSE_Value_IsObject(argAccessor) || | |
6303 (FXJSE_Value_IsNull(argAccessor) && bsAccessorName.IsEmpty())) { | |
6304 iRet = | |
6305 ResolveObjects(hThis, argAccessor, szSomExp, resoveNodeRS, FALSE); | |
6306 } else if (!FXJSE_Value_IsObject(argAccessor) && | |
6307 !bsAccessorName.IsEmpty()) { | |
6308 FX_BOOL bGetObject = | |
6309 GetObjectByName(hThis, argAccessor, bsAccessorName); | |
6310 if (bGetObject) { | |
6311 iRet = | |
6312 ResolveObjects(hThis, argAccessor, szSomExp, resoveNodeRS, FALSE); | |
6313 } | |
6314 } | |
6315 if (iRet > 0) { | |
6316 FXJSE_HVALUE* hResolveValues; | |
6317 int32_t iSize = 0; | |
6318 FX_BOOL bAttribute = FALSE; | |
6319 ParseResolveResult(hThis, resoveNodeRS, argAccessor, hResolveValues, | |
6320 iSize, bAttribute); | |
6321 FXJSE_HVALUE* rgValues = FX_Alloc(FXJSE_HVALUE, iSize + 2); | |
6322 for (int32_t i = 0; i < (iSize + 2); i++) { | |
6323 rgValues[i] = FXJSE_Value_Create(hruntime); | |
6324 } | |
6325 FXJSE_Value_SetInteger(rgValues[0], 1); | |
6326 if (bAttribute) { | |
6327 FXJSE_Value_SetUTF8String(rgValues[1], szName); | |
6328 } else { | |
6329 FXJSE_Value_SetNull(rgValues[1]); | |
6330 } | |
6331 for (int32_t i = 0; i < iSize; i++) { | |
6332 FXJSE_Value_Set(rgValues[i + 2], hResolveValues[i]); | |
6333 } | |
6334 FXJSE_Value_SetArray(args.GetReturnValue(), (iSize + 2), rgValues); | |
6335 for (int32_t i = 0; i < (iSize + 2); i++) { | |
6336 FXJSE_Value_Release(rgValues[i]); | |
6337 } | |
6338 FX_Free(rgValues); | |
6339 for (int32_t i = 0; i < iSize; i++) { | |
6340 FXJSE_Value_Release(hResolveValues[i]); | |
6341 } | |
6342 FX_Free(hResolveValues); | |
6343 } else { | |
6344 CFX_WideString wsPropertyName = | |
6345 CFX_WideString::FromUTF8(szName, szName.GetLength()); | |
6346 CFX_WideString wsSomExpression = | |
6347 CFX_WideString::FromUTF8(szSomExp, szSomExp.GetLength()); | |
6348 pContext->ThrowScriptErrorMessage(XFA_IDS_ACCESS_PROPERTY_IN_NOT_OBJECT, | |
6349 (const FX_WCHAR*)wsPropertyName, | |
6350 (const FX_WCHAR*)wsSomExpression); | |
6351 } | |
6352 } | |
6353 if (argc == 5) { | |
6354 FXJSE_Value_Release(argIndex); | |
6355 } | |
6356 FXJSE_Value_Release(argAccessor); | |
6357 } else { | |
6358 pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR); | |
6359 } | |
6360 } | |
6361 void CXFA_FM2JSContext::eval_translation(FXJSE_HOBJECT hThis, | |
6362 const CFX_ByteStringC& szFuncName, | |
6363 CFXJSE_Arguments& args) { | |
6364 CXFA_FM2JSContext* pContext = | |
6365 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
6366 int32_t argc = args.GetLength(); | |
6367 if (argc == 1) { | |
6368 FXJSE_HVALUE argOne = GetSimpleHValue(hThis, args, 0); | |
6369 CFX_ByteString argString; | |
6370 HValueToUTF8String(argOne, argString); | |
6371 if (argString.IsEmpty()) { | |
6372 pContext->ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH); | |
6373 } else { | |
6374 CFX_WideString scriptString = | |
6375 CFX_WideString::FromUTF8(argString, argString.GetLength()); | |
6376 CFX_WideTextBuf wsJavaScriptBuf; | |
6377 CFX_WideString wsError; | |
6378 XFA_FM2JS_Translate(scriptString, wsJavaScriptBuf, wsError); | |
6379 if (wsError.IsEmpty()) { | |
6380 CFX_WideString javaScript = wsJavaScriptBuf.GetWideString(); | |
6381 FXJSE_Value_SetUTF8String( | |
6382 args.GetReturnValue(), | |
6383 FX_UTF8Encode(javaScript, javaScript.GetLength())); | |
6384 } else { | |
6385 pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR); | |
6386 } | |
6387 } | |
6388 FXJSE_Value_Release(argOne); | |
6389 } else { | |
6390 pContext->ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, | |
6391 L"Eval"); | |
6392 } | |
6393 } | |
6394 void CXFA_FM2JSContext::is_fm_object(FXJSE_HOBJECT hThis, | |
6395 const CFX_ByteStringC& szFuncName, | |
6396 CFXJSE_Arguments& args) { | |
6397 int32_t iLength = args.GetLength(); | |
6398 if (iLength == 1) { | |
6399 FXJSE_HVALUE argOne = args.GetValue(0); | |
6400 FXJSE_Value_SetBoolean(args.GetReturnValue(), FXJSE_Value_IsObject(argOne)); | |
6401 FXJSE_Value_Release(argOne); | |
6402 } else { | |
6403 FXJSE_Value_SetBoolean(args.GetReturnValue(), FALSE); | |
6404 } | |
6405 } | |
6406 void CXFA_FM2JSContext::is_fm_array(FXJSE_HOBJECT hThis, | |
6407 const CFX_ByteStringC& szFuncName, | |
6408 CFXJSE_Arguments& args) { | |
6409 int32_t iLength = args.GetLength(); | |
6410 if (iLength == 1) { | |
6411 FXJSE_HVALUE argOne = args.GetValue(0); | |
6412 FX_BOOL bIsArray = FXJSE_Value_IsArray(argOne); | |
6413 FXJSE_Value_SetBoolean(args.GetReturnValue(), bIsArray); | |
6414 FXJSE_Value_Release(argOne); | |
6415 } else { | |
6416 FXJSE_Value_SetBoolean(args.GetReturnValue(), FALSE); | |
6417 } | |
6418 } | |
6419 void CXFA_FM2JSContext::get_fm_value(FXJSE_HOBJECT hThis, | |
6420 const CFX_ByteStringC& szFuncName, | |
6421 CFXJSE_Arguments& args) { | |
6422 CXFA_FM2JSContext* pContext = | |
6423 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
6424 FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime(); | |
6425 int32_t iLength = args.GetLength(); | |
6426 if (iLength == 1) { | |
6427 FXJSE_HVALUE argOne = args.GetValue(0); | |
6428 if (FXJSE_Value_IsArray(argOne)) { | |
6429 FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime); | |
6430 FXJSE_HVALUE jsobjectValue = FXJSE_Value_Create(hruntime); | |
6431 FXJSE_Value_GetObjectPropByIdx(argOne, 1, propertyValue); | |
6432 FXJSE_Value_GetObjectPropByIdx(argOne, 2, jsobjectValue); | |
6433 if (FXJSE_Value_IsNull(propertyValue)) { | |
6434 GetObjectDefaultValue(jsobjectValue, args.GetReturnValue()); | |
6435 } else { | |
6436 CFX_ByteString propertyStr; | |
6437 FXJSE_Value_ToUTF8String(propertyValue, propertyStr); | |
6438 FXJSE_Value_GetObjectProp(jsobjectValue, propertyStr, | |
6439 args.GetReturnValue()); | |
6440 } | |
6441 FXJSE_Value_Release(propertyValue); | |
6442 FXJSE_Value_Release(jsobjectValue); | |
6443 } else if (FXJSE_Value_IsObject(argOne)) { | |
6444 GetObjectDefaultValue(argOne, args.GetReturnValue()); | |
6445 } else { | |
6446 FXJSE_Value_Set(args.GetReturnValue(), argOne); | |
6447 } | |
6448 FXJSE_Value_Release(argOne); | |
6449 } else { | |
6450 pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR); | |
6451 } | |
6452 } | |
6453 void CXFA_FM2JSContext::get_fm_jsobj(FXJSE_HOBJECT hThis, | |
6454 const CFX_ByteStringC& szFuncName, | |
6455 CFXJSE_Arguments& args) { | |
6456 CXFA_FM2JSContext* pContext = | |
6457 static_cast<CXFA_FM2JSContext*>(FXJSE_Value_ToObject(hThis, nullptr)); | |
6458 int32_t argc = args.GetLength(); | |
6459 if (argc == 1) { | |
6460 FXJSE_HVALUE argOne = args.GetValue(0); | |
6461 if (FXJSE_Value_IsArray(argOne)) { | |
6462 #ifndef NDEBUG | |
6463 FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime(); | |
6464 FXJSE_HVALUE lengthValue = FXJSE_Value_Create(hruntime); | |
6465 FXJSE_Value_GetObjectProp(argOne, "length", lengthValue); | |
6466 FXSYS_assert(FXJSE_Value_ToInteger(lengthValue) >= 3); | |
6467 FXJSE_Value_Release(lengthValue); | |
6468 #endif | |
6469 FXJSE_Value_GetObjectPropByIdx(argOne, 2, args.GetReturnValue()); | |
6470 } else { | |
6471 FXJSE_Value_Set(args.GetReturnValue(), argOne); | |
6472 } | |
6473 FXJSE_Value_Release(argOne); | |
6474 } else { | |
6475 pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR); | |
6476 } | |
6477 } | |
6478 void CXFA_FM2JSContext::fm_var_filter(FXJSE_HOBJECT hThis, | |
6479 const CFX_ByteStringC& szFuncName, | |
6480 CFXJSE_Arguments& args) { | |
6481 CXFA_FM2JSContext* pContext = | |
6482 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
6483 FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime(); | |
6484 int32_t argc = args.GetLength(); | |
6485 if (argc == 1) { | |
6486 FXJSE_HVALUE argOne = args.GetValue(0); | |
6487 if (FXJSE_Value_IsArray(argOne)) { | |
6488 #ifndef NDEBUG | |
6489 FXJSE_HVALUE lengthValue = FXJSE_Value_Create(hruntime); | |
6490 FXJSE_Value_GetObjectProp(argOne, "length", lengthValue); | |
6491 FXSYS_assert(FXJSE_Value_ToInteger(lengthValue) >= 3); | |
6492 FXJSE_Value_Release(lengthValue); | |
6493 #endif | |
6494 FXJSE_HVALUE flagsValue = FXJSE_Value_Create(hruntime); | |
6495 FXJSE_Value_GetObjectPropByIdx(argOne, 0, flagsValue); | |
6496 int32_t iFlags = FXJSE_Value_ToInteger(flagsValue); | |
6497 FXJSE_Value_Release(flagsValue); | |
6498 if (iFlags == 4) { | |
6499 FXJSE_HVALUE rgValues[3]; | |
6500 for (int32_t i = 0; i < 3; i++) { | |
6501 rgValues[i] = FXJSE_Value_Create(hruntime); | |
6502 } | |
6503 FXJSE_Value_SetInteger(rgValues[0], 3); | |
6504 FXJSE_Value_SetNull(rgValues[1]); | |
6505 FXJSE_Value_SetNull(rgValues[2]); | |
6506 FXJSE_Value_SetArray(args.GetReturnValue(), 3, rgValues); | |
6507 for (int32_t i = 0; i < 3; i++) { | |
6508 FXJSE_Value_Release(rgValues[i]); | |
6509 } | |
6510 } else if (iFlags == 3) { | |
6511 FXJSE_HVALUE objectValue = FXJSE_Value_Create(hruntime); | |
6512 FXJSE_Value_GetObjectPropByIdx(argOne, 2, objectValue); | |
6513 if (!FXJSE_Value_IsNull(objectValue)) { | |
6514 FXJSE_Value_Set(args.GetReturnValue(), argOne); | |
6515 } else { | |
6516 pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR); | |
6517 } | |
6518 FXJSE_Value_Release(objectValue); | |
6519 } else { | |
6520 FXJSE_HVALUE simpleValue = GetSimpleHValue(hThis, args, 0); | |
6521 FXJSE_Value_Set(args.GetReturnValue(), simpleValue); | |
6522 FXJSE_Value_Release(simpleValue); | |
6523 } | |
6524 } else { | |
6525 FXJSE_HVALUE simpleValue = GetSimpleHValue(hThis, args, 0); | |
6526 FXJSE_Value_Set(args.GetReturnValue(), simpleValue); | |
6527 FXJSE_Value_Release(simpleValue); | |
6528 } | |
6529 FXJSE_Value_Release(argOne); | |
6530 } else { | |
6531 pContext->ThrowScriptErrorMessage(XFA_IDS_COMPILER_ERROR); | |
6532 } | |
6533 } | |
6534 void CXFA_FM2JSContext::concat_fm_object(FXJSE_HOBJECT hThis, | |
6535 const CFX_ByteStringC& szFuncName, | |
6536 CFXJSE_Arguments& args) { | |
6537 CXFA_FM2JSContext* pContext = | |
6538 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
6539 FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime(); | |
6540 uint32_t iLength = 0; | |
6541 int32_t argCount = args.GetLength(); | |
6542 FXJSE_HVALUE* argValues = FX_Alloc(FXJSE_HVALUE, argCount); | |
6543 for (int32_t i = 0; i < argCount; i++) { | |
6544 argValues[i] = args.GetValue(i); | |
6545 if (FXJSE_Value_IsArray(argValues[i])) { | |
6546 FXJSE_HVALUE lengthValue = FXJSE_Value_Create(hruntime); | |
6547 FXJSE_Value_GetObjectProp(argValues[i], "length", lengthValue); | |
6548 int32_t length = FXJSE_Value_ToInteger(lengthValue); | |
6549 iLength = iLength + ((length > 2) ? (length - 2) : 0); | |
6550 FXJSE_Value_Release(lengthValue); | |
6551 } | |
6552 iLength += 1; | |
6553 } | |
6554 FXJSE_HVALUE* returnValues = FX_Alloc(FXJSE_HVALUE, iLength); | |
6555 for (int32_t i = 0; i < (int32_t)iLength; i++) { | |
6556 returnValues[i] = FXJSE_Value_Create(hruntime); | |
6557 } | |
6558 int32_t index = 0; | |
6559 for (int32_t i = 0; i < argCount; i++) { | |
6560 if (FXJSE_Value_IsArray(argValues[i])) { | |
6561 FXJSE_HVALUE lengthValue = FXJSE_Value_Create(hruntime); | |
6562 FXJSE_Value_GetObjectProp(argValues[i], "length", lengthValue); | |
6563 int32_t length = FXJSE_Value_ToInteger(lengthValue); | |
6564 for (int32_t j = 2; j < length; j++) { | |
6565 FXJSE_Value_GetObjectPropByIdx(argValues[i], j, returnValues[index]); | |
6566 index++; | |
6567 } | |
6568 FXJSE_Value_Release(lengthValue); | |
6569 } | |
6570 FXJSE_Value_Set(returnValues[index], argValues[i]); | |
6571 index++; | |
6572 } | |
6573 FXJSE_Value_SetArray(args.GetReturnValue(), iLength, returnValues); | |
6574 for (int32_t i = 0; i < argCount; i++) { | |
6575 FXJSE_Value_Release(argValues[i]); | |
6576 } | |
6577 FX_Free(argValues); | |
6578 for (int32_t i = 0; i < (int32_t)iLength; i++) { | |
6579 FXJSE_Value_Release(returnValues[i]); | |
6580 } | |
6581 FX_Free(returnValues); | |
6582 } | |
6583 FXJSE_HVALUE CXFA_FM2JSContext::GetSimpleHValue(FXJSE_HOBJECT hThis, | |
6584 CFXJSE_Arguments& args, | |
6585 uint32_t index) { | |
6586 CXFA_FM2JSContext* pContext = | |
6587 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
6588 FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime(); | |
6589 FXSYS_assert(index < (uint32_t)args.GetLength()); | |
6590 FXJSE_HVALUE argIndex = args.GetValue(index); | |
6591 if (FXJSE_Value_IsArray(argIndex)) { | |
6592 FXJSE_HVALUE lengthValue = FXJSE_Value_Create(hruntime); | |
6593 FXJSE_Value_GetObjectProp(argIndex, "length", lengthValue); | |
6594 int32_t iLength = FXJSE_Value_ToInteger(lengthValue); | |
6595 FXJSE_Value_Release(lengthValue); | |
6596 FXJSE_HVALUE simpleValue = FXJSE_Value_Create(hruntime); | |
6597 if (iLength > 2) { | |
6598 FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime); | |
6599 FXJSE_HVALUE jsobjectValue = FXJSE_Value_Create(hruntime); | |
6600 FXJSE_Value_GetObjectPropByIdx(argIndex, 1, propertyValue); | |
6601 FXJSE_Value_GetObjectPropByIdx(argIndex, 2, jsobjectValue); | |
6602 if (FXJSE_Value_IsNull(propertyValue)) { | |
6603 GetObjectDefaultValue(jsobjectValue, simpleValue); | |
6604 } else { | |
6605 CFX_ByteString propertyStr; | |
6606 FXJSE_Value_ToUTF8String(propertyValue, propertyStr); | |
6607 FXJSE_Value_GetObjectProp(jsobjectValue, propertyStr, simpleValue); | |
6608 } | |
6609 FXJSE_Value_Release(propertyValue); | |
6610 FXJSE_Value_Release(jsobjectValue); | |
6611 } else { | |
6612 FXJSE_Value_SetUndefined(simpleValue); | |
6613 } | |
6614 FXJSE_Value_Release(argIndex); | |
6615 return simpleValue; | |
6616 } else if (FXJSE_Value_IsObject(argIndex)) { | |
6617 FXJSE_HVALUE defaultValue = FXJSE_Value_Create(hruntime); | |
6618 GetObjectDefaultValue(argIndex, defaultValue); | |
6619 FXJSE_Value_Release(argIndex); | |
6620 return defaultValue; | |
6621 } else { | |
6622 return argIndex; | |
6623 } | |
6624 } | |
6625 FX_BOOL CXFA_FM2JSContext::HValueIsNull(FXJSE_HOBJECT hThis, FXJSE_HVALUE arg) { | |
6626 CXFA_FM2JSContext* pContext = | |
6627 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
6628 FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime(); | |
6629 FX_BOOL isNull = FALSE; | |
6630 if (FXJSE_Value_IsNull(arg)) { | |
6631 isNull = TRUE; | |
6632 } else if (FXJSE_Value_IsArray(arg)) { | |
6633 int32_t iLength = hvalue_get_array_length(hThis, arg); | |
6634 if (iLength > 2) { | |
6635 FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime); | |
6636 FXJSE_HVALUE jsObjectValue = FXJSE_Value_Create(hruntime); | |
6637 FXJSE_Value_GetObjectPropByIdx(arg, 1, propertyValue); | |
6638 FXJSE_Value_GetObjectPropByIdx(arg, 2, jsObjectValue); | |
6639 if (FXJSE_Value_IsNull(propertyValue)) { | |
6640 FXJSE_HVALUE defaultValue = FXJSE_Value_Create(hruntime); | |
6641 GetObjectDefaultValue(jsObjectValue, defaultValue); | |
6642 if (FXJSE_Value_IsNull(defaultValue)) { | |
6643 isNull = TRUE; | |
6644 } | |
6645 FXJSE_Value_Release(defaultValue); | |
6646 } else { | |
6647 CFX_ByteString propertyStr; | |
6648 FXJSE_Value_ToUTF8String(propertyValue, propertyStr); | |
6649 FXJSE_HVALUE newPropertyValue = FXJSE_Value_Create(hruntime); | |
6650 FXJSE_Value_GetObjectProp(jsObjectValue, propertyStr, newPropertyValue); | |
6651 if (FXJSE_Value_IsNull(newPropertyValue)) { | |
6652 isNull = TRUE; | |
6653 } | |
6654 FXJSE_Value_Release(newPropertyValue); | |
6655 } | |
6656 FXJSE_Value_Release(propertyValue); | |
6657 FXJSE_Value_Release(jsObjectValue); | |
6658 } else { | |
6659 isNull = TRUE; | |
6660 } | |
6661 } else if (FXJSE_Value_IsObject(arg)) { | |
6662 FXJSE_HVALUE defaultValue = FXJSE_Value_Create(hruntime); | |
6663 GetObjectDefaultValue(arg, defaultValue); | |
6664 if (FXJSE_Value_IsNull(defaultValue)) { | |
6665 isNull = TRUE; | |
6666 } | |
6667 FXJSE_Value_Release(defaultValue); | |
6668 } | |
6669 return isNull; | |
6670 } | |
6671 int32_t CXFA_FM2JSContext::hvalue_get_array_length(FXJSE_HOBJECT hThis, | |
6672 FXJSE_HVALUE arg) { | |
6673 CXFA_FM2JSContext* pContext = | |
6674 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
6675 FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime(); | |
6676 int32_t iLength = 0; | |
6677 if (FXJSE_Value_IsArray(arg)) { | |
6678 FXJSE_HVALUE lengthValue = FXJSE_Value_Create(hruntime); | |
6679 FXJSE_Value_GetObjectProp(arg, "length", lengthValue); | |
6680 iLength = FXJSE_Value_ToInteger(lengthValue); | |
6681 FXJSE_Value_Release(lengthValue); | |
6682 } | |
6683 return iLength; | |
6684 } | |
6685 FX_BOOL CXFA_FM2JSContext::simpleValueCompare(FXJSE_HOBJECT hThis, | |
6686 FXJSE_HVALUE firstValue, | |
6687 FXJSE_HVALUE secondValue) { | |
6688 FX_BOOL bReturn = FALSE; | |
6689 if (FXJSE_Value_IsUTF8String(firstValue)) { | |
6690 CFX_ByteString firstString, secondString; | |
6691 HValueToUTF8String(firstValue, firstString); | |
6692 HValueToUTF8String(secondValue, secondString); | |
6693 bReturn = firstString.Equal(secondString); | |
6694 } else if (FXJSE_Value_IsNumber(firstValue)) { | |
6695 FX_FLOAT first = HValueToFloat(hThis, firstValue); | |
6696 FX_FLOAT second = HValueToFloat(hThis, secondValue); | |
6697 bReturn = (first == second); | |
6698 } else if (FXJSE_Value_IsBoolean(firstValue)) { | |
6699 bReturn = (FXJSE_Value_ToBoolean(firstValue) == | |
6700 FXJSE_Value_ToBoolean(secondValue)); | |
6701 } else if (FXJSE_Value_IsNull(firstValue) && | |
6702 FXJSE_Value_IsNull(secondValue)) { | |
6703 bReturn = TRUE; | |
6704 } | |
6705 return bReturn; | |
6706 } | |
6707 void CXFA_FM2JSContext::unfoldArgs(FXJSE_HOBJECT hThis, | |
6708 CFXJSE_Arguments& args, | |
6709 FXJSE_HVALUE*& resultValues, | |
6710 int32_t& iCount, | |
6711 int32_t iStart) { | |
6712 CXFA_FM2JSContext* pContext = | |
6713 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
6714 FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime(); | |
6715 iCount = 0; | |
6716 int32_t argc = args.GetLength(); | |
6717 FXJSE_HVALUE* argsValue = FX_Alloc(FXJSE_HVALUE, argc); | |
6718 for (int32_t i = iStart; i < argc; i++) { | |
6719 argsValue[i] = args.GetValue(i); | |
6720 if (FXJSE_Value_IsArray(argsValue[i])) { | |
6721 FXJSE_HVALUE lengthValue = FXJSE_Value_Create(hruntime); | |
6722 FXJSE_Value_GetObjectProp(argsValue[i], "length", lengthValue); | |
6723 int32_t iLength = FXJSE_Value_ToInteger(lengthValue); | |
6724 FXJSE_Value_Release(lengthValue); | |
6725 iCount += ((iLength > 2) ? (iLength - 2) : 0); | |
6726 } else { | |
6727 iCount += 1; | |
6728 } | |
6729 } | |
6730 resultValues = FX_Alloc(FXJSE_HVALUE, iCount); | |
6731 for (int32_t i = 0; i < iCount; i++) { | |
6732 resultValues[i] = FXJSE_Value_Create(hruntime); | |
6733 } | |
6734 int32_t index = 0; | |
6735 for (int32_t i = iStart; i < argc; i++) { | |
6736 if (FXJSE_Value_IsArray(argsValue[i])) { | |
6737 FXJSE_HVALUE lengthValue = FXJSE_Value_Create(hruntime); | |
6738 FXJSE_Value_GetObjectProp(argsValue[i], "length", lengthValue); | |
6739 int32_t iLength = FXJSE_Value_ToInteger(lengthValue); | |
6740 FXJSE_Value_Release(lengthValue); | |
6741 if (iLength > 2) { | |
6742 FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime); | |
6743 FXJSE_HVALUE jsObjectValue = FXJSE_Value_Create(hruntime); | |
6744 FXJSE_Value_GetObjectPropByIdx(argsValue[i], 1, propertyValue); | |
6745 if (FXJSE_Value_IsNull(propertyValue)) { | |
6746 for (int32_t j = 2; j < iLength; j++) { | |
6747 FXJSE_Value_GetObjectPropByIdx(argsValue[i], j, jsObjectValue); | |
6748 GetObjectDefaultValue(jsObjectValue, resultValues[index]); | |
6749 index++; | |
6750 } | |
6751 } else { | |
6752 CFX_ByteString propertyString; | |
6753 FXJSE_Value_ToUTF8String(propertyValue, propertyString); | |
6754 for (int32_t j = 2; j < iLength; j++) { | |
6755 FXJSE_Value_GetObjectPropByIdx(argsValue[i], j, jsObjectValue); | |
6756 FXJSE_Value_GetObjectProp(jsObjectValue, propertyString, | |
6757 resultValues[index]); | |
6758 index++; | |
6759 } | |
6760 } | |
6761 FXJSE_Value_Release(propertyValue); | |
6762 FXJSE_Value_Release(jsObjectValue); | |
6763 } | |
6764 } else if (FXJSE_Value_IsObject(argsValue[i])) { | |
6765 GetObjectDefaultValue(argsValue[i], resultValues[index]); | |
6766 index++; | |
6767 } else { | |
6768 FXJSE_Value_Set(resultValues[index], argsValue[i]); | |
6769 index++; | |
6770 } | |
6771 } | |
6772 for (int32_t i = iStart; i < argc; i++) { | |
6773 FXJSE_Value_Release(argsValue[i]); | |
6774 } | |
6775 FX_Free(argsValue); | |
6776 } | |
6777 void CXFA_FM2JSContext::GetObjectDefaultValue(FXJSE_HVALUE hObjectValue, | |
6778 FXJSE_HVALUE hDefaultValue) { | |
6779 CXFA_Node* pNode = | |
6780 ToNode((CXFA_Object*)FXJSE_Value_ToObject(hObjectValue, NULL)); | |
6781 if (pNode) { | |
6782 pNode->Script_Som_DefaultValue(hDefaultValue, FALSE, (XFA_ATTRIBUTE)-1); | |
6783 } else { | |
6784 FXJSE_Value_SetNull(hDefaultValue); | |
6785 } | |
6786 } | |
6787 FX_BOOL CXFA_FM2JSContext::SetObjectDefaultValue(FXJSE_HVALUE hObjectValue, | |
6788 FXJSE_HVALUE hNewValue) { | |
6789 CXFA_Node* pNode = | |
6790 ToNode((CXFA_Object*)FXJSE_Value_ToObject(hObjectValue, NULL)); | |
6791 if (pNode) { | |
6792 pNode->Script_Som_DefaultValue(hNewValue, TRUE, (XFA_ATTRIBUTE)-1); | |
6793 return TRUE; | |
6794 } | |
6795 return FALSE; | |
6796 } | |
6797 void CXFA_FM2JSContext::GenerateSomExpression(const CFX_ByteStringC& szName, | |
6798 int32_t iIndexFlags, | |
6799 int32_t iIndexValue, | |
6800 FX_BOOL bIsStar, | |
6801 CFX_ByteString& szSomExp) { | |
6802 if (bIsStar) { | |
6803 szSomExp = szName + "[*]"; | |
6804 return; | |
6805 } | |
6806 if (iIndexFlags == 0) { | |
6807 szSomExp = szName; | |
6808 return; | |
6809 } | |
6810 if (iIndexFlags == 1 || iIndexValue == 0) { | |
6811 szSomExp = szName + "[" + | |
6812 CFX_ByteString::FormatInteger(iIndexValue, FXFORMAT_SIGNED) + | |
6813 "]"; | |
6814 } else if (iIndexFlags == 2) { | |
6815 szSomExp = (iIndexValue < 0) ? (szName + "[-") : (szName + "[+"); | |
6816 iIndexValue = (iIndexValue < 0) ? (0 - iIndexValue) : iIndexValue; | |
6817 szSomExp += CFX_ByteString::FormatInteger(iIndexValue); | |
6818 szSomExp += "]"; | |
6819 } else { | |
6820 szSomExp = (iIndexValue < 0) ? (szName + "[") : (szName + "[-"); | |
6821 iIndexValue = (iIndexValue < 0) ? (0 - iIndexValue) : iIndexValue; | |
6822 szSomExp += CFX_ByteString::FormatInteger(iIndexValue); | |
6823 szSomExp += "]"; | |
6824 } | |
6825 } | |
6826 FX_BOOL CXFA_FM2JSContext::GetObjectByName( | |
6827 FXJSE_HOBJECT hThis, | |
6828 FXJSE_HVALUE accessorValue, | |
6829 const CFX_ByteStringC& szAccessorName) { | |
6830 FX_BOOL bFlags = FALSE; | |
6831 CXFA_FM2JSContext* pContext = | |
6832 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
6833 CXFA_Document* pDoc = pContext->GetDocument(); | |
6834 if (!pDoc) { | |
6835 return bFlags; | |
6836 } | |
6837 IXFA_ScriptContext* pScriptContext = pDoc->GetScriptContext(); | |
6838 XFA_RESOLVENODE_RS resoveNodeRS; | |
6839 FX_DWORD dwFlags = XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Properties | | |
6840 XFA_RESOLVENODE_Siblings | XFA_RESOLVENODE_Parent; | |
6841 int32_t iRet = pScriptContext->ResolveObjects( | |
6842 pScriptContext->GetThisObject(), | |
6843 CFX_WideString::FromUTF8(szAccessorName.GetCStr(), | |
6844 szAccessorName.GetLength()), | |
6845 resoveNodeRS, dwFlags); | |
6846 if (iRet >= 1 && resoveNodeRS.dwFlags == XFA_RESOVENODE_RSTYPE_Nodes) { | |
6847 FXJSE_Value_Set(accessorValue, pScriptContext->GetJSValueFromMap( | |
6848 resoveNodeRS.nodes.GetAt(0))); | |
6849 bFlags = TRUE; | |
6850 } | |
6851 return bFlags; | |
6852 } | |
6853 int32_t CXFA_FM2JSContext::ResolveObjects(FXJSE_HOBJECT hThis, | |
6854 FXJSE_HVALUE hRefValue, | |
6855 const CFX_ByteStringC& bsSomExp, | |
6856 XFA_RESOLVENODE_RS& resoveNodeRS, | |
6857 FX_BOOL bdotAccessor, | |
6858 FX_BOOL bHasNoResolveName) { | |
6859 CFX_WideString wsSomExpression = | |
6860 CFX_WideString::FromUTF8(bsSomExp.GetCStr(), bsSomExp.GetLength()); | |
6861 int32_t iRet = -1; | |
6862 CXFA_FM2JSContext* pContext = | |
6863 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
6864 CXFA_Document* pDoc = pContext->GetDocument(); | |
6865 if (!pDoc) { | |
6866 return iRet; | |
6867 } | |
6868 IXFA_ScriptContext* pScriptContext = pDoc->GetScriptContext(); | |
6869 CXFA_Object* pNode = NULL; | |
6870 FX_DWORD dFlags = 0UL; | |
6871 if (bdotAccessor) { | |
6872 if (FXJSE_Value_IsNull(hRefValue)) { | |
6873 pNode = pScriptContext->GetThisObject(); | |
6874 dFlags = XFA_RESOLVENODE_Siblings | XFA_RESOLVENODE_Parent; | |
6875 } else { | |
6876 pNode = (CXFA_Object*)FXJSE_Value_ToObject(hRefValue, NULL); | |
6877 FXSYS_assert(pNode); | |
6878 if (bHasNoResolveName) { | |
6879 CFX_WideString wsName; | |
6880 if (CXFA_Node* pXFANode = pNode->AsNode()) { | |
6881 pXFANode->GetAttribute(XFA_ATTRIBUTE_Name, wsName, FALSE); | |
6882 } | |
6883 if (wsName.IsEmpty()) { | |
6884 CFX_WideStringC className; | |
6885 pNode->GetClassName(className); | |
6886 wsName = FX_WSTRC(L"#") + className; | |
6887 } | |
6888 wsSomExpression = wsName + wsSomExpression; | |
6889 dFlags = XFA_RESOLVENODE_Siblings; | |
6890 } else { | |
6891 dFlags = (bsSomExp == "*") | |
6892 ? (XFA_RESOLVENODE_Children) | |
6893 : (XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Attributes | | |
6894 XFA_RESOLVENODE_Properties); | |
6895 } | |
6896 } | |
6897 } else { | |
6898 pNode = (CXFA_Object*)FXJSE_Value_ToObject(hRefValue, NULL); | |
6899 dFlags = XFA_RESOLVENODE_AnyChild; | |
6900 } | |
6901 iRet = pScriptContext->ResolveObjects(pNode, wsSomExpression, resoveNodeRS, | |
6902 dFlags); | |
6903 return iRet; | |
6904 } | |
6905 void CXFA_FM2JSContext::ParseResolveResult( | |
6906 FXJSE_HOBJECT hThis, | |
6907 const XFA_RESOLVENODE_RS& resoveNodeRS, | |
6908 FXJSE_HVALUE hParentValue, | |
6909 FXJSE_HVALUE*& resultValues, | |
6910 int32_t& iSize, | |
6911 FX_BOOL& bAttribute) { | |
6912 CXFA_FM2JSContext* pContext = | |
6913 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
6914 FXJSE_HRUNTIME hRuntime = pContext->GetScriptRuntime(); | |
6915 iSize = 0; | |
6916 resultValues = NULL; | |
6917 if (resoveNodeRS.dwFlags == XFA_RESOVENODE_RSTYPE_Nodes) { | |
6918 bAttribute = FALSE; | |
6919 iSize = resoveNodeRS.nodes.GetSize(); | |
6920 resultValues = FX_Alloc(FXJSE_HVALUE, iSize); | |
6921 for (int32_t i = 0; i < iSize; i++) { | |
6922 resultValues[i] = FXJSE_Value_Create(hRuntime); | |
6923 FXJSE_Value_Set( | |
6924 resultValues[i], | |
6925 pContext->GetDocument()->GetScriptContext()->GetJSValueFromMap( | |
6926 resoveNodeRS.nodes.GetAt(i))); | |
6927 } | |
6928 } else { | |
6929 CXFA_HVALUEArray objectProperties(hRuntime); | |
6930 int32_t iRet = resoveNodeRS.GetAttributeResult(objectProperties); | |
6931 bAttribute = (iRet == 0); | |
6932 if (bAttribute) { | |
6933 if (FXJSE_Value_IsObject(hParentValue)) { | |
6934 iSize = 1; | |
6935 resultValues = FX_Alloc(FXJSE_HVALUE, 1); | |
6936 resultValues[0] = FXJSE_Value_Create(hRuntime); | |
6937 FXJSE_Value_Set(resultValues[0], hParentValue); | |
6938 } | |
6939 } else { | |
6940 iSize = iRet; | |
6941 resultValues = FX_Alloc(FXJSE_HVALUE, iSize); | |
6942 for (int32_t i = 0; i < iSize; i++) { | |
6943 resultValues[i] = FXJSE_Value_Create(hRuntime); | |
6944 FXJSE_Value_Set(resultValues[i], objectProperties[i]); | |
6945 } | |
6946 } | |
6947 } | |
6948 } | |
6949 int32_t CXFA_FM2JSContext::HValueToInteger(FXJSE_HOBJECT hThis, | |
6950 FXJSE_HVALUE hValue) { | |
6951 CXFA_FM2JSContext* pContext = | |
6952 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
6953 FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime(); | |
6954 int32_t iValue = 0; | |
6955 if (FXJSE_Value_IsArray(hValue)) { | |
6956 FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime); | |
6957 FXJSE_HVALUE jsobjectValue = FXJSE_Value_Create(hruntime); | |
6958 FXJSE_HVALUE newProperty = FXJSE_Value_Create(hruntime); | |
6959 FXJSE_Value_GetObjectPropByIdx(hValue, 1, propertyValue); | |
6960 FXJSE_Value_GetObjectPropByIdx(hValue, 2, jsobjectValue); | |
6961 if (FXJSE_Value_IsNull(propertyValue)) { | |
6962 GetObjectDefaultValue(jsobjectValue, newProperty); | |
6963 } else { | |
6964 CFX_ByteString propertyStr; | |
6965 FXJSE_Value_ToUTF8String(propertyValue, propertyStr); | |
6966 FXJSE_Value_GetObjectProp(jsobjectValue, propertyStr, newProperty); | |
6967 } | |
6968 iValue = HValueToInteger(hThis, newProperty); | |
6969 FXJSE_Value_Release(newProperty); | |
6970 FXJSE_Value_Release(jsobjectValue); | |
6971 FXJSE_Value_Release(propertyValue); | |
6972 return iValue; | |
6973 } else if (FXJSE_Value_IsObject(hValue)) { | |
6974 FXJSE_HVALUE newProperty = FXJSE_Value_Create(hruntime); | |
6975 GetObjectDefaultValue(hValue, newProperty); | |
6976 iValue = HValueToInteger(hThis, newProperty); | |
6977 FXJSE_Value_Release(newProperty); | |
6978 return iValue; | |
6979 } else if (FXJSE_Value_IsUTF8String(hValue)) { | |
6980 CFX_ByteString szValue; | |
6981 FXJSE_Value_ToUTF8String(hValue, szValue); | |
6982 iValue = FXSYS_atoi(szValue); | |
6983 } else { | |
6984 iValue = FXJSE_Value_ToInteger(hValue); | |
6985 } | |
6986 return iValue; | |
6987 } | |
6988 FX_DOUBLE CXFA_FM2JSContext::StringToDouble( | |
6989 const CFX_ByteStringC& szStringVal) { | |
6990 return XFA_ByteStringToDouble(szStringVal); | |
6991 } | |
6992 FX_FLOAT CXFA_FM2JSContext::HValueToFloat(FXJSE_HOBJECT hThis, | |
6993 FXJSE_HVALUE arg) { | |
6994 CXFA_FM2JSContext* pContext = | |
6995 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
6996 FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime(); | |
6997 FX_FLOAT fRet = 0.0f; | |
6998 if (FXJSE_Value_IsArray(arg)) { | |
6999 FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime); | |
7000 FXJSE_HVALUE jsobjectValue = FXJSE_Value_Create(hruntime); | |
7001 FXJSE_HVALUE newProperty = FXJSE_Value_Create(hruntime); | |
7002 FXJSE_Value_GetObjectPropByIdx(arg, 1, propertyValue); | |
7003 FXJSE_Value_GetObjectPropByIdx(arg, 2, jsobjectValue); | |
7004 if (FXJSE_Value_IsNull(propertyValue)) { | |
7005 GetObjectDefaultValue(jsobjectValue, newProperty); | |
7006 } else { | |
7007 CFX_ByteString propertyStr; | |
7008 FXJSE_Value_ToUTF8String(propertyValue, propertyStr); | |
7009 FXJSE_Value_GetObjectProp(jsobjectValue, propertyStr, newProperty); | |
7010 } | |
7011 fRet = HValueToFloat(hThis, newProperty); | |
7012 FXJSE_Value_Release(newProperty); | |
7013 FXJSE_Value_Release(jsobjectValue); | |
7014 FXJSE_Value_Release(propertyValue); | |
7015 } else if (FXJSE_Value_IsObject(arg)) { | |
7016 FXJSE_HVALUE newProperty = FXJSE_Value_Create(hruntime); | |
7017 GetObjectDefaultValue(arg, newProperty); | |
7018 fRet = HValueToFloat(hThis, newProperty); | |
7019 FXJSE_Value_Release(newProperty); | |
7020 } else if (FXJSE_Value_IsUTF8String(arg)) { | |
7021 CFX_ByteString bsOutput; | |
7022 FXJSE_Value_ToUTF8String(arg, bsOutput); | |
7023 fRet = (FX_FLOAT)StringToDouble(bsOutput); | |
7024 } else if (FXJSE_Value_IsUndefined(arg)) { | |
7025 fRet = 0; | |
7026 } else { | |
7027 fRet = FXJSE_Value_ToFloat(arg); | |
7028 } | |
7029 return fRet; | |
7030 } | |
7031 FX_DOUBLE CXFA_FM2JSContext::HValueToDouble(FXJSE_HOBJECT hThis, | |
7032 FXJSE_HVALUE arg) { | |
7033 CXFA_FM2JSContext* pContext = | |
7034 (CXFA_FM2JSContext*)FXJSE_Value_ToObject(hThis, NULL); | |
7035 FXJSE_HRUNTIME hruntime = pContext->GetScriptRuntime(); | |
7036 FX_DOUBLE dRet = 0; | |
7037 if (FXJSE_Value_IsArray(arg)) { | |
7038 FXJSE_HVALUE propertyValue = FXJSE_Value_Create(hruntime); | |
7039 FXJSE_HVALUE jsobjectValue = FXJSE_Value_Create(hruntime); | |
7040 FXJSE_HVALUE newProperty = FXJSE_Value_Create(hruntime); | |
7041 FXJSE_Value_GetObjectPropByIdx(arg, 1, propertyValue); | |
7042 FXJSE_Value_GetObjectPropByIdx(arg, 2, jsobjectValue); | |
7043 if (FXJSE_Value_IsNull(propertyValue)) { | |
7044 GetObjectDefaultValue(jsobjectValue, newProperty); | |
7045 } else { | |
7046 CFX_ByteString propertyStr; | |
7047 FXJSE_Value_ToUTF8String(propertyValue, propertyStr); | |
7048 FXJSE_Value_GetObjectProp(jsobjectValue, propertyStr, newProperty); | |
7049 } | |
7050 dRet = HValueToDouble(hThis, newProperty); | |
7051 FXJSE_Value_Release(newProperty); | |
7052 FXJSE_Value_Release(jsobjectValue); | |
7053 FXJSE_Value_Release(propertyValue); | |
7054 } else if (FXJSE_Value_IsObject(arg)) { | |
7055 FXJSE_HVALUE newProperty = FXJSE_Value_Create(hruntime); | |
7056 GetObjectDefaultValue(arg, newProperty); | |
7057 dRet = HValueToDouble(hThis, newProperty); | |
7058 FXJSE_Value_Release(newProperty); | |
7059 } else if (FXJSE_Value_IsUTF8String(arg)) { | |
7060 CFX_ByteString bsOutput; | |
7061 FXJSE_Value_ToUTF8String(arg, bsOutput); | |
7062 dRet = StringToDouble(bsOutput); | |
7063 } else if (FXJSE_Value_IsUndefined(arg)) { | |
7064 dRet = 0; | |
7065 } else { | |
7066 dRet = FXJSE_Value_ToDouble(arg); | |
7067 } | |
7068 return dRet; | |
7069 } | |
7070 void CXFA_FM2JSContext::HValueToUTF8String(FXJSE_HVALUE arg, | |
7071 CFX_ByteString& szOutputString) { | |
7072 if (FXJSE_Value_IsNull(arg) || FXJSE_Value_IsUndefined(arg)) { | |
7073 szOutputString = ""; | |
7074 } else if (FXJSE_Value_IsBoolean(arg)) { | |
7075 szOutputString = FXJSE_Value_ToBoolean(arg) ? "1" : "0"; | |
7076 } else { | |
7077 szOutputString = ""; | |
7078 FXJSE_Value_ToUTF8String(arg, szOutputString); | |
7079 } | |
7080 } | |
7081 static FXJSE_FUNCTION formcalc_fm2js_functions[] = { | |
7082 {"Abs", CXFA_FM2JSContext::Abs}, | |
7083 {"Avg", CXFA_FM2JSContext::Avg}, | |
7084 {"Ceil", CXFA_FM2JSContext::Ceil}, | |
7085 {"Count", CXFA_FM2JSContext::Count}, | |
7086 {"Floor", CXFA_FM2JSContext::Floor}, | |
7087 {"Max", CXFA_FM2JSContext::Max}, | |
7088 {"Min", CXFA_FM2JSContext::Min}, | |
7089 {"Mod", CXFA_FM2JSContext::Mod}, | |
7090 {"Round", CXFA_FM2JSContext::Round}, | |
7091 {"Sum", CXFA_FM2JSContext::Sum}, | |
7092 {"Date", CXFA_FM2JSContext::Date}, | |
7093 {"Date2Num", CXFA_FM2JSContext::Date2Num}, | |
7094 {"DateFmt", CXFA_FM2JSContext::DateFmt}, | |
7095 {"IsoDate2Num", CXFA_FM2JSContext::IsoDate2Num}, | |
7096 {"IsoTime2Num", CXFA_FM2JSContext::IsoTime2Num}, | |
7097 {"LocalDateFmt", CXFA_FM2JSContext::LocalDateFmt}, | |
7098 {"LocalTimeFmt", CXFA_FM2JSContext::LocalTimeFmt}, | |
7099 {"Num2Date", CXFA_FM2JSContext::Num2Date}, | |
7100 {"Num2GMTime", CXFA_FM2JSContext::Num2GMTime}, | |
7101 {"Num2Time", CXFA_FM2JSContext::Num2Time}, | |
7102 {"Time", CXFA_FM2JSContext::Time}, | |
7103 {"Time2Num", CXFA_FM2JSContext::Time2Num}, | |
7104 {"TimeFmt", CXFA_FM2JSContext::TimeFmt}, | |
7105 {"Apr", CXFA_FM2JSContext::Apr}, | |
7106 {"Cterm", CXFA_FM2JSContext::CTerm}, | |
7107 {"FV", CXFA_FM2JSContext::FV}, | |
7108 {"Ipmt", CXFA_FM2JSContext::IPmt}, | |
7109 {"NPV", CXFA_FM2JSContext::NPV}, | |
7110 {"Pmt", CXFA_FM2JSContext::Pmt}, | |
7111 {"PPmt", CXFA_FM2JSContext::PPmt}, | |
7112 {"PV", CXFA_FM2JSContext::PV}, | |
7113 {"Rate", CXFA_FM2JSContext::Rate}, | |
7114 {"Term", CXFA_FM2JSContext::Term}, | |
7115 {"Choose", CXFA_FM2JSContext::Choose}, | |
7116 {"Exists", CXFA_FM2JSContext::Exists}, | |
7117 {"HasValue", CXFA_FM2JSContext::HasValue}, | |
7118 {"Oneof", CXFA_FM2JSContext::Oneof}, | |
7119 {"Within", CXFA_FM2JSContext::Within}, | |
7120 {"If", CXFA_FM2JSContext::If}, | |
7121 {"Eval", CXFA_FM2JSContext::Eval}, | |
7122 {"Translate", CXFA_FM2JSContext::eval_translation}, | |
7123 {"Ref", CXFA_FM2JSContext::Ref}, | |
7124 {"UnitType", CXFA_FM2JSContext::UnitType}, | |
7125 {"UnitValue", CXFA_FM2JSContext::UnitValue}, | |
7126 {"At", CXFA_FM2JSContext::At}, | |
7127 {"Concat", CXFA_FM2JSContext::Concat}, | |
7128 {"Decode", CXFA_FM2JSContext::Decode}, | |
7129 {"Encode", CXFA_FM2JSContext::Encode}, | |
7130 {"Format", CXFA_FM2JSContext::Format}, | |
7131 {"Left", CXFA_FM2JSContext::Left}, | |
7132 {"Len", CXFA_FM2JSContext::Len}, | |
7133 {"Lower", CXFA_FM2JSContext::Lower}, | |
7134 {"Ltrim", CXFA_FM2JSContext::Ltrim}, | |
7135 {"Parse", CXFA_FM2JSContext::Parse}, | |
7136 {"Replace", CXFA_FM2JSContext::Replace}, | |
7137 {"Right", CXFA_FM2JSContext::Right}, | |
7138 {"Rtrim", CXFA_FM2JSContext::Rtrim}, | |
7139 {"Space", CXFA_FM2JSContext::Space}, | |
7140 {"Str", CXFA_FM2JSContext::Str}, | |
7141 {"Stuff", CXFA_FM2JSContext::Stuff}, | |
7142 {"Substr", CXFA_FM2JSContext::Substr}, | |
7143 {"Uuid", CXFA_FM2JSContext::Uuid}, | |
7144 {"Upper", CXFA_FM2JSContext::Upper}, | |
7145 {"WordNum", CXFA_FM2JSContext::WordNum}, | |
7146 {"Get", CXFA_FM2JSContext::Get}, | |
7147 {"Post", CXFA_FM2JSContext::Post}, | |
7148 {"Put", CXFA_FM2JSContext::Put}, | |
7149 {"positive_operator", CXFA_FM2JSContext::positive_operator}, | |
7150 {"negative_operator", CXFA_FM2JSContext::negative_operator}, | |
7151 {"logical_or_operator", CXFA_FM2JSContext::logical_or_operator}, | |
7152 {"logical_and_operator", CXFA_FM2JSContext::logical_and_operator}, | |
7153 {"logical_not_operator", CXFA_FM2JSContext::logical_not_operator}, | |
7154 {"equality_operator", CXFA_FM2JSContext::equality_operator}, | |
7155 {"notequality_operator", CXFA_FM2JSContext::notequality_operator}, | |
7156 {"less_operator", CXFA_FM2JSContext::less_operator}, | |
7157 {"lessequal_operator", CXFA_FM2JSContext::lessequal_operator}, | |
7158 {"greater_operator", CXFA_FM2JSContext::greater_operator}, | |
7159 {"greaterequal_operator", CXFA_FM2JSContext::greaterequal_operator}, | |
7160 {"plus_operator", CXFA_FM2JSContext::plus_operator}, | |
7161 {"minus_operator", CXFA_FM2JSContext::minus_operator}, | |
7162 {"multiple_operator", CXFA_FM2JSContext::multiple_operator}, | |
7163 {"divide_operator", CXFA_FM2JSContext::divide_operator}, | |
7164 {"assign_value_operator", CXFA_FM2JSContext::assign_value_operator}, | |
7165 {"dot_accessor", CXFA_FM2JSContext::dot_accessor}, | |
7166 {"dotdot_accessor", CXFA_FM2JSContext::dotdot_accessor}, | |
7167 {"concat_fm_object", CXFA_FM2JSContext::concat_fm_object}, | |
7168 {"is_fm_object", CXFA_FM2JSContext::is_fm_object}, | |
7169 {"is_fm_array", CXFA_FM2JSContext::is_fm_array}, | |
7170 {"get_fm_value", CXFA_FM2JSContext::get_fm_value}, | |
7171 {"get_fm_jsobj", CXFA_FM2JSContext::get_fm_jsobj}, | |
7172 {"fm_var_filter", CXFA_FM2JSContext::fm_var_filter}, | |
7173 }; | |
7174 CXFA_FM2JSContext::CXFA_FM2JSContext() | |
7175 : m_hFMClass(nullptr), m_pDocument(nullptr) { | |
7176 FXSYS_memset(&m_fmClass, 0, sizeof(FXJSE_CLASS)); | |
7177 } | |
7178 CXFA_FM2JSContext::~CXFA_FM2JSContext() { | |
7179 m_pDocument = NULL; | |
7180 if (m_hValue) { | |
7181 FXJSE_Value_Release(m_hValue); | |
7182 m_hValue = NULL; | |
7183 } | |
7184 m_hScriptRuntime = NULL; | |
7185 } | |
7186 CXFA_FM2JSContext* CXFA_FM2JSContext::Create() { | |
7187 return new CXFA_FM2JSContext; | |
7188 } | |
7189 void CXFA_FM2JSContext::Initialize(FXJSE_HRUNTIME hScriptRuntime, | |
7190 FXJSE_HCONTEXT hScriptContext, | |
7191 CXFA_Document* pDoc) { | |
7192 m_pDocument = pDoc; | |
7193 m_hScriptRuntime = hScriptRuntime; | |
7194 m_fmClass.name = "XFA_FM2JS_FormCalcClass"; | |
7195 m_fmClass.constructor = NULL; | |
7196 m_fmClass.properties = NULL; | |
7197 m_fmClass.methods = formcalc_fm2js_functions; | |
7198 m_fmClass.propNum = 0; | |
7199 m_fmClass.methNum = | |
7200 sizeof(formcalc_fm2js_functions) / sizeof(formcalc_fm2js_functions[0]); | |
7201 m_hFMClass = FXJSE_DefineClass(hScriptContext, &m_fmClass); | |
7202 m_hValue = FXJSE_Value_Create(hScriptRuntime); | |
7203 FXJSE_Value_SetNull(m_hValue); | |
7204 FXJSE_Value_SetObject(m_hValue, this, m_hFMClass); | |
7205 } | |
7206 void CXFA_FM2JSContext::GlobalPropertyGetter(FXJSE_HVALUE hValue) { | |
7207 FXJSE_Value_Set(hValue, m_hValue); | |
7208 } | |
7209 void CXFA_FM2JSContext::Release() { | |
7210 delete this; | |
7211 } | |
7212 void CXFA_FM2JSContext::ThrowScriptErrorMessage(int32_t iStringID, ...) { | |
7213 IXFA_AppProvider* pAppProvider = m_pDocument->GetNotify()->GetAppProvider(); | |
7214 FXSYS_assert(pAppProvider); | |
7215 CFX_WideString wsFormat; | |
7216 pAppProvider->LoadString(iStringID, wsFormat); | |
7217 CFX_WideString wsMessage; | |
7218 va_list arg_ptr; | |
7219 va_start(arg_ptr, iStringID); | |
7220 wsMessage.FormatV((const FX_WCHAR*)wsFormat, arg_ptr); | |
7221 va_end(arg_ptr); | |
7222 FXJSE_ThrowMessage("", FX_UTF8Encode(wsMessage, wsMessage.GetLength())); | |
7223 } | |
OLD | NEW |