diff options
Diffstat (limited to 'fxjs/cfxjse_formcalc_context.h')
-rw-r--r-- | fxjs/cfxjse_formcalc_context.h | 445 |
1 files changed, 445 insertions, 0 deletions
diff --git a/fxjs/cfxjse_formcalc_context.h b/fxjs/cfxjse_formcalc_context.h new file mode 100644 index 0000000000..ec9c14b77b --- /dev/null +++ b/fxjs/cfxjse_formcalc_context.h @@ -0,0 +1,445 @@ +// 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 int32_t ResolveObjects(CFXJSE_Value* pThis, + CFXJSE_Value* pParentValue, + const ByteStringView& bsSomExp, + XFA_RESOLVENODE_RS& resoveNodeRS, + bool bdotAccessor = true, + bool bHasNoResolveName = false); + static void ParseResolveResult( + CFXJSE_Value* pThis, + const XFA_RESOLVENODE_RS& resoveNodeRS, + 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_ |