Wean CJS_Value off of v8::Isolate.
[pdfium.git] / fpdfsdk / src / javascript / JS_Value.h
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 FPDFSDK_SRC_JAVASCRIPT_JS_VALUE_H_
8 #define FPDFSDK_SRC_JAVASCRIPT_JS_VALUE_H_
9
10 #include "../../../core/include/fxcrt/fx_basic.h"
11 #include "../../include/jsapi/fxjs_v8.h"
12
13 class CJS_Array;
14 class CJS_Date;
15 class CJS_Document;
16 class CJS_Object;
17 class CJS_Runtime;
18
19 class CJS_Value {
20  public:
21   enum Type {
22     VT_unknown,
23     VT_string,
24     VT_number,
25     VT_boolean,
26     VT_date,
27     VT_object,
28     VT_fxobject,
29     VT_null,
30     VT_undefined
31   };
32
33   CJS_Value(CJS_Runtime* pRuntime);
34   CJS_Value(CJS_Runtime* pRuntime, v8::Local<v8::Value> pValue, Type t);
35   CJS_Value(CJS_Runtime* pRuntime, const int& iValue);
36   CJS_Value(CJS_Runtime* pRuntime, const double& dValue);
37   CJS_Value(CJS_Runtime* pRuntime, const float& fValue);
38   CJS_Value(CJS_Runtime* pRuntime, const bool& bValue);
39   CJS_Value(CJS_Runtime* pRuntime, v8::Local<v8::Object>);
40   CJS_Value(CJS_Runtime* pRuntime, CJS_Object*);
41   CJS_Value(CJS_Runtime* pRuntime, CJS_Document*);
42   CJS_Value(CJS_Runtime* pRuntime, const FX_CHAR* pStr);
43   CJS_Value(CJS_Runtime* pRuntime, const FX_WCHAR* pWstr);
44   CJS_Value(CJS_Runtime* pRuntime, CJS_Array& array);
45
46   ~CJS_Value();
47
48   void SetNull();
49   void Attach(v8::Local<v8::Value> pValue, Type t);
50   void Attach(CJS_Value* pValue);
51   void Detach();
52
53   Type GetType() const;
54   int ToInt() const;
55   bool ToBool() const;
56   double ToDouble() const;
57   float ToFloat() const;
58   CJS_Object* ToCJSObject() const;
59   CFX_WideString ToCFXWideString() const;
60   CFX_ByteString ToCFXByteString() const;
61   v8::Local<v8::Object> ToV8Object() const;
62   v8::Local<v8::Array> ToV8Array() const;
63   v8::Local<v8::Value> ToV8Value() const;
64
65   void operator=(int iValue);
66   void operator=(bool bValue);
67   void operator=(double);
68   void operator=(float);
69   void operator=(CJS_Object*);
70   void operator=(CJS_Document*);
71   void operator=(v8::Local<v8::Object>);
72   void operator=(CJS_Array&);
73   void operator=(CJS_Date&);
74   void operator=(const FX_WCHAR* pWstr);
75   void operator=(const FX_CHAR* pStr);
76   void operator=(CJS_Value value);
77
78   FX_BOOL IsArrayObject() const;
79   FX_BOOL IsDateObject() const;
80   FX_BOOL ConvertToArray(CJS_Array&) const;
81   FX_BOOL ConvertToDate(CJS_Date&) const;
82
83   CJS_Runtime* GetJSRuntime() const { return m_pJSRuntime; }
84
85  protected:
86   Type m_eType;
87   v8::Local<v8::Value> m_pValue;
88   CJS_Runtime* m_pJSRuntime;
89 };
90
91 class CJS_Parameters : public CFX_ArrayTemplate<CJS_Value> {
92  public:
93   void push_back(const CJS_Value& newElement) {
94     CFX_ArrayTemplate<CJS_Value>::Add(newElement);
95   }
96   int size() const { return CFX_ArrayTemplate<CJS_Value>::GetSize(); }
97 };
98
99 class CJS_PropValue : public CJS_Value {
100  public:
101   CJS_PropValue(const CJS_Value&);
102   CJS_PropValue(CJS_Runtime* pRuntime);
103   ~CJS_PropValue();
104
105   FX_BOOL IsSetting() const { return m_bIsSetting; }
106   FX_BOOL IsGetting() const { return !m_bIsSetting; }
107
108   void operator<<(int);
109   void operator>>(int&) const;
110   void operator<<(bool);
111   void operator>>(bool&) const;
112   void operator<<(double);
113   void operator>>(double&) const;
114   void operator<<(CJS_Object* pObj);
115   void operator>>(CJS_Object*& ppObj) const;
116   void operator<<(CJS_Document* pJsDoc);
117   void operator>>(CJS_Document*& ppJsDoc) const;
118   void operator<<(CFX_ByteString);
119   void operator>>(CFX_ByteString&) const;
120   void operator<<(CFX_WideString);
121   void operator>>(CFX_WideString&) const;
122   void operator<<(const FX_WCHAR* c_string);
123   void operator<<(v8::Local<v8::Object>);
124   void operator>>(v8::Local<v8::Object>&) const;
125   void operator>>(CJS_Array& array) const;
126   void operator<<(CJS_Array& array);
127   void operator<<(CJS_Date& date);
128   void operator>>(CJS_Date& date) const;
129   operator v8::Local<v8::Value>() const;
130   void StartSetting();
131   void StartGetting();
132
133  private:
134   FX_BOOL m_bIsSetting;
135 };
136
137 class CJS_Array {
138  public:
139   CJS_Array(CJS_Runtime* pRuntime);
140   virtual ~CJS_Array();
141
142   void Attach(v8::Local<v8::Array> pArray);
143   void GetElement(unsigned index, CJS_Value& value);
144   void SetElement(unsigned index, CJS_Value value);
145   int GetLength();
146   FX_BOOL IsAttached();
147   operator v8::Local<v8::Array>();
148
149   CJS_Runtime* GetJSRuntime() const { return m_pJSRuntime; }
150
151  private:
152   v8::Local<v8::Array> m_pArray;
153   CJS_Runtime* m_pJSRuntime;
154 };
155
156 class CJS_Date {
157   friend class CJS_Value;
158
159  public:
160   CJS_Date(CJS_Runtime* pRuntime);
161   CJS_Date(CJS_Runtime* pRuntime, double dMsec_time);
162   CJS_Date(CJS_Runtime* pRuntime,
163            int year,
164            int mon,
165            int day,
166            int hour,
167            int min,
168            int sec);
169   virtual ~CJS_Date();
170   void Attach(v8::Local<v8::Value> pDate);
171
172   int GetYear();
173   void SetYear(int iYear);
174
175   int GetMonth();
176   void SetMonth(int iMonth);
177
178   int GetDay();
179   void SetDay(int iDay);
180
181   int GetHours();
182   void SetHours(int iHours);
183
184   int GetMinutes();
185   void SetMinutes(int minutes);
186
187   int GetSeconds();
188   void SetSeconds(int seconds);
189
190   operator v8::Local<v8::Value>();
191   operator double() const;
192
193   CFX_WideString ToString() const;
194
195   static double
196   MakeDate(int year, int mon, int mday, int hour, int min, int sec, int ms);
197
198   FX_BOOL IsValidDate();
199
200  protected:
201   v8::Local<v8::Value> m_pDate;
202   CJS_Runtime* m_pJSRuntime;
203 };
204
205 double JS_GetDateTime();
206 int JS_GetYearFromTime(double dt);
207 int JS_GetMonthFromTime(double dt);
208 int JS_GetDayFromTime(double dt);
209 int JS_GetHourFromTime(double dt);
210 int JS_GetMinFromTime(double dt);
211 int JS_GetSecFromTime(double dt);
212 double JS_DateParse(const wchar_t* string);
213 double JS_MakeDay(int nYear, int nMonth, int nDay);
214 double JS_MakeTime(int nHour, int nMin, int nSec, int nMs);
215 double JS_MakeDate(double day, double time);
216 bool JS_PortIsNan(double d);
217 double JS_LocalTime(double d);
218
219 #endif  // FPDFSDK_SRC_JAVASCRIPT_JS_VALUE_H_