Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(58)

Side by Side Diff: xfa/fxfa/fm2js/xfa_fm2jscontext.cpp

Issue 2043133002: xfa_fm2jscontext method cleanup - pt VI (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@master
Patch Set: Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 PDFium Authors. All rights reserved. 1 // Copyright 2014 PDFium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6 6
7 #include "xfa/fxfa/fm2js/xfa_fm2jscontext.h" 7 #include "xfa/fxfa/fm2js/xfa_fm2jscontext.h"
8 8
9 #include <time.h> 9 #include <time.h>
10 10
(...skipping 2941 matching lines...) Expand 10 before | Expand all | Expand 10 after
2952 delete parametersValue[i]; 2952 delete parametersValue[i];
2953 FX_Free(parametersValue); 2953 FX_Free(parametersValue);
2954 2954
2955 FXJSE_Value_SetInteger(args.GetReturnValue(), bFlags); 2955 FXJSE_Value_SetInteger(args.GetReturnValue(), bFlags);
2956 } 2956 }
2957 2957
2958 // static 2958 // static
2959 void CXFA_FM2JSContext::Within(CFXJSE_Value* pThis, 2959 void CXFA_FM2JSContext::Within(CFXJSE_Value* pThis,
2960 const CFX_ByteStringC& szFuncName, 2960 const CFX_ByteStringC& szFuncName,
2961 CFXJSE_Arguments& args) { 2961 CFXJSE_Arguments& args) {
2962 if (args.GetLength() == 3) { 2962 if (args.GetLength() != 3) {
2963 std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0);
2964 if (FXJSE_Value_IsNull(argOne.get())) {
2965 FXJSE_Value_SetUndefined(args.GetReturnValue());
2966 } else {
2967 std::unique_ptr<CFXJSE_Value> argLow = GetSimpleValue(pThis, args, 1);
2968 std::unique_ptr<CFXJSE_Value> argHeight = GetSimpleValue(pThis, args, 2);
2969 if (FXJSE_Value_IsNumber(argOne.get())) {
2970 FX_FLOAT oneNumber = ValueToFloat(pThis, argOne.get());
2971 FX_FLOAT lowNumber = ValueToFloat(pThis, argLow.get());
2972 FX_FLOAT heightNumber = ValueToFloat(pThis, argHeight.get());
2973 FXJSE_Value_SetInteger(
2974 args.GetReturnValue(),
2975 ((oneNumber >= lowNumber) && (oneNumber <= heightNumber)));
2976 } else {
2977 CFX_ByteString oneString;
2978 CFX_ByteString lowString;
2979 CFX_ByteString heightString;
2980 ValueToUTF8String(argOne.get(), oneString);
2981 ValueToUTF8String(argLow.get(), lowString);
2982 ValueToUTF8String(argHeight.get(), heightString);
2983 FXJSE_Value_SetInteger(
2984 args.GetReturnValue(),
2985 ((oneString.Compare(lowString.AsStringC()) >= 0) &&
2986 (oneString.Compare(heightString.AsStringC()) <= 0)));
2987 }
2988 }
2989 } else {
2990 ToJSContext(pThis, nullptr) 2963 ToJSContext(pThis, nullptr)
2991 ->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Within"); 2964 ->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Within");
2965 return;
2992 } 2966 }
2967
2968 std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0);
2969 if (FXJSE_Value_IsNull(argOne.get())) {
2970 FXJSE_Value_SetUndefined(args.GetReturnValue());
2971 return;
2972 }
2973
2974 std::unique_ptr<CFXJSE_Value> argLow = GetSimpleValue(pThis, args, 1);
2975 std::unique_ptr<CFXJSE_Value> argHigh = GetSimpleValue(pThis, args, 2);
2976 if (FXJSE_Value_IsNumber(argOne.get())) {
2977 FX_FLOAT oneNumber = ValueToFloat(pThis, argOne.get());
2978 FX_FLOAT lowNumber = ValueToFloat(pThis, argLow.get());
2979 FX_FLOAT heightNumber = ValueToFloat(pThis, argHigh.get());
2980 FXJSE_Value_SetInteger(
2981 args.GetReturnValue(),
2982 ((oneNumber >= lowNumber) && (oneNumber <= heightNumber)));
2983 return;
2984 }
2985
2986 CFX_ByteString oneString;
2987 CFX_ByteString lowString;
2988 CFX_ByteString heightString;
2989 ValueToUTF8String(argOne.get(), oneString);
2990 ValueToUTF8String(argLow.get(), lowString);
2991 ValueToUTF8String(argHigh.get(), heightString);
2992 FXJSE_Value_SetInteger(args.GetReturnValue(),
2993 ((oneString.Compare(lowString.AsStringC()) >= 0) &&
2994 (oneString.Compare(heightString.AsStringC()) <= 0)));
2993 } 2995 }
2994 2996
2995 // static 2997 // static
2996 void CXFA_FM2JSContext::If(CFXJSE_Value* pThis, 2998 void CXFA_FM2JSContext::If(CFXJSE_Value* pThis,
2997 const CFX_ByteStringC& szFuncName, 2999 const CFX_ByteStringC& szFuncName,
2998 CFXJSE_Arguments& args) { 3000 CFXJSE_Arguments& args) {
2999 if (args.GetLength() == 3) { 3001 if (args.GetLength() != 3) {
3000 std::unique_ptr<CFXJSE_Value> argCondition = GetSimpleValue(pThis, args, 0);
3001 std::unique_ptr<CFXJSE_Value> argFirstValue =
3002 GetSimpleValue(pThis, args, 1);
3003 std::unique_ptr<CFXJSE_Value> argSecondValue =
3004 GetSimpleValue(pThis, args, 2);
3005 FX_BOOL bCondition = FXJSE_Value_ToBoolean(argCondition.get());
3006 FXJSE_Value_Set(args.GetReturnValue(),
3007 bCondition ? argFirstValue.get() : argSecondValue.get());
3008 } else {
3009 ToJSContext(pThis, nullptr) 3002 ToJSContext(pThis, nullptr)
3010 ->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"If"); 3003 ->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"If");
3004 return;
3011 } 3005 }
3006
3007 FXJSE_Value_Set(args.GetReturnValue(),
3008 FXJSE_Value_ToBoolean(GetSimpleValue(pThis, args, 0).get())
3009 ? GetSimpleValue(pThis, args, 1).get()
3010 : GetSimpleValue(pThis, args, 2).get());
3012 } 3011 }
3013 3012
3014 // static 3013 // static
3015 void CXFA_FM2JSContext::Eval(CFXJSE_Value* pThis, 3014 void CXFA_FM2JSContext::Eval(CFXJSE_Value* pThis,
3016 const CFX_ByteStringC& szFuncName, 3015 const CFX_ByteStringC& szFuncName,
3017 CFXJSE_Arguments& args) { 3016 CFXJSE_Arguments& args) {
3018 CXFA_FM2JSContext* pContext = ToJSContext(pThis, nullptr); 3017 CXFA_FM2JSContext* pContext = ToJSContext(pThis, nullptr);
3019 if (args.GetLength() == 1) { 3018 if (args.GetLength() != 1) {
3020 v8::Isolate* pIsolate = pContext->GetScriptRuntime();
3021 std::unique_ptr<CFXJSE_Value> scriptValue = GetSimpleValue(pThis, args, 0);
3022 CFX_ByteString utf8ScriptString;
3023 ValueToUTF8String(scriptValue.get(), utf8ScriptString);
3024 if (utf8ScriptString.IsEmpty()) {
3025 FXJSE_Value_SetNull(args.GetReturnValue());
3026 } else {
3027 CFX_WideTextBuf wsJavaScriptBuf;
3028 CFX_WideString javaScript;
3029 CFX_WideString wsError;
3030 CXFA_FM2JSContext::Translate(
3031 CFX_WideString::FromUTF8(utf8ScriptString.AsStringC()).AsStringC(),
3032 wsJavaScriptBuf, wsError);
3033 CFXJSE_Context* pNewContext =
3034 FXJSE_Context_Create(pIsolate, nullptr, nullptr);
3035 std::unique_ptr<CFXJSE_Value> returnValue(new CFXJSE_Value(pIsolate));
3036 javaScript = wsJavaScriptBuf.AsStringC();
3037 FXJSE_ExecuteScript(
3038 pNewContext,
3039 FX_UTF8Encode(javaScript.c_str(), javaScript.GetLength()).c_str(),
3040 returnValue.get());
3041 FXJSE_Value_Set(args.GetReturnValue(), returnValue.get());
3042 FXJSE_Context_Release(pNewContext);
3043 }
3044 } else {
3045 pContext->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Eval"); 3019 pContext->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Eval");
3020 return;
3046 } 3021 }
3022
3023 v8::Isolate* pIsolate = pContext->GetScriptRuntime();
3024 std::unique_ptr<CFXJSE_Value> scriptValue = GetSimpleValue(pThis, args, 0);
3025 CFX_ByteString utf8ScriptString;
3026 ValueToUTF8String(scriptValue.get(), utf8ScriptString);
3027 if (utf8ScriptString.IsEmpty()) {
3028 FXJSE_Value_SetNull(args.GetReturnValue());
3029 return;
3030 }
3031
3032 CFX_WideTextBuf wsJavaScriptBuf;
3033 CFX_WideString wsError;
3034 CXFA_FM2JSContext::Translate(
3035 CFX_WideString::FromUTF8(utf8ScriptString.AsStringC()).AsStringC(),
3036 wsJavaScriptBuf, wsError);
3037 CFXJSE_Context* pNewContext =
3038 FXJSE_Context_Create(pIsolate, nullptr, nullptr);
3039
3040 std::unique_ptr<CFXJSE_Value> returnValue(new CFXJSE_Value(pIsolate));
3041 CFX_WideString javaScript(wsJavaScriptBuf.AsStringC());
3042 FXJSE_ExecuteScript(
3043 pNewContext,
3044 FX_UTF8Encode(javaScript.c_str(), javaScript.GetLength()).c_str(),
3045 returnValue.get());
3046
3047 FXJSE_Value_Set(args.GetReturnValue(), returnValue.get());
3048 FXJSE_Context_Release(pNewContext);
3047 } 3049 }
3048 3050
3049 // static 3051 // static
3050 void CXFA_FM2JSContext::Ref(CFXJSE_Value* pThis, 3052 void CXFA_FM2JSContext::Ref(CFXJSE_Value* pThis,
3051 const CFX_ByteStringC& szFuncName, 3053 const CFX_ByteStringC& szFuncName,
3052 CFXJSE_Arguments& args) { 3054 CFXJSE_Arguments& args) {
3053 CXFA_FM2JSContext* pContext = ToJSContext(pThis, nullptr); 3055 CXFA_FM2JSContext* pContext = ToJSContext(pThis, nullptr);
3054 v8::Isolate* pIsolate = pContext->GetScriptRuntime(); 3056 v8::Isolate* pIsolate = pContext->GetScriptRuntime();
3055 if (args.GetLength() == 1) { 3057 if (args.GetLength() != 1) {
3056 std::unique_ptr<CFXJSE_Value> argOne = args.GetValue(0); 3058 pContext->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Ref");
3057 if (FXJSE_Value_IsNull(argOne.get())) { 3059 return;
3058 CFXJSE_Value* rgValues[3]; 3060 }
3059 for (int32_t i = 0; i < 3; i++)
3060 rgValues[i] = new CFXJSE_Value(pIsolate);
3061 3061
3062 FXJSE_Value_SetInteger(rgValues[0], 4); 3062 std::unique_ptr<CFXJSE_Value> argOne = args.GetValue(0);
3063 FXJSE_Value_SetNull(rgValues[1]); 3063 if (!FXJSE_Value_IsArray(argOne.get()) &&
3064 FXJSE_Value_SetNull(rgValues[2]); 3064 !FXJSE_Value_IsObject(argOne.get()) &&
3065 FXJSE_Value_SetArray(args.GetReturnValue(), 3, rgValues); 3065 !FXJSE_Value_IsBoolean(argOne.get()) &&
3066 !FXJSE_Value_IsUTF8String(argOne.get()) &&
3067 !FXJSE_Value_IsNull(argOne.get()) &&
3068 !FXJSE_Value_IsNumber(argOne.get())) {
3069 pContext->ThrowException(XFA_IDS_ARGUMENT_MISMATCH);
3070 return;
3071 }
3072
3073 if (FXJSE_Value_IsBoolean(argOne.get()) ||
3074 FXJSE_Value_IsUTF8String(argOne.get()) ||
3075 FXJSE_Value_IsNumber(argOne.get())) {
3076 FXJSE_Value_Set(args.GetReturnValue(), argOne.get());
3077 return;
3078 }
3079
3080 CFXJSE_Value* rgValues[3];
3081 for (int32_t i = 0; i < 3; i++)
3082 rgValues[i] = new CFXJSE_Value(pIsolate);
3083
3084 int intVal = 3;
3085 if (FXJSE_Value_IsNull(argOne.get())) {
3086 intVal = 4;
3087 FXJSE_Value_SetNull(rgValues[2]);
3088 } else if (FXJSE_Value_IsArray(argOne.get())) {
3089 #ifndef NDEBUG
3090 std::unique_ptr<CFXJSE_Value> lengthValue(new CFXJSE_Value(pIsolate));
3091 FXJSE_Value_GetObjectProp(argOne.get(), "length", lengthValue.get());
3092 ASSERT(FXJSE_Value_ToInteger(lengthValue.get()) >= 3);
3093 #endif
3094
3095 std::unique_ptr<CFXJSE_Value> propertyValue(new CFXJSE_Value(pIsolate));
3096 std::unique_ptr<CFXJSE_Value> jsObjectValue(new CFXJSE_Value(pIsolate));
3097 FXJSE_Value_GetObjectPropByIdx(argOne.get(), 1, propertyValue.get());
3098 FXJSE_Value_GetObjectPropByIdx(argOne.get(), 2, jsObjectValue.get());
3099 if (!FXJSE_Value_IsNull(propertyValue.get()) ||
3100 FXJSE_Value_IsNull(jsObjectValue.get())) {
3066 for (int32_t i = 0; i < 3; i++) 3101 for (int32_t i = 0; i < 3; i++)
3067 delete rgValues[i]; 3102 delete rgValues[i];
3068 3103
3069 } else if (FXJSE_Value_IsArray(argOne.get())) { 3104 pContext->ThrowException(XFA_IDS_ARGUMENT_MISMATCH);
3070 #ifndef NDEBUG 3105 return;
3071 std::unique_ptr<CFXJSE_Value> lengthValue(new CFXJSE_Value(pIsolate)); 3106 }
3072 FXJSE_Value_GetObjectProp(argOne.get(), "length", lengthValue.get());
3073 ASSERT(FXJSE_Value_ToInteger(lengthValue.get()) >= 3);
3074 #endif
3075 std::unique_ptr<CFXJSE_Value> propertyValue(new CFXJSE_Value(pIsolate));
3076 std::unique_ptr<CFXJSE_Value> jsObjectValue(new CFXJSE_Value(pIsolate));
3077 FXJSE_Value_GetObjectPropByIdx(argOne.get(), 1, propertyValue.get());
3078 FXJSE_Value_GetObjectPropByIdx(argOne.get(), 2, jsObjectValue.get());
3079 if (FXJSE_Value_IsNull(jsObjectValue.get())) {
3080 pContext->ThrowException(XFA_IDS_ARGUMENT_MISMATCH);
3081 } else if (FXJSE_Value_IsNull(propertyValue.get()) &&
3082 (!FXJSE_Value_IsNull(jsObjectValue.get()))) {
3083 CFXJSE_Value* rgValues[3];
3084 for (int32_t i = 0; i < 3; i++)
3085 rgValues[i] = new CFXJSE_Value(pIsolate);
3086 3107
3087 FXJSE_Value_SetInteger(rgValues[0], 3); 3108 FXJSE_Value_Set(rgValues[2], jsObjectValue.get());
3088 FXJSE_Value_SetNull(rgValues[1]); 3109 } else if (FXJSE_Value_IsObject(argOne.get())) {
3089 FXJSE_Value_Set(rgValues[2], jsObjectValue.get()); 3110 FXJSE_Value_Set(rgValues[2], argOne.get());
3090 FXJSE_Value_SetArray(args.GetReturnValue(), 3, rgValues); 3111 }
3091 for (int32_t i = 0; i < 3; i++)
3092 delete rgValues[i];
3093 3112
3094 } else { 3113 FXJSE_Value_SetInteger(rgValues[0], intVal);
3095 pContext->ThrowException(XFA_IDS_ARGUMENT_MISMATCH); 3114 FXJSE_Value_SetNull(rgValues[1]);
3096 } 3115 FXJSE_Value_SetArray(args.GetReturnValue(), 3, rgValues);
3097 } else if (FXJSE_Value_IsObject(argOne.get())) {
3098 CFXJSE_Value* rgValues[3];
3099 for (int32_t i = 0; i < 3; i++)
3100 rgValues[i] = new CFXJSE_Value(pIsolate);
3101 3116
3102 FXJSE_Value_SetInteger(rgValues[0], 3); 3117 for (int32_t i = 0; i < 3; i++)
3103 FXJSE_Value_SetNull(rgValues[1]); 3118 delete rgValues[i];
3104 FXJSE_Value_Set(rgValues[2], argOne.get());
3105 FXJSE_Value_SetArray(args.GetReturnValue(), 3, rgValues);
3106
3107 for (int32_t i = 0; i < 3; i++)
3108 delete rgValues[i];
3109 } else if (FXJSE_Value_IsBoolean(argOne.get()) ||
3110 FXJSE_Value_IsUTF8String(argOne.get()) ||
3111 FXJSE_Value_IsNumber(argOne.get())) {
3112 FXJSE_Value_Set(args.GetReturnValue(), argOne.get());
3113 } else {
3114 pContext->ThrowException(XFA_IDS_ARGUMENT_MISMATCH);
3115 }
3116 } else {
3117 pContext->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Ref");
3118 }
3119 } 3119 }
3120 3120
3121 // static 3121 // static
3122 void CXFA_FM2JSContext::UnitType(CFXJSE_Value* pThis, 3122 void CXFA_FM2JSContext::UnitType(CFXJSE_Value* pThis,
3123 const CFX_ByteStringC& szFuncName, 3123 const CFX_ByteStringC& szFuncName,
3124 CFXJSE_Arguments& args) { 3124 CFXJSE_Arguments& args) {
3125 if (args.GetLength() == 1) { 3125 if (args.GetLength() != 1) {
3126 std::unique_ptr<CFXJSE_Value> unitspanValue =
3127 GetSimpleValue(pThis, args, 0);
3128 if (FXJSE_Value_IsNull(unitspanValue.get())) {
3129 FXJSE_Value_SetNull(args.GetReturnValue());
3130 return;
3131 }
3132 CFX_ByteString unitspanString;
3133 ValueToUTF8String(unitspanValue.get(), unitspanString);
3134 if (unitspanString.IsEmpty()) {
3135 FXJSE_Value_SetUTF8String(args.GetReturnValue(), "in");
3136 } else {
3137 enum XFA_FM2JS_VALUETYPE_ParserStatus {
3138 VALUETYPE_START,
3139 VALUETYPE_HAVEINVALIDCHAR,
3140 VALUETYPE_HAVEDIGIT,
3141 VALUETYPE_HAVEDIGITWHITE,
3142 VALUETYPE_ISCM,
3143 VALUETYPE_ISMM,
3144 VALUETYPE_ISPT,
3145 VALUETYPE_ISMP,
3146 VALUETYPE_ISIN,
3147 };
3148 unitspanString.MakeLower();
3149 CFX_WideString wsTypeString =
3150 CFX_WideString::FromUTF8(unitspanString.AsStringC());
3151 const FX_WCHAR* pData = wsTypeString.c_str();
3152 int32_t u = 0;
3153 int32_t uLen = wsTypeString.GetLength();
3154 while (IsWhitespace(pData[u]))
3155 u++;
3156
3157 XFA_FM2JS_VALUETYPE_ParserStatus eParserStatus = VALUETYPE_START;
3158 FX_WCHAR typeChar;
3159 while (u < uLen) {
3160 typeChar = pData[u];
3161 if (IsWhitespace(typeChar)) {
3162 if (eParserStatus == VALUETYPE_HAVEDIGIT ||
3163 eParserStatus == VALUETYPE_HAVEDIGITWHITE) {
3164 eParserStatus = VALUETYPE_HAVEDIGITWHITE;
3165 } else {
3166 eParserStatus = VALUETYPE_ISIN;
3167 break;
3168 }
3169 } else if ((typeChar >= '0' && typeChar <= '9') || typeChar == '-' ||
3170 typeChar == '.') {
3171 if (eParserStatus == VALUETYPE_HAVEDIGITWHITE) {
3172 eParserStatus = VALUETYPE_ISIN;
3173 break;
3174 } else {
3175 eParserStatus = VALUETYPE_HAVEDIGIT;
3176 }
3177 } else if ((typeChar == 'c' || typeChar == 'p') && (u + 1 < uLen)) {
3178 FX_WCHAR nextChar = pData[u + 1];
3179 if ((eParserStatus == VALUETYPE_START ||
3180 eParserStatus == VALUETYPE_HAVEDIGIT ||
3181 eParserStatus == VALUETYPE_HAVEDIGITWHITE) &&
3182 (nextChar > '9' || nextChar < '0') && nextChar != '.' &&
3183 nextChar != '-') {
3184 eParserStatus = (typeChar == 'c') ? VALUETYPE_ISCM : VALUETYPE_ISPT;
3185 break;
3186 } else {
3187 eParserStatus = VALUETYPE_HAVEINVALIDCHAR;
3188 }
3189 } else if (typeChar == 'm' && (u + 1 < uLen)) {
3190 FX_WCHAR nextChar = pData[u + 1];
3191 if ((eParserStatus == VALUETYPE_START ||
3192 eParserStatus == VALUETYPE_HAVEDIGIT ||
3193 eParserStatus == VALUETYPE_HAVEDIGITWHITE) &&
3194 (nextChar > '9' || nextChar < '0') && nextChar != '.' &&
3195 nextChar != '-') {
3196 eParserStatus = VALUETYPE_ISMM;
3197 if (nextChar == 'p' ||
3198 ((u + 5 < uLen) && pData[u + 1] == 'i' && pData[u + 2] == 'l' &&
3199 pData[u + 3] == 'l' && pData[u + 4] == 'i' &&
3200 pData[u + 5] == 'p')) {
3201 eParserStatus = VALUETYPE_ISMP;
3202 }
3203 break;
3204 }
3205 } else {
3206 eParserStatus = VALUETYPE_HAVEINVALIDCHAR;
3207 }
3208 u++;
3209 }
3210 switch (eParserStatus) {
3211 case VALUETYPE_ISCM:
3212 FXJSE_Value_SetUTF8String(args.GetReturnValue(), "cm");
3213 break;
3214 case VALUETYPE_ISMM:
3215 FXJSE_Value_SetUTF8String(args.GetReturnValue(), "mm");
3216 break;
3217 case VALUETYPE_ISPT:
3218 FXJSE_Value_SetUTF8String(args.GetReturnValue(), "pt");
3219 break;
3220 case VALUETYPE_ISMP:
3221 FXJSE_Value_SetUTF8String(args.GetReturnValue(), "mp");
3222 break;
3223 default:
3224 FXJSE_Value_SetUTF8String(args.GetReturnValue(), "in");
3225 break;
3226 }
3227 }
3228 } else {
3229 ToJSContext(pThis, nullptr) 3126 ToJSContext(pThis, nullptr)
3230 ->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"UnitType"); 3127 ->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"UnitType");
3128 return;
3129 }
3130
3131 std::unique_ptr<CFXJSE_Value> unitspanValue = GetSimpleValue(pThis, args, 0);
3132 if (FXJSE_Value_IsNull(unitspanValue.get())) {
3133 FXJSE_Value_SetNull(args.GetReturnValue());
3134 return;
3135 }
3136
3137 CFX_ByteString unitspanString;
3138 ValueToUTF8String(unitspanValue.get(), unitspanString);
3139 if (unitspanString.IsEmpty()) {
3140 FXJSE_Value_SetUTF8String(args.GetReturnValue(), "in");
3141 return;
3142 }
3143
3144 enum XFA_FM2JS_VALUETYPE_ParserStatus {
3145 VALUETYPE_START,
3146 VALUETYPE_HAVEINVALIDCHAR,
3147 VALUETYPE_HAVEDIGIT,
3148 VALUETYPE_HAVEDIGITWHITE,
3149 VALUETYPE_ISCM,
3150 VALUETYPE_ISMM,
3151 VALUETYPE_ISPT,
3152 VALUETYPE_ISMP,
3153 VALUETYPE_ISIN,
3154 };
3155 unitspanString.MakeLower();
3156 CFX_WideString wsTypeString =
3157 CFX_WideString::FromUTF8(unitspanString.AsStringC());
3158 const FX_WCHAR* pData = wsTypeString.c_str();
3159 int32_t u = 0;
3160 int32_t uLen = wsTypeString.GetLength();
3161 while (IsWhitespace(pData[u]))
3162 u++;
3163
3164 XFA_FM2JS_VALUETYPE_ParserStatus eParserStatus = VALUETYPE_START;
3165 FX_WCHAR typeChar;
3166 // TODO(dsinclair): Cleanup this parser, figure out what the various checks
3167 // are for.
3168 while (u < uLen) {
3169 typeChar = pData[u];
3170 if (IsWhitespace(typeChar)) {
3171 if (eParserStatus != VALUETYPE_HAVEDIGIT &&
3172 eParserStatus != VALUETYPE_HAVEDIGITWHITE) {
3173 eParserStatus = VALUETYPE_ISIN;
3174 break;
3175 }
3176 eParserStatus = VALUETYPE_HAVEDIGITWHITE;
3177 } else if ((typeChar >= '0' && typeChar <= '9') || typeChar == '-' ||
3178 typeChar == '.') {
3179 if (eParserStatus == VALUETYPE_HAVEDIGITWHITE) {
3180 eParserStatus = VALUETYPE_ISIN;
3181 break;
3182 }
3183 eParserStatus = VALUETYPE_HAVEDIGIT;
3184 } else if ((typeChar == 'c' || typeChar == 'p') && (u + 1 < uLen)) {
3185 FX_WCHAR nextChar = pData[u + 1];
3186 if ((eParserStatus == VALUETYPE_START ||
3187 eParserStatus == VALUETYPE_HAVEDIGIT ||
3188 eParserStatus == VALUETYPE_HAVEDIGITWHITE) &&
3189 (nextChar > '9' || nextChar < '0') && nextChar != '.' &&
3190 nextChar != '-') {
3191 eParserStatus = (typeChar == 'c') ? VALUETYPE_ISCM : VALUETYPE_ISPT;
3192 break;
3193 }
3194 eParserStatus = VALUETYPE_HAVEINVALIDCHAR;
3195 } else if (typeChar == 'm' && (u + 1 < uLen)) {
3196 FX_WCHAR nextChar = pData[u + 1];
3197 if ((eParserStatus == VALUETYPE_START ||
3198 eParserStatus == VALUETYPE_HAVEDIGIT ||
3199 eParserStatus == VALUETYPE_HAVEDIGITWHITE) &&
3200 (nextChar > '9' || nextChar < '0') && nextChar != '.' &&
3201 nextChar != '-') {
3202 eParserStatus = VALUETYPE_ISMM;
3203 if (nextChar == 'p' || ((u + 5 < uLen) && pData[u + 1] == 'i' &&
3204 pData[u + 2] == 'l' && pData[u + 3] == 'l' &&
3205 pData[u + 4] == 'i' && pData[u + 5] == 'p')) {
3206 eParserStatus = VALUETYPE_ISMP;
3207 }
3208 break;
3209 }
3210 } else {
3211 eParserStatus = VALUETYPE_HAVEINVALIDCHAR;
3212 }
3213 u++;
3214 }
3215 switch (eParserStatus) {
3216 case VALUETYPE_ISCM:
3217 FXJSE_Value_SetUTF8String(args.GetReturnValue(), "cm");
3218 break;
3219 case VALUETYPE_ISMM:
3220 FXJSE_Value_SetUTF8String(args.GetReturnValue(), "mm");
3221 break;
3222 case VALUETYPE_ISPT:
3223 FXJSE_Value_SetUTF8String(args.GetReturnValue(), "pt");
3224 break;
3225 case VALUETYPE_ISMP:
3226 FXJSE_Value_SetUTF8String(args.GetReturnValue(), "mp");
3227 break;
3228 default:
3229 FXJSE_Value_SetUTF8String(args.GetReturnValue(), "in");
3230 break;
3231 } 3231 }
3232 } 3232 }
3233 3233
3234 // static 3234 // static
3235 void CXFA_FM2JSContext::UnitValue(CFXJSE_Value* pThis, 3235 void CXFA_FM2JSContext::UnitValue(CFXJSE_Value* pThis,
3236 const CFX_ByteStringC& szFuncName, 3236 const CFX_ByteStringC& szFuncName,
3237 CFXJSE_Arguments& args) { 3237 CFXJSE_Arguments& args) {
3238 int32_t argc = args.GetLength(); 3238 int32_t argc = args.GetLength();
3239 if ((argc == 1) || (argc == 2)) { 3239 if (argc < 1 || argc > 2) {
3240 std::unique_ptr<CFXJSE_Value> unitspanValue =
3241 GetSimpleValue(pThis, args, 0);
3242 CFX_ByteString unitspanString;
3243 FX_DOUBLE dFirstNumber = 0;
3244 CFX_ByteString strFirstUnit;
3245 CFX_ByteString strUnit;
3246 if (FXJSE_Value_IsNull(unitspanValue.get())) {
3247 FXJSE_Value_SetNull(args.GetReturnValue());
3248 } else {
3249 ValueToUTF8String(unitspanValue.get(), unitspanString);
3250 const FX_CHAR* pData = unitspanString.c_str();
3251 if (pData) {
3252 int32_t u = 0;
3253 while (IsWhitespace(pData[u]))
3254 ++u;
3255
3256 while (u < unitspanString.GetLength()) {
3257 if ((pData[u] > '9' || pData[u] < '0') && pData[u] != '.' &&
3258 pData[u] != '-') {
3259 break;
3260 }
3261 ++u;
3262 }
3263 FX_CHAR* pTemp = nullptr;
3264 dFirstNumber = strtod(pData, &pTemp);
3265 while (IsWhitespace(pData[u]))
3266 ++u;
3267
3268 int32_t uLen = unitspanString.GetLength();
3269 while (u < uLen) {
3270 if (pData[u] == ' ') {
3271 break;
3272 }
3273 strFirstUnit += pData[u];
3274 ++u;
3275 }
3276 strFirstUnit.MakeLower();
3277 if (argc == 2) {
3278 std::unique_ptr<CFXJSE_Value> unitValue =
3279 GetSimpleValue(pThis, args, 1);
3280 CFX_ByteString unitTempString;
3281 ValueToUTF8String(unitValue.get(), unitTempString);
3282 const FX_CHAR* pChar = unitTempString.c_str();
3283 int32_t uVal = 0;
3284 while (IsWhitespace(pChar[uVal]))
3285 ++uVal;
3286
3287 while (uVal < unitTempString.GetLength()) {
3288 if ((pChar[uVal] > '9' || pChar[uVal] < '0') &&
3289 pChar[uVal] != '.') {
3290 break;
3291 }
3292 ++uVal;
3293 }
3294 while (IsWhitespace(pChar[uVal]))
3295 ++uVal;
3296
3297 int32_t uValLen = unitTempString.GetLength();
3298 while (uVal < uValLen) {
3299 if (pChar[uVal] == ' ') {
3300 break;
3301 }
3302 strUnit += pChar[uVal];
3303 ++uVal;
3304 }
3305 strUnit.MakeLower();
3306 } else {
3307 strUnit = strFirstUnit;
3308 }
3309 FX_DOUBLE dResult = 0;
3310 if (strFirstUnit == "in" || strFirstUnit == "inches") {
3311 if (strUnit == "mm" || strUnit == "millimeters") {
3312 dResult = dFirstNumber * 25.4;
3313 } else if (strUnit == "cm" || strUnit == "centimeters") {
3314 dResult = dFirstNumber * 2.54;
3315 } else if (strUnit == "pt" || strUnit == "points") {
3316 dResult = dFirstNumber / 72;
3317 } else if (strUnit == "mp" || strUnit == "millipoints") {
3318 dResult = dFirstNumber / 72000;
3319 } else {
3320 dResult = dFirstNumber;
3321 }
3322 } else if (strFirstUnit == "mm" || strFirstUnit == "millimeters") {
3323 if (strUnit == "mm" || strUnit == "millimeters") {
3324 dResult = dFirstNumber;
3325 } else if (strUnit == "cm" || strUnit == "centimeters") {
3326 dResult = dFirstNumber / 10;
3327 } else if (strUnit == "pt" || strUnit == "points") {
3328 dResult = dFirstNumber / 25.4 / 72;
3329 } else if (strUnit == "mp" || strUnit == "millipoints") {
3330 dResult = dFirstNumber / 25.4 / 72000;
3331 } else {
3332 dResult = dFirstNumber / 25.4;
3333 }
3334 } else if (strFirstUnit == "cm" || strFirstUnit == "centimeters") {
3335 if (strUnit == "mm" || strUnit == "millimeters") {
3336 dResult = dFirstNumber * 10;
3337 } else if (strUnit == "cm" || strUnit == "centimeters") {
3338 dResult = dFirstNumber;
3339 } else if (strUnit == "pt" || strUnit == "points") {
3340 dResult = dFirstNumber / 2.54 / 72;
3341 } else if (strUnit == "mp" || strUnit == "millipoints") {
3342 dResult = dFirstNumber / 2.54 / 72000;
3343 } else {
3344 dResult = dFirstNumber / 2.54;
3345 }
3346 } else if (strFirstUnit == "pt" || strFirstUnit == "points") {
3347 if (strUnit == "mm" || strUnit == "millimeters") {
3348 dResult = dFirstNumber / 72 * 25.4;
3349 } else if (strUnit == "cm" || strUnit == "centimeters") {
3350 dResult = dFirstNumber / 72 * 2.54;
3351 } else if (strUnit == "pt" || strUnit == "points") {
3352 dResult = dFirstNumber;
3353 } else if (strUnit == "mp" || strUnit == "millipoints") {
3354 dResult = dFirstNumber * 1000;
3355 } else {
3356 dResult = dFirstNumber / 72;
3357 }
3358 } else if (strFirstUnit == "mp" || strFirstUnit == "millipoints") {
3359 if (strUnit == "mm" || strUnit == "millimeters") {
3360 dResult = dFirstNumber / 72000 * 25.4;
3361 } else if (strUnit == "cm" || strUnit == "centimeters") {
3362 dResult = dFirstNumber / 72000 * 2.54;
3363 } else if (strUnit == "pt" || strUnit == "points") {
3364 dResult = dFirstNumber / 1000;
3365 } else if (strUnit == "mp" || strUnit == "millipoints") {
3366 dResult = dFirstNumber;
3367 } else {
3368 dResult = dFirstNumber / 72000;
3369 }
3370 }
3371 FXJSE_Value_SetDouble(args.GetReturnValue(), dResult);
3372 } else {
3373 FXJSE_Value_SetInteger(args.GetReturnValue(), 0);
3374 }
3375 }
3376 } else {
3377 ToJSContext(pThis, nullptr) 3240 ToJSContext(pThis, nullptr)
3378 ->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"UnitValue"); 3241 ->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"UnitValue");
3242 return;
3379 } 3243 }
3244
3245 std::unique_ptr<CFXJSE_Value> unitspanValue = GetSimpleValue(pThis, args, 0);
3246 if (FXJSE_Value_IsNull(unitspanValue.get())) {
3247 FXJSE_Value_SetNull(args.GetReturnValue());
3248 return;
3249 }
3250
3251 CFX_ByteString unitspanString;
3252 ValueToUTF8String(unitspanValue.get(), unitspanString);
3253 const FX_CHAR* pData = unitspanString.c_str();
3254 if (!pData) {
3255 FXJSE_Value_SetInteger(args.GetReturnValue(), 0);
3256 return;
3257 }
3258
3259 int32_t u = 0;
3260 while (IsWhitespace(pData[u]))
3261 ++u;
3262
3263 while (u < unitspanString.GetLength()) {
3264 if ((pData[u] > '9' || pData[u] < '0') && pData[u] != '.' &&
3265 pData[u] != '-') {
3266 break;
3267 }
3268 ++u;
3269 }
3270
3271 FX_CHAR* pTemp = nullptr;
3272 FX_DOUBLE dFirstNumber = strtod(pData, &pTemp);
3273 while (IsWhitespace(pData[u]))
3274 ++u;
3275
3276 int32_t uLen = unitspanString.GetLength();
3277 CFX_ByteString strFirstUnit;
3278 while (u < uLen) {
3279 if (pData[u] == ' ')
3280 break;
3281
3282 strFirstUnit += pData[u];
3283 ++u;
3284 }
3285 strFirstUnit.MakeLower();
3286
3287 CFX_ByteString strUnit;
3288 if (argc > 1) {
3289 std::unique_ptr<CFXJSE_Value> unitValue = GetSimpleValue(pThis, args, 1);
3290 CFX_ByteString unitTempString;
3291 ValueToUTF8String(unitValue.get(), unitTempString);
3292 const FX_CHAR* pChar = unitTempString.c_str();
3293 int32_t uVal = 0;
3294 while (IsWhitespace(pChar[uVal]))
3295 ++uVal;
3296
3297 while (uVal < unitTempString.GetLength()) {
3298 if ((pChar[uVal] > '9' || pChar[uVal] < '0') && pChar[uVal] != '.') {
3299 break;
3300 }
3301 ++uVal;
3302 }
3303 while (IsWhitespace(pChar[uVal]))
3304 ++uVal;
3305
3306 int32_t uValLen = unitTempString.GetLength();
3307 while (uVal < uValLen) {
3308 if (pChar[uVal] == ' ')
3309 break;
3310
3311 strUnit += pChar[uVal];
3312 ++uVal;
3313 }
3314 strUnit.MakeLower();
3315 } else {
3316 strUnit = strFirstUnit;
3317 }
3318
3319 FX_DOUBLE dResult = 0;
3320 if (strFirstUnit == "in" || strFirstUnit == "inches") {
3321 if (strUnit == "mm" || strUnit == "millimeters")
3322 dResult = dFirstNumber * 25.4;
3323 else if (strUnit == "cm" || strUnit == "centimeters")
3324 dResult = dFirstNumber * 2.54;
3325 else if (strUnit == "pt" || strUnit == "points")
3326 dResult = dFirstNumber / 72;
3327 else if (strUnit == "mp" || strUnit == "millipoints")
3328 dResult = dFirstNumber / 72000;
3329 else
3330 dResult = dFirstNumber;
3331 } else if (strFirstUnit == "mm" || strFirstUnit == "millimeters") {
3332 if (strUnit == "mm" || strUnit == "millimeters")
3333 dResult = dFirstNumber;
3334 else if (strUnit == "cm" || strUnit == "centimeters")
3335 dResult = dFirstNumber / 10;
3336 else if (strUnit == "pt" || strUnit == "points")
3337 dResult = dFirstNumber / 25.4 / 72;
3338 else if (strUnit == "mp" || strUnit == "millipoints")
3339 dResult = dFirstNumber / 25.4 / 72000;
3340 else
3341 dResult = dFirstNumber / 25.4;
3342 } else if (strFirstUnit == "cm" || strFirstUnit == "centimeters") {
3343 if (strUnit == "mm" || strUnit == "millimeters")
3344 dResult = dFirstNumber * 10;
3345 else if (strUnit == "cm" || strUnit == "centimeters")
3346 dResult = dFirstNumber;
3347 else if (strUnit == "pt" || strUnit == "points")
3348 dResult = dFirstNumber / 2.54 / 72;
3349 else if (strUnit == "mp" || strUnit == "millipoints")
3350 dResult = dFirstNumber / 2.54 / 72000;
3351 else
3352 dResult = dFirstNumber / 2.54;
3353 } else if (strFirstUnit == "pt" || strFirstUnit == "points") {
3354 if (strUnit == "mm" || strUnit == "millimeters")
3355 dResult = dFirstNumber / 72 * 25.4;
3356 else if (strUnit == "cm" || strUnit == "centimeters")
3357 dResult = dFirstNumber / 72 * 2.54;
3358 else if (strUnit == "pt" || strUnit == "points")
3359 dResult = dFirstNumber;
3360 else if (strUnit == "mp" || strUnit == "millipoints")
3361 dResult = dFirstNumber * 1000;
3362 else
3363 dResult = dFirstNumber / 72;
3364 } else if (strFirstUnit == "mp" || strFirstUnit == "millipoints") {
3365 if (strUnit == "mm" || strUnit == "millimeters")
3366 dResult = dFirstNumber / 72000 * 25.4;
3367 else if (strUnit == "cm" || strUnit == "centimeters")
3368 dResult = dFirstNumber / 72000 * 2.54;
3369 else if (strUnit == "pt" || strUnit == "points")
3370 dResult = dFirstNumber / 1000;
3371 else if (strUnit == "mp" || strUnit == "millipoints")
3372 dResult = dFirstNumber;
3373 else
3374 dResult = dFirstNumber / 72000;
3375 }
3376 FXJSE_Value_SetDouble(args.GetReturnValue(), dResult);
3380 } 3377 }
3381 3378
3382 // static 3379 // static
3383 void CXFA_FM2JSContext::At(CFXJSE_Value* pThis, 3380 void CXFA_FM2JSContext::At(CFXJSE_Value* pThis,
3384 const CFX_ByteStringC& szFuncName, 3381 const CFX_ByteStringC& szFuncName,
3385 CFXJSE_Arguments& args) { 3382 CFXJSE_Arguments& args) {
3386 if (args.GetLength() == 2) { 3383 if (args.GetLength() != 2) {
3387 std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0);
3388 std::unique_ptr<CFXJSE_Value> argTwo = GetSimpleValue(pThis, args, 1);
3389 if (ValueIsNull(pThis, argOne.get()) || ValueIsNull(pThis, argTwo.get())) {
3390 FXJSE_Value_SetNull(args.GetReturnValue());
3391 } else {
3392 CFX_ByteString stringTwo;
3393 ValueToUTF8String(argTwo.get(), stringTwo);
3394 if (stringTwo.IsEmpty()) {
3395 FXJSE_Value_SetInteger(args.GetReturnValue(), 1);
3396 } else {
3397 CFX_ByteString stringOne;
3398 ValueToUTF8String(argOne.get(), stringOne);
3399 FX_STRSIZE iPosition = stringOne.Find(stringTwo.AsStringC());
3400 FXJSE_Value_SetInteger(args.GetReturnValue(), iPosition + 1);
3401 }
3402 }
3403 } else {
3404 ToJSContext(pThis, nullptr) 3384 ToJSContext(pThis, nullptr)
3405 ->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"At"); 3385 ->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"At");
3386 return;
3406 } 3387 }
3388
3389 std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0);
3390 std::unique_ptr<CFXJSE_Value> argTwo = GetSimpleValue(pThis, args, 1);
3391 if (ValueIsNull(pThis, argOne.get()) || ValueIsNull(pThis, argTwo.get())) {
3392 FXJSE_Value_SetNull(args.GetReturnValue());
3393 return;
3394 }
3395
3396 CFX_ByteString stringTwo;
3397 ValueToUTF8String(argTwo.get(), stringTwo);
3398 if (stringTwo.IsEmpty()) {
3399 FXJSE_Value_SetInteger(args.GetReturnValue(), 1);
3400 return;
3401 }
3402
3403 CFX_ByteString stringOne;
3404 ValueToUTF8String(argOne.get(), stringOne);
3405 FX_STRSIZE iPosition = stringOne.Find(stringTwo.AsStringC());
3406 FXJSE_Value_SetInteger(args.GetReturnValue(), iPosition + 1);
3407 } 3407 }
3408 3408
3409 // static 3409 // static
3410 void CXFA_FM2JSContext::Concat(CFXJSE_Value* pThis, 3410 void CXFA_FM2JSContext::Concat(CFXJSE_Value* pThis,
3411 const CFX_ByteStringC& szFuncName, 3411 const CFX_ByteStringC& szFuncName,
3412 CFXJSE_Arguments& args) { 3412 CFXJSE_Arguments& args) {
3413 int32_t argc = args.GetLength(); 3413 int32_t argc = args.GetLength();
3414 if (argc > 0) { 3414 if (argc < 1) {
3415 CFX_ByteString resultString;
3416 FX_BOOL bAllNull = TRUE;
3417
3418 for (int32_t i = 0; i < argc; i++) {
3419 std::unique_ptr<CFXJSE_Value> value = GetSimpleValue(pThis, args, i);
3420 if (!ValueIsNull(pThis, value.get())) {
3421 CFX_ByteString valueStr;
3422 ValueToUTF8String(value.get(), valueStr);
3423 resultString += valueStr;
3424 bAllNull = FALSE;
3425 }
3426 }
3427
3428 if (bAllNull) {
3429 FXJSE_Value_SetNull(args.GetReturnValue());
3430 } else {
3431 FXJSE_Value_SetUTF8String(args.GetReturnValue(),
3432 resultString.AsStringC());
3433 }
3434 } else {
3435 ToJSContext(pThis, nullptr) 3415 ToJSContext(pThis, nullptr)
3436 ->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Concat"); 3416 ->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Concat");
3417 return;
3437 } 3418 }
3419
3420 CFX_ByteString resultString;
3421 FX_BOOL bAllNull = TRUE;
3422 for (int32_t i = 0; i < argc; i++) {
3423 std::unique_ptr<CFXJSE_Value> value = GetSimpleValue(pThis, args, i);
3424 if (ValueIsNull(pThis, value.get()))
3425 continue;
3426
3427 bAllNull = FALSE;
3428
3429 CFX_ByteString valueStr;
3430 ValueToUTF8String(value.get(), valueStr);
3431 resultString += valueStr;
3432 }
3433
3434 if (bAllNull) {
3435 FXJSE_Value_SetNull(args.GetReturnValue());
3436 return;
3437 }
3438
3439 FXJSE_Value_SetUTF8String(args.GetReturnValue(), resultString.AsStringC());
3438 } 3440 }
3439 3441
3440 // static 3442 // static
3441 void CXFA_FM2JSContext::Decode(CFXJSE_Value* pThis, 3443 void CXFA_FM2JSContext::Decode(CFXJSE_Value* pThis,
3442 const CFX_ByteStringC& szFuncName, 3444 const CFX_ByteStringC& szFuncName,
3443 CFXJSE_Arguments& args) { 3445 CFXJSE_Arguments& args) {
3444 int32_t argc = args.GetLength(); 3446 int32_t argc = args.GetLength();
3447 if (argc < 1 || argc > 2) {
3448 ToJSContext(pThis, nullptr)
3449 ->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Decode");
3450 return;
3451 }
3452
3445 if (argc == 1) { 3453 if (argc == 1) {
3446 std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0); 3454 std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0);
3447 if (ValueIsNull(pThis, argOne.get())) { 3455 if (ValueIsNull(pThis, argOne.get())) {
3448 FXJSE_Value_SetNull(args.GetReturnValue()); 3456 FXJSE_Value_SetNull(args.GetReturnValue());
3449 } else { 3457 return;
3450 CFX_ByteString toDecodeString;
3451 ValueToUTF8String(argOne.get(), toDecodeString);
3452 CFX_ByteTextBuf resultBuf;
3453 DecodeURL(toDecodeString.AsStringC(), resultBuf);
3454 FXJSE_Value_SetUTF8String(args.GetReturnValue(), resultBuf.AsStringC());
3455 } 3458 }
3456 } else if (argc == 2) { 3459
3457 std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0); 3460 CFX_ByteString toDecodeString;
3458 std::unique_ptr<CFXJSE_Value> argTwo = GetSimpleValue(pThis, args, 1); 3461 ValueToUTF8String(argOne.get(), toDecodeString);
3459 if (ValueIsNull(pThis, argOne.get()) || ValueIsNull(pThis, argTwo.get())) { 3462 CFX_ByteTextBuf resultBuf;
3460 FXJSE_Value_SetNull(args.GetReturnValue()); 3463 DecodeURL(toDecodeString.AsStringC(), resultBuf);
3461 } else { 3464 FXJSE_Value_SetUTF8String(args.GetReturnValue(), resultBuf.AsStringC());
3462 CFX_ByteString toDecodeString; 3465 return;
3463 ValueToUTF8String(argOne.get(), toDecodeString);
3464 CFX_ByteString identifyString;
3465 ValueToUTF8String(argTwo.get(), identifyString);
3466 CFX_ByteTextBuf resultBuf;
3467 if (identifyString.EqualNoCase("html")) {
3468 DecodeHTML(toDecodeString.AsStringC(), resultBuf);
3469 } else if (identifyString.EqualNoCase("xml")) {
3470 DecodeXML(toDecodeString.AsStringC(), resultBuf);
3471 } else {
3472 DecodeURL(toDecodeString.AsStringC(), resultBuf);
3473 }
3474 FXJSE_Value_SetUTF8String(args.GetReturnValue(), resultBuf.AsStringC());
3475 }
3476 } else {
3477 ToJSContext(pThis, nullptr)
3478 ->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Decode");
3479 } 3466 }
3467
3468 std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0);
3469 std::unique_ptr<CFXJSE_Value> argTwo = GetSimpleValue(pThis, args, 1);
3470 if (ValueIsNull(pThis, argOne.get()) || ValueIsNull(pThis, argTwo.get())) {
3471 FXJSE_Value_SetNull(args.GetReturnValue());
3472 return;
3473 }
3474
3475 CFX_ByteString toDecodeString;
3476 ValueToUTF8String(argOne.get(), toDecodeString);
3477
3478 CFX_ByteString identifyString;
3479 ValueToUTF8String(argTwo.get(), identifyString);
3480
3481 CFX_ByteTextBuf resultBuf;
3482 if (identifyString.EqualNoCase("html"))
3483 DecodeHTML(toDecodeString.AsStringC(), resultBuf);
3484 else if (identifyString.EqualNoCase("xml"))
3485 DecodeXML(toDecodeString.AsStringC(), resultBuf);
3486 else
3487 DecodeURL(toDecodeString.AsStringC(), resultBuf);
3488
3489 FXJSE_Value_SetUTF8String(args.GetReturnValue(), resultBuf.AsStringC());
3480 } 3490 }
3481 3491
3482 // static 3492 // static
3483 void CXFA_FM2JSContext::DecodeURL(const CFX_ByteStringC& szURLString, 3493 void CXFA_FM2JSContext::DecodeURL(const CFX_ByteStringC& szURLString,
3484 CFX_ByteTextBuf& szResultString) { 3494 CFX_ByteTextBuf& szResultString) {
3485 CFX_WideString wsURLString = CFX_WideString::FromUTF8(szURLString); 3495 CFX_WideString wsURLString = CFX_WideString::FromUTF8(szURLString);
3486 const FX_WCHAR* pData = wsURLString.c_str(); 3496 const FX_WCHAR* pData = wsURLString.c_str();
3487 int32_t iLen = wsURLString.GetLength();
3488 int32_t i = 0; 3497 int32_t i = 0;
3489 FX_WCHAR ch = 0;
3490 FX_WCHAR chTemp = 0;
3491 CFX_WideTextBuf wsResultBuf; 3498 CFX_WideTextBuf wsResultBuf;
3492 while (i < iLen) { 3499 while (i < wsURLString.GetLength()) {
3493 ch = pData[i]; 3500 FX_WCHAR ch = pData[i];
3494 if ('%' == ch) { 3501 if ('%' != ch) {
3495 chTemp = 0; 3502 wsResultBuf.AppendChar(ch);
3496 int32_t iCount = 0; 3503 ++i;
3497 while (iCount < 2) { 3504 continue;
3498 ++i; 3505 }
3499 ch = pData[i]; 3506
3500 if (ch <= '9' && ch >= '0') { 3507 FX_WCHAR chTemp = 0;
3501 if (!iCount) { 3508 int32_t iCount = 0;
3502 chTemp += (ch - '0') * 16; 3509 while (iCount < 2) {
3503 } else { 3510 ++i;
3504 chTemp += (ch - '0'); 3511 ch = pData[i];
3505 } 3512 if (ch <= '9' && ch >= '0') {
3506 } else { 3513 // TODO(dsinclair): Premultiply and add rather then scale.
3507 if (ch <= 'F' && ch >= 'A') { 3514 chTemp += (ch - '0') * (!iCount ? 16 : 1);
3508 if (!iCount) { 3515 } else if (ch <= 'F' && ch >= 'A') {
3509 chTemp += (ch - 'A' + 10) * 16; 3516 chTemp += (ch - 'A' + 10) * (!iCount ? 16 : 1);
3510 } else { 3517 } else if (ch <= 'f' && ch >= 'a') {
3511 chTemp += (ch - 'A' + 10); 3518 chTemp += (ch - 'a' + 10) * (!iCount ? 16 : 1);
3512 } 3519 } else {
3513 } else if (ch <= 'f' && ch >= 'a') { 3520 wsResultBuf.Clear();
3514 if (!iCount) { 3521 return;
3515 chTemp += (ch - 'a' + 10) * 16;
3516 } else {
3517 chTemp += (ch - 'a' + 10);
3518 }
3519 } else {
3520 wsResultBuf.Clear();
3521 return;
3522 }
3523 }
3524 ++iCount;
3525 } 3522 }
3526 wsResultBuf.AppendChar(chTemp); 3523 ++iCount;
3527 } else {
3528 wsResultBuf.AppendChar(ch);
3529 } 3524 }
3525 wsResultBuf.AppendChar(chTemp);
3530 ++i; 3526 ++i;
3531 } 3527 }
3532 wsResultBuf.AppendChar(0); 3528 wsResultBuf.AppendChar(0);
3529
3533 szResultString.Clear(); 3530 szResultString.Clear();
3534 szResultString << FX_UTF8Encode(wsResultBuf.GetBuffer(), 3531 szResultString << FX_UTF8Encode(wsResultBuf.GetBuffer(),
3535 wsResultBuf.GetLength()) 3532 wsResultBuf.GetLength())
3536 .AsStringC(); 3533 .AsStringC();
3537 } 3534 }
3538 3535
3539 // static 3536 // static
3540 void CXFA_FM2JSContext::DecodeHTML(const CFX_ByteStringC& szHTMLString, 3537 void CXFA_FM2JSContext::DecodeHTML(const CFX_ByteStringC& szHTMLString,
3541 CFX_ByteTextBuf& szResultString) { 3538 CFX_ByteTextBuf& szResultString) {
3542 CFX_WideString wsHTMLString = CFX_WideString::FromUTF8(szHTMLString); 3539 CFX_WideString wsHTMLString = CFX_WideString::FromUTF8(szHTMLString);
3543 FX_WCHAR strString[9]; 3540 FX_WCHAR strString[9];
3544 int32_t iStrIndex = 0; 3541 int32_t iStrIndex = 0;
3545 int32_t iLen = wsHTMLString.GetLength(); 3542 int32_t iLen = wsHTMLString.GetLength();
3546 int32_t i = 0; 3543 int32_t i = 0;
3547 int32_t iCode = 0; 3544 int32_t iCode = 0;
3548 FX_WCHAR ch = 0;
3549 const FX_WCHAR* pData = wsHTMLString.c_str(); 3545 const FX_WCHAR* pData = wsHTMLString.c_str();
3550 CFX_WideTextBuf wsResultBuf; 3546 CFX_WideTextBuf wsResultBuf;
3551 while (i < iLen) { 3547 while (i < iLen) {
3552 ch = pData[i]; 3548 FX_WCHAR ch = pData[i];
3553 if (ch == '&') { 3549 if (ch != '&') {
3554 ++i;
3555 ch = pData[i];
3556 if (ch == '#') {
3557 ++i;
3558 ch = pData[i];
3559 if (ch == 'x' || ch == 'X') {
3560 ++i;
3561 ch = pData[i];
3562 if ((ch >= '0' && ch <= '9') || (ch <= 'f' && ch >= 'a') ||
3563 (ch <= 'F' && ch >= 'A')) {
3564 while (ch != ';' && i < iLen) {
3565 if (ch >= '0' && ch <= '9') {
3566 iCode += ch - '0';
3567 } else if (ch <= 'f' && ch >= 'a') {
3568 iCode += ch - 'a' + 10;
3569 } else if (ch <= 'F' && ch >= 'A') {
3570 iCode += ch - 'A' + 10;
3571 } else {
3572 wsResultBuf.Clear();
3573 return;
3574 }
3575 ++i;
3576 iCode *= 16;
3577 ch = pData[i];
3578 }
3579 iCode /= 16;
3580 }
3581 } else {
3582 wsResultBuf.Clear();
3583 return;
3584 }
3585 } else {
3586 while (ch != ';' && i < iLen) {
3587 strString[iStrIndex++] = ch;
3588 ++i;
3589 ch = pData[i];
3590 }
3591 strString[iStrIndex] = 0;
3592 }
3593 } else {
3594 wsResultBuf.AppendChar(ch); 3550 wsResultBuf.AppendChar(ch);
3595 ++i; 3551 ++i;
3596 continue; 3552 continue;
3597 } 3553 }
3554
3555 ++i;
3556 ch = pData[i];
3557 if (ch == '#') {
3558 ++i;
3559 ch = pData[i];
3560 if (ch != 'x' && ch != 'X') {
3561 wsResultBuf.Clear();
3562 return;
3563 }
3564
3565 ++i;
3566 ch = pData[i];
3567 if ((ch >= '0' && ch <= '9') || (ch <= 'f' && ch >= 'a') ||
3568 (ch <= 'F' && ch >= 'A')) {
3569 while (ch != ';' && i < iLen) {
3570 if (ch >= '0' && ch <= '9') {
3571 iCode += ch - '0';
3572 } else if (ch <= 'f' && ch >= 'a') {
3573 iCode += ch - 'a' + 10;
3574 } else if (ch <= 'F' && ch >= 'A') {
3575 iCode += ch - 'A' + 10;
3576 } else {
3577 wsResultBuf.Clear();
3578 return;
3579 }
3580 ++i;
3581 // TODO(dsinclair): Postmultiply seems wrong, start at zero
3582 // and pre-multiply then can remove the post divide.
3583 iCode *= 16;
3584 ch = pData[i];
3585 }
3586 iCode /= 16;
3587 }
3588 } else {
3589 while (ch != ';' && i < iLen) {
3590 strString[iStrIndex++] = ch;
3591 ++i;
3592 ch = pData[i];
3593 }
3594 strString[iStrIndex] = 0;
3595 }
3598 uint32_t iData = 0; 3596 uint32_t iData = 0;
3599 if (HTMLSTR2Code(strString, iData)) { 3597 if (HTMLSTR2Code(strString, iData)) {
3600 wsResultBuf.AppendChar((FX_WCHAR)iData); 3598 wsResultBuf.AppendChar((FX_WCHAR)iData);
3601 } else { 3599 } else {
3602 wsResultBuf.AppendChar(iCode); 3600 wsResultBuf.AppendChar(iCode);
3603 } 3601 }
3604 iStrIndex = 0; 3602 iStrIndex = 0;
3605 strString[iStrIndex] = 0; 3603 strString[iStrIndex] = 0;
3606 ++i; 3604 ++i;
3607 } 3605 }
3608 wsResultBuf.AppendChar(0); 3606 wsResultBuf.AppendChar(0);
3607
3609 szResultString.Clear(); 3608 szResultString.Clear();
3610 szResultString << FX_UTF8Encode(wsResultBuf.GetBuffer(), 3609 szResultString << FX_UTF8Encode(wsResultBuf.GetBuffer(),
3611 wsResultBuf.GetLength()) 3610 wsResultBuf.GetLength())
3612 .AsStringC(); 3611 .AsStringC();
3613 } 3612 }
3614 3613
3615 // static 3614 // static
3616 void CXFA_FM2JSContext::DecodeXML(const CFX_ByteStringC& szXMLString, 3615 void CXFA_FM2JSContext::DecodeXML(const CFX_ByteStringC& szXMLString,
3617 CFX_ByteTextBuf& szResultString) { 3616 CFX_ByteTextBuf& szResultString) {
3618 CFX_WideString wsXMLString = CFX_WideString::FromUTF8(szXMLString); 3617 CFX_WideString wsXMLString = CFX_WideString::FromUTF8(szXMLString);
3619 FX_WCHAR strString[9]; 3618 FX_WCHAR strString[9];
3620 int32_t iStrIndex = 0; 3619 int32_t iStrIndex = 0;
3621 int32_t iLen = wsXMLString.GetLength(); 3620 int32_t iLen = wsXMLString.GetLength();
3622 int32_t i = 0; 3621 int32_t i = 0;
3623 int32_t iCode = 0; 3622 int32_t iCode = 0;
3624 FX_WCHAR ch = 0; 3623 FX_WCHAR ch = 0;
3625 const FX_WCHAR* pData = wsXMLString.c_str(); 3624 const FX_WCHAR* pData = wsXMLString.c_str();
3626 CFX_WideTextBuf wsXMLBuf; 3625 CFX_WideTextBuf wsXMLBuf;
3627 while (i < iLen) { 3626 while (i < iLen) {
3628 ch = pData[i]; 3627 ch = pData[i];
3629 if (ch == '&') { 3628 if (ch != '&') {
3630 ++i;
3631 ch = pData[i];
3632 if (ch == '#') {
3633 ++i;
3634 ch = pData[i];
3635 if (ch == 'x' || ch == 'X') {
3636 ++i;
3637 ch = pData[i];
3638 if ((ch >= '0' && ch <= '9') || (ch <= 'f' && ch >= 'a') ||
3639 (ch <= 'F' && ch >= 'A')) {
3640 while (ch != ';') {
3641 if (ch >= '0' && ch <= '9') {
3642 iCode += ch - '0';
3643 } else if (ch <= 'f' && ch >= 'a') {
3644 iCode += ch - 'a' + 10;
3645 } else if (ch <= 'F' && ch >= 'A') {
3646 iCode += ch - 'A' + 10;
3647 } else {
3648 wsXMLBuf.Clear();
3649 return;
3650 }
3651 ++i;
3652 iCode *= 16;
3653 ch = pData[i];
3654 }
3655 iCode /= 16;
3656 }
3657 } else {
3658 wsXMLBuf.Clear();
3659 return;
3660 }
3661 } else {
3662 while (ch != ';' && i < iLen) {
3663 strString[iStrIndex++] = ch;
3664 ++i;
3665 ch = pData[i];
3666 }
3667 strString[iStrIndex] = 0;
3668 }
3669 } else {
3670 wsXMLBuf.AppendChar(ch); 3629 wsXMLBuf.AppendChar(ch);
3671 ++i; 3630 ++i;
3672 continue; 3631 continue;
3673 } 3632 }
3633
3634 // TODO(dsinclair): This is very similar to DecodeHTML, can they be
3635 // combined?
3636 ++i;
3637 ch = pData[i];
3638 if (ch == '#') {
3639 ++i;
3640 ch = pData[i];
3641 if (ch != 'x' && ch != 'X') {
3642 wsXMLBuf.Clear();
3643 return;
3644 }
3645
3646 ++i;
3647 ch = pData[i];
3648 if ((ch >= '0' && ch <= '9') || (ch <= 'f' && ch >= 'a') ||
3649 (ch <= 'F' && ch >= 'A')) {
3650 while (ch != ';') {
3651 if (ch >= '0' && ch <= '9') {
3652 iCode += ch - '0';
3653 } else if (ch <= 'f' && ch >= 'a') {
3654 iCode += ch - 'a' + 10;
3655 } else if (ch <= 'F' && ch >= 'A') {
3656 iCode += ch - 'A' + 10;
3657 } else {
3658 wsXMLBuf.Clear();
3659 return;
3660 }
3661 ++i;
3662 iCode *= 16;
3663 ch = pData[i];
3664 }
3665 iCode /= 16;
3666 }
3667 } else {
3668 while (ch != ';' && i < iLen) {
3669 strString[iStrIndex++] = ch;
3670 ++i;
3671 ch = pData[i];
3672 }
3673 strString[iStrIndex] = 0;
3674 }
3675
3674 const FX_WCHAR* const strName[] = {L"quot", L"amp", L"apos", L"lt", L"gt"}; 3676 const FX_WCHAR* const strName[] = {L"quot", L"amp", L"apos", L"lt", L"gt"};
3675 int32_t iIndex = 0; 3677 int32_t iIndex = 0;
3676 while (iIndex < 5) { 3678 while (iIndex < 5) {
3677 if (FXSYS_memcmp(strString, strName[iIndex], 3679 if (FXSYS_memcmp(strString, strName[iIndex],
3678 FXSYS_wcslen(strName[iIndex])) == 0) { 3680 FXSYS_wcslen(strName[iIndex])) == 0) {
3679 break; 3681 break;
3680 } 3682 }
3681 ++iIndex; 3683 ++iIndex;
3682 } 3684 }
3683 switch (iIndex) { 3685 switch (iIndex) {
(...skipping 15 matching lines...) Expand all
3699 default: 3701 default:
3700 wsXMLBuf.AppendChar(iCode); 3702 wsXMLBuf.AppendChar(iCode);
3701 break; 3703 break;
3702 } 3704 }
3703 iStrIndex = 0; 3705 iStrIndex = 0;
3704 strString[iStrIndex] = 0; 3706 strString[iStrIndex] = 0;
3705 ++i; 3707 ++i;
3706 iCode = 0; 3708 iCode = 0;
3707 } 3709 }
3708 wsXMLBuf.AppendChar(0); 3710 wsXMLBuf.AppendChar(0);
3711
3709 szResultString.Clear(); 3712 szResultString.Clear();
3710 szResultString << FX_UTF8Encode(wsXMLBuf.GetBuffer(), wsXMLBuf.GetLength()) 3713 szResultString << FX_UTF8Encode(wsXMLBuf.GetBuffer(), wsXMLBuf.GetLength())
3711 .AsStringC(); 3714 .AsStringC();
3712 } 3715 }
3713 3716
3714 // static 3717 // static
3715 void CXFA_FM2JSContext::Encode(CFXJSE_Value* pThis, 3718 void CXFA_FM2JSContext::Encode(CFXJSE_Value* pThis,
3716 const CFX_ByteStringC& szFuncName, 3719 const CFX_ByteStringC& szFuncName,
3717 CFXJSE_Arguments& args) { 3720 CFXJSE_Arguments& args) {
3718 int32_t argc = args.GetLength(); 3721 int32_t argc = args.GetLength();
(...skipping 2981 matching lines...) Expand 10 before | Expand all | Expand 10 after
6700 CFX_WideString wsFormat; 6703 CFX_WideString wsFormat;
6701 pAppProvider->LoadString(iStringID, wsFormat); 6704 pAppProvider->LoadString(iStringID, wsFormat);
6702 CFX_WideString wsMessage; 6705 CFX_WideString wsMessage;
6703 va_list arg_ptr; 6706 va_list arg_ptr;
6704 va_start(arg_ptr, iStringID); 6707 va_start(arg_ptr, iStringID);
6705 wsMessage.FormatV(wsFormat.c_str(), arg_ptr); 6708 wsMessage.FormatV(wsFormat.c_str(), arg_ptr);
6706 va_end(arg_ptr); 6709 va_end(arg_ptr);
6707 FXJSE_ThrowMessage( 6710 FXJSE_ThrowMessage(
6708 "", FX_UTF8Encode(wsMessage.c_str(), wsMessage.GetLength()).AsStringC()); 6711 "", FX_UTF8Encode(wsMessage.c_str(), wsMessage.GetLength()).AsStringC());
6709 } 6712 }
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698