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 _JS_VALUE_H_
8#define _JS_VALUE_H_
9
10class CJS_Array;
11class CJS_Date;
12
13class CJS_Value
14{
15public:
16	CJS_Value(v8::Isolate* isolate);
17	CJS_Value(v8::Isolate* isolate, v8::Handle<v8::Value> pValue,FXJSVALUETYPE t);
18	CJS_Value(v8::Isolate* isolate, const int &iValue);
19	CJS_Value(v8::Isolate* isolate, const double &dValue);
20	CJS_Value(v8::Isolate* isolate, const float &fValue);
21	CJS_Value(v8::Isolate* isolate, const bool &bValue);
22	CJS_Value(v8::Isolate* isolate, JSFXObject);
23	CJS_Value(v8::Isolate* isolate, CJS_Object *);
24	CJS_Value(v8::Isolate* isolate, FX_LPCSTR pStr);
25	CJS_Value(v8::Isolate* isolate, FX_LPCWSTR pWstr);
26	CJS_Value(v8::Isolate* isolate, CJS_Array& array);
27
28	~CJS_Value();
29
30	void SetNull();
31    void Attach(v8::Handle<v8::Value> pValue,FXJSVALUETYPE t);
32	void Attach(CJS_Value *pValue);
33	void Detach();
34
35
36	operator int() const;
37	operator bool() const;
38	operator double() const;
39	operator float() const;
40	operator CJS_Object *() const;
41	//operator JSFXObject *() const;
42	operator v8::Handle<v8::Object>() const;
43	operator v8::Handle<v8::Array>() const;
44	operator CFX_WideString() const;
45	//operator FX_WCHAR *() const;
46	operator CFX_ByteString() const;
47	v8::Handle<v8::Value> ToJSValue();
48
49	void operator = (int iValue);
50	void operator = (bool bValue);
51	void operator = (double);
52	void operator = (float);
53	void operator = (CJS_Object *);
54	void operator = (v8::Handle<v8::Object>);
55//	void operator = (JSObject *);
56	void operator = (CJS_Array &);
57	void operator = (CJS_Date &);
58	void operator = (FX_LPCWSTR pWstr);
59	void operator = (FX_LPCSTR pStr);
60	void operator = (CJS_Value value);
61
62	FX_BOOL IsArrayObject() const;
63	FX_BOOL	IsDateObject() const;
64	FXJSVALUETYPE GetType() const;
65
66	FX_BOOL ConvertToArray(CJS_Array &) const;
67	FX_BOOL ConvertToDate(CJS_Date &) const;
68
69	v8::Isolate* GetIsolate() {return m_isolate;}
70protected:
71	v8::Handle<v8::Value> m_pValue;
72	FXJSVALUETYPE m_eType;
73	v8::Isolate* m_isolate;
74};
75
76template<class TYPE> class CJS_ParametersTmpl : public CFX_ArrayTemplate<TYPE>
77{
78public:
79	void push_back(TYPE newElement){CFX_ArrayTemplate<TYPE>::Add(newElement);}
80	int size() const{return CFX_ArrayTemplate<TYPE>::GetSize();}
81};
82typedef CJS_ParametersTmpl<CJS_Value> CJS_Parameters;
83
84class CJS_PropValue: public CJS_Value
85{
86public:
87	CJS_PropValue(const CJS_Value &);
88	CJS_PropValue(v8::Isolate* isolate);
89	~CJS_PropValue();
90public:
91	FX_BOOL IsSetting();
92	FX_BOOL IsGetting();
93	void operator<<(int );
94	void operator>>(int &) const;
95	void operator<<(bool);
96	void operator>>(bool &) const;
97	void operator<<(double );
98	void operator>>(double &) const;
99	void operator<<(CJS_Object *pObj);
100	void operator>>(CJS_Object *&ppObj) const;
101	void operator<<(CFX_ByteString);
102	void operator>>(CFX_ByteString &) const;
103	void operator<<(CFX_WideString);
104	void operator>>(CFX_WideString &) const;
105	void operator<<(FX_LPCWSTR c_string);
106
107	void operator<<(JSFXObject);
108	void operator>>(JSFXObject &) const;
109
110	void operator>>(CJS_Array &array) const;
111	void operator<<(CJS_Array &array);
112
113	void operator<<(CJS_Date &date);
114	void operator>>(CJS_Date &date) const;
115
116	operator v8::Handle<v8::Value>() const;
117
118	void StartSetting();
119	void StartGetting();
120private:
121	FX_BOOL m_bIsSetting;
122};
123
124class CJS_Array
125{
126public:
127	CJS_Array(v8::Isolate* isolate);
128	virtual ~CJS_Array();
129
130	void Attach(v8::Handle<v8::Array> pArray);
131	void GetElement(unsigned index,CJS_Value &value);
132	void SetElement(unsigned index,CJS_Value value);
133    int GetLength();
134	FX_BOOL IsAttached();
135	operator v8::Handle<v8::Array>();
136
137	v8::Isolate* GetIsolate() {return m_isolate;}
138private:
139	v8::Handle<v8::Array> m_pArray;
140	v8::Isolate* m_isolate;
141};
142
143class CJS_Date
144{
145friend class CJS_Value;
146public:
147	CJS_Date(v8::Isolate* isolate);
148	CJS_Date(v8::Isolate* isolate,double dMsec_time);
149	CJS_Date(v8::Isolate* isolate,int year, int mon, int day,int hour, int min, int sec);
150	virtual ~CJS_Date();
151	void Attach(v8::Handle<v8::Value> pDate);
152
153	int     GetYear();
154	void    SetYear(int iYear);
155
156	int     GetMonth();
157	void    SetMonth(int iMonth);
158
159	int     GetDay();
160	void    SetDay(int iDay);
161
162	int     GetHours();
163	void    SetHours(int iHours);
164
165	int     GetMinutes();
166	void    SetMinutes(int minutes);
167
168	int     GetSeconds();
169	void    SetSeconds(int seconds);
170
171	operator v8::Handle<v8::Value>();
172	operator double() const;
173
174	CFX_WideString	ToString() const;
175
176	static double	MakeDate(int year, int mon, int mday,int hour, int min, int sec,int ms);
177
178	FX_BOOL	IsValidDate();
179
180protected:
181	v8::Handle<v8::Value> m_pDate;
182	v8::Isolate* m_isolate;
183};
184
185#endif //_JS_VALUE_H_
186
187