summaryrefslogtreecommitdiff
path: root/fpdfsdk/javascript/JS_GlobalData.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'fpdfsdk/javascript/JS_GlobalData.cpp')
-rw-r--r--fpdfsdk/javascript/JS_GlobalData.cpp203
1 files changed, 88 insertions, 115 deletions
diff --git a/fpdfsdk/javascript/JS_GlobalData.cpp b/fpdfsdk/javascript/JS_GlobalData.cpp
index 2c2ec1d5c1..3a9e52175a 100644
--- a/fpdfsdk/javascript/JS_GlobalData.cpp
+++ b/fpdfsdk/javascript/JS_GlobalData.cpp
@@ -8,6 +8,7 @@
#include "core/fdrm/crypto/include/fx_crypt.h"
#include "fpdfsdk/include/javascript/IJavaScript.h"
+#include "third_party/base/stl_util.h"
#define JS_MAXGLOBALDATA (1024 * 4 - 8)
@@ -97,6 +98,15 @@ static const uint8_t JS_RC4KEY[] = {
0x0e, 0xd0, 0x6b, 0xbb, 0xd5, 0x75, 0x55, 0x8b, 0x6e, 0x6b, 0x19, 0xa0,
0xf8, 0x77, 0xd5, 0xa3};
+// Returns true if non-empty, setting sPropName
+static bool TrimPropName(const char* propname, CFX_ByteString* sPropName) {
+ ASSERT(propname);
+ *sPropName = propname;
+ sPropName->TrimLeft();
+ sPropName->TrimRight();
+ return sPropName->GetLength() != 0;
+}
+
CJS_GlobalData* CJS_GlobalData::g_Instance = nullptr;
// static
@@ -115,197 +125,164 @@ void CJS_GlobalData::Release() {
}
}
-CJS_GlobalData::CJS_GlobalData() : m_RefCount(0) {
- m_sFilePath += SDK_JS_GLOBALDATA_FILENAME;
+CJS_GlobalData::CJS_GlobalData()
+ : m_RefCount(0), m_sFilePath(SDK_JS_GLOBALDATA_FILENAME) {
LoadGlobalPersistentVariables();
}
CJS_GlobalData::~CJS_GlobalData() {
SaveGlobalPersisitentVariables();
- for (int i = 0, sz = m_arrayGlobalData.GetSize(); i < sz; i++)
- delete m_arrayGlobalData.GetAt(i);
+}
- m_arrayGlobalData.RemoveAll();
+CJS_GlobalData::iterator CJS_GlobalData::FindGlobalVariable(
+ const FX_CHAR* propname) {
+ for (auto it = m_arrayGlobalData.begin(); it != m_arrayGlobalData.end();
+ ++it) {
+ if ((*it)->data.sKey == propname)
+ return it;
+ }
+ return m_arrayGlobalData.end();
}
-int CJS_GlobalData::FindGlobalVariable(const FX_CHAR* propname) {
- for (int i = 0, sz = m_arrayGlobalData.GetSize(); i < sz; i++) {
- CJS_GlobalData_Element* pTemp = m_arrayGlobalData.GetAt(i);
- if (pTemp->data.sKey[0] == *propname && pTemp->data.sKey == propname)
- return i;
+CJS_GlobalData::const_iterator CJS_GlobalData::FindGlobalVariable(
+ const FX_CHAR* propname) const {
+ for (auto it = m_arrayGlobalData.begin(); it != m_arrayGlobalData.end();
+ ++it) {
+ if ((*it)->data.sKey == propname)
+ return it;
}
- return -1;
+ return m_arrayGlobalData.end();
}
CJS_GlobalData_Element* CJS_GlobalData::GetGlobalVariable(
const FX_CHAR* propname) {
- ASSERT(propname);
-
- int nFind = FindGlobalVariable(propname);
- return nFind >= 0 ? m_arrayGlobalData.GetAt(nFind) : nullptr;
+ auto iter = FindGlobalVariable(propname);
+ return iter != m_arrayGlobalData.end() ? iter->get() : nullptr;
}
void CJS_GlobalData::SetGlobalVariableNumber(const FX_CHAR* propname,
double dData) {
- ASSERT(propname);
- CFX_ByteString sPropName = propname;
- sPropName.TrimLeft();
- sPropName.TrimRight();
- if (sPropName.GetLength() == 0)
+ CFX_ByteString sPropName;
+ if (!TrimPropName(propname, &sPropName))
return;
if (CJS_GlobalData_Element* pData = GetGlobalVariable(sPropName)) {
pData->data.nType = JS_GLOBALDATA_TYPE_NUMBER;
pData->data.dData = dData;
- } else {
- CJS_GlobalData_Element* pNewData = new CJS_GlobalData_Element;
- pNewData->data.sKey = sPropName;
- pNewData->data.nType = JS_GLOBALDATA_TYPE_NUMBER;
- pNewData->data.dData = dData;
- m_arrayGlobalData.Add(pNewData);
+ return;
}
+ std::unique_ptr<CJS_GlobalData_Element> pNewData(new CJS_GlobalData_Element);
+ pNewData->data.sKey = sPropName;
+ pNewData->data.nType = JS_GLOBALDATA_TYPE_NUMBER;
+ pNewData->data.dData = dData;
+ m_arrayGlobalData.push_back(std::move(pNewData));
}
void CJS_GlobalData::SetGlobalVariableBoolean(const FX_CHAR* propname,
bool bData) {
- ASSERT(propname);
- CFX_ByteString sPropName = propname;
-
- sPropName.TrimLeft();
- sPropName.TrimRight();
-
- if (sPropName.GetLength() == 0)
+ CFX_ByteString sPropName;
+ if (!TrimPropName(propname, &sPropName))
return;
if (CJS_GlobalData_Element* pData = GetGlobalVariable(sPropName)) {
pData->data.nType = JS_GLOBALDATA_TYPE_BOOLEAN;
pData->data.bData = bData;
- } else {
- CJS_GlobalData_Element* pNewData = new CJS_GlobalData_Element;
- pNewData->data.sKey = sPropName;
- pNewData->data.nType = JS_GLOBALDATA_TYPE_BOOLEAN;
- pNewData->data.bData = bData;
-
- m_arrayGlobalData.Add(pNewData);
+ return;
}
+ std::unique_ptr<CJS_GlobalData_Element> pNewData(new CJS_GlobalData_Element);
+ pNewData->data.sKey = sPropName;
+ pNewData->data.nType = JS_GLOBALDATA_TYPE_BOOLEAN;
+ pNewData->data.bData = bData;
+ m_arrayGlobalData.push_back(std::move(pNewData));
}
void CJS_GlobalData::SetGlobalVariableString(const FX_CHAR* propname,
const CFX_ByteString& sData) {
- ASSERT(propname);
- CFX_ByteString sPropName = propname;
-
- sPropName.TrimLeft();
- sPropName.TrimRight();
-
- if (sPropName.GetLength() == 0)
+ CFX_ByteString sPropName;
+ if (!TrimPropName(propname, &sPropName))
return;
if (CJS_GlobalData_Element* pData = GetGlobalVariable(sPropName)) {
pData->data.nType = JS_GLOBALDATA_TYPE_STRING;
pData->data.sData = sData;
- } else {
- CJS_GlobalData_Element* pNewData = new CJS_GlobalData_Element;
- pNewData->data.sKey = sPropName;
- pNewData->data.nType = JS_GLOBALDATA_TYPE_STRING;
- pNewData->data.sData = sData;
-
- m_arrayGlobalData.Add(pNewData);
+ return;
}
+ std::unique_ptr<CJS_GlobalData_Element> pNewData(new CJS_GlobalData_Element);
+ pNewData->data.sKey = sPropName;
+ pNewData->data.nType = JS_GLOBALDATA_TYPE_STRING;
+ pNewData->data.sData = sData;
+ m_arrayGlobalData.push_back(std::move(pNewData));
}
void CJS_GlobalData::SetGlobalVariableObject(
const FX_CHAR* propname,
const CJS_GlobalVariableArray& array) {
- ASSERT(propname);
- CFX_ByteString sPropName = propname;
-
- sPropName.TrimLeft();
- sPropName.TrimRight();
-
- if (sPropName.GetLength() == 0)
+ CFX_ByteString sPropName;
+ if (!TrimPropName(propname, &sPropName))
return;
if (CJS_GlobalData_Element* pData = GetGlobalVariable(sPropName)) {
pData->data.nType = JS_GLOBALDATA_TYPE_OBJECT;
pData->data.objData.Copy(array);
- } else {
- CJS_GlobalData_Element* pNewData = new CJS_GlobalData_Element;
- pNewData->data.sKey = sPropName;
- pNewData->data.nType = JS_GLOBALDATA_TYPE_OBJECT;
- pNewData->data.objData.Copy(array);
-
- m_arrayGlobalData.Add(pNewData);
+ return;
}
+ std::unique_ptr<CJS_GlobalData_Element> pNewData(new CJS_GlobalData_Element);
+ pNewData->data.sKey = sPropName;
+ pNewData->data.nType = JS_GLOBALDATA_TYPE_OBJECT;
+ pNewData->data.objData.Copy(array);
+ m_arrayGlobalData.push_back(std::move(pNewData));
}
void CJS_GlobalData::SetGlobalVariableNull(const FX_CHAR* propname) {
- ASSERT(propname);
- CFX_ByteString sPropName = propname;
-
- sPropName.TrimLeft();
- sPropName.TrimRight();
-
- if (sPropName.GetLength() == 0)
+ CFX_ByteString sPropName;
+ if (!TrimPropName(propname, &sPropName))
return;
if (CJS_GlobalData_Element* pData = GetGlobalVariable(sPropName)) {
pData->data.nType = JS_GLOBALDATA_TYPE_NULL;
- } else {
- CJS_GlobalData_Element* pNewData = new CJS_GlobalData_Element;
- pNewData->data.sKey = sPropName;
- pNewData->data.nType = JS_GLOBALDATA_TYPE_NULL;
-
- m_arrayGlobalData.Add(pNewData);
+ return;
}
+ std::unique_ptr<CJS_GlobalData_Element> pNewData(new CJS_GlobalData_Element);
+ pNewData->data.sKey = sPropName;
+ pNewData->data.nType = JS_GLOBALDATA_TYPE_NULL;
+ m_arrayGlobalData.push_back(std::move(pNewData));
}
FX_BOOL CJS_GlobalData::SetGlobalVariablePersistent(const FX_CHAR* propname,
FX_BOOL bPersistent) {
- ASSERT(propname);
- CFX_ByteString sPropName = propname;
-
- sPropName.TrimLeft();
- sPropName.TrimRight();
-
- if (sPropName.GetLength() == 0)
+ CFX_ByteString sPropName;
+ if (!TrimPropName(propname, &sPropName))
return FALSE;
- if (CJS_GlobalData_Element* pData = GetGlobalVariable(sPropName)) {
- pData->bPersistent = bPersistent;
- return TRUE;
- }
+ CJS_GlobalData_Element* pData = GetGlobalVariable(sPropName);
+ if (!pData)
+ return FALSE;
- return FALSE;
+ pData->bPersistent = bPersistent;
+ return TRUE;
}
FX_BOOL CJS_GlobalData::DeleteGlobalVariable(const FX_CHAR* propname) {
- ASSERT(propname);
- CFX_ByteString sPropName = propname;
-
- sPropName.TrimLeft();
- sPropName.TrimRight();
-
- if (sPropName.GetLength() == 0)
+ CFX_ByteString sPropName;
+ if (!TrimPropName(propname, &sPropName))
return FALSE;
- int nFind = FindGlobalVariable(sPropName);
-
- if (nFind >= 0) {
- delete m_arrayGlobalData.GetAt(nFind);
- m_arrayGlobalData.RemoveAt(nFind);
- return TRUE;
- }
+ auto iter = FindGlobalVariable(sPropName);
+ if (iter == m_arrayGlobalData.end())
+ return FALSE;
- return FALSE;
+ m_arrayGlobalData.erase(iter);
+ return TRUE;
}
int32_t CJS_GlobalData::GetSize() const {
- return m_arrayGlobalData.GetSize();
+ return pdfium::CollectionSize<int32_t>(m_arrayGlobalData);
}
CJS_GlobalData_Element* CJS_GlobalData::GetAt(int index) const {
- return m_arrayGlobalData.GetAt(index);
+ if (index < 0 || index >= GetSize())
+ return nullptr;
+ return m_arrayGlobalData[index].get();
}
void CJS_GlobalData::LoadGlobalPersistentVariables() {
@@ -400,13 +377,10 @@ void CJS_GlobalData::LoadGlobalPersistentVariables() {
void CJS_GlobalData::SaveGlobalPersisitentVariables() {
uint32_t nCount = 0;
CFX_BinaryBuf sData;
-
- for (int i = 0, sz = m_arrayGlobalData.GetSize(); i < sz; i++) {
- CJS_GlobalData_Element* pElement = m_arrayGlobalData.GetAt(i);
+ for (const auto& pElement : m_arrayGlobalData) {
if (pElement->bPersistent) {
CFX_BinaryBuf sElement;
MakeByteString(pElement->data.sKey, &pElement->data, sElement);
-
if (sData.GetSize() + sElement.GetSize() > JS_MAXGLOBALDATA)
break;
@@ -416,7 +390,6 @@ void CJS_GlobalData::SaveGlobalPersisitentVariables() {
}
CFX_BinaryBuf sFile;
-
uint16_t wType = (uint16_t)(('X' << 8) | 'F');
sFile.AppendBlock(&wType, sizeof(uint16_t));
uint16_t wVersion = 2;