blob: e13b50f5ef025285032eb0827b534d1b55db43dd [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
Tom Sepez37458412015-10-06 11:33:46 -07007#include "JS_GlobalData.h"
8
Lei Zhange5b0bd12015-06-19 17:15:41 -07009#include "../../../core/include/fdrm/fx_crypt.h"
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070010#include "../../include/javascript/IJavaScript.h"
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070011
Nico Weber9d8ec5a2015-08-04 13:00:21 -070012#define JS_MAXGLOBALDATA (1024 * 4 - 8)
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070013
14/* --------------------- CJS_GlobalVariableArray --------------------- */
15
Nico Weber9d8ec5a2015-08-04 13:00:21 -070016CJS_GlobalVariableArray::CJS_GlobalVariableArray() {}
17
18CJS_GlobalVariableArray::~CJS_GlobalVariableArray() {
19 Empty();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070020}
21
Nico Weber9d8ec5a2015-08-04 13:00:21 -070022void CJS_GlobalVariableArray::Copy(const CJS_GlobalVariableArray& array) {
23 Empty();
24 for (int i = 0, sz = array.Count(); i < sz; i++) {
25 CJS_KeyValue* pOldObjData = array.GetAt(i);
26 ASSERT(pOldObjData != NULL);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070027
Nico Weber9d8ec5a2015-08-04 13:00:21 -070028 switch (pOldObjData->nType) {
29 case JS_GLOBALDATA_TYPE_NUMBER: {
30 CJS_KeyValue* pNewObjData = new CJS_KeyValue;
31 pNewObjData->sKey = pOldObjData->sKey;
32 pNewObjData->nType = pOldObjData->nType;
33 pNewObjData->dData = pOldObjData->dData;
34 Add(pNewObjData);
35 } break;
36 case JS_GLOBALDATA_TYPE_BOOLEAN: {
37 CJS_KeyValue* pNewObjData = new CJS_KeyValue;
38 pNewObjData->sKey = pOldObjData->sKey;
39 pNewObjData->nType = pOldObjData->nType;
40 pNewObjData->bData = pOldObjData->bData;
41 Add(pNewObjData);
42 } break;
43 case JS_GLOBALDATA_TYPE_STRING: {
44 CJS_KeyValue* pNewObjData = new CJS_KeyValue;
45 pNewObjData->sKey = pOldObjData->sKey;
46 pNewObjData->nType = pOldObjData->nType;
47 pNewObjData->sData = pOldObjData->sData;
48 Add(pNewObjData);
49 } break;
50 case JS_GLOBALDATA_TYPE_OBJECT: {
51 CJS_KeyValue* pNewObjData = new CJS_KeyValue;
52 pNewObjData->sKey = pOldObjData->sKey;
53 pNewObjData->nType = pOldObjData->nType;
54 pNewObjData->objData.Copy(pOldObjData->objData);
55 Add(pNewObjData);
56 }
57 case JS_GLOBALDATA_TYPE_NULL: {
58 CJS_KeyValue* pNewObjData = new CJS_KeyValue;
59 pNewObjData->sKey = pOldObjData->sKey;
60 pNewObjData->nType = pOldObjData->nType;
61 Add(pNewObjData);
62 }
Tom Sepez2f2ffec2015-07-23 14:42:09 -070063 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -070064 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070065}
66
Nico Weber9d8ec5a2015-08-04 13:00:21 -070067void CJS_GlobalVariableArray::Add(CJS_KeyValue* p) {
68 array.Add(p);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070069}
70
Nico Weber9d8ec5a2015-08-04 13:00:21 -070071int CJS_GlobalVariableArray::Count() const {
72 return array.GetSize();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070073}
74
Nico Weber9d8ec5a2015-08-04 13:00:21 -070075CJS_KeyValue* CJS_GlobalVariableArray::GetAt(int index) const {
76 return array.GetAt(index);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070077}
78
Nico Weber9d8ec5a2015-08-04 13:00:21 -070079void CJS_GlobalVariableArray::Empty() {
80 for (int i = 0, sz = array.GetSize(); i < sz; i++)
81 delete array.GetAt(i);
82 array.RemoveAll();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070083}
84
85/* -------------------------- CJS_GlobalData -------------------------- */
86
Nico Weber9d8ec5a2015-08-04 13:00:21 -070087#define READER_JS_GLOBALDATA_FILENAME L"Reader_JsGlobal.Data"
88#define PHANTOM_JS_GLOBALDATA_FILENAME L"Phantom_JsGlobal.Data"
89#define SDK_JS_GLOBALDATA_FILENAME L"SDK_JsGlobal.Data"
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070090
Nico Weber9d8ec5a2015-08-04 13:00:21 -070091static const uint8_t JS_RC4KEY[] = {
92 0x19, 0xa8, 0xe8, 0x01, 0xf6, 0xa8, 0xb6, 0x4d, 0x82, 0x04, 0x45, 0x6d,
93 0xb4, 0xcf, 0xd7, 0x77, 0x67, 0xf9, 0x75, 0x9f, 0xf0, 0xe0, 0x1e, 0x51,
94 0xee, 0x46, 0xfd, 0x0b, 0xc9, 0x93, 0x25, 0x55, 0x4a, 0xee, 0xe0, 0x16,
95 0xd0, 0xdf, 0x8c, 0xfa, 0x2a, 0xa9, 0x49, 0xfd, 0x97, 0x1c, 0x0e, 0x22,
96 0x13, 0x28, 0x7c, 0xaf, 0xc4, 0xfc, 0x9c, 0x12, 0x65, 0x8c, 0x4e, 0x5b,
97 0x04, 0x75, 0x89, 0xc9, 0xb1, 0xed, 0x50, 0xca, 0x96, 0x6f, 0x1a, 0x7a,
98 0xfe, 0x58, 0x5d, 0xec, 0x19, 0x4a, 0xf6, 0x35, 0x6a, 0x97, 0x14, 0x00,
99 0x0e, 0xd0, 0x6b, 0xbb, 0xd5, 0x75, 0x55, 0x8b, 0x6e, 0x6b, 0x19, 0xa0,
100 0xf8, 0x77, 0xd5, 0xa3};
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700101
Tom Sepezf4583622015-09-14 15:06:53 -0700102CJS_GlobalData* CJS_GlobalData::g_Instance = nullptr;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700103
Tom Sepezf4583622015-09-14 15:06:53 -0700104// static
105CJS_GlobalData* CJS_GlobalData::GetRetainedInstance(CPDFDoc_Environment* pApp) {
106 if (!g_Instance) {
107 g_Instance = new CJS_GlobalData(pApp);
108 }
109 ++g_Instance->m_RefCount;
110 return g_Instance;
111}
112
113void CJS_GlobalData::Release() {
114 if (!--m_RefCount) {
115 delete g_Instance;
116 g_Instance = nullptr;
117 }
118}
119
120CJS_GlobalData::CJS_GlobalData(CPDFDoc_Environment* pApp)
121 : m_pApp(pApp), m_RefCount(0) {
122 m_sFilePath += SDK_JS_GLOBALDATA_FILENAME;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700123 LoadGlobalPersistentVariables();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700124}
125
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700126CJS_GlobalData::~CJS_GlobalData() {
127 SaveGlobalPersisitentVariables();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700128 for (int i = 0, sz = m_arrayGlobalData.GetSize(); i < sz; i++)
129 delete m_arrayGlobalData.GetAt(i);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700130
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700131 m_arrayGlobalData.RemoveAll();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700132}
133
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700134int CJS_GlobalData::FindGlobalVariable(const FX_CHAR* propname) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700135 for (int i = 0, sz = m_arrayGlobalData.GetSize(); i < sz; i++) {
136 CJS_GlobalData_Element* pTemp = m_arrayGlobalData.GetAt(i);
Tom Sepezf4583622015-09-14 15:06:53 -0700137 if (pTemp->data.sKey[0] == *propname && pTemp->data.sKey == propname)
138 return i;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700139 }
Tom Sepezf4583622015-09-14 15:06:53 -0700140 return -1;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700141}
142
143CJS_GlobalData_Element* CJS_GlobalData::GetGlobalVariable(
144 const FX_CHAR* propname) {
145 ASSERT(propname != NULL);
146
147 int nFind = FindGlobalVariable(propname);
148 if (nFind >= 0)
149 return m_arrayGlobalData.GetAt(nFind);
150
151 return NULL;
152}
153
154void CJS_GlobalData::SetGlobalVariableNumber(const FX_CHAR* propname,
155 double dData) {
156 ASSERT(propname != NULL);
157
158 CFX_ByteString sPropName = propname;
159 sPropName.TrimLeft();
160 sPropName.TrimRight();
161 if (sPropName.GetLength() == 0)
162 return;
163
164 if (CJS_GlobalData_Element* pData = GetGlobalVariable(sPropName)) {
165 pData->data.nType = JS_GLOBALDATA_TYPE_NUMBER;
166 pData->data.dData = dData;
167 } else {
168 CJS_GlobalData_Element* pNewData = new CJS_GlobalData_Element;
169 pNewData->data.sKey = sPropName;
170 pNewData->data.nType = JS_GLOBALDATA_TYPE_NUMBER;
171 pNewData->data.dData = dData;
172 m_arrayGlobalData.Add(pNewData);
173 }
174}
175
176void CJS_GlobalData::SetGlobalVariableBoolean(const FX_CHAR* propname,
177 bool bData) {
178 ASSERT(propname != NULL);
179 CFX_ByteString sPropName = propname;
180
181 sPropName.TrimLeft();
182 sPropName.TrimRight();
183
184 if (sPropName.GetLength() == 0)
185 return;
186
187 if (CJS_GlobalData_Element* pData = GetGlobalVariable(sPropName)) {
188 pData->data.nType = JS_GLOBALDATA_TYPE_BOOLEAN;
189 pData->data.bData = bData;
190 } else {
191 CJS_GlobalData_Element* pNewData = new CJS_GlobalData_Element;
192 pNewData->data.sKey = sPropName;
193 pNewData->data.nType = JS_GLOBALDATA_TYPE_BOOLEAN;
194 pNewData->data.bData = bData;
195
196 m_arrayGlobalData.Add(pNewData);
197 }
198}
199
200void CJS_GlobalData::SetGlobalVariableString(const FX_CHAR* propname,
201 const CFX_ByteString& sData) {
202 ASSERT(propname != NULL);
203 CFX_ByteString sPropName = propname;
204
205 sPropName.TrimLeft();
206 sPropName.TrimRight();
207
208 if (sPropName.GetLength() == 0)
209 return;
210
211 if (CJS_GlobalData_Element* pData = GetGlobalVariable(sPropName)) {
212 pData->data.nType = JS_GLOBALDATA_TYPE_STRING;
213 pData->data.sData = sData;
214 } else {
215 CJS_GlobalData_Element* pNewData = new CJS_GlobalData_Element;
216 pNewData->data.sKey = sPropName;
217 pNewData->data.nType = JS_GLOBALDATA_TYPE_STRING;
218 pNewData->data.sData = sData;
219
220 m_arrayGlobalData.Add(pNewData);
221 }
222}
223
224void CJS_GlobalData::SetGlobalVariableObject(
225 const FX_CHAR* propname,
226 const CJS_GlobalVariableArray& array) {
227 ASSERT(propname != NULL);
228 CFX_ByteString sPropName = propname;
229
230 sPropName.TrimLeft();
231 sPropName.TrimRight();
232
233 if (sPropName.GetLength() == 0)
234 return;
235
236 if (CJS_GlobalData_Element* pData = GetGlobalVariable(sPropName)) {
237 pData->data.nType = JS_GLOBALDATA_TYPE_OBJECT;
238 pData->data.objData.Copy(array);
239 } else {
240 CJS_GlobalData_Element* pNewData = new CJS_GlobalData_Element;
241 pNewData->data.sKey = sPropName;
242 pNewData->data.nType = JS_GLOBALDATA_TYPE_OBJECT;
243 pNewData->data.objData.Copy(array);
244
245 m_arrayGlobalData.Add(pNewData);
246 }
247}
248
249void CJS_GlobalData::SetGlobalVariableNull(const FX_CHAR* propname) {
250 ASSERT(propname != NULL);
251 CFX_ByteString sPropName = propname;
252
253 sPropName.TrimLeft();
254 sPropName.TrimRight();
255
256 if (sPropName.GetLength() == 0)
257 return;
258
259 if (CJS_GlobalData_Element* pData = GetGlobalVariable(sPropName)) {
260 pData->data.nType = JS_GLOBALDATA_TYPE_NULL;
261 } else {
262 CJS_GlobalData_Element* pNewData = new CJS_GlobalData_Element;
263 pNewData->data.sKey = sPropName;
264 pNewData->data.nType = JS_GLOBALDATA_TYPE_NULL;
265
266 m_arrayGlobalData.Add(pNewData);
267 }
268}
269
270FX_BOOL CJS_GlobalData::SetGlobalVariablePersistent(const FX_CHAR* propname,
271 FX_BOOL bPersistent) {
272 ASSERT(propname != NULL);
273 CFX_ByteString sPropName = propname;
274
275 sPropName.TrimLeft();
276 sPropName.TrimRight();
277
278 if (sPropName.GetLength() == 0)
279 return FALSE;
280
281 if (CJS_GlobalData_Element* pData = GetGlobalVariable(sPropName)) {
282 pData->bPersistent = bPersistent;
283 return TRUE;
284 }
285
286 return FALSE;
287}
288
289FX_BOOL CJS_GlobalData::DeleteGlobalVariable(const FX_CHAR* propname) {
290 ASSERT(propname != NULL);
291 CFX_ByteString sPropName = propname;
292
293 sPropName.TrimLeft();
294 sPropName.TrimRight();
295
296 if (sPropName.GetLength() == 0)
297 return FALSE;
298
299 int nFind = FindGlobalVariable(sPropName);
300
301 if (nFind >= 0) {
302 delete m_arrayGlobalData.GetAt(nFind);
303 m_arrayGlobalData.RemoveAt(nFind);
304 return TRUE;
305 }
306
307 return FALSE;
308}
309
310int32_t CJS_GlobalData::GetSize() const {
311 return m_arrayGlobalData.GetSize();
312}
313
314CJS_GlobalData_Element* CJS_GlobalData::GetAt(int index) const {
315 return m_arrayGlobalData.GetAt(index);
316}
317
318void CJS_GlobalData::LoadGlobalPersistentVariables() {
319 uint8_t* pBuffer = NULL;
320 int32_t nLength = 0;
321
322 LoadFileBuffer(m_sFilePath.c_str(), pBuffer, nLength);
323 CRYPT_ArcFourCryptBlock(pBuffer, nLength, JS_RC4KEY, sizeof(JS_RC4KEY));
324
325 if (pBuffer) {
326 uint8_t* p = pBuffer;
327 FX_WORD wType = *((FX_WORD*)p);
328 p += sizeof(FX_WORD);
329
330 // FX_WORD wTemp = (FX_WORD)(('X' << 8) | 'F');
331
332 if (wType == (FX_WORD)(('X' << 8) | 'F')) {
333 FX_WORD wVersion = *((FX_WORD*)p);
334 p += sizeof(FX_WORD);
335
336 ASSERT(wVersion <= 2);
337
338 FX_DWORD dwCount = *((FX_DWORD*)p);
339 p += sizeof(FX_DWORD);
340
341 FX_DWORD dwSize = *((FX_DWORD*)p);
342 p += sizeof(FX_DWORD);
343
344 if (dwSize == nLength - sizeof(FX_WORD) * 2 - sizeof(FX_DWORD) * 2) {
345 for (int32_t i = 0, sz = dwCount; i < sz; i++) {
346 if (p > pBuffer + nLength)
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700347 break;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700348
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700349 FX_DWORD dwNameLen = *((FX_DWORD*)p);
350 p += sizeof(FX_DWORD);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700351
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700352 if (p + dwNameLen > pBuffer + nLength)
353 break;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700354
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700355 CFX_ByteString sEntry = CFX_ByteString(p, dwNameLen);
356 p += sizeof(char) * dwNameLen;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700357
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700358 FX_WORD wDataType = *((FX_WORD*)p);
359 p += sizeof(FX_WORD);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700360
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700361 switch (wDataType) {
362 case JS_GLOBALDATA_TYPE_NUMBER: {
363 double dData = 0;
364 switch (wVersion) {
365 case 1: {
366 FX_DWORD dwData = *((FX_DWORD*)p);
367 p += sizeof(FX_DWORD);
368 dData = dwData;
369 } break;
370 case 2: {
371 dData = *((double*)p);
372 p += sizeof(double);
373 } break;
374 }
375 SetGlobalVariableNumber(sEntry, dData);
376 SetGlobalVariablePersistent(sEntry, TRUE);
377 } break;
378 case JS_GLOBALDATA_TYPE_BOOLEAN: {
379 FX_WORD wData = *((FX_WORD*)p);
380 p += sizeof(FX_WORD);
381 SetGlobalVariableBoolean(sEntry, (bool)(wData == 1));
382 SetGlobalVariablePersistent(sEntry, TRUE);
383 } break;
384 case JS_GLOBALDATA_TYPE_STRING: {
385 FX_DWORD dwLength = *((FX_DWORD*)p);
386 p += sizeof(FX_DWORD);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700387
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700388 if (p + dwLength > pBuffer + nLength)
389 break;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700390
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700391 SetGlobalVariableString(sEntry, CFX_ByteString(p, dwLength));
392 SetGlobalVariablePersistent(sEntry, TRUE);
393 p += sizeof(char) * dwLength;
394 } break;
395 case JS_GLOBALDATA_TYPE_NULL: {
396 SetGlobalVariableNull(sEntry);
397 SetGlobalVariablePersistent(sEntry, TRUE);
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700398 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700399 }
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700400 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700401 }
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700402 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700403 FX_Free(pBuffer);
404 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700405}
406
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700407void CJS_GlobalData::SaveGlobalPersisitentVariables() {
408 FX_DWORD nCount = 0;
409 CFX_BinaryBuf sData;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700410
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700411 for (int i = 0, sz = m_arrayGlobalData.GetSize(); i < sz; i++) {
412 CJS_GlobalData_Element* pElement = m_arrayGlobalData.GetAt(i);
413 ASSERT(pElement != NULL);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700414
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700415 if (pElement->bPersistent) {
416 CFX_BinaryBuf sElement;
417 MakeByteString(pElement->data.sKey, &pElement->data, sElement);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700418
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700419 if (sData.GetSize() + sElement.GetSize() > JS_MAXGLOBALDATA)
420 break;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700421
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700422 sData.AppendBlock(sElement.GetBuffer(), sElement.GetSize());
423 nCount++;
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700424 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700425 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700426
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700427 CFX_BinaryBuf sFile;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700428
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700429 FX_WORD wType = (FX_WORD)(('X' << 8) | 'F');
430 sFile.AppendBlock(&wType, sizeof(FX_WORD));
431 FX_WORD wVersion = 2;
432 sFile.AppendBlock(&wVersion, sizeof(FX_WORD));
433 sFile.AppendBlock(&nCount, sizeof(FX_DWORD));
434 FX_DWORD dwSize = sData.GetSize();
435 sFile.AppendBlock(&dwSize, sizeof(FX_DWORD));
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700436
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700437 sFile.AppendBlock(sData.GetBuffer(), sData.GetSize());
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700438
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700439 CRYPT_ArcFourCryptBlock(sFile.GetBuffer(), sFile.GetSize(), JS_RC4KEY,
440 sizeof(JS_RC4KEY));
441 WriteFileBuffer(m_sFilePath.c_str(), (const FX_CHAR*)sFile.GetBuffer(),
442 sFile.GetSize());
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700443}
444
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700445void CJS_GlobalData::LoadFileBuffer(const FX_WCHAR* sFilePath,
446 uint8_t*& pBuffer,
447 int32_t& nLength) {
448 // UnSupport.
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700449}
450
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700451void CJS_GlobalData::WriteFileBuffer(const FX_WCHAR* sFilePath,
452 const FX_CHAR* pBuffer,
453 int32_t nLength) {
454 // UnSupport.
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700455}
456
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700457void CJS_GlobalData::MakeByteString(const CFX_ByteString& name,
458 CJS_KeyValue* pData,
459 CFX_BinaryBuf& sData) {
460 FX_WORD wType = (FX_WORD)pData->nType;
461 switch (wType) {
462 case JS_GLOBALDATA_TYPE_NUMBER: {
463 FX_DWORD dwNameLen = (FX_DWORD)name.GetLength();
464 sData.AppendBlock(&dwNameLen, sizeof(FX_DWORD));
465 sData.AppendString(name);
466 sData.AppendBlock(&wType, sizeof(FX_WORD));
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700467
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700468 double dData = pData->dData;
469 sData.AppendBlock(&dData, sizeof(double));
470 } break;
471 case JS_GLOBALDATA_TYPE_BOOLEAN: {
472 FX_DWORD dwNameLen = (FX_DWORD)name.GetLength();
473 sData.AppendBlock(&dwNameLen, sizeof(FX_DWORD));
474 sData.AppendString(name);
475 sData.AppendBlock(&wType, sizeof(FX_WORD));
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700476
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700477 FX_WORD wData = (FX_WORD)pData->bData;
478 sData.AppendBlock(&wData, sizeof(FX_WORD));
479 } break;
480 case JS_GLOBALDATA_TYPE_STRING: {
481 FX_DWORD dwNameLen = (FX_DWORD)name.GetLength();
482 sData.AppendBlock(&dwNameLen, sizeof(FX_DWORD));
483 sData.AppendString(name);
484 sData.AppendBlock(&wType, sizeof(FX_WORD));
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700485
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700486 FX_DWORD dwDataLen = (FX_DWORD)pData->sData.GetLength();
487 sData.AppendBlock(&dwDataLen, sizeof(FX_DWORD));
488 sData.AppendString(pData->sData);
489 } break;
490 case JS_GLOBALDATA_TYPE_NULL: {
491 FX_DWORD dwNameLen = (FX_DWORD)name.GetLength();
492 sData.AppendBlock(&dwNameLen, sizeof(FX_DWORD));
493 sData.AppendString(name);
494 sData.AppendBlock(&wType, sizeof(FX_DWORD));
495 } break;
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700496 default:
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700497 break;
498 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700499}