| // Copyright 2014 PDFium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
| |
| #ifndef FXJS_CFXJSE_FORMCALC_CONTEXT_H_ |
| #define FXJS_CFXJSE_FORMCALC_CONTEXT_H_ |
| |
| #include <memory> |
| #include <vector> |
| |
| #include "fxjs/cfxjse_arguments.h" |
| #include "fxjs/cfxjse_context.h" |
| #include "xfa/fxfa/parser/xfa_resolvenode_rs.h" |
| |
| class CFX_WideTextBuf; |
| class CXFA_Document; |
| |
| class CFXJSE_FormCalcContext : public CFXJSE_HostObject { |
| public: |
| CFXJSE_FormCalcContext(v8::Isolate* pScriptIsolate, |
| CFXJSE_Context* pScriptContext, |
| CXFA_Document* pDoc); |
| ~CFXJSE_FormCalcContext() override; |
| |
| static void Abs(CFXJSE_Value* pThis, |
| const ByteStringView& szFuncName, |
| CFXJSE_Arguments& args); |
| static void Avg(CFXJSE_Value* pThis, |
| const ByteStringView& szFuncName, |
| CFXJSE_Arguments& args); |
| static void Ceil(CFXJSE_Value* pThis, |
| const ByteStringView& szFuncName, |
| CFXJSE_Arguments& args); |
| static void Count(CFXJSE_Value* pThis, |
| const ByteStringView& szFuncName, |
| CFXJSE_Arguments& args); |
| static void Floor(CFXJSE_Value* pThis, |
| const ByteStringView& szFuncName, |
| CFXJSE_Arguments& args); |
| static void Max(CFXJSE_Value* pThis, |
| const ByteStringView& szFuncName, |
| CFXJSE_Arguments& args); |
| static void Min(CFXJSE_Value* pThis, |
| const ByteStringView& szFuncName, |
| CFXJSE_Arguments& args); |
| static void Mod(CFXJSE_Value* pThis, |
| const ByteStringView& szFuncName, |
| CFXJSE_Arguments& args); |
| static void Round(CFXJSE_Value* pThis, |
| const ByteStringView& szFuncName, |
| CFXJSE_Arguments& args); |
| static void Sum(CFXJSE_Value* pThis, |
| const ByteStringView& szFuncName, |
| CFXJSE_Arguments& args); |
| static void Date(CFXJSE_Value* pThis, |
| const ByteStringView& szFuncName, |
| CFXJSE_Arguments& args); |
| static void Date2Num(CFXJSE_Value* pThis, |
| const ByteStringView& szFuncName, |
| CFXJSE_Arguments& args); |
| static void DateFmt(CFXJSE_Value* pThis, |
| const ByteStringView& szFuncName, |
| CFXJSE_Arguments& args); |
| static void IsoDate2Num(CFXJSE_Value* pThis, |
| const ByteStringView& szFuncName, |
| CFXJSE_Arguments& args); |
| static void IsoTime2Num(CFXJSE_Value* pThis, |
| const ByteStringView& szFuncName, |
| CFXJSE_Arguments& args); |
| static void LocalDateFmt(CFXJSE_Value* pThis, |
| const ByteStringView& szFuncName, |
| CFXJSE_Arguments& args); |
| static void LocalTimeFmt(CFXJSE_Value* pThis, |
| const ByteStringView& szFuncName, |
| CFXJSE_Arguments& args); |
| static void Num2Date(CFXJSE_Value* pThis, |
| const ByteStringView& szFuncName, |
| CFXJSE_Arguments& args); |
| static void Num2GMTime(CFXJSE_Value* pThis, |
| const ByteStringView& szFuncName, |
| CFXJSE_Arguments& args); |
| static void Num2Time(CFXJSE_Value* pThis, |
| const ByteStringView& szFuncName, |
| CFXJSE_Arguments& args); |
| static void Time(CFXJSE_Value* pThis, |
| const ByteStringView& szFuncName, |
| CFXJSE_Arguments& args); |
| static void Time2Num(CFXJSE_Value* pThis, |
| const ByteStringView& szFuncName, |
| CFXJSE_Arguments& args); |
| static void TimeFmt(CFXJSE_Value* pThis, |
| const ByteStringView& szFuncName, |
| CFXJSE_Arguments& args); |
| |
| static bool IsIsoDateFormat(const char* pData, |
| int32_t iLength, |
| int32_t& iStyle, |
| int32_t& iYear, |
| int32_t& iMonth, |
| int32_t& iDay); |
| static bool IsIsoTimeFormat(const char* pData, |
| int32_t iLength, |
| int32_t& iHour, |
| int32_t& iMinute, |
| int32_t& iSecond, |
| int32_t& iMilliSecond, |
| int32_t& iZoneHour, |
| int32_t& iZoneMinute); |
| static bool IsIsoDateTimeFormat(const char* pData, |
| int32_t iLength, |
| int32_t& iYear, |
| int32_t& iMonth, |
| int32_t& iDay, |
| int32_t& iHour, |
| int32_t& iMinute, |
| int32_t& iSecond, |
| int32_t& iMillionSecond, |
| int32_t& iZoneHour, |
| int32_t& iZoneMinute); |
| static ByteString Local2IsoDate(CFXJSE_Value* pThis, |
| const ByteStringView& szDate, |
| const ByteStringView& szFormat, |
| const ByteStringView& szLocale); |
| static ByteString IsoDate2Local(CFXJSE_Value* pThis, |
| const ByteStringView& szDate, |
| const ByteStringView& szFormat, |
| const ByteStringView& szLocale); |
| static ByteString IsoTime2Local(CFXJSE_Value* pThis, |
| const ByteStringView& szTime, |
| const ByteStringView& szFormat, |
| const ByteStringView& szLocale); |
| static int32_t DateString2Num(const ByteStringView& szDateString); |
| static ByteString GetLocalDateFormat(CFXJSE_Value* pThis, |
| int32_t iStyle, |
| const ByteStringView& szLocalStr, |
| bool bStandard); |
| static ByteString GetLocalTimeFormat(CFXJSE_Value* pThis, |
| int32_t iStyle, |
| const ByteStringView& szLocalStr, |
| bool bStandard); |
| static ByteString GetStandardDateFormat(CFXJSE_Value* pThis, |
| int32_t iStyle, |
| const ByteStringView& szLocalStr); |
| static ByteString GetStandardTimeFormat(CFXJSE_Value* pThis, |
| int32_t iStyle, |
| const ByteStringView& szLocalStr); |
| static ByteString Num2AllTime(CFXJSE_Value* pThis, |
| int32_t iTime, |
| const ByteStringView& szFormat, |
| const ByteStringView& szLocale, |
| bool bGM); |
| static void GetLocalTimeZone(int32_t& iHour, int32_t& iMin, int32_t& iSec); |
| |
| static void Apr(CFXJSE_Value* pThis, |
| const ByteStringView& szFuncName, |
| CFXJSE_Arguments& args); |
| static void CTerm(CFXJSE_Value* pThis, |
| const ByteStringView& szFuncName, |
| CFXJSE_Arguments& args); |
| static void FV(CFXJSE_Value* pThis, |
| const ByteStringView& szFuncName, |
| CFXJSE_Arguments& args); |
| static void IPmt(CFXJSE_Value* pThis, |
| const ByteStringView& szFuncName, |
| CFXJSE_Arguments& args); |
| static void NPV(CFXJSE_Value* pThis, |
| const ByteStringView& szFuncName, |
| CFXJSE_Arguments& args); |
| static void Pmt(CFXJSE_Value* pThis, |
| const ByteStringView& szFuncName, |
| CFXJSE_Arguments& args); |
| static void PPmt(CFXJSE_Value* pThis, |
| const ByteStringView& szFuncName, |
| CFXJSE_Arguments& args); |
| static void PV(CFXJSE_Value* pThis, |
| const ByteStringView& szFuncName, |
| CFXJSE_Arguments& args); |
| static void Rate(CFXJSE_Value* pThis, |
| const ByteStringView& szFuncName, |
| CFXJSE_Arguments& args); |
| static void Term(CFXJSE_Value* pThis, |
| const ByteStringView& szFuncName, |
| CFXJSE_Arguments& args); |
| static void Choose(CFXJSE_Value* pThis, |
| const ByteStringView& szFuncName, |
| CFXJSE_Arguments& args); |
| static void Exists(CFXJSE_Value* pThis, |
| const ByteStringView& szFuncName, |
| CFXJSE_Arguments& args); |
| static void HasValue(CFXJSE_Value* pThis, |
| const ByteStringView& szFuncName, |
| CFXJSE_Arguments& args); |
| static void Oneof(CFXJSE_Value* pThis, |
| const ByteStringView& szFuncName, |
| CFXJSE_Arguments& args); |
| static void Within(CFXJSE_Value* pThis, |
| const ByteStringView& szFuncName, |
| CFXJSE_Arguments& args); |
| static void If(CFXJSE_Value* pThis, |
| const ByteStringView& szFuncName, |
| CFXJSE_Arguments& args); |
| static void Eval(CFXJSE_Value* pThis, |
| const ByteStringView& szFuncName, |
| CFXJSE_Arguments& args); |
| static void Ref(CFXJSE_Value* pThis, |
| const ByteStringView& szFuncName, |
| CFXJSE_Arguments& args); |
| static void UnitType(CFXJSE_Value* pThis, |
| const ByteStringView& szFuncName, |
| CFXJSE_Arguments& args); |
| static void UnitValue(CFXJSE_Value* pThis, |
| const ByteStringView& szFuncName, |
| CFXJSE_Arguments& args); |
| |
| static void At(CFXJSE_Value* pThis, |
| const ByteStringView& szFuncName, |
| CFXJSE_Arguments& args); |
| static void Concat(CFXJSE_Value* pThis, |
| const ByteStringView& szFuncName, |
| CFXJSE_Arguments& args); |
| static void Decode(CFXJSE_Value* pThis, |
| const ByteStringView& szFuncName, |
| CFXJSE_Arguments& args); |
| static WideString DecodeURL(const WideString& wsURLString); |
| static WideString DecodeHTML(const WideString& wsHTMLString); |
| static WideString DecodeXML(const WideString& wsXMLString); |
| static void Encode(CFXJSE_Value* pThis, |
| const ByteStringView& szFuncName, |
| CFXJSE_Arguments& args); |
| static WideString EncodeURL(const ByteString& szURLString); |
| static WideString EncodeHTML(const ByteString& szHTMLString); |
| static WideString EncodeXML(const ByteString& szXMLString); |
| static bool HTMLSTR2Code(const WideStringView& pData, uint32_t* iCode); |
| static bool HTMLCode2STR(uint32_t iCode, WideString* wsHTMLReserve); |
| static void Format(CFXJSE_Value* pThis, |
| const ByteStringView& szFuncName, |
| CFXJSE_Arguments& args); |
| static void Left(CFXJSE_Value* pThis, |
| const ByteStringView& szFuncName, |
| CFXJSE_Arguments& args); |
| static void Len(CFXJSE_Value* pThis, |
| const ByteStringView& szFuncName, |
| CFXJSE_Arguments& args); |
| static void Lower(CFXJSE_Value* pThis, |
| const ByteStringView& szFuncName, |
| CFXJSE_Arguments& args); |
| static void Ltrim(CFXJSE_Value* pThis, |
| const ByteStringView& szFuncName, |
| CFXJSE_Arguments& args); |
| static void Parse(CFXJSE_Value* pThis, |
| const ByteStringView& szFuncName, |
| CFXJSE_Arguments& args); |
| static void Replace(CFXJSE_Value* pThis, |
| const ByteStringView& szFuncName, |
| CFXJSE_Arguments& args); |
| static void Right(CFXJSE_Value* pThis, |
| const ByteStringView& szFuncName, |
| CFXJSE_Arguments& args); |
| static void Rtrim(CFXJSE_Value* pThis, |
| const ByteStringView& szFuncName, |
| CFXJSE_Arguments& args); |
| static void Space(CFXJSE_Value* pThis, |
| const ByteStringView& szFuncName, |
| CFXJSE_Arguments& args); |
| static void Str(CFXJSE_Value* pThis, |
| const ByteStringView& szFuncName, |
| CFXJSE_Arguments& args); |
| static void Stuff(CFXJSE_Value* pThis, |
| const ByteStringView& szFuncName, |
| CFXJSE_Arguments& args); |
| static void Substr(CFXJSE_Value* pThis, |
| const ByteStringView& szFuncName, |
| CFXJSE_Arguments& args); |
| static void Uuid(CFXJSE_Value* pThis, |
| const ByteStringView& szFuncName, |
| CFXJSE_Arguments& args); |
| static void Upper(CFXJSE_Value* pThis, |
| const ByteStringView& szFuncName, |
| CFXJSE_Arguments& args); |
| static void WordNum(CFXJSE_Value* pThis, |
| const ByteStringView& szFuncName, |
| CFXJSE_Arguments& args); |
| static ByteString TrillionUS(const ByteStringView& szData); |
| static ByteString WordUS(const ByteString& szData, int32_t iStyle); |
| |
| static void Get(CFXJSE_Value* pThis, |
| const ByteStringView& szFuncName, |
| CFXJSE_Arguments& args); |
| static void Post(CFXJSE_Value* pThis, |
| const ByteStringView& szFuncName, |
| CFXJSE_Arguments& args); |
| static void Put(CFXJSE_Value* pThis, |
| const ByteStringView& szFuncName, |
| CFXJSE_Arguments& args); |
| static void assign_value_operator(CFXJSE_Value* pThis, |
| const ByteStringView& szFuncName, |
| CFXJSE_Arguments& args); |
| static void logical_or_operator(CFXJSE_Value* pThis, |
| const ByteStringView& szFuncName, |
| CFXJSE_Arguments& args); |
| static void logical_and_operator(CFXJSE_Value* pThis, |
| const ByteStringView& szFuncName, |
| CFXJSE_Arguments& args); |
| static void equality_operator(CFXJSE_Value* pThis, |
| const ByteStringView& szFuncName, |
| CFXJSE_Arguments& args); |
| static void notequality_operator(CFXJSE_Value* pThis, |
| const ByteStringView& szFuncName, |
| CFXJSE_Arguments& args); |
| static bool fm_ref_equal(CFXJSE_Value* pThis, CFXJSE_Arguments& args); |
| static void less_operator(CFXJSE_Value* pThis, |
| const ByteStringView& szFuncName, |
| CFXJSE_Arguments& args); |
| static void lessequal_operator(CFXJSE_Value* pThis, |
| const ByteStringView& szFuncName, |
| CFXJSE_Arguments& args); |
| static void greater_operator(CFXJSE_Value* pThis, |
| const ByteStringView& szFuncName, |
| CFXJSE_Arguments& args); |
| static void greaterequal_operator(CFXJSE_Value* pThis, |
| const ByteStringView& szFuncName, |
| CFXJSE_Arguments& args); |
| static void plus_operator(CFXJSE_Value* pThis, |
| const ByteStringView& szFuncName, |
| CFXJSE_Arguments& args); |
| static void minus_operator(CFXJSE_Value* pThis, |
| const ByteStringView& szFuncName, |
| CFXJSE_Arguments& args); |
| static void multiple_operator(CFXJSE_Value* pThis, |
| const ByteStringView& szFuncName, |
| CFXJSE_Arguments& args); |
| static void divide_operator(CFXJSE_Value* pThis, |
| const ByteStringView& szFuncName, |
| CFXJSE_Arguments& args); |
| static void positive_operator(CFXJSE_Value* pThis, |
| const ByteStringView& szFuncName, |
| CFXJSE_Arguments& args); |
| static void negative_operator(CFXJSE_Value* pThis, |
| const ByteStringView& szFuncName, |
| CFXJSE_Arguments& args); |
| static void logical_not_operator(CFXJSE_Value* pThis, |
| const ByteStringView& szFuncName, |
| CFXJSE_Arguments& args); |
| static void dot_accessor(CFXJSE_Value* pThis, |
| const ByteStringView& szFuncName, |
| CFXJSE_Arguments& args); |
| static void dotdot_accessor(CFXJSE_Value* pThis, |
| const ByteStringView& szFuncName, |
| CFXJSE_Arguments& args); |
| static void eval_translation(CFXJSE_Value* pThis, |
| const ByteStringView& szFuncName, |
| CFXJSE_Arguments& args); |
| static void is_fm_object(CFXJSE_Value* pThis, |
| const ByteStringView& szFuncName, |
| CFXJSE_Arguments& args); |
| static void is_fm_array(CFXJSE_Value* pThis, |
| const ByteStringView& szFuncName, |
| CFXJSE_Arguments& args); |
| static void get_fm_value(CFXJSE_Value* pThis, |
| const ByteStringView& szFuncName, |
| CFXJSE_Arguments& args); |
| static void get_fm_jsobj(CFXJSE_Value* pThis, |
| const ByteStringView& szFuncName, |
| CFXJSE_Arguments& args); |
| static void fm_var_filter(CFXJSE_Value* pThis, |
| const ByteStringView& szFuncName, |
| CFXJSE_Arguments& args); |
| static void concat_fm_object(CFXJSE_Value* pThis, |
| const ByteStringView& szFuncName, |
| CFXJSE_Arguments& args); |
| |
| static int32_t hvalue_get_array_length(CFXJSE_Value* pThis, |
| CFXJSE_Value* arg); |
| static bool simpleValueCompare(CFXJSE_Value* pThis, |
| CFXJSE_Value* firstValue, |
| CFXJSE_Value* secondValue); |
| static void unfoldArgs( |
| CFXJSE_Value* pThis, |
| CFXJSE_Arguments& args, |
| std::vector<std::unique_ptr<CFXJSE_Value>>* resultValues, |
| int32_t iStart = 0); |
| static void GetObjectDefaultValue(CFXJSE_Value* pObjectValue, |
| CFXJSE_Value* pDefaultValue); |
| static bool SetObjectDefaultValue(CFXJSE_Value* pObjectValue, |
| CFXJSE_Value* pNewValue); |
| static ByteString GenerateSomExpression(const ByteStringView& szName, |
| int32_t iIndexFlags, |
| int32_t iIndexValue, |
| bool bIsStar); |
| static bool GetObjectForName(CFXJSE_Value* pThis, |
| CFXJSE_Value* accessorValue, |
| const ByteStringView& szAccessorName); |
| static bool ResolveObjects(CFXJSE_Value* pThis, |
| CFXJSE_Value* pParentValue, |
| const ByteStringView& bsSomExp, |
| XFA_RESOLVENODE_RS* resolveNodeRS, |
| bool bdotAccessor, |
| bool bHasNoResolveName); |
| static void ParseResolveResult( |
| CFXJSE_Value* pThis, |
| const XFA_RESOLVENODE_RS& resolveNodeRS, |
| CFXJSE_Value* pParentValue, |
| std::vector<std::unique_ptr<CFXJSE_Value>>* resultValues, |
| bool* bAttribute); |
| |
| static std::unique_ptr<CFXJSE_Value> GetSimpleValue(CFXJSE_Value* pThis, |
| CFXJSE_Arguments& args, |
| uint32_t index); |
| static bool ValueIsNull(CFXJSE_Value* pThis, CFXJSE_Value* pValue); |
| static int32_t ValueToInteger(CFXJSE_Value* pThis, CFXJSE_Value* pValue); |
| static float ValueToFloat(CFXJSE_Value* pThis, CFXJSE_Value* pValue); |
| static double ValueToDouble(CFXJSE_Value* pThis, CFXJSE_Value* pValue); |
| static ByteString ValueToUTF8String(CFXJSE_Value* pValue); |
| static double ExtractDouble(CFXJSE_Value* pThis, |
| CFXJSE_Value* src, |
| bool* ret); |
| |
| static bool Translate(const WideStringView& wsFormcalc, |
| CFX_WideTextBuf* wsJavascript); |
| |
| void GlobalPropertyGetter(CFXJSE_Value* pValue); |
| |
| private: |
| v8::Isolate* GetScriptRuntime() const { return m_pIsolate; } |
| CXFA_Document* GetDocument() const { return m_pDocument.Get(); } |
| |
| void ThrowNoDefaultPropertyException(const ByteStringView& name) const; |
| void ThrowCompilerErrorException() const; |
| void ThrowDivideByZeroException() const; |
| void ThrowServerDeniedException() const; |
| void ThrowPropertyNotInObjectException(const WideString& name, |
| const WideString& exp) const; |
| void ThrowArgumentMismatchException() const; |
| void ThrowParamCountMismatchException(const WideString& method) const; |
| void ThrowException(const wchar_t* str, ...) const; |
| |
| v8::Isolate* m_pIsolate; |
| CFXJSE_Class* m_pFMClass; |
| std::unique_ptr<CFXJSE_Value> m_pValue; |
| UnownedPtr<CXFA_Document> const m_pDocument; |
| }; |
| |
| #endif // FXJS_CFXJSE_FORMCALC_CONTEXT_H_ |