Fix a few more -Wreorder warnings.
[pdfium.git] / fpdfsdk / src / javascript / JS_Value.cpp
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 #include "../../include/javascript/JavaScript.h"
8 #include "../../include/javascript/JS_Define.h"
9 #include "../../include/javascript/JS_Object.h"
10 #include "../../include/javascript/JS_Value.h"
11
12 /* ---------------------------- CJS_Value ---------------------------- */
13
14 CJS_Value::CJS_Value(v8::Isolate* isolate) : m_eType(VT_unknown),m_isolate(isolate)
15 {
16 }
17 CJS_Value::CJS_Value(v8::Isolate* isolate, v8::Handle<v8::Value> pValue,FXJSVALUETYPE t) :
18         m_pValue(pValue), m_eType(t), m_isolate(isolate)
19 {
20 }
21
22 CJS_Value::CJS_Value(v8::Isolate* isolate, const int &iValue):m_isolate(isolate)
23 {
24         operator =(iValue);
25 }
26
27 CJS_Value::CJS_Value(v8::Isolate* isolate, const bool &bValue):m_isolate(isolate)
28 {
29         operator =(bValue);
30 }
31
32 CJS_Value::CJS_Value(v8::Isolate* isolate, const float &fValue):m_isolate(isolate)
33 {
34         operator =(fValue);
35 }
36
37 CJS_Value::CJS_Value(v8::Isolate* isolate, const double &dValue):m_isolate(isolate) 
38 {
39         operator =(dValue);
40 }
41
42 CJS_Value::CJS_Value(v8::Isolate* isolate, JSFXObject  pJsObj):m_isolate(isolate) 
43 {
44         operator =(pJsObj);
45 }
46
47 CJS_Value::CJS_Value(v8::Isolate* isolate, CJS_Object * pJsObj):m_isolate(isolate) 
48 {
49         operator =(pJsObj);
50 }
51
52 CJS_Value::CJS_Value(v8::Isolate* isolate, FX_LPCWSTR pWstr):m_isolate(isolate) 
53 {
54         operator =(pWstr);
55 }
56
57 CJS_Value::CJS_Value(v8::Isolate* isolate, FX_LPCSTR pStr):m_isolate(isolate) 
58 {
59         operator = (pStr);
60 }
61
62 CJS_Value::CJS_Value(v8::Isolate* isolate, CJS_Array& array):m_isolate(isolate) 
63 {
64         operator = (array);
65 }
66
67 CJS_Value::~CJS_Value()
68 {
69 }
70
71 void CJS_Value::Attach(v8::Handle<v8::Value> pValue,FXJSVALUETYPE t)
72 {
73         m_pValue = pValue;
74         m_eType = t;
75 }
76
77 void CJS_Value::Attach(CJS_Value *pValue)
78 {
79         if (pValue)
80                 Attach(pValue->ToJSValue(),pValue->GetType());
81 }
82
83 void CJS_Value::Detach()
84 {
85         m_pValue = v8::Handle<v8::Value>();
86         m_eType = VT_unknown;
87 }
88
89 /* ---------------------------------------------------------------------------------------- */
90
91 CJS_Value::operator int() const
92 {
93
94         return JS_ToInt32(m_pValue);
95
96 }
97
98 CJS_Value::operator bool() const
99 {
100
101         return JS_ToBoolean(m_pValue);
102         
103 }
104
105 CJS_Value::operator double() const
106 {
107
108         return JS_ToNumber(m_pValue);
109         
110 }
111
112 CJS_Value::operator float() const
113 {
114
115         return (float)JS_ToNumber(m_pValue);
116
117 }
118
119 CJS_Value::operator CJS_Object *() const
120 {
121
122         v8::Handle<v8::Object>  pObj = JS_ToObject(m_pValue);
123         return (CJS_Object*)JS_GetPrivate(m_isolate, pObj);
124 }
125
126 CJS_Value::operator v8::Handle<v8::Object>() const
127 {
128         return JS_ToObject(m_pValue);
129 }
130
131 CJS_Value::operator CFX_WideString() const
132 {
133         return JS_ToString(m_pValue);
134 }
135
136 CJS_Value::operator CFX_ByteString() const
137 {
138         return CFX_ByteString::FromUnicode(operator CFX_WideString());
139 }
140
141 v8::Handle<v8::Value> CJS_Value::ToJSValue()
142 {
143         return m_pValue;
144 }
145
146
147 CJS_Value::operator v8::Handle<v8::Array>() const
148 {
149         if (IsArrayObject())
150                 return v8::Handle<v8::Array>::Cast(JS_ToObject(m_pValue));
151         return v8::Handle<v8::Array>();
152 }
153
154 /* ---------------------------------------------------------------------------------------- */
155
156 void CJS_Value::operator =(int iValue)
157 {
158         m_pValue = JS_NewNumber(m_isolate, iValue);
159
160         m_eType = VT_number;
161 }
162
163 void CJS_Value::operator =(bool bValue)
164 {
165         m_pValue = JS_NewBoolean(m_isolate, bValue);
166
167         m_eType = VT_boolean;
168 }
169
170 void CJS_Value::operator =(double dValue)
171 {
172         m_pValue = JS_NewNumber(m_isolate,dValue);
173
174         m_eType = VT_number;
175 }
176
177 void CJS_Value::operator = (float fValue)
178 {
179         m_pValue = JS_NewNumber(m_isolate,fValue);
180         m_eType = VT_number;
181 }
182
183 void CJS_Value::operator =(v8::Handle<v8::Object> pObj)
184 {
185
186         m_pValue = JS_NewObject(m_isolate,pObj);
187
188         m_eType = VT_fxobject;
189 }
190
191 void CJS_Value::operator =(CJS_Object * pObj)
192 {
193         if (pObj)
194                 operator = ((JSFXObject)*pObj);
195 }
196
197 void CJS_Value::operator =(FX_LPCWSTR pWstr)
198 {
199         m_pValue = JS_NewString(m_isolate,(wchar_t *)pWstr);
200
201         m_eType = VT_string;
202 }
203
204 void CJS_Value::SetNull()
205 {
206         m_pValue = JS_NewNull();
207
208         m_eType = VT_null;
209 }
210
211 void CJS_Value::operator = (FX_LPCSTR pStr)
212 {       
213         operator = (CFX_WideString::FromLocal(pStr));
214 }
215
216 void CJS_Value::operator = (CJS_Array & array)
217 {
218         m_pValue = JS_NewObject2(m_isolate,(v8::Handle<v8::Array>)array);
219
220         m_eType = VT_object;
221 }
222
223 void CJS_Value::operator = (CJS_Date & date)
224 {
225         m_pValue = JS_NewDate(m_isolate, (double)date);
226
227         m_eType = VT_date;
228 }
229
230 void CJS_Value::operator = (CJS_Value value)
231 {
232         m_pValue = value.ToJSValue();
233
234         m_eType = value.m_eType;
235 }
236
237 /* ---------------------------------------------------------------------------------------- */
238
239 FXJSVALUETYPE CJS_Value::GetType() const
240 {
241         if(m_pValue.IsEmpty()) return VT_unknown;
242         if(m_pValue->IsString()) return VT_string;
243         if(m_pValue->IsNumber()) return VT_number;
244         if(m_pValue->IsBoolean()) return VT_boolean;
245         if(m_pValue->IsDate()) return VT_date;
246         if(m_pValue->IsObject()) return VT_object;
247         if(m_pValue->IsNull()) return VT_null;
248         if(m_pValue->IsUndefined()) return VT_undefined;
249         return VT_unknown;
250 }
251
252 FX_BOOL CJS_Value::IsArrayObject() const 
253 {
254         if(m_pValue.IsEmpty()) return FALSE;
255         return m_pValue->IsArray();
256 }
257
258 FX_BOOL CJS_Value::IsDateObject() const
259 {
260         if(m_pValue.IsEmpty()) return FALSE;
261         return m_pValue->IsDate();
262 }
263
264 //CJS_Value::operator CJS_Array()
265 FX_BOOL CJS_Value::ConvertToArray(CJS_Array &array) const
266 {
267         if (IsArrayObject())
268         {
269                 array.Attach(JS_ToArray(m_pValue));
270                 return TRUE;
271         }
272
273         return FALSE;
274 }
275
276 FX_BOOL CJS_Value::ConvertToDate(CJS_Date &date) const
277 {
278 //      if (GetType() == VT_date)
279 //      {
280 //              date = (double)(*this);
281 //              return TRUE;
282 //      }
283
284         if (IsDateObject())
285         {
286                 date.Attach(m_pValue);
287                 return TRUE;
288         }
289
290         return FALSE;   
291 }
292
293 /* ---------------------------- CJS_PropValue ---------------------------- */
294
295 CJS_PropValue::CJS_PropValue(const CJS_Value &value) : 
296         CJS_Value(value),
297         m_bIsSetting(0)
298 {
299 }
300
301 CJS_PropValue::CJS_PropValue(v8::Isolate* isolate) : CJS_Value(isolate),
302                                  m_bIsSetting(0)
303 {
304 }
305
306 CJS_PropValue::~CJS_PropValue()
307 {
308 }
309
310 FX_BOOL CJS_PropValue::IsSetting()
311 {
312         return m_bIsSetting;
313 }
314
315 FX_BOOL CJS_PropValue::IsGetting()
316 {
317         return !m_bIsSetting;
318 }
319
320 void CJS_PropValue::operator <<(int iValue)
321 {
322         ASSERT(!m_bIsSetting);
323         CJS_Value::operator =(iValue);
324 }
325
326 void CJS_PropValue::operator >>(int & iValue) const
327 {
328         ASSERT(m_bIsSetting);
329         iValue = CJS_Value::operator int();
330 }
331
332
333 void CJS_PropValue::operator <<(bool bValue)
334 {
335         ASSERT(!m_bIsSetting);
336         CJS_Value::operator =(bValue);
337 }
338
339 void CJS_PropValue::operator >>(bool &bValue) const
340 {
341         ASSERT(m_bIsSetting);
342         bValue = CJS_Value::operator bool();
343
344 }
345
346 void CJS_PropValue::operator <<(double dValue)
347 {
348         ASSERT(!m_bIsSetting);
349         CJS_Value::operator =(dValue);
350 }
351
352 void CJS_PropValue::operator >>(double &dValue) const
353 {
354         ASSERT(m_bIsSetting);
355         dValue = CJS_Value::operator double();
356 }
357
358 void CJS_PropValue::operator <<(CJS_Object *pObj)
359 {
360         ASSERT(!m_bIsSetting);
361         CJS_Value::operator = (pObj);
362 }
363
364 void CJS_PropValue::operator >>(CJS_Object *&ppObj) const
365 {
366         ASSERT(m_bIsSetting);
367         ppObj = CJS_Value::operator CJS_Object *();
368 }
369
370 void CJS_PropValue::operator<<(JSFXObject pObj)
371 {
372         ASSERT(!m_bIsSetting);
373         CJS_Value::operator = (pObj);
374 }
375
376 void CJS_PropValue::operator>>(JSFXObject &ppObj) const
377 {
378         ASSERT(m_bIsSetting);
379         ppObj = CJS_Value::operator JSFXObject ();
380 }
381
382
383 void CJS_PropValue::StartSetting()
384 {
385         m_bIsSetting = 1;
386 }
387
388 void CJS_PropValue::StartGetting()
389 {
390         m_bIsSetting = 0;
391 }
392 void CJS_PropValue::operator <<(CFX_ByteString string)
393 {
394         ASSERT(!m_bIsSetting);
395         CJS_Value::operator =((FX_LPCSTR)string);
396 }
397
398 void CJS_PropValue::operator >>(CFX_ByteString &string) const
399 {
400         ASSERT(m_bIsSetting);
401         string = CJS_Value::operator CFX_ByteString();
402 }
403
404 void CJS_PropValue::operator <<(FX_LPCWSTR c_string)
405 {
406         ASSERT(!m_bIsSetting);
407         CJS_Value::operator =(c_string);
408 }
409
410 void CJS_PropValue::operator >>(CFX_WideString &wide_string) const
411 {
412         ASSERT(m_bIsSetting);
413         wide_string = CJS_Value::operator CFX_WideString();
414 }
415
416 void CJS_PropValue::operator <<(CFX_WideString wide_string)
417 {
418         ASSERT(!m_bIsSetting);
419         CJS_Value::operator = (wide_string);
420 }
421
422 void CJS_PropValue::operator >>(CJS_Array &array) const
423 {
424         ASSERT(m_bIsSetting);
425         ConvertToArray(array);
426 }
427
428 void CJS_PropValue::operator <<(CJS_Array &array)
429 {
430         ASSERT(!m_bIsSetting);
431         CJS_Value::operator=(array);
432 }
433
434 void CJS_PropValue::operator>>(CJS_Date &date) const
435 {
436         ASSERT(m_bIsSetting);
437         ConvertToDate(date);
438 }
439
440 void CJS_PropValue::operator<<(CJS_Date &date)
441 {
442         ASSERT(!m_bIsSetting);
443         CJS_Value::operator=(date);
444 }
445
446 CJS_PropValue::operator v8::Handle<v8::Value>() const
447 {
448         return m_pValue;
449 }
450
451 /* ======================================== CJS_Array ========================================= */
452 CJS_Array::CJS_Array(v8::Isolate* isolate):m_isolate(isolate)
453 {
454 }
455
456 CJS_Array::~CJS_Array()
457 {               
458 }
459
460 void CJS_Array::Attach(v8::Handle<v8::Array> pArray)
461 {
462         m_pArray = pArray;
463 }
464
465 FX_BOOL CJS_Array::IsAttached()
466 {
467         return FALSE;
468 }
469
470 void CJS_Array::GetElement(unsigned index,CJS_Value &value)
471 {
472         if (m_pArray.IsEmpty())
473                 return;
474         v8::Handle<v8::Value>  p = JS_GetArrayElemnet(m_pArray,index);
475         value.Attach(p,VT_object);
476 }
477
478 void CJS_Array::SetElement(unsigned index,CJS_Value value)
479 {
480         if (m_pArray.IsEmpty())
481                 m_pArray = JS_NewArray(m_isolate);
482
483         JS_PutArrayElement(m_pArray,index,value.ToJSValue(),value.GetType());
484 }
485
486 int CJS_Array::GetLength()
487 {
488         if (m_pArray.IsEmpty())
489                 return 0;
490         return JS_GetArrayLength(m_pArray);
491 }
492
493 CJS_Array:: operator v8::Handle<v8::Array>()
494 {
495         if (m_pArray.IsEmpty())
496                 m_pArray = JS_NewArray(m_isolate);
497
498         return m_pArray;
499 }
500
501 /* ======================================== CJS_Date ========================================= */
502
503 CJS_Date::CJS_Date(v8::Isolate* isolate) :m_isolate(isolate)
504 {
505 }
506
507 CJS_Date::CJS_Date(v8::Isolate* isolate,double dMsec_time) 
508 {
509         m_isolate = isolate;
510         m_pDate = JS_NewDate(isolate,dMsec_time);               
511 }
512
513 CJS_Date::CJS_Date(v8::Isolate* isolate,int year, int mon, int day,int hour, int min, int sec) 
514 {
515         m_isolate = isolate;
516         m_pDate = JS_NewDate(isolate,MakeDate(year,mon,day,hour,min,sec,0));    
517 }
518
519 double CJS_Date::MakeDate(int year, int mon, int day,int hour, int min, int sec,int ms)
520 {
521         return JS_MakeDate(JS_MakeDay(year,mon,day), JS_MakeTime(hour,min,sec,ms));
522 }
523
524 CJS_Date::~CJS_Date()
525 {
526 }
527
528 FX_BOOL CJS_Date::IsValidDate()
529 {
530         if(m_pDate.IsEmpty()) return FALSE;
531         return !JS_PortIsNan(JS_ToNumber(m_pDate));
532 }
533
534 void CJS_Date::Attach(v8::Handle<v8::Value> pDate)
535 {
536         m_pDate = pDate;
537 }
538
539 int CJS_Date::GetYear()
540 {
541         if (IsValidDate())
542                 return JS_GetYearFromTime(JS_LocalTime(JS_ToNumber(m_pDate)));
543
544         return 0;
545 }
546
547 void CJS_Date::SetYear(int iYear)
548 {
549         double date = MakeDate(iYear,GetMonth(),GetDay(),GetHours(),GetMinutes(),GetSeconds(),0);
550         JS_ValueCopy(m_pDate, JS_NewDate(m_isolate,date));
551 }
552
553 int CJS_Date::GetMonth()
554 {
555         if (IsValidDate())
556                 return JS_GetMonthFromTime(JS_LocalTime(JS_ToNumber(m_pDate)));
557
558         return 0;
559 }
560
561 void CJS_Date::SetMonth(int iMonth)
562 {
563
564         double date = MakeDate(GetYear(),iMonth,GetDay(),GetHours(),GetMinutes(),GetSeconds(),0);
565         JS_ValueCopy(m_pDate, JS_NewDate(m_isolate,date));
566
567 }
568
569 int CJS_Date::GetDay()
570 {
571         if (IsValidDate())
572                 return JS_GetDayFromTime(JS_LocalTime(JS_ToNumber(m_pDate)));
573
574         return 0;
575 }
576
577 void CJS_Date::SetDay(int iDay)
578 {
579
580         double date = MakeDate(GetYear(),GetMonth(),iDay,GetHours(),GetMinutes(),GetSeconds(),0);
581         JS_ValueCopy(m_pDate,JS_NewDate(m_isolate,date));
582
583 }
584
585 int CJS_Date::GetHours()
586 {
587         if (IsValidDate())
588                 return JS_GetHourFromTime(JS_LocalTime(JS_ToNumber(m_pDate)));
589
590         return 0;
591 }
592
593 void CJS_Date::SetHours(int iHours)
594 {
595         double date = MakeDate(GetYear(),GetMonth(),GetDay(),iHours,GetMinutes(),GetSeconds(),0);
596         JS_ValueCopy(m_pDate,JS_NewDate(m_isolate,date));
597 }
598
599 int CJS_Date::GetMinutes()
600 {
601         if (IsValidDate())
602                 return JS_GetMinFromTime(JS_LocalTime(JS_ToNumber(m_pDate)));
603
604         return 0;
605 }
606
607 void CJS_Date::SetMinutes(int minutes)
608 {
609         double date = MakeDate(GetYear(),GetMonth(),GetDay(),GetHours(),minutes,GetSeconds(),0);
610         JS_ValueCopy(m_pDate,JS_NewDate(m_isolate,date));
611 }
612
613 int CJS_Date::GetSeconds()
614 {
615         if (IsValidDate())
616                 return JS_GetSecFromTime(JS_LocalTime(JS_ToNumber(m_pDate)));
617
618         return 0;
619 }
620
621 void CJS_Date::SetSeconds(int seconds)
622 {
623         double date = MakeDate(GetYear(),GetMonth(),GetDay(),GetHours(),GetMinutes(),seconds,0);
624         JS_ValueCopy(m_pDate,JS_NewDate(m_isolate,date));
625 }
626
627 CJS_Date::operator v8::Handle<v8::Value>()
628 {
629         return m_pDate;
630 }
631
632 CJS_Date::operator double() const
633 {
634         if(m_pDate.IsEmpty())
635                 return 0.0;
636         return JS_ToNumber(m_pDate);
637 }
638
639 CFX_WideString CJS_Date::ToString() const
640 {
641         if(m_pDate.IsEmpty())
642                 return L"";
643         return JS_ToString(m_pDate);
644 }