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