summaryrefslogtreecommitdiff
path: root/core/src/fpdfapi/fpdf_parser/fpdf_parser_objects.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'core/src/fpdfapi/fpdf_parser/fpdf_parser_objects.cpp')
-rw-r--r--core/src/fpdfapi/fpdf_parser/fpdf_parser_objects.cpp251
1 files changed, 97 insertions, 154 deletions
diff --git a/core/src/fpdfapi/fpdf_parser/fpdf_parser_objects.cpp b/core/src/fpdfapi/fpdf_parser/fpdf_parser_objects.cpp
index bd8b157bfa..6c93bcb39f 100644
--- a/core/src/fpdfapi/fpdf_parser/fpdf_parser_objects.cpp
+++ b/core/src/fpdfapi/fpdf_parser/fpdf_parser_objects.cpp
@@ -7,9 +7,6 @@
#include "../../../include/fpdfapi/fpdf_parser.h"
void CPDF_Object::Release()
{
- if (this == NULL) {
- return;
- }
if (m_ObjNum) {
return;
}
@@ -39,9 +36,6 @@ void CPDF_Object::Destroy()
}
CFX_ByteString CPDF_Object::GetString() const
{
- if (this == NULL) {
- return CFX_ByteString();
- }
switch (m_Type) {
case PDFOBJ_BOOLEAN:
return ((CPDF_Boolean*)this)->m_bValue ? "true" : "false";
@@ -67,9 +61,6 @@ CFX_ByteString CPDF_Object::GetString() const
}
CFX_ByteStringC CPDF_Object::GetConstString() const
{
- if (this == NULL) {
- return CFX_ByteStringC();
- }
switch (m_Type) {
case PDFOBJ_STRING:
return CFX_ByteStringC((FX_LPCBYTE)((CPDF_String*)this)->m_String, ((CPDF_String*)this)->m_String.GetLength());
@@ -91,9 +82,6 @@ CFX_ByteStringC CPDF_Object::GetConstString() const
}
FX_FLOAT CPDF_Object::GetNumber() const
{
- if (this == NULL) {
- return 0;
- }
switch (m_Type) {
case PDFOBJ_NUMBER:
return ((CPDF_Number*)this)->GetNumber();
@@ -117,9 +105,6 @@ FX_FLOAT CPDF_Object::GetNumber16() const
}
int CPDF_Object::GetInteger() const
{
- if (this == NULL) {
- return 0;
- }
switch (m_Type) {
case PDFOBJ_BOOLEAN:
return ((CPDF_Boolean*)this)->m_bValue;
@@ -143,9 +128,6 @@ int CPDF_Object::GetInteger() const
}
CPDF_Dictionary* CPDF_Object::GetDict() const
{
- if (this == NULL) {
- return NULL;
- }
switch (m_Type) {
case PDFOBJ_DICTIONARY:
return (CPDF_Dictionary*)this;
@@ -167,13 +149,10 @@ CPDF_Dictionary* CPDF_Object::GetDict() const
}
CPDF_Array* CPDF_Object::GetArray() const
{
- if (this == NULL) {
- return NULL;
- }
- if (m_Type == PDFOBJ_ARRAY) {
+ if (m_Type == PDFOBJ_ARRAY)
return (CPDF_Array*)this;
- }
- return NULL;
+ else
+ return NULL;
}
void CPDF_Object::SetString(const CFX_ByteString& str)
{
@@ -207,11 +186,11 @@ FX_BOOL CPDF_Object::IsIdentical(CPDF_Object* pOther) const
if (this == pOther) {
return TRUE;
}
- if (this == NULL || pOther == NULL) {
+ if (pOther == NULL) {
return FALSE;
}
if (pOther->m_Type != m_Type) {
- if (m_Type == PDFOBJ_REFERENCE) {
+ if (m_Type == PDFOBJ_REFERENCE && GetDirect()) {
return GetDirect()->IsIdentical(pOther);
} else if (pOther->m_Type == PDFOBJ_REFERENCE) {
return IsIdentical(pOther->GetDirect());
@@ -242,9 +221,6 @@ FX_BOOL CPDF_Object::IsIdentical(CPDF_Object* pOther) const
}
CPDF_Object* CPDF_Object::GetDirect() const
{
- if (this == NULL) {
- return NULL;
- }
if (m_Type != PDFOBJ_REFERENCE) {
return (CPDF_Object*)this;
}
@@ -261,9 +237,6 @@ CPDF_Object* CPDF_Object::Clone(FX_BOOL bDirect) const
}
CPDF_Object* CPDF_Object::CloneInternal(FX_BOOL bDirect, CFX_MapPtrToPtr* visited) const
{
- if (this == NULL) {
- return NULL;
- }
switch (m_Type) {
case PDFOBJ_BOOLEAN:
return FX_NEW CPDF_Boolean(((CPDF_Boolean*)this)->m_bValue);
@@ -303,7 +276,11 @@ CPDF_Object* CPDF_Object::CloneInternal(FX_BOOL bDirect, CFX_MapPtrToPtr* visite
CPDF_StreamAcc acc;
acc.LoadAllData(pThis, TRUE);
FX_DWORD streamSize = acc.GetSize();
- CPDF_Stream* pObj = FX_NEW CPDF_Stream(acc.DetachData(), streamSize, (CPDF_Dictionary*)((CPDF_Object*)pThis->GetDict())->CloneInternal(bDirect, visited));
+ CPDF_Stream* pObj;
+ if (pThis->GetDict())
+ pObj = FX_NEW CPDF_Stream(acc.DetachData(), streamSize, (CPDF_Dictionary*)((CPDF_Object*)pThis->GetDict())->CloneInternal(bDirect, visited));
+ else
+ pObj = FX_NEW CPDF_Stream(acc.DetachData(), streamSize, NULL);
return pObj;
}
case PDFOBJ_REFERENCE: {
@@ -311,7 +288,11 @@ CPDF_Object* CPDF_Object::CloneInternal(FX_BOOL bDirect, CFX_MapPtrToPtr* visite
FX_DWORD obj_num = pRef->m_RefObjNum;
if (bDirect && !visited->GetValueAt((void*)(FX_UINTPTR)obj_num)) {
visited->SetAt((void*)(FX_UINTPTR)obj_num, (void*)1);
- CPDF_Object* ret = pRef->GetDirect()->CloneInternal(TRUE, visited);
+ CPDF_Object* ret;
+ if (pRef->GetDirect())
+ ret = pRef->GetDirect()->CloneInternal(TRUE, visited);
+ else
+ ret = NULL;
return ret;
} else {
return FX_NEW CPDF_Reference(pRef->m_pObjList, obj_num);
@@ -322,9 +303,6 @@ CPDF_Object* CPDF_Object::CloneInternal(FX_BOOL bDirect, CFX_MapPtrToPtr* visite
}
CPDF_Object* CPDF_Object::CloneRef(CPDF_IndirectObjects* pDoc) const
{
- if (this == NULL) {
- return NULL;
- }
if (m_ObjNum) {
return FX_NEW CPDF_Reference(pDoc, m_ObjNum);
}
@@ -332,9 +310,6 @@ CPDF_Object* CPDF_Object::CloneRef(CPDF_IndirectObjects* pDoc) const
}
CFX_WideString CPDF_Object::GetUnicodeText(CFX_CharMap* pCharMap) const
{
- if (this == NULL) {
- return CFX_WideString();
- }
if (m_Type == PDFOBJ_STRING) {
return PDF_DecodeText(((CPDF_String*)this)->m_String, pCharMap);
} else if (m_Type == PDFOBJ_STREAM) {
@@ -349,9 +324,6 @@ CFX_WideString CPDF_Object::GetUnicodeText(CFX_CharMap* pCharMap) const
}
void CPDF_Object::SetUnicodeText(FX_LPCWSTR pUnicodes, int len)
{
- if (this == NULL) {
- return;
- }
if (m_Type == PDFOBJ_STRING) {
((CPDF_String*)this)->m_String = PDF_EncodeText(pUnicodes, len);
} else if (m_Type == PDFOBJ_STREAM) {
@@ -411,13 +383,14 @@ CPDF_Array::~CPDF_Array()
int size = m_Objects.GetSize();
CPDF_Object** pList = (CPDF_Object**)m_Objects.GetData();
for (int i = 0; i < size; i ++) {
- pList[i]->Release();
+ if (pList[i])
+ pList[i]->Release();
}
}
CFX_FloatRect CPDF_Array::GetRect()
{
CFX_FloatRect rect;
- if (this == NULL || m_Type != PDFOBJ_ARRAY || m_Objects.GetSize() != 4) {
+ if (m_Type != PDFOBJ_ARRAY || m_Objects.GetSize() != 4) {
return rect;
}
rect.left = GetNumber(0);
@@ -429,7 +402,7 @@ CFX_FloatRect CPDF_Array::GetRect()
CFX_AffineMatrix CPDF_Array::GetMatrix()
{
CFX_AffineMatrix matrix;
- if (this == NULL || m_Type != PDFOBJ_ARRAY || m_Objects.GetSize() != 6) {
+ if (m_Type != PDFOBJ_ARRAY || m_Objects.GetSize() != 6) {
return matrix;
}
matrix.Set(GetNumber(0), GetNumber(1), GetNumber(2), GetNumber(3), GetNumber(4), GetNumber(5));
@@ -437,9 +410,6 @@ CFX_AffineMatrix CPDF_Array::GetMatrix()
}
CPDF_Object* CPDF_Array::GetElement(FX_DWORD i) const
{
- if (this == NULL) {
- return NULL;
- }
if (i >= (FX_DWORD)m_Objects.GetSize()) {
return NULL;
}
@@ -447,9 +417,6 @@ CPDF_Object* CPDF_Array::GetElement(FX_DWORD i) const
}
CPDF_Object* CPDF_Array::GetElementValue(FX_DWORD i) const
{
- if (this == NULL) {
- return NULL;
- }
if (i >= (FX_DWORD)m_Objects.GetSize()) {
return NULL;
}
@@ -457,23 +424,25 @@ CPDF_Object* CPDF_Array::GetElementValue(FX_DWORD i) const
}
CFX_ByteString CPDF_Array::GetString(FX_DWORD i) const
{
- if (this && i < (FX_DWORD)m_Objects.GetSize()) {
+ if (i < (FX_DWORD)m_Objects.GetSize()) {
CPDF_Object* p = (CPDF_Object*)m_Objects.GetAt(i);
return p->GetString();
}
- return CFX_ByteString();
+ else
+ return CFX_ByteString();
}
CFX_ByteStringC CPDF_Array::GetConstString(FX_DWORD i) const
{
- if (this && i < (FX_DWORD)m_Objects.GetSize()) {
+ if (i < (FX_DWORD)m_Objects.GetSize()) {
CPDF_Object* p = (CPDF_Object*)m_Objects.GetAt(i);
return p->GetConstString();
}
- return CFX_ByteStringC();
+ else
+ return CFX_ByteStringC();
}
int CPDF_Array::GetInteger(FX_DWORD i) const
{
- if (this == NULL || i >= (FX_DWORD)m_Objects.GetSize()) {
+ if (i >= (FX_DWORD)m_Objects.GetSize()) {
return 0;
}
CPDF_Object* p = (CPDF_Object*)m_Objects.GetAt(i);
@@ -481,7 +450,7 @@ int CPDF_Array::GetInteger(FX_DWORD i) const
}
FX_FLOAT CPDF_Array::GetNumber(FX_DWORD i) const
{
- if (this == NULL || i >= (FX_DWORD)m_Objects.GetSize()) {
+ if (i >= (FX_DWORD)m_Objects.GetSize()) {
return 0;
}
CPDF_Object* p = (CPDF_Object*)m_Objects.GetAt(i);
@@ -517,23 +486,25 @@ CPDF_Array* CPDF_Array::GetArray(FX_DWORD i) const
}
void CPDF_Array::RemoveAt(FX_DWORD i)
{
- ASSERT(this != NULL && m_Type == PDFOBJ_ARRAY);
+ ASSERT(m_Type == PDFOBJ_ARRAY);
if (i >= (FX_DWORD)m_Objects.GetSize()) {
return;
}
CPDF_Object* p = (CPDF_Object*)m_Objects.GetAt(i);
- p->Release();
+ if (p)
+ p->Release();
m_Objects.RemoveAt(i);
}
void CPDF_Array::SetAt(FX_DWORD i, CPDF_Object* pObj, CPDF_IndirectObjects* pObjs)
{
- ASSERT(this != NULL && m_Type == PDFOBJ_ARRAY);
+ ASSERT(m_Type == PDFOBJ_ARRAY);
ASSERT(i < (FX_DWORD)m_Objects.GetSize());
if (i >= (FX_DWORD)m_Objects.GetSize()) {
return;
}
CPDF_Object* pOld = (CPDF_Object*)m_Objects.GetAt(i);
- pOld->Release();
+ if (pOld)
+ pOld->Release();
if (pObj->GetObjNum()) {
ASSERT(pObjs != NULL);
pObj = CPDF_Reference::Create(pObjs, pObj->GetObjNum());
@@ -560,29 +531,29 @@ void CPDF_Array::Add(CPDF_Object* pObj, CPDF_IndirectObjects* pObjs)
}
void CPDF_Array::AddName(const CFX_ByteString& str)
{
- ASSERT(this != NULL && m_Type == PDFOBJ_ARRAY);
+ ASSERT(m_Type == PDFOBJ_ARRAY);
Add(FX_NEW CPDF_Name(str));
}
void CPDF_Array::AddString(const CFX_ByteString& str)
{
- ASSERT(this != NULL && m_Type == PDFOBJ_ARRAY);
+ ASSERT(m_Type == PDFOBJ_ARRAY);
Add(FX_NEW CPDF_String(str));
}
void CPDF_Array::AddInteger(int i)
{
- ASSERT(this != NULL && m_Type == PDFOBJ_ARRAY);
+ ASSERT(m_Type == PDFOBJ_ARRAY);
Add(FX_NEW CPDF_Number(i));
}
void CPDF_Array::AddNumber(FX_FLOAT f)
{
- ASSERT(this != NULL && m_Type == PDFOBJ_ARRAY);
+ ASSERT(m_Type == PDFOBJ_ARRAY);
CPDF_Number* pNumber = FX_NEW CPDF_Number;
pNumber->SetNumber(f);
Add(pNumber);
}
void CPDF_Array::AddReference(CPDF_IndirectObjects* pDoc, FX_DWORD objnum)
{
- ASSERT(this != NULL && m_Type == PDFOBJ_ARRAY);
+ ASSERT(m_Type == PDFOBJ_ARRAY);
Add(FX_NEW CPDF_Reference(pDoc, objnum));
}
FX_BOOL CPDF_Array::Identical(CPDF_Array* pOther) const
@@ -601,7 +572,8 @@ CPDF_Dictionary::~CPDF_Dictionary()
FX_POSITION pos = m_Map.GetStartPosition();
while (pos) {
FX_LPVOID value = m_Map.GetNextValue(pos);
- ((CPDF_Object*)value)->Release();
+ if (value)
+ ((CPDF_Object*)value)->Release();
}
}
FX_POSITION CPDF_Dictionary::GetStartPos() const
@@ -619,123 +591,99 @@ CPDF_Object* CPDF_Dictionary::GetNextElement(FX_POSITION& pos, CFX_ByteString& k
}
CPDF_Object* CPDF_Dictionary::GetElement(FX_BSTR key) const
{
- if (this == NULL) {
- return NULL;
- }
CPDF_Object* p = NULL;
m_Map.Lookup(key, (void*&)p);
return p;
}
CPDF_Object* CPDF_Dictionary::GetElementValue(FX_BSTR key) const
{
- if (this == NULL) {
- return NULL;
- }
CPDF_Object* p = NULL;
m_Map.Lookup(key, (void*&)p);
- return p->GetDirect();
+ return p ? p->GetDirect() : NULL;
}
CFX_ByteString CPDF_Dictionary::GetString(FX_BSTR key) const
{
- if (this) {
- CPDF_Object* p = NULL;
- m_Map.Lookup(key, (void*&)p);
- if (p) {
- return p->GetString();
- }
- }
- return CFX_ByteString();
+ CPDF_Object* p = NULL;
+ m_Map.Lookup(key, (void*&)p);
+ if (p)
+ return p->GetString();
+ else
+ return CFX_ByteString();
}
CFX_ByteStringC CPDF_Dictionary::GetConstString(FX_BSTR key) const
{
- if (this) {
- CPDF_Object* p = NULL;
- m_Map.Lookup(key, (void*&)p);
- if (p) {
- return p->GetConstString();
- }
- }
- return CFX_ByteStringC();
+ CPDF_Object* p = NULL;
+ m_Map.Lookup(key, (void*&)p);
+ if (p)
+ return p->GetConstString();
+ else
+ return CFX_ByteStringC();
}
CFX_WideString CPDF_Dictionary::GetUnicodeText(FX_BSTR key, CFX_CharMap* pCharMap) const
{
- if (this) {
- CPDF_Object* p = NULL;
- m_Map.Lookup(key, (void*&)p);
- if (p) {
- if(p->GetType() == PDFOBJ_REFERENCE) {
- p = ((CPDF_Reference*)p)->GetDirect();
- return p->GetUnicodeText(pCharMap);
- } else {
- return p->GetUnicodeText(pCharMap);
- }
+ CPDF_Object* p = NULL;
+ m_Map.Lookup(key, (void*&)p);
+ if (p) {
+ if(p->GetType() == PDFOBJ_REFERENCE) {
+ p = ((CPDF_Reference*)p)->GetDirect();
+ return p->GetUnicodeText(pCharMap);
+ } else {
+ return p->GetUnicodeText(pCharMap);
}
}
return CFX_WideString();
}
CFX_ByteString CPDF_Dictionary::GetString(FX_BSTR key, FX_BSTR def) const
{
- if (this) {
- CPDF_Object* p = NULL;
- m_Map.Lookup(key, (void*&)p);
- if (p) {
- return p->GetString();
- }
+ CPDF_Object* p = NULL;
+ m_Map.Lookup(key, (void*&)p);
+ if (p) {
+ return p->GetString();
}
return CFX_ByteString(def);
}
CFX_ByteStringC CPDF_Dictionary::GetConstString(FX_BSTR key, FX_BSTR def) const
{
- if (this) {
- CPDF_Object* p = NULL;
- m_Map.Lookup(key, (void*&)p);
- if (p) {
- return p->GetConstString();
- }
- }
- return CFX_ByteStringC(def);
+ CPDF_Object* p = NULL;
+ m_Map.Lookup(key, (void*&)p);
+ if (p)
+ return p->GetConstString();
+ else
+ return CFX_ByteStringC(def);
}
int CPDF_Dictionary::GetInteger(FX_BSTR key) const
{
- if (this) {
- CPDF_Object* p = NULL;
- m_Map.Lookup(key, (void*&)p);
- if (p) {
- return p->GetInteger();
- }
+ CPDF_Object* p = NULL;
+ m_Map.Lookup(key, (void*&)p);
+ if (p) {
+ return p->GetInteger();
}
return 0;
}
int CPDF_Dictionary::GetInteger(FX_BSTR key, int def) const
{
- if (this) {
- CPDF_Object* p = NULL;
- m_Map.Lookup(key, (void*&)p);
- if (p) {
- return p->GetInteger();
- }
+ CPDF_Object* p = NULL;
+ m_Map.Lookup(key, (void*&)p);
+ if (p) {
+ return p->GetInteger();
}
return def;
}
FX_FLOAT CPDF_Dictionary::GetNumber(FX_BSTR key) const
{
- if (this) {
- CPDF_Object* p = NULL;
- m_Map.Lookup(key, (void*&)p);
- if (p) {
- return p->GetNumber();
- }
+ CPDF_Object* p = NULL;
+ m_Map.Lookup(key, (void*&)p);
+ if (p) {
+ return p->GetNumber();
}
return 0;
}
FX_BOOL CPDF_Dictionary::GetBoolean(FX_BSTR key, FX_BOOL bDefault) const
{
- if (this) {
- CPDF_Object* p = NULL;
- m_Map.Lookup(key, (void*&)p);
- if (p && p->GetType() == PDFOBJ_BOOLEAN) {
- return p->GetInteger();
- }
+ CPDF_Object* p = NULL;
+ m_Map.Lookup(key, (void*&)p);
+ if (p && p->GetType() == PDFOBJ_BOOLEAN) {
+ return p->GetInteger();
}
return bDefault;
}
@@ -787,23 +735,19 @@ CFX_AffineMatrix CPDF_Dictionary::GetMatrix(FX_BSTR key) const
}
FX_BOOL CPDF_Dictionary::KeyExist(FX_BSTR key) const
{
- if (this == NULL) {
- return FALSE;
- }
FX_LPVOID value;
return m_Map.Lookup(key, value);
}
void CPDF_Dictionary::SetAt(FX_BSTR key, CPDF_Object* pObj, CPDF_IndirectObjects* pObjs)
{
- ASSERT(this != NULL && m_Type == PDFOBJ_DICTIONARY);
+ ASSERT(m_Type == PDFOBJ_DICTIONARY);
CPDF_Object* p = NULL;
m_Map.Lookup(key, (void*&)p);
if (p == pObj) {
return;
}
- if (p) {
+ if (p)
p->Release();
- }
if (pObj) {
if (pObj->GetObjNum()) {
ASSERT(pObjs != NULL);
@@ -816,12 +760,12 @@ void CPDF_Dictionary::SetAt(FX_BSTR key, CPDF_Object* pObj, CPDF_IndirectObjects
}
void CPDF_Dictionary::AddValue(FX_BSTR key, CPDF_Object* pObj)
{
- ASSERT(this != NULL && m_Type == PDFOBJ_DICTIONARY);
+ ASSERT(m_Type == PDFOBJ_DICTIONARY);
m_Map.AddValue(key, pObj);
}
void CPDF_Dictionary::RemoveAt(FX_BSTR key)
{
- ASSERT(this != NULL && m_Type == PDFOBJ_DICTIONARY);
+ ASSERT(m_Type == PDFOBJ_DICTIONARY);
CPDF_Object* p = NULL;
m_Map.Lookup(key, (void*&)p);
if (p == NULL) {
@@ -832,7 +776,7 @@ void CPDF_Dictionary::RemoveAt(FX_BSTR key)
}
void CPDF_Dictionary::ReplaceKey(FX_BSTR oldkey, FX_BSTR newkey)
{
- ASSERT(this != NULL && m_Type == PDFOBJ_DICTIONARY);
+ ASSERT(m_Type == PDFOBJ_DICTIONARY);
CPDF_Object* p = NULL;
m_Map.Lookup(oldkey, (void*&)p);
if (p == NULL) {
@@ -843,12 +787,6 @@ void CPDF_Dictionary::ReplaceKey(FX_BSTR oldkey, FX_BSTR newkey)
}
FX_BOOL CPDF_Dictionary::Identical(CPDF_Dictionary* pOther) const
{
- if (this == NULL) {
- if (pOther == NULL) {
- return TRUE;
- }
- return FALSE;
- }
if (pOther == NULL) {
return FALSE;
}
@@ -860,6 +798,8 @@ FX_BOOL CPDF_Dictionary::Identical(CPDF_Dictionary* pOther) const
CFX_ByteString key;
FX_LPVOID value;
m_Map.GetNextAssoc(pos, key, value);
+ if (!value)
+ return FALSE;
if (!((CPDF_Object*)value)->IsIdentical(pOther->GetElement(key))) {
return FALSE;
}
@@ -1014,6 +954,9 @@ void CPDF_Stream::InitStream(IFX_FileRead *pFile, CPDF_Dictionary* pDict)
}
FX_BOOL CPDF_Stream::Identical(CPDF_Stream* pOther) const
{
+ if (!m_pDict)
+ return pOther->m_pDict ? FALSE : TRUE;
+
if (!m_pDict->Identical(pOther->m_pDict)) {
return FALSE;
}