blob: 2b4248ccbf8f875dde347c8aab517207afb6ce9c [file] [log] [blame]
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001// 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.
Lei Zhanga6d9f0e2015-06-13 00:48:38 -07004
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07005// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6
Lei Zhange5b0bd12015-06-19 17:15:41 -07007#include "../../../core/include/fdrm/fx_crypt.h"
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07008#include "../../include/javascript/JavaScript.h"
9#include "../../include/javascript/IJavaScript.h"
10#include "../../include/javascript/JS_GlobalData.h"
11
Tom Sepez2f2ffec2015-07-23 14:42:09 -070012#define JS_MAXGLOBALDATA (1024 * 4 - 8)
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070013
14/* --------------------- CJS_GlobalVariableArray --------------------- */
15
16CJS_GlobalVariableArray::CJS_GlobalVariableArray()
17{
18}
19
20CJS_GlobalVariableArray::~CJS_GlobalVariableArray()
21{
Tom Sepez2f2ffec2015-07-23 14:42:09 -070022 Empty();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070023}
24
25void CJS_GlobalVariableArray::Copy(const CJS_GlobalVariableArray& array)
26{
Tom Sepez2f2ffec2015-07-23 14:42:09 -070027 Empty();
28 for (int i=0,sz=array.Count(); i<sz; i++)
29 {
30 CJS_KeyValue* pOldObjData = array.GetAt(i);
31 ASSERT(pOldObjData != NULL);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070032
Tom Sepez2f2ffec2015-07-23 14:42:09 -070033 switch (pOldObjData->nType)
34 {
35 case JS_GLOBALDATA_TYPE_NUMBER:
36 {
37 CJS_KeyValue* pNewObjData = new CJS_KeyValue;
38 pNewObjData->sKey = pOldObjData->sKey;
39 pNewObjData->nType = pOldObjData->nType;
40 pNewObjData->dData = pOldObjData->dData;
41 Add(pNewObjData);
42 }
43 break;
44 case JS_GLOBALDATA_TYPE_BOOLEAN:
45 {
46 CJS_KeyValue* pNewObjData = new CJS_KeyValue;
47 pNewObjData->sKey = pOldObjData->sKey;
48 pNewObjData->nType = pOldObjData->nType;
49 pNewObjData->bData = pOldObjData->bData;
50 Add(pNewObjData);
51 }
52 break;
53 case JS_GLOBALDATA_TYPE_STRING:
54 {
55 CJS_KeyValue* pNewObjData = new CJS_KeyValue;
56 pNewObjData->sKey = pOldObjData->sKey;
57 pNewObjData->nType = pOldObjData->nType;
58 pNewObjData->sData = pOldObjData->sData;
59 Add(pNewObjData);
60 }
61 break;
62 case JS_GLOBALDATA_TYPE_OBJECT:
63 {
64 CJS_KeyValue* pNewObjData = new CJS_KeyValue;
65 pNewObjData->sKey = pOldObjData->sKey;
66 pNewObjData->nType = pOldObjData->nType;
67 pNewObjData->objData.Copy(pOldObjData->objData);
68 Add(pNewObjData);
69 }
70 case JS_GLOBALDATA_TYPE_NULL:
71 {
72 CJS_KeyValue* pNewObjData = new CJS_KeyValue;
73 pNewObjData->sKey = pOldObjData->sKey;
74 pNewObjData->nType = pOldObjData->nType;
75 Add(pNewObjData);
76 }
77 }
78 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070079}
80
81void CJS_GlobalVariableArray::Add(CJS_KeyValue* p)
82{
Tom Sepez2f2ffec2015-07-23 14:42:09 -070083 array.Add(p);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070084}
85
86int CJS_GlobalVariableArray::Count() const
87{
Tom Sepez2f2ffec2015-07-23 14:42:09 -070088 return array.GetSize();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070089}
90
91CJS_KeyValue* CJS_GlobalVariableArray::GetAt(int index) const
92{
Tom Sepez2f2ffec2015-07-23 14:42:09 -070093 return array.GetAt(index);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070094}
95
96void CJS_GlobalVariableArray::Empty()
97{
Tom Sepez2f2ffec2015-07-23 14:42:09 -070098 for (int i=0,sz=array.GetSize(); i<sz; i++)
99 delete array.GetAt(i);
100 array.RemoveAll();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700101}
102
103/* -------------------------- CJS_GlobalData -------------------------- */
104
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700105#define READER_JS_GLOBALDATA_FILENAME L"Reader_JsGlobal.Data"
106#define PHANTOM_JS_GLOBALDATA_FILENAME L"Phantom_JsGlobal.Data"
107#define SDK_JS_GLOBALDATA_FILENAME L"SDK_JsGlobal.Data"
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700108
Tom Sepezbfa9a822015-06-09 13:24:12 -0700109static const uint8_t JS_RC4KEY[] = {0x19,0xa8,0xe8,0x01,0xf6,0xa8,0xb6,0x4d,0x82,0x04,
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700110 0x45,0x6d,0xb4,0xcf,0xd7,0x77,0x67,0xf9,0x75,0x9f,
111 0xf0,0xe0,0x1e,0x51,0xee,0x46,0xfd,0x0b,0xc9,0x93,
112 0x25,0x55,0x4a,0xee,0xe0,0x16,0xd0,0xdf,0x8c,0xfa,
113 0x2a,0xa9,0x49,0xfd,0x97,0x1c,0x0e,0x22,0x13,0x28,
114 0x7c,0xaf,0xc4,0xfc,0x9c,0x12,0x65,0x8c,0x4e,0x5b,
115 0x04,0x75,0x89,0xc9,0xb1,0xed,0x50,0xca,0x96,0x6f,
116 0x1a,0x7a,0xfe,0x58,0x5d,0xec,0x19,0x4a,0xf6,0x35,
117 0x6a,0x97,0x14,0x00,0x0e,0xd0,0x6b,0xbb,0xd5,0x75,
118 0x55,0x8b,0x6e,0x6b,0x19,0xa0,0xf8,0x77,0xd5,0xa3
119 };
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700120
Bo Xufdc00a72014-10-28 23:03:33 -0700121CJS_GlobalData::CJS_GlobalData(CPDFDoc_Environment* pApp) : m_pApp(pApp)
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700122{
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700123// IBaseAnnot* pBaseAnnot = IBaseAnnot::GetBaseAnnot(m_pApp);
124// ASSERT(pBaseAnnot != NULL);
Lei Zhanga6d9f0e2015-06-13 00:48:38 -0700125//
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700126// m_sFilePath = pBaseAnnot->GetUserPath();
127 m_sFilePath += SDK_JS_GLOBALDATA_FILENAME;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700128
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700129 LoadGlobalPersistentVariables();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700130}
131
132CJS_GlobalData::~CJS_GlobalData()
133{
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700134 SaveGlobalPersisitentVariables();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700135
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700136 for (int i=0,sz=m_arrayGlobalData.GetSize(); i<sz; i++)
137 delete m_arrayGlobalData.GetAt(i);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700138
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700139 m_arrayGlobalData.RemoveAll();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700140}
141
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700142int CJS_GlobalData::FindGlobalVariable(const FX_CHAR* propname)
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700143{
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700144 ASSERT(propname != NULL);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700145
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700146 int nRet = -1;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700147
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700148 for (int i=0,sz=m_arrayGlobalData.GetSize(); i<sz; i++)
149 {
150 CJS_GlobalData_Element* pTemp = m_arrayGlobalData.GetAt(i);
151 if (pTemp->data.sKey[0] == *propname && pTemp->data.sKey == propname)
152 {
153 nRet = i;
154 break;
155 }
156 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700157
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700158 return nRet;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700159}
160
Tom Sepezd7e5cc72015-06-10 14:33:37 -0700161CJS_GlobalData_Element* CJS_GlobalData::GetGlobalVariable(const FX_CHAR* propname)
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700162{
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700163 ASSERT(propname != NULL);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700164
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700165 int nFind = FindGlobalVariable(propname);
166 if (nFind >= 0)
167 return m_arrayGlobalData.GetAt(nFind);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700168
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700169 return NULL;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700170}
171
Tom Sepezd7e5cc72015-06-10 14:33:37 -0700172void CJS_GlobalData::SetGlobalVariableNumber(const FX_CHAR* propname, double dData)
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700173{
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700174 ASSERT(propname != NULL);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700175
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700176 CFX_ByteString sPropName = propname;
177 sPropName.TrimLeft();
178 sPropName.TrimRight();
179 if (sPropName.GetLength() == 0)
180 return;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700181
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700182 if (CJS_GlobalData_Element* pData = GetGlobalVariable(sPropName))
183 {
184 pData->data.nType = JS_GLOBALDATA_TYPE_NUMBER;
185 pData->data.dData = dData;
186 }
187 else
188 {
189 CJS_GlobalData_Element* pNewData = new CJS_GlobalData_Element;
190 pNewData->data.sKey = sPropName;
191 pNewData->data.nType = JS_GLOBALDATA_TYPE_NUMBER;
192 pNewData->data.dData = dData;
193 m_arrayGlobalData.Add(pNewData);
194 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700195}
196
Tom Sepezd7e5cc72015-06-10 14:33:37 -0700197void CJS_GlobalData::SetGlobalVariableBoolean(const FX_CHAR* propname, bool bData)
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700198{
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700199 ASSERT(propname != NULL);
200 CFX_ByteString sPropName = propname;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700201
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700202 sPropName.TrimLeft();
203 sPropName.TrimRight();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700204
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700205 if (sPropName.GetLength() == 0) return;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700206
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700207 if (CJS_GlobalData_Element* pData = GetGlobalVariable(sPropName))
208 {
209 pData->data.nType = JS_GLOBALDATA_TYPE_BOOLEAN;
210 pData->data.bData = bData;
211 }
212 else
213 {
214 CJS_GlobalData_Element* pNewData = new CJS_GlobalData_Element;
215 pNewData->data.sKey = sPropName;
216 pNewData->data.nType = JS_GLOBALDATA_TYPE_BOOLEAN;
217 pNewData->data.bData = bData;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700218
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700219 m_arrayGlobalData.Add(pNewData);
220 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700221}
222
Tom Sepezd7e5cc72015-06-10 14:33:37 -0700223void CJS_GlobalData::SetGlobalVariableString(const FX_CHAR* propname, const CFX_ByteString& sData)
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700224{
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700225 ASSERT(propname != NULL);
226 CFX_ByteString sPropName = propname;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700227
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700228 sPropName.TrimLeft();
229 sPropName.TrimRight();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700230
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700231 if (sPropName.GetLength() == 0) return;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700232
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700233 if (CJS_GlobalData_Element* pData = GetGlobalVariable(sPropName))
234 {
235 pData->data.nType = JS_GLOBALDATA_TYPE_STRING;
236 pData->data.sData = sData;
237 }
238 else
239 {
240 CJS_GlobalData_Element* pNewData = new CJS_GlobalData_Element;
241 pNewData->data.sKey = sPropName;
242 pNewData->data.nType = JS_GLOBALDATA_TYPE_STRING;
243 pNewData->data.sData = sData;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700244
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700245 m_arrayGlobalData.Add(pNewData);
246 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700247}
248
Tom Sepezd7e5cc72015-06-10 14:33:37 -0700249void CJS_GlobalData::SetGlobalVariableObject(const FX_CHAR* propname, const CJS_GlobalVariableArray& array)
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700250{
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700251 ASSERT(propname != NULL);
252 CFX_ByteString sPropName = propname;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700253
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700254 sPropName.TrimLeft();
255 sPropName.TrimRight();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700256
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700257 if (sPropName.GetLength() == 0) return;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700258
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700259 if (CJS_GlobalData_Element* pData = GetGlobalVariable(sPropName))
260 {
261 pData->data.nType = JS_GLOBALDATA_TYPE_OBJECT;
262 pData->data.objData.Copy(array);
263 }
264 else
265 {
266 CJS_GlobalData_Element* pNewData = new CJS_GlobalData_Element;
267 pNewData->data.sKey = sPropName;
268 pNewData->data.nType = JS_GLOBALDATA_TYPE_OBJECT;
269 pNewData->data.objData.Copy(array);
Lei Zhanga6d9f0e2015-06-13 00:48:38 -0700270
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700271 m_arrayGlobalData.Add(pNewData);
272 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700273}
274
Tom Sepezd7e5cc72015-06-10 14:33:37 -0700275void CJS_GlobalData::SetGlobalVariableNull(const FX_CHAR* propname)
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700276{
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700277 ASSERT(propname != NULL);
278 CFX_ByteString sPropName = propname;
Lei Zhanga6d9f0e2015-06-13 00:48:38 -0700279
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700280 sPropName.TrimLeft();
281 sPropName.TrimRight();
Lei Zhanga6d9f0e2015-06-13 00:48:38 -0700282
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700283 if (sPropName.GetLength() == 0) return;
Lei Zhanga6d9f0e2015-06-13 00:48:38 -0700284
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700285 if (CJS_GlobalData_Element* pData = GetGlobalVariable(sPropName))
286 {
287 pData->data.nType = JS_GLOBALDATA_TYPE_NULL;
288 }
289 else
290 {
291 CJS_GlobalData_Element* pNewData = new CJS_GlobalData_Element;
292 pNewData->data.sKey = sPropName;
293 pNewData->data.nType = JS_GLOBALDATA_TYPE_NULL;
Lei Zhanga6d9f0e2015-06-13 00:48:38 -0700294
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700295 m_arrayGlobalData.Add(pNewData);
296 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700297}
298
Tom Sepezd7e5cc72015-06-10 14:33:37 -0700299FX_BOOL CJS_GlobalData::SetGlobalVariablePersistent(const FX_CHAR* propname, FX_BOOL bPersistent)
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700300{
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700301 ASSERT(propname != NULL);
302 CFX_ByteString sPropName = propname;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700303
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700304 sPropName.TrimLeft();
305 sPropName.TrimRight();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700306
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700307 if (sPropName.GetLength() == 0) return FALSE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700308
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700309 if (CJS_GlobalData_Element* pData = GetGlobalVariable(sPropName))
310 {
311 pData->bPersistent = bPersistent;
312 return TRUE;
313 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700314
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700315 return FALSE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700316}
317
Tom Sepezd7e5cc72015-06-10 14:33:37 -0700318FX_BOOL CJS_GlobalData::DeleteGlobalVariable(const FX_CHAR* propname)
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700319{
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700320 ASSERT(propname != NULL);
321 CFX_ByteString sPropName = propname;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700322
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700323 sPropName.TrimLeft();
324 sPropName.TrimRight();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700325
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700326 if (sPropName.GetLength() == 0) return FALSE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700327
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700328 int nFind = FindGlobalVariable(sPropName);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700329
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700330 if (nFind >= 0)
331 {
332 delete m_arrayGlobalData.GetAt(nFind);
333 m_arrayGlobalData.RemoveAt(nFind);
334 return TRUE;
335 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700336
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700337 return FALSE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700338}
339
Tom Sepezbfa9a822015-06-09 13:24:12 -0700340int32_t CJS_GlobalData::GetSize() const
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700341{
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700342 return m_arrayGlobalData.GetSize();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700343}
344
345CJS_GlobalData_Element* CJS_GlobalData::GetAt(int index) const
346{
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700347 return m_arrayGlobalData.GetAt(index);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700348}
349
350void CJS_GlobalData::LoadGlobalPersistentVariables()
351{
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700352 uint8_t* pBuffer = NULL;
353 int32_t nLength = 0;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700354
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700355 LoadFileBuffer(m_sFilePath.c_str(), pBuffer, nLength);
356 CRYPT_ArcFourCryptBlock(pBuffer, nLength, JS_RC4KEY, sizeof(JS_RC4KEY));
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700357
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700358 if (pBuffer)
359 {
360 uint8_t* p = pBuffer;
361 FX_WORD wType = *((FX_WORD*)p);
362 p += sizeof(FX_WORD);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700363
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700364 //FX_WORD wTemp = (FX_WORD)(('X' << 8) | 'F');
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700365
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700366 if (wType == (FX_WORD)(('X' << 8) | 'F'))
367 {
368 FX_WORD wVersion = *((FX_WORD*)p);
369 p += sizeof(FX_WORD);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700370
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700371 ASSERT(wVersion <= 2);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700372
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700373 FX_DWORD dwCount = *((FX_DWORD*)p);
374 p += sizeof(FX_DWORD);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700375
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700376 FX_DWORD dwSize = *((FX_DWORD*)p);
377 p += sizeof(FX_DWORD);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700378
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700379 if (dwSize == nLength - sizeof(FX_WORD) * 2 - sizeof(FX_DWORD)* 2)
380 {
381 for (int32_t i=0,sz=dwCount; i<sz; i++)
382 {
383 if (p > pBuffer + nLength)
384 break;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700385
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700386 FX_DWORD dwNameLen = *((FX_DWORD*)p);
387 p += sizeof(FX_DWORD);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700388
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700389 if (p + dwNameLen > pBuffer + nLength)
390 break;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700391
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700392 CFX_ByteString sEntry = CFX_ByteString(p, dwNameLen);
393 p += sizeof(char) * dwNameLen;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700394
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700395 FX_WORD wDataType = *((FX_WORD*)p);
396 p += sizeof(FX_WORD);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700397
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700398 switch (wDataType)
399 {
400 case JS_GLOBALDATA_TYPE_NUMBER:
401 {
402 double dData = 0;
403 switch (wVersion)
404 {
405 case 1:
406 {
407 FX_DWORD dwData = *((FX_DWORD*)p);
408 p += sizeof(FX_DWORD);
409 dData = dwData;
410 }
411 break;
412 case 2:
413 {
414 dData = *((double*)p);
415 p += sizeof(double);
416 }
417 break;
418 }
419 SetGlobalVariableNumber(sEntry, dData);
420 SetGlobalVariablePersistent(sEntry, TRUE);
421 }
422 break;
423 case JS_GLOBALDATA_TYPE_BOOLEAN:
424 {
425 FX_WORD wData = *((FX_WORD*)p);
426 p += sizeof(FX_WORD);
427 SetGlobalVariableBoolean(sEntry, (bool)(wData == 1));
428 SetGlobalVariablePersistent(sEntry, TRUE);
429 }
430 break;
431 case JS_GLOBALDATA_TYPE_STRING:
432 {
433 FX_DWORD dwLength = *((FX_DWORD*)p);
434 p += sizeof(FX_DWORD);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700435
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700436 if (p + dwLength > pBuffer + nLength)
437 break;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700438
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700439 SetGlobalVariableString(sEntry, CFX_ByteString(p, dwLength));
440 SetGlobalVariablePersistent(sEntry, TRUE);
441 p += sizeof(char) * dwLength;
442 }
443 break;
444 case JS_GLOBALDATA_TYPE_NULL:
445 {
446 SetGlobalVariableNull(sEntry);
447 SetGlobalVariablePersistent(sEntry, TRUE);
448 }
449 }
450 }
451 }
452 }
453 FX_Free(pBuffer);
454 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700455}
456
457/*
458struct js_global_datafile_header
459{
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700460 FX_WORD type; //FX ('X' << 8) | 'F'
461 FX_WORD version; //1.0
462 FX_DWORD datacount;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700463};
464struct js_global_datafile_data
465{
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700466 FX_WORD type;
467 FX_DWORD nData;
468 FX_WORD bData;
469 FX_DWORD nStrLen;
470 char* pStr;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700471};
472*/
473
474void CJS_GlobalData::SaveGlobalPersisitentVariables()
475{
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700476 FX_DWORD nCount = 0;
477 CFX_BinaryBuf sData;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700478
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700479 for (int i=0,sz=m_arrayGlobalData.GetSize(); i<sz; i++)
480 {
481 CJS_GlobalData_Element* pElement = m_arrayGlobalData.GetAt(i);
482 ASSERT(pElement != NULL);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700483
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700484 if (pElement->bPersistent)
485 {
486 CFX_BinaryBuf sElement;
487 MakeByteString(pElement->data.sKey, &pElement->data, sElement);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700488
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700489 if (sData.GetSize() + sElement.GetSize() > JS_MAXGLOBALDATA)
490 break;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700491
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700492 sData.AppendBlock(sElement.GetBuffer(), sElement.GetSize());
493 nCount++;
494 }
495 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700496
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700497 CFX_BinaryBuf sFile;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700498
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700499 FX_WORD wType = (FX_WORD)(('X' << 8) | 'F');
500 sFile.AppendBlock(&wType, sizeof(FX_WORD));
501 FX_WORD wVersion = 2;
502 sFile.AppendBlock(&wVersion, sizeof(FX_WORD));
503 sFile.AppendBlock(&nCount, sizeof(FX_DWORD));
504 FX_DWORD dwSize = sData.GetSize();
505 sFile.AppendBlock(&dwSize, sizeof(FX_DWORD));
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700506
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700507 sFile.AppendBlock(sData.GetBuffer(), sData.GetSize());
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700508
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700509 CRYPT_ArcFourCryptBlock(sFile.GetBuffer(), sFile.GetSize(), JS_RC4KEY, sizeof(JS_RC4KEY));
510 WriteFileBuffer(m_sFilePath.c_str(), (const FX_CHAR*)sFile.GetBuffer(), sFile.GetSize());
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700511}
512
Tom Sepezd7e5cc72015-06-10 14:33:37 -0700513void CJS_GlobalData::LoadFileBuffer(const FX_WCHAR* sFilePath, uint8_t*& pBuffer, int32_t& nLength)
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700514{
515//UnSupport.
516}
517
Tom Sepezd7e5cc72015-06-10 14:33:37 -0700518void CJS_GlobalData::WriteFileBuffer(const FX_WCHAR* sFilePath, const FX_CHAR* pBuffer, int32_t nLength)
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700519{
520//UnSupport.
521}
522
523void CJS_GlobalData::MakeByteString(const CFX_ByteString& name, CJS_KeyValue* pData, CFX_BinaryBuf& sData)
524{
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700525 FX_WORD wType = (FX_WORD)pData->nType;
526 switch (wType)
527 {
528 case JS_GLOBALDATA_TYPE_NUMBER:
529 {
530 FX_DWORD dwNameLen = (FX_DWORD)name.GetLength();
531 sData.AppendBlock(&dwNameLen, sizeof(FX_DWORD));
532 sData.AppendString(name);
533 sData.AppendBlock(&wType, sizeof(FX_WORD));
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700534
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700535 double dData = pData->dData;
536 sData.AppendBlock(&dData, sizeof(double));
537 }
538 break;
539 case JS_GLOBALDATA_TYPE_BOOLEAN:
540 {
541 FX_DWORD dwNameLen = (FX_DWORD)name.GetLength();
542 sData.AppendBlock(&dwNameLen, sizeof(FX_DWORD));
543 sData.AppendString(name);
544 sData.AppendBlock(&wType, sizeof(FX_WORD));
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700545
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700546 FX_WORD wData = (FX_WORD)pData->bData;
547 sData.AppendBlock(&wData, sizeof(FX_WORD));
548 }
549 break;
550 case JS_GLOBALDATA_TYPE_STRING:
551 {
552 FX_DWORD dwNameLen = (FX_DWORD)name.GetLength();
553 sData.AppendBlock(&dwNameLen, sizeof(FX_DWORD));
554 sData.AppendString(name);
555 sData.AppendBlock(&wType, sizeof(FX_WORD));
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700556
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700557 FX_DWORD dwDataLen = (FX_DWORD)pData->sData.GetLength();
558 sData.AppendBlock(&dwDataLen, sizeof(FX_DWORD));
559 sData.AppendString(pData->sData);
560 }
561 break;
562 case JS_GLOBALDATA_TYPE_NULL:
563 {
564 FX_DWORD dwNameLen = (FX_DWORD)name.GetLength();
565 sData.AppendBlock(&dwNameLen, sizeof(FX_DWORD));
566 sData.AppendString(name);
567 sData.AppendBlock(&wType, sizeof(FX_DWORD));
568 }
569 break;
570 default:
571 break;
572 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700573}
574