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 #ifndef XFA_INCLUDE_FXJSE_FXJSE_H_ 8 #define XFA_INCLUDE_FXJSE_FXJSE_H_ 9 10 #include "core/include/fpdfapi/fpdf_parser.h" 11 #include "core/include/fxcrt/fx_string.h" 12 #include "core/include/fxcrt/fx_system.h" 13 14 class CPDFDoc_Environment; 15 class CPDF_Page; 16 17 typedef struct FXJSE_HRUNTIME_ { void* pData; } * FXJSE_HRUNTIME; 18 typedef struct FXJSE_HCONTEXT_ { void* pData; } * FXJSE_HCONTEXT; 19 typedef struct FXJSE_HCLASS_ { void* pData; } * FXJSE_HCLASS; 20 typedef struct FXJSE_HVALUE_ { void* pData; } * FXJSE_HVALUE; 21 typedef struct FXJSE_HOBJECT_ : public FXJSE_HVALUE_{} * FXJSE_HOBJECT; 22 23 typedef double FXJSE_DOUBLE; 24 void FXJSE_Initialize(); 25 void FXJSE_Finalize(); 26 FXJSE_HRUNTIME FXJSE_Runtime_Create(); 27 void FXJSE_Runtime_Release(FXJSE_HRUNTIME hRuntime); 28 typedef struct _FXJSE_CLASS FXJSE_CLASS; 29 FXJSE_HCONTEXT FXJSE_Context_Create(FXJSE_HRUNTIME hRuntime, 30 const FXJSE_CLASS* lpGlobalClass = nullptr, 31 void* lpGlobalObject = nullptr); 32 void FXJSE_Context_Release(FXJSE_HCONTEXT hContext); 33 FXJSE_HVALUE FXJSE_Context_GetGlobalObject(FXJSE_HCONTEXT hContext); 34 FXJSE_HRUNTIME FXJSE_Context_GetRuntime(FXJSE_HCONTEXT hContext); 35 enum FXJSE_CompatibleModeFlags { 36 FXJSE_COMPATIBLEMODEFLAG_CONSTRUCTOREXTRAMETHODS = (1 << 0), 37 FXJSE_COMPATIBLEMODEFLAGCOUNT = 1, 38 }; 39 void FXJSE_Context_EnableCompatibleMode(FXJSE_HCONTEXT hContext, 40 FX_DWORD dwCompatibleFlags); 41 class CFXJSE_Arguments { 42 public: 43 FXJSE_HRUNTIME GetRuntime() const; 44 int32_t GetLength() const; 45 FXJSE_HVALUE GetValue(int32_t index) const; 46 FX_BOOL GetBoolean(int32_t index) const; 47 int32_t GetInt32(int32_t index) const; 48 FX_FLOAT GetFloat(int32_t index) const; 49 CFX_ByteString GetUTF8String(int32_t index) const; 50 void* GetObject(int32_t index, FXJSE_HCLASS hClass = nullptr) const; 51 FXJSE_HVALUE GetReturnValue(); 52 }; 53 typedef void (*FXJSE_FuncCallback)(FXJSE_HOBJECT hThis, 54 const CFX_ByteStringC& szFuncName, 55 CFXJSE_Arguments& args); 56 typedef void (*FXJSE_PropAccessor)(FXJSE_HOBJECT hObject, 57 const CFX_ByteStringC& szPropName, 58 FXJSE_HVALUE hValue); 59 typedef int32_t (*FXJSE_PropTypeGetter)(FXJSE_HOBJECT hObject, 60 const CFX_ByteStringC& szPropName, 61 FX_BOOL bQueryIn); 62 typedef FX_BOOL (*FXJSE_PropDeleter)(FXJSE_HOBJECT hObject, 63 const CFX_ByteStringC& szPropName); 64 typedef struct _FXJSE_FUNCTION { 65 const FX_CHAR* name; 66 FXJSE_FuncCallback callbackProc; 67 } FXJSE_FUNCTION; 68 #define FXJSE_DEF_FUNCTION(functionName, functionCallback) \ 69 { functionName, functionCallback } 70 void FXJSE_DefineFunctions(FXJSE_HCONTEXT hContext, 71 const FXJSE_FUNCTION* lpFunctions, 72 int nNum); 73 typedef struct _FXJSE_PROPERTY { 74 const FX_CHAR* name; 75 FXJSE_PropAccessor getProc; 76 FXJSE_PropAccessor setProc; 77 } FXJSE_PROPERTY; 78 enum FXJSE_ClassPropTypes { 79 FXJSE_ClassPropType_None, 80 FXJSE_ClassPropType_Property, 81 FXJSE_ClassPropType_Method 82 }; 83 typedef struct _FXJSE_CLASS { 84 const FX_CHAR* name; 85 FXJSE_FuncCallback constructor; 86 FXJSE_PROPERTY* properties; 87 FXJSE_FUNCTION* methods; 88 int32_t propNum; 89 int32_t methNum; 90 FXJSE_PropTypeGetter dynPropTypeGetter; 91 FXJSE_PropAccessor dynPropGetter; 92 FXJSE_PropAccessor dynPropSetter; 93 FXJSE_PropDeleter dynPropDeleter; 94 FXJSE_FuncCallback dynMethodCall; 95 } FXJSE_CLASS; 96 FXJSE_HCLASS FXJSE_DefineClass(FXJSE_HCONTEXT hContext, 97 const FXJSE_CLASS* lpClass); 98 FXJSE_HCLASS FXJSE_GetClass(FXJSE_HCONTEXT hContext, 99 const CFX_ByteStringC& szName); 100 FXJSE_HVALUE FXJSE_Value_Create(FXJSE_HRUNTIME hRuntime); 101 void FXJSE_Value_Release(FXJSE_HVALUE hValue); 102 FXJSE_HRUNTIME FXJSE_Value_GetRuntime(FXJSE_HVALUE hValue); 103 FX_BOOL FXJSE_Value_IsUndefined(FXJSE_HVALUE hValue); 104 FX_BOOL FXJSE_Value_IsNull(FXJSE_HVALUE hValue); 105 FX_BOOL FXJSE_Value_IsBoolean(FXJSE_HVALUE hValue); 106 FX_BOOL FXJSE_Value_IsUTF8String(FXJSE_HVALUE hValue); 107 FX_BOOL FXJSE_Value_IsNumber(FXJSE_HVALUE hValue); 108 FX_BOOL FXJSE_Value_IsInteger(FXJSE_HVALUE hValue); 109 FX_BOOL FXJSE_Value_IsObject(FXJSE_HVALUE hValue); 110 FX_BOOL FXJSE_Value_IsArray(FXJSE_HVALUE hValue); 111 FX_BOOL FXJSE_Value_IsFunction(FXJSE_HVALUE hValue); 112 FX_BOOL FXJSE_Value_IsDate(FXJSE_HVALUE hValue); 113 FX_BOOL FXJSE_Value_ToBoolean(FXJSE_HVALUE hValue); 114 FX_FLOAT FXJSE_Value_ToFloat(FXJSE_HVALUE hValue); 115 FXJSE_DOUBLE FXJSE_Value_ToDouble(FXJSE_HVALUE hValue); 116 int32_t FXJSE_Value_ToInteger(FXJSE_HVALUE hValue); 117 void FXJSE_Value_ToUTF8String(FXJSE_HVALUE hValue, CFX_ByteString& szStrOutput); 118 void* FXJSE_Value_ToObject(FXJSE_HVALUE hValue, FXJSE_HCLASS hClass); 119 void FXJSE_Value_SetUndefined(FXJSE_HVALUE hValue); 120 void FXJSE_Value_SetNull(FXJSE_HVALUE hValue); 121 void FXJSE_Value_SetBoolean(FXJSE_HVALUE hValue, FX_BOOL bBoolean); 122 void FXJSE_Value_SetUTF8String(FXJSE_HVALUE hValue, 123 const CFX_ByteStringC& szString); 124 void FXJSE_Value_SetInteger(FXJSE_HVALUE hValue, int32_t nInteger); 125 void FXJSE_Value_SetFloat(FXJSE_HVALUE hValue, FX_FLOAT fFloat); 126 void FXJSE_Value_SetDouble(FXJSE_HVALUE hValue, FXJSE_DOUBLE dDouble); 127 void FXJSE_Value_SetObject(FXJSE_HVALUE hValue, 128 void* lpObject, 129 FXJSE_HCLASS hClass); 130 void FXJSE_Value_SetArray(FXJSE_HVALUE hValue, 131 uint32_t uValueCount, 132 FXJSE_HVALUE* rgValues); 133 void FXJSE_Value_SetDate(FXJSE_HVALUE hValue, FXJSE_DOUBLE dDouble); 134 void FXJSE_Value_Set(FXJSE_HVALUE hValue, FXJSE_HVALUE hOriginalValue); 135 FX_BOOL FXJSE_Value_GetObjectProp(FXJSE_HVALUE hValue, 136 const CFX_ByteStringC& szPropName, 137 FXJSE_HVALUE hPropValue); 138 FX_BOOL FXJSE_Value_SetObjectProp(FXJSE_HVALUE hValue, 139 const CFX_ByteStringC& szPropName, 140 FXJSE_HVALUE hPropValue); 141 FX_BOOL FXJSE_Value_GetObjectPropByIdx(FXJSE_HVALUE hValue, 142 uint32_t uPropIdx, 143 FXJSE_HVALUE hPropValue); 144 FX_BOOL FXJSE_Value_SetObjectPropByIdx(FXJSE_HVALUE hValue, 145 uint32_t uPropIdx, 146 FXJSE_HVALUE hPropValue); 147 FX_BOOL FXJSE_Value_DeleteObjectProp(FXJSE_HVALUE hValue, 148 const CFX_ByteStringC& szPropName); 149 FX_BOOL FXJSE_Value_ObjectHasOwnProp(FXJSE_HVALUE hValue, 150 const CFX_ByteStringC& szPropName, 151 FX_BOOL bUseTypeGetter); 152 FX_BOOL FXJSE_Value_SetObjectOwnProp(FXJSE_HVALUE hValue, 153 const CFX_ByteStringC& szPropName, 154 FXJSE_HVALUE hPropValue); 155 FX_BOOL FXJSE_Value_CallFunction(FXJSE_HVALUE hFunction, 156 FXJSE_HVALUE hThis, 157 FXJSE_HVALUE hRetValue, 158 uint32_t nArgCount, 159 FXJSE_HVALUE* lpArgs); 160 FX_BOOL FXJSE_Value_SetFunctionBind(FXJSE_HVALUE hValue, 161 FXJSE_HVALUE hOldFunction, 162 FXJSE_HVALUE hNewThis); 163 FX_BOOL FXJSE_ExecuteScript(FXJSE_HCONTEXT hContext, 164 const FX_CHAR* szScript, 165 FXJSE_HVALUE hRetValue, 166 FXJSE_HVALUE hNewThisObject = nullptr); 167 void FXJSE_ThrowMessage(const CFX_ByteStringC& utf8Name, 168 const CFX_ByteStringC& utf8Message); 169 FX_BOOL FXJSE_ReturnValue_GetMessage(FXJSE_HVALUE hRetValue, 170 CFX_ByteString& utf8Name, 171 CFX_ByteString& utf8Message); 172 FX_BOOL FXJSE_ReturnValue_GetLineInfo(FXJSE_HVALUE hRetValue, 173 int32_t& nLine, 174 int32_t& nCol); 175 176 #endif // XFA_INCLUDE_FXJSE_FXJSE_H_ 177