blob: 567e4f2c0a4de125ec19be6aef810f048b54fe8e [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
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
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700102CJS_GlobalData::CJS_GlobalData(CPDFDoc_Environment* pApp) : m_pApp(pApp) {
103 // IBaseAnnot* pBaseAnnot = IBaseAnnot::GetBaseAnnot(m_pApp);
104 // ASSERT(pBaseAnnot != NULL);
105 //
106 // m_sFilePath = pBaseAnnot->GetUserPath();
107 m_sFilePath += SDK_JS_GLOBALDATA_FILENAME;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700108
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700109 LoadGlobalPersistentVariables();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700110}
111
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700112CJS_GlobalData::~CJS_GlobalData() {
113 SaveGlobalPersisitentVariables();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700114
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700115 for (int i = 0, sz = m_arrayGlobalData.GetSize(); i < sz; i++)
116 delete m_arrayGlobalData.GetAt(i);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700117
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700118 m_arrayGlobalData.RemoveAll();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700119}
120
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700121int CJS_GlobalData::FindGlobalVariable(const FX_CHAR* propname) {
122 ASSERT(propname != NULL);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700123
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700124 int nRet = -1;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700125
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700126 for (int i = 0, sz = m_arrayGlobalData.GetSize(); i < sz; i++) {
127 CJS_GlobalData_Element* pTemp = m_arrayGlobalData.GetAt(i);
128 if (pTemp->data.sKey[0] == *propname && pTemp->data.sKey == propname) {
129 nRet = i;
130 break;
131 }
132 }
133
134 return nRet;
135}
136
137CJS_GlobalData_Element* CJS_GlobalData::GetGlobalVariable(
138 const FX_CHAR* propname) {
139 ASSERT(propname != NULL);
140
141 int nFind = FindGlobalVariable(propname);
142 if (nFind >= 0)
143 return m_arrayGlobalData.GetAt(nFind);
144
145 return NULL;
146}
147
148void CJS_GlobalData::SetGlobalVariableNumber(const FX_CHAR* propname,
149 double dData) {
150 ASSERT(propname != NULL);
151
152 CFX_ByteString sPropName = propname;
153 sPropName.TrimLeft();
154 sPropName.TrimRight();
155 if (sPropName.GetLength() == 0)
156 return;
157
158 if (CJS_GlobalData_Element* pData = GetGlobalVariable(sPropName)) {
159 pData->data.nType = JS_GLOBALDATA_TYPE_NUMBER;
160 pData->data.dData = dData;
161 } else {
162 CJS_GlobalData_Element* pNewData = new CJS_GlobalData_Element;
163 pNewData->data.sKey = sPropName;
164 pNewData->data.nType = JS_GLOBALDATA_TYPE_NUMBER;
165 pNewData->data.dData = dData;
166 m_arrayGlobalData.Add(pNewData);
167 }
168}
169
170void CJS_GlobalData::SetGlobalVariableBoolean(const FX_CHAR* propname,
171 bool bData) {
172 ASSERT(propname != NULL);
173 CFX_ByteString sPropName = propname;
174
175 sPropName.TrimLeft();
176 sPropName.TrimRight();
177
178 if (sPropName.GetLength() == 0)
179 return;
180
181 if (CJS_GlobalData_Element* pData = GetGlobalVariable(sPropName)) {
182 pData->data.nType = JS_GLOBALDATA_TYPE_BOOLEAN;
183 pData->data.bData = bData;
184 } else {
185 CJS_GlobalData_Element* pNewData = new CJS_GlobalData_Element;
186 pNewData->data.sKey = sPropName;
187 pNewData->data.nType = JS_GLOBALDATA_TYPE_BOOLEAN;
188 pNewData->data.bData = bData;
189
190 m_arrayGlobalData.Add(pNewData);
191 }
192}
193
194void CJS_GlobalData::SetGlobalVariableString(const FX_CHAR* propname,
195 const CFX_ByteString& sData) {
196 ASSERT(propname != NULL);
197 CFX_ByteString sPropName = propname;
198
199 sPropName.TrimLeft();
200 sPropName.TrimRight();
201
202 if (sPropName.GetLength() == 0)
203 return;
204
205 if (CJS_GlobalData_Element* pData = GetGlobalVariable(sPropName)) {
206 pData->data.nType = JS_GLOBALDATA_TYPE_STRING;
207 pData->data.sData = sData;
208 } else {
209 CJS_GlobalData_Element* pNewData = new CJS_GlobalData_Element;
210 pNewData->data.sKey = sPropName;
211 pNewData->data.nType = JS_GLOBALDATA_TYPE_STRING;
212 pNewData->data.sData = sData;
213
214 m_arrayGlobalData.Add(pNewData);
215 }
216}
217
218void CJS_GlobalData::SetGlobalVariableObject(
219 const FX_CHAR* propname,
220 const CJS_GlobalVariableArray& array) {
221 ASSERT(propname != NULL);
222 CFX_ByteString sPropName = propname;
223
224 sPropName.TrimLeft();
225 sPropName.TrimRight();
226
227 if (sPropName.GetLength() == 0)
228 return;
229
230 if (CJS_GlobalData_Element* pData = GetGlobalVariable(sPropName)) {
231 pData->data.nType = JS_GLOBALDATA_TYPE_OBJECT;
232 pData->data.objData.Copy(array);
233 } else {
234 CJS_GlobalData_Element* pNewData = new CJS_GlobalData_Element;
235 pNewData->data.sKey = sPropName;
236 pNewData->data.nType = JS_GLOBALDATA_TYPE_OBJECT;
237 pNewData->data.objData.Copy(array);
238
239 m_arrayGlobalData.Add(pNewData);
240 }
241}
242
243void CJS_GlobalData::SetGlobalVariableNull(const FX_CHAR* propname) {
244 ASSERT(propname != NULL);
245 CFX_ByteString sPropName = propname;
246
247 sPropName.TrimLeft();
248 sPropName.TrimRight();
249
250 if (sPropName.GetLength() == 0)
251 return;
252
253 if (CJS_GlobalData_Element* pData = GetGlobalVariable(sPropName)) {
254 pData->data.nType = JS_GLOBALDATA_TYPE_NULL;
255 } else {
256 CJS_GlobalData_Element* pNewData = new CJS_GlobalData_Element;
257 pNewData->data.sKey = sPropName;
258 pNewData->data.nType = JS_GLOBALDATA_TYPE_NULL;
259
260 m_arrayGlobalData.Add(pNewData);
261 }
262}
263
264FX_BOOL CJS_GlobalData::SetGlobalVariablePersistent(const FX_CHAR* propname,
265 FX_BOOL bPersistent) {
266 ASSERT(propname != NULL);
267 CFX_ByteString sPropName = propname;
268
269 sPropName.TrimLeft();
270 sPropName.TrimRight();
271
272 if (sPropName.GetLength() == 0)
273 return FALSE;
274
275 if (CJS_GlobalData_Element* pData = GetGlobalVariable(sPropName)) {
276 pData->bPersistent = bPersistent;
277 return TRUE;
278 }
279
280 return FALSE;
281}
282
283FX_BOOL CJS_GlobalData::DeleteGlobalVariable(const FX_CHAR* propname) {
284 ASSERT(propname != NULL);
285 CFX_ByteString sPropName = propname;
286
287 sPropName.TrimLeft();
288 sPropName.TrimRight();
289
290 if (sPropName.GetLength() == 0)
291 return FALSE;
292
293 int nFind = FindGlobalVariable(sPropName);
294
295 if (nFind >= 0) {
296 delete m_arrayGlobalData.GetAt(nFind);
297 m_arrayGlobalData.RemoveAt(nFind);
298 return TRUE;
299 }
300
301 return FALSE;
302}
303
304int32_t CJS_GlobalData::GetSize() const {
305 return m_arrayGlobalData.GetSize();
306}
307
308CJS_GlobalData_Element* CJS_GlobalData::GetAt(int index) const {
309 return m_arrayGlobalData.GetAt(index);
310}
311
312void CJS_GlobalData::LoadGlobalPersistentVariables() {
313 uint8_t* pBuffer = NULL;
314 int32_t nLength = 0;
315
316 LoadFileBuffer(m_sFilePath.c_str(), pBuffer, nLength);
317 CRYPT_ArcFourCryptBlock(pBuffer, nLength, JS_RC4KEY, sizeof(JS_RC4KEY));
318
319 if (pBuffer) {
320 uint8_t* p = pBuffer;
321 FX_WORD wType = *((FX_WORD*)p);
322 p += sizeof(FX_WORD);
323
324 // FX_WORD wTemp = (FX_WORD)(('X' << 8) | 'F');
325
326 if (wType == (FX_WORD)(('X' << 8) | 'F')) {
327 FX_WORD wVersion = *((FX_WORD*)p);
328 p += sizeof(FX_WORD);
329
330 ASSERT(wVersion <= 2);
331
332 FX_DWORD dwCount = *((FX_DWORD*)p);
333 p += sizeof(FX_DWORD);
334
335 FX_DWORD dwSize = *((FX_DWORD*)p);
336 p += sizeof(FX_DWORD);
337
338 if (dwSize == nLength - sizeof(FX_WORD) * 2 - sizeof(FX_DWORD) * 2) {
339 for (int32_t i = 0, sz = dwCount; i < sz; i++) {
340 if (p > pBuffer + nLength)
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700341 break;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700342
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700343 FX_DWORD dwNameLen = *((FX_DWORD*)p);
344 p += sizeof(FX_DWORD);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700345
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700346 if (p + dwNameLen > pBuffer + nLength)
347 break;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700348
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700349 CFX_ByteString sEntry = CFX_ByteString(p, dwNameLen);
350 p += sizeof(char) * dwNameLen;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700351
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700352 FX_WORD wDataType = *((FX_WORD*)p);
353 p += sizeof(FX_WORD);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700354
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700355 switch (wDataType) {
356 case JS_GLOBALDATA_TYPE_NUMBER: {
357 double dData = 0;
358 switch (wVersion) {
359 case 1: {
360 FX_DWORD dwData = *((FX_DWORD*)p);
361 p += sizeof(FX_DWORD);
362 dData = dwData;
363 } break;
364 case 2: {
365 dData = *((double*)p);
366 p += sizeof(double);
367 } break;
368 }
369 SetGlobalVariableNumber(sEntry, dData);
370 SetGlobalVariablePersistent(sEntry, TRUE);
371 } break;
372 case JS_GLOBALDATA_TYPE_BOOLEAN: {
373 FX_WORD wData = *((FX_WORD*)p);
374 p += sizeof(FX_WORD);
375 SetGlobalVariableBoolean(sEntry, (bool)(wData == 1));
376 SetGlobalVariablePersistent(sEntry, TRUE);
377 } break;
378 case JS_GLOBALDATA_TYPE_STRING: {
379 FX_DWORD dwLength = *((FX_DWORD*)p);
380 p += sizeof(FX_DWORD);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700381
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700382 if (p + dwLength > pBuffer + nLength)
383 break;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700384
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700385 SetGlobalVariableString(sEntry, CFX_ByteString(p, dwLength));
386 SetGlobalVariablePersistent(sEntry, TRUE);
387 p += sizeof(char) * dwLength;
388 } break;
389 case JS_GLOBALDATA_TYPE_NULL: {
390 SetGlobalVariableNull(sEntry);
391 SetGlobalVariablePersistent(sEntry, TRUE);
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700392 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700393 }
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700394 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700395 }
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700396 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700397 FX_Free(pBuffer);
398 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700399}
400
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700401void CJS_GlobalData::SaveGlobalPersisitentVariables() {
402 FX_DWORD nCount = 0;
403 CFX_BinaryBuf sData;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700404
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700405 for (int i = 0, sz = m_arrayGlobalData.GetSize(); i < sz; i++) {
406 CJS_GlobalData_Element* pElement = m_arrayGlobalData.GetAt(i);
407 ASSERT(pElement != NULL);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700408
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700409 if (pElement->bPersistent) {
410 CFX_BinaryBuf sElement;
411 MakeByteString(pElement->data.sKey, &pElement->data, sElement);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700412
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700413 if (sData.GetSize() + sElement.GetSize() > JS_MAXGLOBALDATA)
414 break;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700415
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700416 sData.AppendBlock(sElement.GetBuffer(), sElement.GetSize());
417 nCount++;
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700418 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700419 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700420
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700421 CFX_BinaryBuf sFile;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700422
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700423 FX_WORD wType = (FX_WORD)(('X' << 8) | 'F');
424 sFile.AppendBlock(&wType, sizeof(FX_WORD));
425 FX_WORD wVersion = 2;
426 sFile.AppendBlock(&wVersion, sizeof(FX_WORD));
427 sFile.AppendBlock(&nCount, sizeof(FX_DWORD));
428 FX_DWORD dwSize = sData.GetSize();
429 sFile.AppendBlock(&dwSize, sizeof(FX_DWORD));
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700430
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700431 sFile.AppendBlock(sData.GetBuffer(), sData.GetSize());
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700432
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700433 CRYPT_ArcFourCryptBlock(sFile.GetBuffer(), sFile.GetSize(), JS_RC4KEY,
434 sizeof(JS_RC4KEY));
435 WriteFileBuffer(m_sFilePath.c_str(), (const FX_CHAR*)sFile.GetBuffer(),
436 sFile.GetSize());
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700437}
438
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700439void CJS_GlobalData::LoadFileBuffer(const FX_WCHAR* sFilePath,
440 uint8_t*& pBuffer,
441 int32_t& nLength) {
442 // UnSupport.
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700443}
444
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700445void CJS_GlobalData::WriteFileBuffer(const FX_WCHAR* sFilePath,
446 const FX_CHAR* 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::MakeByteString(const CFX_ByteString& name,
452 CJS_KeyValue* pData,
453 CFX_BinaryBuf& sData) {
454 FX_WORD wType = (FX_WORD)pData->nType;
455 switch (wType) {
456 case JS_GLOBALDATA_TYPE_NUMBER: {
457 FX_DWORD dwNameLen = (FX_DWORD)name.GetLength();
458 sData.AppendBlock(&dwNameLen, sizeof(FX_DWORD));
459 sData.AppendString(name);
460 sData.AppendBlock(&wType, sizeof(FX_WORD));
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700461
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700462 double dData = pData->dData;
463 sData.AppendBlock(&dData, sizeof(double));
464 } break;
465 case JS_GLOBALDATA_TYPE_BOOLEAN: {
466 FX_DWORD dwNameLen = (FX_DWORD)name.GetLength();
467 sData.AppendBlock(&dwNameLen, sizeof(FX_DWORD));
468 sData.AppendString(name);
469 sData.AppendBlock(&wType, sizeof(FX_WORD));
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700470
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700471 FX_WORD wData = (FX_WORD)pData->bData;
472 sData.AppendBlock(&wData, sizeof(FX_WORD));
473 } break;
474 case JS_GLOBALDATA_TYPE_STRING: {
475 FX_DWORD dwNameLen = (FX_DWORD)name.GetLength();
476 sData.AppendBlock(&dwNameLen, sizeof(FX_DWORD));
477 sData.AppendString(name);
478 sData.AppendBlock(&wType, sizeof(FX_WORD));
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700479
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700480 FX_DWORD dwDataLen = (FX_DWORD)pData->sData.GetLength();
481 sData.AppendBlock(&dwDataLen, sizeof(FX_DWORD));
482 sData.AppendString(pData->sData);
483 } break;
484 case JS_GLOBALDATA_TYPE_NULL: {
485 FX_DWORD dwNameLen = (FX_DWORD)name.GetLength();
486 sData.AppendBlock(&dwNameLen, sizeof(FX_DWORD));
487 sData.AppendString(name);
488 sData.AppendBlock(&wType, sizeof(FX_DWORD));
489 } break;
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700490 default:
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700491 break;
492 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700493}