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