[Merge to XFA] Revert "Revert "Add type cast definitions for CPDF_Dictionary.""
This reverts commit 937840e1722d1f2b77d80575d6e710d760662c9c.
Add type cast definitions for CPDF_Dictionary.
This CL adds ToCPDFDictionary type definitions and updates one file to use
instead of straight casts. I had to fix two places where we'd casted off the
constness of the original pointer.
BUG=pdfium:201
R=tsepez@chromium.org
Review URL: https://codereview.chromium.org/1420583003 .
(cherry picked from commit 39869b641511c882d78e17548293cdb458c36f38)
Review URL: https://codereview.chromium.org/1410343003 .
diff --git a/core/include/fpdfapi/fpdf_objects.h b/core/include/fpdfapi/fpdf_objects.h
index 58fb37c..d64a092 100644
--- a/core/include/fpdfapi/fpdf_objects.h
+++ b/core/include/fpdfapi/fpdf_objects.h
@@ -80,6 +80,11 @@
FX_BOOL IsModified() const { return FALSE; }
+ bool IsDictionary() const { return m_Type == PDFOBJ_DICTIONARY; }
+
+ CPDF_Dictionary* AsDictionary();
+ const CPDF_Dictionary* AsDictionary() const;
+
protected:
CPDF_Object(FX_DWORD type) : m_Type(type), m_ObjNum(0), m_GenNum(0) {}
~CPDF_Object() {}
@@ -404,6 +409,13 @@
friend class CPDF_Object;
};
+inline CPDF_Dictionary* ToDictionary(CPDF_Object* obj) {
+ return obj ? obj->AsDictionary() : nullptr;
+}
+inline const CPDF_Dictionary* ToDictionary(const CPDF_Object* obj) {
+ return obj ? obj->AsDictionary() : nullptr;
+}
+
class CPDF_Stream : public CPDF_Object {
public:
static CPDF_Stream* Create(uint8_t* pData,
diff --git a/core/include/fpdfdoc/fpdf_doc.h b/core/include/fpdfdoc/fpdf_doc.h
index 038bf90..168d9eb 100644
--- a/core/include/fpdfdoc/fpdf_doc.h
+++ b/core/include/fpdfdoc/fpdf_doc.h
@@ -717,10 +717,10 @@
CPDF_Object* GetFieldAttr(CPDF_Dictionary* pFieldDict, const FX_CHAR* name);
- CPDF_FormField* AddTerminalField(const CPDF_Dictionary* pFieldDict);
+ CPDF_FormField* AddTerminalField(CPDF_Dictionary* pFieldDict);
CPDF_FormControl* AddControl(const CPDF_FormField* pField,
- const CPDF_Dictionary* pWidgetDict);
+ CPDF_Dictionary* pWidgetDict);
void FDF_ImportField(CPDF_Dictionary* pField,
const CFX_WideString& parent_name,
diff --git a/core/src/fpdfapi/fpdf_edit/fpdf_edit_create.cpp b/core/src/fpdfapi/fpdf_edit/fpdf_edit_create.cpp
index 4e6c723..054cf10 100644
--- a/core/src/fpdfapi/fpdf_edit/fpdf_edit_create.cpp
+++ b/core/src/fpdfapi/fpdf_edit/fpdf_edit_create.cpp
@@ -110,7 +110,7 @@
return -1;
}
offset += 2;
- CPDF_Dictionary* p = (CPDF_Dictionary*)pObj;
+ const CPDF_Dictionary* p = pObj->AsDictionary();
FX_POSITION pos = p->GetStartPos();
while (pos) {
CFX_ByteString key;
@@ -334,7 +334,8 @@
}
void CPDF_FlateEncoder::CloneDict() {
if (!m_bCloned) {
- m_pDict = (CPDF_Dictionary*)m_pDict->Clone();
+ m_pDict = ToDictionary(m_pDict->Clone());
+ ASSERT(m_pDict);
m_bCloned = TRUE;
}
}
@@ -349,7 +350,7 @@
destAcc.LoadAllData(pStream);
m_dwSize = destAcc.GetSize();
m_pData = (uint8_t*)destAcc.DetachData();
- m_pDict = (CPDF_Dictionary*)pStream->GetDict()->Clone();
+ m_pDict = ToDictionary(pStream->GetDict()->Clone());
m_pDict->RemoveAt(FX_BSTRC("Filter"));
m_bNewData = TRUE;
m_bCloned = TRUE;
@@ -365,7 +366,7 @@
m_bNewData = TRUE;
m_bCloned = TRUE;
::FlateEncode(m_Acc.GetData(), m_Acc.GetSize(), m_pData, m_dwSize);
- m_pDict = (CPDF_Dictionary*)pStream->GetDict()->Clone();
+ m_pDict = ToDictionary(pStream->GetDict()->Clone());
m_pDict->SetAtInteger("Length", m_dwSize);
m_pDict->SetAtName("Filter", "FlateDecode");
m_pDict->RemoveAt("DecodeParms");
@@ -1227,7 +1228,7 @@
return -1;
}
m_Offset += 2;
- CPDF_Dictionary* p = (CPDF_Dictionary*)pObj;
+ const CPDF_Dictionary* p = pObj->AsDictionary();
FX_BOOL bSignDict = IsSignatureDict(p);
FX_POSITION pos = p->GetStartPos();
while (pos) {
diff --git a/core/src/fpdfapi/fpdf_font/fpdf_font.cpp b/core/src/fpdfapi/fpdf_font/fpdf_font.cpp
index c52b4fe..77f7f11 100644
--- a/core/src/fpdfapi/fpdf_font/fpdf_font.cpp
+++ b/core/src/fpdfapi/fpdf_font/fpdf_font.cpp
@@ -745,10 +745,11 @@
GetPredefinedEncoding(iBaseEncoding, bsEncoding);
return;
}
- if (pEncoding->GetType() != PDFOBJ_DICTIONARY) {
+
+ CPDF_Dictionary* pDict = pEncoding->AsDictionary();
+ if (!pDict)
return;
- }
- CPDF_Dictionary* pDict = (CPDF_Dictionary*)pEncoding;
+
if (iBaseEncoding != PDFFONT_ENCODING_ADOBE_SYMBOL &&
iBaseEncoding != PDFFONT_ENCODING_ZAPFDINGBATS) {
CFX_ByteString bsEncoding = pDict->GetString(FX_BSTRC("BaseEncoding"));
@@ -781,6 +782,7 @@
}
}
}
+
FX_BOOL CPDF_Font::IsStandardFont() const {
if (m_FontType != PDFFONT_TYPE1) {
return FALSE;
diff --git a/core/src/fpdfapi/fpdf_page/fpdf_page_func.cpp b/core/src/fpdfapi/fpdf_page/fpdf_page_func.cpp
index 224c99b..d66a9ef 100644
--- a/core/src/fpdfapi/fpdf_page/fpdf_page_func.cpp
+++ b/core/src/fpdfapi/fpdf_page/fpdf_page_func.cpp
@@ -818,8 +818,8 @@
type = ((CPDF_Stream*)pFuncObj)
->GetDict()
->GetInteger(FX_BSTRC("FunctionType"));
- } else if (pFuncObj->GetType() == PDFOBJ_DICTIONARY) {
- type = ((CPDF_Dictionary*)pFuncObj)->GetInteger(FX_BSTRC("FunctionType"));
+ } else if (CPDF_Dictionary* pDict = pFuncObj->AsDictionary()) {
+ type = pDict->GetInteger(FX_BSTRC("FunctionType"));
} else {
return NULL;
}
@@ -853,7 +853,7 @@
if (pObj->GetType() == PDFOBJ_STREAM) {
pDict = ((CPDF_Stream*)pObj)->GetDict();
} else {
- pDict = (CPDF_Dictionary*)pObj;
+ pDict = pObj->AsDictionary();
}
CPDF_Array* pDomains = pDict->GetArray(FX_BSTRC("Domain"));
if (pDomains == NULL) {
diff --git a/core/src/fpdfapi/fpdf_page/fpdf_page_graph_state.cpp b/core/src/fpdfapi/fpdf_page/fpdf_page_graph_state.cpp
index f11a2bb..6d071f3 100644
--- a/core/src/fpdfapi/fpdf_page/fpdf_page_graph_state.cpp
+++ b/core/src/fpdfapi/fpdf_page/fpdf_page_graph_state.cpp
@@ -530,7 +530,7 @@
break;
}
case FXBSTR_ID('S', 'M', 'a', 's'):
- if (pObject && pObject->GetType() == PDFOBJ_DICTIONARY) {
+ if (ToDictionary(pObject)) {
pGeneralState->m_pSoftMask = pObject;
FXSYS_memcpy(pGeneralState->m_SMaskMatrix,
&pParser->GetCurStates()->m_CTM, sizeof(CPDF_Matrix));
@@ -599,20 +599,21 @@
m_MarkName = src.m_MarkName;
m_ParamType = src.m_ParamType;
if (m_ParamType == DirectDict) {
- m_pParam = ((CPDF_Dictionary*)src.m_pParam)->Clone();
+ m_pParam = ToDictionary(static_cast<CPDF_Object*>(src.m_pParam))->Clone();
} else {
m_pParam = src.m_pParam;
}
}
CPDF_ContentMarkItem::~CPDF_ContentMarkItem() {
if (m_ParamType == DirectDict && m_pParam) {
- ((CPDF_Dictionary*)m_pParam)->Release();
+ ToDictionary(static_cast<CPDF_Object*>(m_pParam))->Release();
}
}
FX_BOOL CPDF_ContentMarkItem::HasMCID() const {
if (m_pParam &&
(m_ParamType == DirectDict || m_ParamType == PropertiesDict)) {
- return ((CPDF_Dictionary*)m_pParam)->KeyExist(FX_BSTRC("MCID"));
+ return ToDictionary(static_cast<CPDF_Object*>(m_pParam))
+ ->KeyExist(FX_BSTRC("MCID"));
}
return FALSE;
}
@@ -627,7 +628,8 @@
type = m_Marks[i].GetParamType();
if (type == CPDF_ContentMarkItem::PropertiesDict ||
type == CPDF_ContentMarkItem::DirectDict) {
- CPDF_Dictionary* pDict = (CPDF_Dictionary*)m_Marks[i].GetParam();
+ CPDF_Dictionary* pDict =
+ ToDictionary(static_cast<CPDF_Object*>(m_Marks[i].GetParam()));
if (pDict->KeyExist(FX_BSTRC("MCID"))) {
return pDict->GetInteger(FX_BSTRC("MCID"));
}
@@ -677,7 +679,7 @@
pDict = NULL;
if (item.GetParamType() == CPDF_ContentMarkItem::PropertiesDict ||
item.GetParamType() == CPDF_ContentMarkItem::DirectDict) {
- pDict = (CPDF_Dictionary*)item.GetParam();
+ pDict = ToDictionary(static_cast<CPDF_Object*>(item.GetParam()));
}
return TRUE;
}
diff --git a/core/src/fpdfapi/fpdf_page/fpdf_page_image.cpp b/core/src/fpdfapi/fpdf_page/fpdf_page_image.cpp
index e9f70c1..9cdf00e 100644
--- a/core/src/fpdfapi/fpdf_page/fpdf_page_image.cpp
+++ b/core/src/fpdfapi/fpdf_page/fpdf_page_image.cpp
@@ -52,8 +52,7 @@
pImage->LoadImageF((CPDF_Stream*)((CPDF_Object*)m_pStream)->Clone(),
m_bInline);
if (m_bInline) {
- CPDF_Dictionary* pInlineDict = (CPDF_Dictionary*)m_pInlineDict->Clone(TRUE);
- pImage->SetInlineDict(pInlineDict);
+ pImage->SetInlineDict(ToDictionary(m_pInlineDict->Clone(TRUE)));
}
return pImage;
}
@@ -86,7 +85,7 @@
m_bInline = bInline;
CPDF_Dictionary* pDict = pStream->GetDict();
if (m_bInline) {
- m_pInlineDict = (CPDF_Dictionary*)pDict->Clone();
+ m_pInlineDict = ToDictionary(pDict->Clone());
}
m_pOC = pDict->GetDict(FX_BSTRC("OC"));
m_bIsMask = !pDict->KeyExist(FX_BSTRC("ColorSpace")) ||
diff --git a/core/src/fpdfapi/fpdf_page/fpdf_page_parser.cpp b/core/src/fpdfapi/fpdf_page/fpdf_page_parser.cpp
index 127fb93..ffa5e62 100644
--- a/core/src/fpdfapi/fpdf_page/fpdf_page_parser.cpp
+++ b/core/src/fpdfapi/fpdf_page/fpdf_page_parser.cpp
@@ -418,11 +418,9 @@
}
bDirect = FALSE;
}
- if (pProperty->GetType() != PDFOBJ_DICTIONARY) {
- return;
+ if (CPDF_Dictionary* pDict = pProperty->AsDictionary()) {
+ m_CurContentMark.GetModify()->AddMark(tag, pDict, bDirect);
}
- m_CurContentMark.GetModify()->AddMark(tag, (CPDF_Dictionary*)pProperty,
- bDirect);
}
void CPDF_StreamContentParser::Handle_BeginMarkedContent() {
if (!m_Options.m_bMarkedContent) {
@@ -487,7 +485,7 @@
void _PDF_ReplaceAbbr(CPDF_Object* pObj) {
switch (pObj->GetType()) {
case PDFOBJ_DICTIONARY: {
- CPDF_Dictionary* pDict = (CPDF_Dictionary*)pObj;
+ CPDF_Dictionary* pDict = pObj->AsDictionary();
FX_POSITION pos = pDict->GetStartPos();
while (pos) {
CFX_ByteString key;
@@ -550,7 +548,7 @@
void _PDF_ReplaceFull(CPDF_Object* pObj) {
switch (pObj->GetType()) {
case PDFOBJ_DICTIONARY: {
- CPDF_Dictionary* pDict = (CPDF_Dictionary*)pObj;
+ CPDF_Dictionary* pDict = pObj->AsDictionary();
FX_POSITION pos = pDict->GetStartPos();
while (pos) {
CFX_ByteString key;
@@ -886,8 +884,8 @@
void CPDF_StreamContentParser::Handle_SetExtendGraphState() {
CFX_ByteString name = GetString(0);
CPDF_Dictionary* pGS =
- (CPDF_Dictionary*)FindResourceObj(FX_BSTRC("ExtGState"), name);
- if (pGS == NULL || pGS->GetType() != PDFOBJ_DICTIONARY) {
+ ToDictionary(FindResourceObj(FX_BSTRC("ExtGState"), name));
+ if (!pGS) {
m_bResourceMissing = TRUE;
return;
}
@@ -1217,11 +1215,12 @@
}
CPDF_Font* CPDF_StreamContentParser::FindFont(const CFX_ByteString& name) {
CPDF_Dictionary* pFontDict =
- (CPDF_Dictionary*)FindResourceObj(FX_BSTRC("Font"), name);
- if (pFontDict == NULL || pFontDict->GetType() != PDFOBJ_DICTIONARY) {
+ ToDictionary(FindResourceObj(FX_BSTRC("Font"), name));
+ if (!pFontDict) {
m_bResourceMissing = TRUE;
return CPDF_Font::GetStockFont(m_pDocument, FX_BSTRC("Helvetica"));
}
+
CPDF_Font* pFont = m_pDocument->LoadFont(pFontDict);
if (pFont && pFont->GetType3Font()) {
pFont->GetType3Font()->SetPageResources(m_pResources);
@@ -1261,8 +1260,8 @@
FX_BOOL bShading) {
CPDF_Object* pPattern = FindResourceObj(
bShading ? FX_BSTRC("Shading") : FX_BSTRC("Pattern"), name);
- if (pPattern == NULL || (pPattern->GetType() != PDFOBJ_DICTIONARY &&
- pPattern->GetType() != PDFOBJ_STREAM)) {
+ if (pPattern == NULL ||
+ (!pPattern->IsDictionary() && pPattern->GetType() != PDFOBJ_STREAM)) {
m_bResourceMissing = TRUE;
return NULL;
}
diff --git a/core/src/fpdfapi/fpdf_parser/fpdf_parser_decode.cpp b/core/src/fpdfapi/fpdf_parser/fpdf_parser_decode.cpp
index 2d6e9f3..55c62e2 100644
--- a/core/src/fpdfapi/fpdf_parser/fpdf_parser_decode.cpp
+++ b/core/src/fpdfapi/fpdf_parser/fpdf_parser_decode.cpp
@@ -283,7 +283,7 @@
int predictor = 0;
int Colors = 0, BitsPerComponent = 0, Columns = 0;
if (pParams) {
- predictor = ((CPDF_Dictionary*)pParams)->GetInteger(FX_BSTRC("Predictor"));
+ predictor = pParams->GetInteger(FX_BSTRC("Predictor"));
Colors = pParams->GetInteger(FX_BSTRC("Colors"), 1);
BitsPerComponent = pParams->GetInteger(FX_BSTRC("BitsPerComponent"), 8);
Columns = pParams->GetInteger(FX_BSTRC("Columns"), 1);
@@ -306,9 +306,8 @@
FX_BOOL bEarlyChange = TRUE;
int Colors = 0, BitsPerComponent = 0, Columns = 0;
if (pParams) {
- predictor = ((CPDF_Dictionary*)pParams)->GetInteger(FX_BSTRC("Predictor"));
- bEarlyChange =
- ((CPDF_Dictionary*)pParams)->GetInteger(FX_BSTRC("EarlyChange"), 1);
+ predictor = pParams->GetInteger(FX_BSTRC("Predictor"));
+ bEarlyChange = pParams->GetInteger(FX_BSTRC("EarlyChange"), 1);
Colors = pParams->GetInteger(FX_BSTRC("Colors"), 1);
BitsPerComponent = pParams->GetInteger(FX_BSTRC("BitsPerComponent"), 8);
Columns = pParams->GetInteger(FX_BSTRC("Columns"), 1);
@@ -365,7 +364,9 @@
int estimated_size =
i == DecoderList.GetSize() - 1 ? last_estimated_size : 0;
CFX_ByteString decoder = DecoderList[i];
- CPDF_Dictionary* pParam = (CPDF_Dictionary*)ParamList[i];
+ // Use ToDictionary here because we can push NULL into the ParamList.
+ CPDF_Dictionary* pParam =
+ ToDictionary(static_cast<CPDF_Object*>(ParamList[i]));
uint8_t* new_buf = NULL;
FX_DWORD new_size = (FX_DWORD)-1;
int offset = -1;
diff --git a/core/src/fpdfapi/fpdf_parser/fpdf_parser_document.cpp b/core/src/fpdfapi/fpdf_parser/fpdf_parser_document.cpp
index 5b78013..7f7f3d1 100644
--- a/core/src/fpdfapi/fpdf_parser/fpdf_parser_document.cpp
+++ b/core/src/fpdfapi/fpdf_parser/fpdf_parser_document.cpp
@@ -142,18 +142,15 @@
return nullptr;
if (m_bLinearized && (iPage == (int)m_dwFirstPageNo)) {
- CPDF_Object* pObj = GetIndirectObject(m_dwFirstPageObjNum);
- if (pObj && pObj->GetType() == PDFOBJ_DICTIONARY) {
- return static_cast<CPDF_Dictionary*>(pObj);
- }
+ if (CPDF_Dictionary* pDict =
+ ToDictionary(GetIndirectObject(m_dwFirstPageObjNum)))
+ return pDict;
}
int objnum = m_PageList.GetAt(iPage);
if (objnum) {
- CPDF_Object* pObj = GetIndirectObject(objnum);
- if (pObj && pObj->GetType() == PDFOBJ_DICTIONARY) {
- return static_cast<CPDF_Dictionary*>(pObj);
- }
+ if (CPDF_Dictionary* pDict = ToDictionary(GetIndirectObject(objnum)))
+ return pDict;
}
CPDF_Dictionary* pRoot = GetRoot();
diff --git a/core/src/fpdfapi/fpdf_parser/fpdf_parser_fdf.cpp b/core/src/fpdfapi/fpdf_parser/fpdf_parser_fdf.cpp
index 19359ad..82bfbb5 100644
--- a/core/src/fpdfapi/fpdf_parser/fpdf_parser_fdf.cpp
+++ b/core/src/fpdfapi/fpdf_parser/fpdf_parser_fdf.cpp
@@ -70,13 +70,11 @@
if (word != FX_BSTRC("trailer")) {
break;
}
- CPDF_Dictionary* pMainDict =
- (CPDF_Dictionary*)parser.GetObject(this, 0, 0, 0);
- if (pMainDict == NULL || pMainDict->GetType() != PDFOBJ_DICTIONARY) {
- break;
+ if (CPDF_Dictionary* pMainDict =
+ ToDictionary(parser.GetObject(this, 0, 0, 0))) {
+ m_pRootDict = pMainDict->GetDict(FX_BSTRC("Root"));
+ pMainDict->Release();
}
- m_pRootDict = pMainDict->GetDict(FX_BSTRC("Root"));
- pMainDict->Release();
break;
}
}
@@ -142,18 +140,17 @@
}
if (pFileSpec->GetType() == PDFOBJ_STRING) {
pFileSpec->SetString(CFX_ByteString::FromUnicode(result));
- } else if (pFileSpec->GetType() == PDFOBJ_DICTIONARY) {
- ((CPDF_Dictionary*)pFileSpec)
- ->SetAtString(FX_BSTRC("F"), CFX_ByteString::FromUnicode(result));
- ((CPDF_Dictionary*)pFileSpec)
- ->SetAtString(FX_BSTRC("UF"), PDF_EncodeText(result));
- ((CPDF_Dictionary*)pFileSpec)->RemoveAt(FX_BSTRC("FS"));
+ } else if (CPDF_Dictionary* pFileDict = pFileSpec->AsDictionary()) {
+ pFileDict->SetAtString(FX_BSTRC("F"), CFX_ByteString::FromUnicode(result));
+ pFileDict->SetAtString(FX_BSTRC("UF"), PDF_EncodeText(result));
+ pFileDict->RemoveAt(FX_BSTRC("FS"));
}
}
CFX_WideString FPDF_FileSpec_GetWin32Path(const CPDF_Object* pFileSpec) {
CFX_WideString wsFileName;
- if (pFileSpec->GetType() == PDFOBJ_DICTIONARY) {
- CPDF_Dictionary* pDict = (CPDF_Dictionary*)pFileSpec;
+ if (!pFileSpec) {
+ wsFileName = CFX_WideString();
+ } else if (const CPDF_Dictionary* pDict = pFileSpec->AsDictionary()) {
wsFileName = pDict->GetUnicodeText(FX_BSTRC("UF"));
if (wsFileName.IsEmpty()) {
wsFileName = CFX_WideString::FromLocal(pDict->GetString(FX_BSTRC("F")));
@@ -164,9 +161,7 @@
if (wsFileName.IsEmpty() && pDict->KeyExist(FX_BSTRC("DOS"))) {
wsFileName = CFX_WideString::FromLocal(pDict->GetString(FX_BSTRC("DOS")));
}
- } else if (!pFileSpec)
- wsFileName = CFX_WideString();
- else {
+ } else {
wsFileName = CFX_WideString::FromLocal(pFileSpec->GetString());
}
if (wsFileName[0] != '/') {
diff --git a/core/src/fpdfapi/fpdf_parser/fpdf_parser_objects.cpp b/core/src/fpdfapi/fpdf_parser/fpdf_parser_objects.cpp
index 79a2bcd..55c274a 100644
--- a/core/src/fpdfapi/fpdf_parser/fpdf_parser_objects.cpp
+++ b/core/src/fpdfapi/fpdf_parser/fpdf_parser_objects.cpp
@@ -28,7 +28,7 @@
delete (CPDF_Array*)this;
break;
case PDFOBJ_DICTIONARY:
- delete (CPDF_Dictionary*)this;
+ delete this->AsDictionary();
break;
case PDFOBJ_STREAM:
delete (CPDF_Stream*)this;
@@ -138,7 +138,9 @@
CPDF_Dictionary* CPDF_Object::GetDict() const {
switch (m_Type) {
case PDFOBJ_DICTIONARY:
- return (CPDF_Dictionary*)this;
+ // The method should be made non-const if we want to not be const.
+ // See bug #234.
+ return const_cast<CPDF_Dictionary*>(this->AsDictionary());
case PDFOBJ_STREAM:
return ((CPDF_Stream*)this)->GetDict();
case PDFOBJ_REFERENCE: {
@@ -215,7 +217,7 @@
case PDFOBJ_ARRAY:
return (((CPDF_Array*)this)->Identical((CPDF_Array*)pOther));
case PDFOBJ_DICTIONARY:
- return (((CPDF_Dictionary*)this)->Identical((CPDF_Dictionary*)pOther));
+ return this->AsDictionary()->Identical(pOther->AsDictionary());
case PDFOBJ_NULL:
return TRUE;
case PDFOBJ_STREAM:
@@ -264,7 +266,7 @@
}
case PDFOBJ_DICTIONARY: {
CPDF_Dictionary* pCopy = new CPDF_Dictionary();
- CPDF_Dictionary* pThis = (CPDF_Dictionary*)this;
+ const CPDF_Dictionary* pThis = this->AsDictionary();
FX_POSITION pos = pThis->m_Map.GetStartPosition();
while (pos) {
CFX_ByteString key;
@@ -283,9 +285,9 @@
acc.LoadAllData(pThis, TRUE);
FX_DWORD streamSize = acc.GetSize();
CPDF_Dictionary* pDict = pThis->GetDict();
- if (pDict)
- pDict = (CPDF_Dictionary*)((CPDF_Object*)pDict)
- ->CloneInternal(bDirect, visited);
+ if (pDict) {
+ pDict = ToDictionary(pDict->CloneInternal(bDirect, visited));
+ }
return new CPDF_Stream(acc.DetachData(), streamSize, pDict);
}
case PDFOBJ_REFERENCE: {
@@ -335,6 +337,14 @@
}
}
+CPDF_Dictionary* CPDF_Object::AsDictionary() {
+ return IsDictionary() ? static_cast<CPDF_Dictionary*>(this) : nullptr;
+}
+
+const CPDF_Dictionary* CPDF_Object::AsDictionary() const {
+ return IsDictionary() ? static_cast<const CPDF_Dictionary*>(this) : nullptr;
+}
+
CPDF_Number::CPDF_Number(int value)
: CPDF_Object(PDFOBJ_NUMBER), m_bInteger(TRUE), m_Integer(value) {}
@@ -442,8 +452,8 @@
if (!p) {
return NULL;
}
- if (p->GetType() == PDFOBJ_DICTIONARY) {
- return (CPDF_Dictionary*)p;
+ if (CPDF_Dictionary* pDict = p->AsDictionary()) {
+ return pDict;
}
if (p->GetType() == PDFOBJ_STREAM) {
return ((CPDF_Stream*)p)->GetDict();
@@ -663,8 +673,8 @@
if (!p) {
return nullptr;
}
- if (p->GetType() == PDFOBJ_DICTIONARY) {
- return (CPDF_Dictionary*)p;
+ if (CPDF_Dictionary* pDict = p->AsDictionary()) {
+ return pDict;
}
if (p->GetType() == PDFOBJ_STREAM) {
return ((CPDF_Stream*)p)->GetDict();
diff --git a/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp b/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp
index 35c1a58..6839c07 100644
--- a/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp
+++ b/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp
@@ -277,8 +277,8 @@
}
CPDF_Object* pEncryptObj = m_pTrailer->GetElement(FX_BSTRC("Encrypt"));
if (pEncryptObj) {
- if (pEncryptObj->GetType() == PDFOBJ_DICTIONARY) {
- SetEncryptDictionary((CPDF_Dictionary*)pEncryptObj);
+ if (CPDF_Dictionary* pEncryptDict = pEncryptObj->AsDictionary()) {
+ SetEncryptDictionary(pEncryptDict);
} else if (pEncryptObj->GetType() == PDFOBJ_REFERENCE) {
pEncryptObj = m_pDocument->GetIndirectObject(
((CPDF_Reference*)pEncryptObj)->GetRefObjNum());
@@ -804,7 +804,7 @@
if (m_pTrailer) {
m_pTrailer->Release();
}
- m_pTrailer = (CPDF_Dictionary*)pDict->Clone();
+ m_pTrailer = ToDictionary(pDict->Clone());
}
}
}
@@ -857,15 +857,14 @@
m_Syntax.RestorePos(pos + i - m_Syntax.m_HeaderOffset);
CPDF_Object* pObj = m_Syntax.GetObject(m_pDocument, 0, 0, 0);
if (pObj) {
- if (pObj->GetType() != PDFOBJ_DICTIONARY &&
- pObj->GetType() != PDFOBJ_STREAM) {
+ if (!pObj->IsDictionary() && pObj->GetType() != PDFOBJ_STREAM) {
pObj->Release();
} else {
CPDF_Dictionary* pTrailer = NULL;
if (pObj->GetType() == PDFOBJ_STREAM) {
pTrailer = ((CPDF_Stream*)pObj)->GetDict();
} else {
- pTrailer = (CPDF_Dictionary*)pObj;
+ pTrailer = pObj->AsDictionary();
}
if (pTrailer) {
if (m_pTrailer) {
@@ -890,7 +889,7 @@
}
} else {
if (pObj->GetType() == PDFOBJ_STREAM) {
- m_pTrailer = (CPDF_Dictionary*)pTrailer->Clone();
+ m_pTrailer = ToDictionary(pTrailer->Clone());
pObj->Release();
} else {
m_pTrailer = pTrailer;
@@ -1034,13 +1033,13 @@
return FALSE;
}
if (bMainXRef) {
- m_pTrailer = (CPDF_Dictionary*)pStream->GetDict()->Clone();
+ m_pTrailer = ToDictionary(pStream->GetDict()->Clone());
m_CrossRef.SetSize(size);
if (m_V5Type.SetSize(size)) {
FXSYS_memset(m_V5Type.GetData(), 0, size);
}
} else {
- m_Trailers.Add((CPDF_Dictionary*)pStream->GetDict()->Clone());
+ m_Trailers.Add(ToDictionary(pStream->GetDict()->Clone()));
}
std::vector<std::pair<int32_t, int32_t> > arrIndex;
CPDF_Array* pArray = pStream->GetDict()->GetArray(FX_BSTRC("Index"));
@@ -1490,9 +1489,9 @@
nonstd::unique_ptr<CPDF_Object, ReleaseDeleter<CPDF_Object>> pObj(
m_Syntax.GetObject(m_pDocument, 0, 0, 0));
- if (!pObj || pObj->GetType() != PDFOBJ_DICTIONARY)
+ if (!ToDictionary(pObj.get()))
return nullptr;
- return static_cast<CPDF_Dictionary*>(pObj.release());
+ return pObj.release()->AsDictionary();
}
FX_DWORD CPDF_Parser::GetPermissions(FX_BOOL bCheckRevision) {
@@ -3496,7 +3495,7 @@
}
}
}
- if (pObj->GetType() != PDFOBJ_DICTIONARY) {
+ if (!pObj->IsDictionary()) {
pObj->Release();
continue;
}
@@ -4049,7 +4048,7 @@
pHints->AddSegment(m_Pos, iTrailerSize);
return FALSE;
}
- if (pTrailer->GetType() != PDFOBJ_DICTIONARY)
+ if (!pTrailer->IsDictionary())
return FALSE;
CPDF_Dictionary* pTrailerDict = pTrailer->GetDict();
@@ -4164,7 +4163,7 @@
pPage->Release();
return TRUE;
}
- if (pPage->GetType() != PDFOBJ_DICTIONARY) {
+ if (!pPage->IsDictionary()) {
pPage->Release();
m_docStatus = PDF_DATAAVAIL_ERROR;
return FALSE;
diff --git a/core/src/fpdfapi/fpdf_parser/fpdf_parser_utility.cpp b/core/src/fpdfapi/fpdf_parser/fpdf_parser_utility.cpp
index 63454d2..c34d812 100644
--- a/core/src/fpdfapi/fpdf_parser/fpdf_parser_utility.cpp
+++ b/core/src/fpdfapi/fpdf_parser/fpdf_parser_utility.cpp
@@ -403,7 +403,7 @@
break;
}
case PDFOBJ_DICTIONARY: {
- CPDF_Dictionary* p = (CPDF_Dictionary*)pObj;
+ const CPDF_Dictionary* p = pObj->AsDictionary();
buf << FX_BSTRC("<<");
FX_POSITION pos = p->GetStartPos();
while (pos) {
diff --git a/core/src/fpdfapi/fpdf_render/fpdf_render.cpp b/core/src/fpdfapi/fpdf_render/fpdf_render.cpp
index 9db3506..99835a3 100644
--- a/core/src/fpdfapi/fpdf_render/fpdf_render.cpp
+++ b/core/src/fpdfapi/fpdf_render/fpdf_render.cpp
@@ -738,7 +738,7 @@
return TRUE;
}
CPDF_Dictionary* pSMaskDict =
- pGeneralState ? (CPDF_Dictionary*)pGeneralState->m_pSoftMask : NULL;
+ pGeneralState ? ToDictionary(pGeneralState->m_pSoftMask) : NULL;
if (pSMaskDict) {
if (pPageObj->m_Type == PDFPAGE_IMAGE &&
((CPDF_ImageObject*)pPageObj)
@@ -1438,7 +1438,8 @@
CPDF_ContentMarkItem& item = pData->GetItem(i);
if (item.GetName() == FX_BSTRC("OC") &&
item.GetParamType() == CPDF_ContentMarkItem::PropertiesDict) {
- CPDF_Dictionary* pOCG = (CPDF_Dictionary*)item.GetParam();
+ CPDF_Dictionary* pOCG =
+ ToDictionary(static_cast<CPDF_Object*>(item.GetParam()));
if (!CheckOCGVisible(pOCG)) {
return FALSE;
}
diff --git a/core/src/fpdfapi/fpdf_render/fpdf_render_image.cpp b/core/src/fpdfapi/fpdf_render/fpdf_render_image.cpp
index 222f58c..e4afdd8 100644
--- a/core/src/fpdfapi/fpdf_render/fpdf_render_image.cpp
+++ b/core/src/fpdfapi/fpdf_render/fpdf_render_image.cpp
@@ -1056,8 +1056,8 @@
}
CPDF_Function* pFunc = NULL;
CPDF_Object* pFuncObj = pSMaskDict->GetElementValue(FX_BSTRC("TR"));
- if (pFuncObj && (pFuncObj->GetType() == PDFOBJ_DICTIONARY ||
- pFuncObj->GetType() == PDFOBJ_STREAM)) {
+ if (pFuncObj &&
+ (pFuncObj->IsDictionary() || pFuncObj->GetType() == PDFOBJ_STREAM)) {
pFunc = CPDF_Function::Load(pFuncObj);
}
CFX_AffineMatrix matrix = *pMatrix;
diff --git a/core/src/fpdfdoc/doc_action.cpp b/core/src/fpdfdoc/doc_action.cpp
index 759a06c..409d050 100644
--- a/core/src/fpdfdoc/doc_action.cpp
+++ b/core/src/fpdfdoc/doc_action.cpp
@@ -251,13 +251,10 @@
return CPDF_Action();
}
CPDF_Object* pNext = m_pDict->GetElementValue("Next");
- int iObjType = pNext->GetType();
- if (iObjType == PDFOBJ_DICTIONARY) {
- CPDF_Dictionary* pDict = static_cast<CPDF_Dictionary*>(pNext);
- if (iIndex == 0) {
+ if (CPDF_Dictionary* pDict = ToDictionary(pNext)) {
+ if (iIndex == 0)
return CPDF_Action(pDict);
- }
- } else if (iObjType == PDFOBJ_ARRAY) {
+ } else if (pNext->GetType() == PDFOBJ_ARRAY) {
CPDF_Array* pArray = static_cast<CPDF_Array*>(pNext);
return CPDF_Action(pArray->GetDict(iIndex));
}
@@ -295,9 +292,10 @@
return CPDF_Action();
}
CPDF_Object* pDirect = pObj->GetDirect();
- if (!pDirect || pDirect->GetType() != PDFOBJ_DICTIONARY) {
+ CPDF_Dictionary* pDict = ToDictionary(pDirect);
+ if (!pDict)
return CPDF_Action();
- }
+
int i = 0;
while (g_sAATypes[i][0] != '\0') {
if (csKey == g_sAATypes[i]) {
@@ -306,7 +304,7 @@
i++;
}
eType = (AActionType)i;
- return CPDF_Action(static_cast<CPDF_Dictionary*>(pDirect));
+ return CPDF_Action(pDict);
}
CPDF_DocJSActions::CPDF_DocJSActions(CPDF_Document* pDoc) {
m_pDocument = pDoc;
@@ -321,7 +319,7 @@
ASSERT(m_pDocument != NULL);
CPDF_NameTree name_tree(m_pDocument, FX_BSTRC("JavaScript"));
CPDF_Object* pAction = name_tree.LookupValue(index, csName);
- if (pAction == NULL || pAction->GetType() != PDFOBJ_DICTIONARY) {
+ if (!ToDictionary(pAction)) {
return CPDF_Action();
}
return CPDF_Action(pAction->GetDict());
@@ -330,7 +328,7 @@
ASSERT(m_pDocument != NULL);
CPDF_NameTree name_tree(m_pDocument, FX_BSTRC("JavaScript"));
CPDF_Object* pAction = name_tree.LookupValue(csName);
- if (pAction == NULL || pAction->GetType() != PDFOBJ_DICTIONARY) {
+ if (!ToDictionary(pAction)) {
return CPDF_Action();
}
return CPDF_Action(pAction->GetDict());
diff --git a/core/src/fpdfdoc/doc_annot.cpp b/core/src/fpdfdoc/doc_annot.cpp
index 57b0665..ca05d78 100644
--- a/core/src/fpdfdoc/doc_annot.cpp
+++ b/core/src/fpdfdoc/doc_annot.cpp
@@ -23,8 +23,8 @@
CPDF_Dictionary* pAcroForm = pRoot->GetDict("AcroForm");
FX_BOOL bRegenerateAP = pAcroForm && pAcroForm->GetBoolean("NeedAppearances");
for (FX_DWORD i = 0; i < pAnnots->GetCount(); ++i) {
- CPDF_Dictionary* pDict = (CPDF_Dictionary*)pAnnots->GetElementValue(i);
- if (pDict == NULL || pDict->GetType() != PDFOBJ_DICTIONARY) {
+ CPDF_Dictionary* pDict = ToDictionary(pAnnots->GetElementValue(i));
+ if (!pDict) {
continue;
}
FX_DWORD dwObjNum = pDict->GetObjNum();
@@ -205,7 +205,7 @@
CPDF_Stream* pStream = NULL;
if (psub->GetType() == PDFOBJ_STREAM) {
pStream = (CPDF_Stream*)psub;
- } else if (psub->GetType() == PDFOBJ_DICTIONARY) {
+ } else if (CPDF_Dictionary* pDict = psub->AsDictionary()) {
CFX_ByteString as = pAnnotDict->GetString("AS");
if (as.IsEmpty()) {
CFX_ByteString value = pAnnotDict->GetString(FX_BSTRC("V"));
@@ -213,13 +213,13 @@
CPDF_Dictionary* pDict = pAnnotDict->GetDict(FX_BSTRC("Parent"));
value = pDict ? pDict->GetString(FX_BSTRC("V")) : CFX_ByteString();
}
- if (value.IsEmpty() || !((CPDF_Dictionary*)psub)->KeyExist(value)) {
+ if (value.IsEmpty() || !pDict->KeyExist(value)) {
as = FX_BSTRC("Off");
} else {
as = value;
}
}
- pStream = ((CPDF_Dictionary*)psub)->GetStream(as);
+ pStream = pDict->GetStream(as);
}
return pStream;
}
diff --git a/core/src/fpdfdoc/doc_basic.cpp b/core/src/fpdfdoc/doc_basic.cpp
index 39b5788..e3b6308 100644
--- a/core/src/fpdfdoc/doc_basic.cpp
+++ b/core/src/fpdfdoc/doc_basic.cpp
@@ -17,7 +17,7 @@
if (pPage->GetType() == PDFOBJ_NUMBER) {
return pPage->GetInteger();
}
- if (pPage->GetType() != PDFOBJ_DICTIONARY) {
+ if (!pPage->IsDictionary()) {
return 0;
}
return pDoc->GetPageIndex(pPage->GetObjNum());
@@ -33,7 +33,7 @@
if (pPage->GetType() == PDFOBJ_NUMBER) {
return pPage->GetInteger();
}
- if (pPage->GetType() == PDFOBJ_DICTIONARY) {
+ if (pPage->IsDictionary()) {
return pPage->GetObjNum();
}
return 0;
@@ -243,8 +243,8 @@
if (pValue->GetType() == PDFOBJ_ARRAY) {
return (CPDF_Array*)pValue;
}
- if (pValue->GetType() == PDFOBJ_DICTIONARY) {
- return ((CPDF_Dictionary*)pValue)->GetArray(FX_BSTRC("D"));
+ if (CPDF_Dictionary* pDict = pValue->AsDictionary()) {
+ return pDict->GetArray(FX_BSTRC("D"));
}
return NULL;
}
@@ -311,11 +311,10 @@
#endif
}
FX_BOOL CPDF_FileSpec::GetFileName(CFX_WideString& csFileName) const {
- if (m_pObj == NULL) {
+ if (!m_pObj) {
return FALSE;
}
- if (m_pObj->GetType() == PDFOBJ_DICTIONARY) {
- CPDF_Dictionary* pDict = (CPDF_Dictionary*)m_pObj;
+ if (CPDF_Dictionary* pDict = m_pObj->AsDictionary()) {
csFileName = pDict->GetUnicodeText(FX_BSTRC("UF"));
if (csFileName.IsEmpty()) {
csFileName = CFX_WideString::FromLocal(pDict->GetString(FX_BSTRC("F")));
@@ -345,20 +344,15 @@
}
CPDF_FileSpec::CPDF_FileSpec() {
m_pObj = CPDF_Dictionary::Create();
- if (m_pObj != NULL) {
- ((CPDF_Dictionary*)m_pObj)
- ->SetAtName(FX_BSTRC("Type"), FX_BSTRC("Filespec"));
+ if (CPDF_Dictionary* pDict = ToDictionary(m_pObj)) {
+ pDict->SetAtName(FX_BSTRC("Type"), FX_BSTRC("Filespec"));
}
}
FX_BOOL CPDF_FileSpec::IsURL() const {
- if (m_pObj == NULL) {
- return FALSE;
+ if (CPDF_Dictionary* pDict = ToDictionary(m_pObj)) {
+ return pDict->GetString(FX_BSTRC("FS")) == FX_BSTRC("URL");
}
- if (m_pObj->GetType() != PDFOBJ_DICTIONARY) {
- return FALSE;
- }
- return ((CPDF_Dictionary*)m_pObj)->GetString(FX_BSTRC("FS")) ==
- FX_BSTRC("URL");
+ return FALSE;
}
CFX_WideString FILESPEC_EncodeFileName(const CFX_WideStringC& filepath) {
if (filepath.GetLength() <= 1) {
@@ -402,15 +396,10 @@
return NULL;
}
int32_t iType = m_pObj->GetType();
- if (iType == PDFOBJ_STREAM) {
+ if (iType == PDFOBJ_STREAM)
return (CPDF_Stream*)m_pObj;
- } else if (iType == PDFOBJ_DICTIONARY) {
- CPDF_Dictionary* pEF = ((CPDF_Dictionary*)m_pObj)->GetDict(FX_BSTRC("EF"));
- if (pEF == NULL) {
- return NULL;
- }
+ if (CPDF_Dictionary* pEF = m_pObj->AsDictionary()->GetDict(FX_BSTRC("EF")))
return pEF->GetStream(FX_BSTRC("F"));
- }
return NULL;
}
static void FPDFDOC_FILESPEC_SetFileName(CPDF_Object* pObj,
@@ -426,8 +415,7 @@
int32_t iType = pObj->GetType();
if (iType == PDFOBJ_STRING) {
pObj->SetString(CFX_ByteString::FromUnicode(wsStr));
- } else if (iType == PDFOBJ_DICTIONARY) {
- CPDF_Dictionary* pDict = (CPDF_Dictionary*)pObj;
+ } else if (CPDF_Dictionary* pDict = pObj->AsDictionary()) {
pDict->SetAtString(FX_BSTRC("F"), CFX_ByteString::FromUnicode(wsStr));
pDict->SetAtString(FX_BSTRC("UF"), PDF_EncodeText(wsStr));
}
@@ -435,8 +423,10 @@
void CPDF_FileSpec::SetFileName(const CFX_WideStringC& wsFileName,
FX_BOOL bURL) {
ASSERT(m_pObj != NULL);
- if (m_pObj->GetType() == PDFOBJ_DICTIONARY && bURL) {
- ((CPDF_Dictionary*)m_pObj)->SetAtName(FX_BSTRC("FS"), "URL");
+ if (bURL) {
+ if (CPDF_Dictionary* pDict = m_pObj->AsDictionary()) {
+ pDict->SetAtName(FX_BSTRC("FS"), "URL");
+ }
}
FPDFDOC_FILESPEC_SetFileName(m_pObj, wsFileName, bURL);
}
@@ -517,8 +507,7 @@
}
if (pValue != NULL) {
pValue = pValue->GetDirect();
- if (pValue->GetType() == PDFOBJ_DICTIONARY) {
- CPDF_Dictionary* pLabel = (CPDF_Dictionary*)pValue;
+ if (CPDF_Dictionary* pLabel = pValue->AsDictionary()) {
if (pLabel->KeyExist(FX_BSTRC("P"))) {
wsLabel += pLabel->GetUnicodeText(FX_BSTRC("P"));
}
diff --git a/core/src/fpdfdoc/doc_form.cpp b/core/src/fpdfdoc/doc_form.cpp
index 17f1808..8078608 100644
--- a/core/src/fpdfdoc/doc_form.cpp
+++ b/core/src/fpdfdoc/doc_form.cpp
@@ -854,9 +854,9 @@
if (pArray == NULL) {
return NULL;
}
- CPDF_Object* pElement = pArray->GetElementValue(index);
- if (pElement != NULL && pElement->GetType() == PDFOBJ_DICTIONARY) {
- return GetFieldByDict((CPDF_Dictionary*)pElement);
+ if (CPDF_Dictionary* pElement =
+ ToDictionary(pArray->GetElementValue(index))) {
+ return GetFieldByDict(pElement);
}
return NULL;
}
@@ -1049,25 +1049,24 @@
}
}
}
-CPDF_FormField* CPDF_InterForm::AddTerminalField(
- const CPDF_Dictionary* pFieldDict) {
+CPDF_FormField* CPDF_InterForm::AddTerminalField(CPDF_Dictionary* pFieldDict) {
if (!pFieldDict->KeyExist(FX_BSTRC("T"))) {
return NULL;
}
- CPDF_Dictionary* pDict = (CPDF_Dictionary*)pFieldDict;
- CFX_WideString csWName = GetFullName(pDict);
+ CPDF_Dictionary* pDict = pFieldDict;
+ CFX_WideString csWName = GetFullName(pFieldDict);
if (csWName.IsEmpty()) {
return NULL;
}
CPDF_FormField* pField = NULL;
pField = m_pFieldTree->GetField(csWName);
if (pField == NULL) {
- CPDF_Dictionary* pParent = (CPDF_Dictionary*)pFieldDict;
+ CPDF_Dictionary* pParent = pFieldDict;
if (!pFieldDict->KeyExist(FX_BSTRC("T")) &&
pFieldDict->GetString(FX_BSTRC("Subtype")) == FX_BSTRC("Widget")) {
pParent = pFieldDict->GetDict(FX_BSTRC("Parent"));
if (!pParent) {
- pParent = (CPDF_Dictionary*)pFieldDict;
+ pParent = pFieldDict;
}
}
if (pParent && pParent != pFieldDict &&
@@ -1116,15 +1115,14 @@
}
return pField;
}
-CPDF_FormControl* CPDF_InterForm::AddControl(
- const CPDF_FormField* pField,
- const CPDF_Dictionary* pWidgetDict) {
+CPDF_FormControl* CPDF_InterForm::AddControl(const CPDF_FormField* pField,
+ CPDF_Dictionary* pWidgetDict) {
const auto it = m_ControlMap.find(pWidgetDict);
if (it != m_ControlMap.end())
return it->second;
- CPDF_FormControl* pControl = new CPDF_FormControl(
- (CPDF_FormField*)pField, (CPDF_Dictionary*)pWidgetDict);
+ CPDF_FormControl* pControl =
+ new CPDF_FormControl((CPDF_FormField*)pField, pWidgetDict);
m_ControlMap[pWidgetDict] = pControl;
((CPDF_FormField*)pField)->m_ControlList.Add(pControl);
return pControl;
diff --git a/core/src/fpdfdoc/doc_formcontrol.cpp b/core/src/fpdfdoc/doc_formcontrol.cpp
index 410f9a1..c5f47d2 100644
--- a/core/src/fpdfdoc/doc_formcontrol.cpp
+++ b/core/src/fpdfdoc/doc_formcontrol.cpp
@@ -61,10 +61,10 @@
continue;
}
CPDF_Object* pObjDirect1 = pObj1->GetDirect();
- if (pObjDirect1->GetType() != PDFOBJ_DICTIONARY) {
+ CPDF_Dictionary* pSubDict = pObjDirect1->AsDictionary();
+ if (!pSubDict)
continue;
- }
- CPDF_Dictionary* pSubDict = (CPDF_Dictionary*)pObjDirect1;
+
FX_POSITION pos2 = pSubDict->GetStartPos();
while (pos2) {
CFX_ByteString csKey2;
@@ -287,8 +287,8 @@
return nullptr;
CPDF_Object* pObj = FPDF_GetFieldAttr(m_pWidgetDict, "DR");
- if (pObj && pObj->GetType() == PDFOBJ_DICTIONARY) {
- CPDF_Dictionary* pFonts = ((CPDF_Dictionary*)pObj)->GetDict("Font");
+ if (CPDF_Dictionary* pDict = ToDictionary(pObj)) {
+ CPDF_Dictionary* pFonts = pDict->GetDict("Font");
if (pFonts) {
CPDF_Dictionary* pElement = pFonts->GetDict(csFontNameTag);
if (pElement) {
@@ -304,8 +304,8 @@
CPDF_Dictionary* pPageDict = m_pWidgetDict->GetDict("P");
pObj = FPDF_GetFieldAttr(pPageDict, "Resources");
- if (pObj && pObj->GetType() == PDFOBJ_DICTIONARY) {
- CPDF_Dictionary* pFonts = ((CPDF_Dictionary*)pObj)->GetDict("Font");
+ if (CPDF_Dictionary* pDict = ToDictionary(pObj)) {
+ CPDF_Dictionary* pFonts = pDict->GetDict("Font");
if (pFonts) {
CPDF_Dictionary* pElement = pFonts->GetDict(csFontNameTag);
if (pElement) {
diff --git a/core/src/fpdfdoc/doc_ocg.cpp b/core/src/fpdfdoc/doc_ocg.cpp
index 70ad9c7..e66b044 100644
--- a/core/src/fpdfdoc/doc_ocg.cpp
+++ b/core/src/fpdfdoc/doc_ocg.cpp
@@ -209,9 +209,8 @@
if (pOCGObj == NULL) {
return FALSE;
}
- if (pOCGObj->GetType() == PDFOBJ_DICTIONARY) {
- return !(bFromConfig ? LoadOCGState((CPDF_Dictionary*)pOCGObj)
- : GetOCGVisible((CPDF_Dictionary*)pOCGObj));
+ if (CPDF_Dictionary* pDict = pOCGObj->AsDictionary()) {
+ return !(bFromConfig ? LoadOCGState(pDict) : GetOCGVisible(pDict));
}
if (pOCGObj->GetType() == PDFOBJ_ARRAY) {
return !GetOCGVE((CPDF_Array*)pOCGObj, bFromConfig, nLevel + 1);
@@ -226,9 +225,8 @@
continue;
}
FX_BOOL bItem = FALSE;
- if (pOCGObj->GetType() == PDFOBJ_DICTIONARY) {
- bItem = bFromConfig ? LoadOCGState((CPDF_Dictionary*)pOCGObj)
- : GetOCGVisible((CPDF_Dictionary*)pOCGObj);
+ if (CPDF_Dictionary* pDict = pOCGObj->AsDictionary()) {
+ bItem = bFromConfig ? LoadOCGState(pDict) : GetOCGVisible(pDict);
} else if (pOCGObj->GetType() == PDFOBJ_ARRAY) {
bItem = GetOCGVE((CPDF_Array*)pOCGObj, bFromConfig, nLevel + 1);
}
@@ -258,9 +256,8 @@
if (pOCGObj == NULL) {
return TRUE;
}
- if (pOCGObj->GetType() == PDFOBJ_DICTIONARY) {
- return bFromConfig ? LoadOCGState((CPDF_Dictionary*)pOCGObj)
- : GetOCGVisible((CPDF_Dictionary*)pOCGObj);
+ if (const CPDF_Dictionary* pDict = pOCGObj->AsDictionary()) {
+ return bFromConfig ? LoadOCGState(pDict) : GetOCGVisible(pDict);
}
if (pOCGObj->GetType() != PDFOBJ_ARRAY) {
return TRUE;
diff --git a/core/src/fpdfdoc/doc_tagged.cpp b/core/src/fpdfdoc/doc_tagged.cpp
index facad46..fb3a05d 100644
--- a/core/src/fpdfdoc/doc_tagged.cpp
+++ b/core/src/fpdfdoc/doc_tagged.cpp
@@ -54,9 +54,9 @@
if (pKids == NULL) {
return;
}
- if (pKids->GetType() == PDFOBJ_DICTIONARY) {
+ if (CPDF_Dictionary* pDict = pKids->AsDictionary()) {
CPDF_StructElementImpl* pStructElementImpl =
- new CPDF_StructElementImpl(this, NULL, (CPDF_Dictionary*)pKids);
+ new CPDF_StructElementImpl(this, NULL, pDict);
m_Kids.Add(pStructElementImpl);
return;
}
@@ -81,7 +81,7 @@
return;
}
FX_DWORD dwKids = 0;
- if (pKids->GetType() == PDFOBJ_DICTIONARY) {
+ if (pKids->IsDictionary()) {
dwKids = 1;
} else if (pKids->GetType() == PDFOBJ_ARRAY) {
dwKids = ((CPDF_Array*)pKids)->GetCount();
@@ -161,7 +161,7 @@
if (!pObj) {
return FALSE;
}
- if (pObj->GetType() == PDFOBJ_DICTIONARY) {
+ if (pObj->IsDictionary()) {
if (pObj->GetObjNum() == pDict->GetObjNum()) {
if (m_Kids[0]) {
m_Kids[0]->Release();
@@ -266,10 +266,10 @@
pKid->m_PageContent.m_PageObjNum = PageObjNum;
return;
}
- if (pKidObj->GetType() != PDFOBJ_DICTIONARY) {
+ CPDF_Dictionary* pKidDict = pKidObj->AsDictionary();
+ if (!pKidDict)
return;
- }
- CPDF_Dictionary* pKidDict = (CPDF_Dictionary*)pKidObj;
+
CPDF_Object* pPageObj = pKidDict->GetElement(FX_BSTRC("Pg"));
if (pPageObj && pPageObj->GetType() == PDFOBJ_REFERENCE) {
PageObjNum = ((CPDF_Reference*)pPageObj)->GetRefObjNum();
@@ -322,8 +322,8 @@
return NULL;
}
CPDF_Dictionary* pDict = NULL;
- if (pAttrs->GetType() == PDFOBJ_DICTIONARY) {
- pDict = (CPDF_Dictionary*)pAttrs;
+ if (pAttrs->IsDictionary()) {
+ pDict = pAttrs->AsDictionary();
} else if (pAttrs->GetType() == PDFOBJ_STREAM) {
pDict = ((CPDF_Stream*)pAttrs)->GetDict();
} else if (pAttrs->GetType() == PDFOBJ_ARRAY) {
diff --git a/core/src/fpdfdoc/doc_utils.cpp b/core/src/fpdfdoc/doc_utils.cpp
index 1ed0017..7d3fdf2 100644
--- a/core/src/fpdfdoc/doc_utils.cpp
+++ b/core/src/fpdfdoc/doc_utils.cpp
@@ -290,9 +290,8 @@
if (pObj == NULL) {
continue;
}
- CPDF_Object* pDirect = pObj->GetDirect();
- if (pDirect != NULL && pDirect->GetType() == PDFOBJ_DICTIONARY) {
- if (((CPDF_Dictionary*)pDirect)->GetString("Type") == "Font") {
+ if (CPDF_Dictionary* pDirect = ToDictionary(pObj->GetDirect())) {
+ if (pDirect->GetString("Type") == "Font") {
dwCount++;
}
}
@@ -323,14 +322,11 @@
if (pObj == NULL) {
continue;
}
- CPDF_Object* pDirect = pObj->GetDirect();
- if (pDirect == NULL || pDirect->GetType() != PDFOBJ_DICTIONARY) {
+ CPDF_Dictionary* pElement = ToDictionary(pObj->GetDirect());
+ if (!pElement)
continue;
- }
- CPDF_Dictionary* pElement = (CPDF_Dictionary*)pDirect;
- if (pElement->GetString("Type") != "Font") {
+ if (pElement->GetString("Type") != "Font")
continue;
- }
if (dwCount == index) {
csNameTag = csKey;
return pDocument->LoadFont(pElement);
@@ -386,18 +382,16 @@
if (pObj == NULL) {
continue;
}
- CPDF_Object* pDirect = pObj->GetDirect();
- if (pDirect == NULL || pDirect->GetType() != PDFOBJ_DICTIONARY) {
+ CPDF_Dictionary* pElement = ToDictionary(pObj->GetDirect());
+ if (!pElement)
continue;
- }
- CPDF_Dictionary* pElement = (CPDF_Dictionary*)pDirect;
- if (pElement->GetString("Type") != "Font") {
+ if (pElement->GetString("Type") != "Font")
continue;
- }
+
CPDF_Font* pFind = pDocument->LoadFont(pElement);
- if (pFind == NULL) {
+ if (!pFind)
continue;
- }
+
CFX_ByteString csBaseFont;
csBaseFont = pFind->GetBaseFont();
csBaseFont.Remove(' ');
@@ -431,14 +425,11 @@
if (pObj == NULL) {
continue;
}
- CPDF_Object* pDirect = pObj->GetDirect();
- if (pDirect == NULL || pDirect->GetType() != PDFOBJ_DICTIONARY) {
+ CPDF_Dictionary* pElement = ToDictionary(pObj->GetDirect());
+ if (!pElement)
continue;
- }
- CPDF_Dictionary* pElement = (CPDF_Dictionary*)pDirect;
- if (pElement->GetString("Type") != "Font") {
+ if (pElement->GetString("Type") != "Font")
continue;
- }
CPDF_Font* pFind = pDocument->LoadFont(pElement);
if (pFind == NULL) {
continue;
@@ -492,11 +483,9 @@
if (pObj == NULL) {
continue;
}
- CPDF_Object* pDirect = pObj->GetDirect();
- if (pDirect == NULL || pDirect->GetType() != PDFOBJ_DICTIONARY) {
+ CPDF_Dictionary* pElement = ToDictionary(pObj->GetDirect());
+ if (!pElement)
continue;
- }
- CPDF_Dictionary* pElement = (CPDF_Dictionary*)pDirect;
if (pElement->GetString("Type") != "Font") {
continue;
}
@@ -534,11 +523,9 @@
if (pObj == NULL) {
continue;
}
- CPDF_Object* pDirect = pObj->GetDirect();
- if (pDirect == NULL || pDirect->GetType() != PDFOBJ_DICTIONARY) {
+ CPDF_Dictionary* pElement = ToDictionary(pObj->GetDirect());
+ if (!pElement)
continue;
- }
- CPDF_Dictionary* pElement = (CPDF_Dictionary*)pDirect;
if (pElement->GetString("Type") != "Font") {
continue;
}
diff --git a/core/src/fpdftext/fpdf_text_int.cpp b/core/src/fpdftext/fpdf_text_int.cpp
index e427a1d..152bb44 100644
--- a/core/src/fpdftext/fpdf_text_int.cpp
+++ b/core/src/fpdftext/fpdf_text_int.cpp
@@ -1339,7 +1339,7 @@
for (n = 0; n < nContentMark; n++) {
CPDF_ContentMarkItem& item = pMarkData->GetItem(n);
CFX_ByteString tagStr = (CFX_ByteString)item.GetName();
- pDict = (CPDF_Dictionary*)item.GetParam();
+ pDict = ToDictionary(static_cast<CPDF_Object*>(item.GetParam()));
CPDF_String* temp =
(CPDF_String*)(pDict ? pDict->GetElement(FX_BSTRC("ActualText"))
: NULL);
@@ -1410,8 +1410,12 @@
for (n = 0; n < nContentMark; n++) {
CPDF_ContentMarkItem& item = pMarkData->GetItem(n);
CFX_ByteString tagStr = (CFX_ByteString)item.GetName();
- pDict = (CPDF_Dictionary*)item.GetParam();
- CPDF_String* temp = (CPDF_String*)pDict->GetElement(FX_BSTRC("ActualText"));
+
+ pDict = ToDictionary(static_cast<CPDF_Object*>(item.GetParam()));
+ CPDF_String* temp =
+ (CPDF_String*)(pDict ? pDict->GetElement(FX_BSTRC("ActualText"))
+ : NULL);
+
if (temp) {
actText = temp->GetUnicodeText();
}
diff --git a/fpdfsdk/src/formfiller/FFL_CBA_Fontmap.cpp b/fpdfsdk/src/formfiller/FFL_CBA_Fontmap.cpp
index 3a8853c..147a058 100644
--- a/fpdfsdk/src/formfiller/FFL_CBA_Fontmap.cpp
+++ b/fpdfsdk/src/formfiller/FFL_CBA_Fontmap.cpp
@@ -137,11 +137,9 @@
if (pObj == NULL)
continue;
- CPDF_Object* pDirect = pObj->GetDirect();
- if (pDirect == NULL || pDirect->GetType() != PDFOBJ_DICTIONARY)
+ CPDF_Dictionary* pElement = ToDictionary(pObj->GetDirect());
+ if (!pElement)
continue;
-
- CPDF_Dictionary* pElement = (CPDF_Dictionary*)pDirect;
if (pElement->GetString("Type") != "Font")
continue;
@@ -181,7 +179,7 @@
// to avoid checkbox and radiobutton
CPDF_Object* pObject = pAPDict->GetElement(m_sAPType);
- if (pObject && pObject->GetType() == PDFOBJ_DICTIONARY)
+ if (ToDictionary(pObject))
return;
CPDF_Stream* pStream = pAPDict->GetStream(m_sAPType);
diff --git a/fpdfsdk/src/formfiller/FFL_Utils.cpp b/fpdfsdk/src/formfiller/FFL_Utils.cpp
index d2ce56a..a4463b7 100644
--- a/fpdfsdk/src/formfiller/FFL_Utils.cpp
+++ b/fpdfsdk/src/formfiller/FFL_Utils.cpp
@@ -51,7 +51,7 @@
} break;
case PDFOBJ_DICTIONARY: {
- CPDF_Dictionary* pDict = (CPDF_Dictionary*)pObj;
+ CPDF_Dictionary* pDict = pObj->AsDictionary();
FX_POSITION fPos = pDict->GetStartPos();
CFX_ByteString csKey;
diff --git a/fpdfsdk/src/fpdf_flatten.cpp b/fpdfsdk/src/fpdf_flatten.cpp
index b2303f3..fee93f2 100644
--- a/fpdfsdk/src/fpdf_flatten.cpp
+++ b/fpdfsdk/src/fpdf_flatten.cpp
@@ -94,11 +94,10 @@
FX_DWORD dwSize = pAnnots->GetCount();
for (int i = 0; i < (int)dwSize; i++) {
- CPDF_Object* pObj = pAnnots->GetElementValue(i);
- if (!pObj || pObj->GetType() != PDFOBJ_DICTIONARY)
+ CPDF_Dictionary* pAnnotDic = ToDictionary(pAnnots->GetElementValue(i));
+ if (!pAnnotDic)
continue;
- CPDF_Dictionary* pAnnotDic = (CPDF_Dictionary*)pObj;
CFX_ByteString sSubtype = pAnnotDic->GetString("Subtype");
if (sSubtype == "Popup")
continue;
diff --git a/fpdfsdk/src/fpdf_transformpage.cpp b/fpdfsdk/src/fpdf_transformpage.cpp
index cdc646a..1e24b68 100644
--- a/fpdfsdk/src/fpdf_transformpage.cpp
+++ b/fpdfsdk/src/fpdf_transformpage.cpp
@@ -166,8 +166,8 @@
CPDF_Object* pObj = pPattenDict->GetNextElement(pos, key);
if (pObj->GetType() == PDFOBJ_REFERENCE)
pObj = pObj->GetDirect();
- if (pObj->GetType() == PDFOBJ_DICTIONARY) {
- pDict = (CPDF_Dictionary*)pObj;
+ if (pObj->IsDictionary()) {
+ pDict = pObj->AsDictionary();
} else if (pObj->GetType() == PDFOBJ_STREAM) {
pDict = ((CPDF_Stream*)pObj)->GetDict();
} else
diff --git a/fpdfsdk/src/fpdfdoc.cpp b/fpdfsdk/src/fpdfdoc.cpp
index b770295..ad8ef8b 100644
--- a/fpdfsdk/src/fpdfdoc.cpp
+++ b/fpdfsdk/src/fpdfdoc.cpp
@@ -56,7 +56,8 @@
if (!pDoc)
return nullptr;
CPDF_BookmarkTree tree(pDoc);
- CPDF_Bookmark bookmark = CPDF_Bookmark((CPDF_Dictionary*)pDict);
+ CPDF_Bookmark bookmark =
+ CPDF_Bookmark(ToDictionary(static_cast<CPDF_Object*>(pDict)));
return tree.GetFirstChild(bookmark).GetDict();
}
@@ -68,7 +69,8 @@
if (!pDoc)
return nullptr;
CPDF_BookmarkTree tree(pDoc);
- CPDF_Bookmark bookmark = CPDF_Bookmark((CPDF_Dictionary*)pDict);
+ CPDF_Bookmark bookmark =
+ CPDF_Bookmark(ToDictionary(static_cast<CPDF_Object*>(pDict)));
return tree.GetNextSibling(bookmark).GetDict();
}
@@ -77,7 +79,7 @@
unsigned long buflen) {
if (!pDict)
return 0;
- CPDF_Bookmark bookmark((CPDF_Dictionary*)pDict);
+ CPDF_Bookmark bookmark(ToDictionary(static_cast<CPDF_Object*>(pDict)));
CFX_WideString title = bookmark.GetTitle();
CFX_ByteString encodedTitle = title.UTF16LE_Encode();
unsigned long len = encodedTitle.GetLength();
@@ -107,7 +109,7 @@
CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document);
if (!pDoc)
return nullptr;
- CPDF_Bookmark bookmark((CPDF_Dictionary*)pDict);
+ CPDF_Bookmark bookmark(ToDictionary(static_cast<CPDF_Object*>(pDict)));
CPDF_Dest dest = bookmark.GetDest(pDoc);
if (dest)
return dest.GetObject();
@@ -122,7 +124,7 @@
DLLEXPORT FPDF_ACTION STDCALL FPDFBookmark_GetAction(FPDF_BOOKMARK pDict) {
if (!pDict)
return NULL;
- CPDF_Bookmark bookmark((CPDF_Dictionary*)pDict);
+ CPDF_Bookmark bookmark(ToDictionary(static_cast<CPDF_Object*>(pDict)));
return bookmark.GetAction().GetDict();
}
@@ -130,7 +132,7 @@
if (!pDict)
return PDFACTION_UNSUPPORTED;
- CPDF_Action action((CPDF_Dictionary*)pDict);
+ CPDF_Action action(ToDictionary(static_cast<CPDF_Object*>(pDict)));
CPDF_Action::ActionType type = action.GetType();
switch (type) {
case CPDF_Action::GoTo:
@@ -153,7 +155,7 @@
CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document);
if (!pDoc)
return nullptr;
- CPDF_Action action((CPDF_Dictionary*)pDict);
+ CPDF_Action action(ToDictionary(static_cast<CPDF_Object*>(pDict)));
return action.GetDest(pDoc).GetObject();
}
@@ -163,7 +165,7 @@
if (type != PDFACTION_REMOTEGOTO && type != PDFACTION_LAUNCH)
return 0;
- CPDF_Action action((CPDF_Dictionary*)pDict);
+ CPDF_Action action(ToDictionary(static_cast<CPDF_Object*>(pDict)));
CFX_ByteString path = action.GetFilePath().UTF8Encode();
unsigned long len = path.GetLength() + 1;
if (buffer && buflen >= len)
@@ -180,7 +182,7 @@
CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document);
if (!pDoc)
return 0;
- CPDF_Action action((CPDF_Dictionary*)pDict);
+ CPDF_Action action(ToDictionary(static_cast<CPDF_Object*>(pDict)));
CFX_ByteString path = action.GetURI(pDoc);
unsigned long len = path.GetLength() + 1;
if (buffer && buflen >= len)
@@ -235,7 +237,7 @@
CPDF_Document* pDoc = CPDFDocumentFromFPDFDocument(document);
if (!pDoc)
return nullptr;
- CPDF_Link link((CPDF_Dictionary*)pDict);
+ CPDF_Link link(ToDictionary(static_cast<CPDF_Object*>(pDict)));
FPDF_DEST dest = link.GetDest(pDoc).GetObject();
if (dest)
return dest;
@@ -250,7 +252,7 @@
if (!pDict)
return nullptr;
- CPDF_Link link((CPDF_Dictionary*)pDict);
+ CPDF_Link link(ToDictionary(static_cast<CPDF_Object*>(pDict)));
return link.GetAction().GetDict();
}
@@ -266,8 +268,9 @@
if (!pAnnots)
return FALSE;
for (int i = *startPos; i < (int)pAnnots->GetCount(); i++) {
- CPDF_Dictionary* pDict = (CPDF_Dictionary*)pAnnots->GetElementValue(i);
- if (!pDict || pDict->GetType() != PDFOBJ_DICTIONARY)
+ CPDF_Dictionary* pDict =
+ ToDictionary(static_cast<CPDF_Object*>(pAnnots->GetElementValue(i)));
+ if (!pDict)
continue;
if (pDict->GetString(FX_BSTRC("Subtype")).Equal(FX_BSTRC("Link"))) {
*startPos = i + 1;
@@ -282,7 +285,8 @@
FS_RECTF* rect) {
if (!linkAnnot || !rect)
return FALSE;
- CPDF_Dictionary* pAnnotDict = (CPDF_Dictionary*)linkAnnot;
+ CPDF_Dictionary* pAnnotDict =
+ ToDictionary(static_cast<CPDF_Object*>(linkAnnot));
CPDF_Rect rt = pAnnotDict->GetRect(FX_BSTRC("Rect"));
rect->left = rt.left;
rect->bottom = rt.bottom;
@@ -294,7 +298,8 @@
DLLEXPORT int STDCALL FPDFLink_CountQuadPoints(FPDF_LINK linkAnnot) {
if (!linkAnnot)
return 0;
- CPDF_Dictionary* pAnnotDict = (CPDF_Dictionary*)linkAnnot;
+ CPDF_Dictionary* pAnnotDict =
+ ToDictionary(static_cast<CPDF_Object*>(linkAnnot));
CPDF_Array* pArray = pAnnotDict->GetArray(FX_BSTRC("QuadPoints"));
if (!pArray)
return 0;
@@ -306,7 +311,8 @@
FS_QUADPOINTSF* quadPoints) {
if (!linkAnnot || !quadPoints)
return FALSE;
- CPDF_Dictionary* pAnnotDict = (CPDF_Dictionary*)linkAnnot;
+ CPDF_Dictionary* pAnnotDict =
+ ToDictionary(static_cast<CPDF_Object*>(linkAnnot));
CPDF_Array* pArray = pAnnotDict->GetArray(FX_BSTRC("QuadPoints"));
if (pArray) {
if (quadIndex < 0 || quadIndex >= (int)pArray->GetCount() / 8 ||
diff --git a/fpdfsdk/src/fpdfeditpage.cpp b/fpdfsdk/src/fpdfeditpage.cpp
index 0cf7c88..42ab3eb 100644
--- a/fpdfsdk/src/fpdfeditpage.cpp
+++ b/fpdfsdk/src/fpdfeditpage.cpp
@@ -107,7 +107,7 @@
else {
if (pDict->KeyExist("Parent")) {
CPDF_Dictionary* pPages =
- (CPDF_Dictionary*)pDict->GetElement("Parent")->GetDirect();
+ ToDictionary(pDict->GetElement("Parent")->GetDirect());
while (pPages) {
if (pPages->KeyExist("Rotate")) {
rotate =
@@ -117,8 +117,7 @@
: 0;
break;
} else if (pPages->KeyExist("Parent"))
- pPages =
- (CPDF_Dictionary*)pPages->GetElement("Parent")->GetDirect();
+ pPages = ToDictionary(pPages->GetElement("Parent")->GetDirect());
else
break;
}
@@ -217,7 +216,7 @@
return TRUE;
CPDF_Dictionary* pSMaskDict =
- pGeneralState ? (CPDF_Dictionary*)pGeneralState->m_pSoftMask : NULL;
+ pGeneralState ? ToDictionary(pGeneralState->m_pSoftMask) : NULL;
if (pSMaskDict)
return TRUE;
diff --git a/fpdfsdk/src/fpdfppo.cpp b/fpdfsdk/src/fpdfppo.cpp
index ed24464..6521258 100644
--- a/fpdfsdk/src/fpdfppo.cpp
+++ b/fpdfsdk/src/fpdfppo.cpp
@@ -59,10 +59,10 @@
pNewRoot->SetAt("Type", new CPDF_Name("Catalog"));
}
- CPDF_Dictionary* pNewPages =
- (CPDF_Dictionary*)(pNewRoot->GetElement("Pages")
- ? pNewRoot->GetElement("Pages")->GetDirect()
- : NULL);
+ CPDF_Dictionary* pNewPages = ToDictionary(
+ pNewRoot->GetElement("Pages") ? pNewRoot->GetElement("Pages")->GetDirect()
+ : nullptr);
+
if (!pNewPages) {
pNewPages = new CPDF_Dictionary;
FX_DWORD NewPagesON = pDestPDFDoc->AddIndirectObject(pNewPages);
@@ -191,29 +191,25 @@
if (pType->GetString().Compare("Page"))
return NULL;
-
if (!pDict->KeyExist("Parent"))
return NULL;
- CPDF_Object* pParent = pDict->GetElement("Parent")->GetDirect();
- if (!pParent || pParent->GetType() != PDFOBJ_DICTIONARY)
- return NULL;
- CPDF_Dictionary* pp = (CPDF_Dictionary*)pParent;
+ CPDF_Dictionary* pp = ToDictionary(pDict->GetElement("Parent")->GetDirect());
+ if (!pp)
+ return nullptr;
if (pDict->KeyExist((const char*)nSrctag))
return pDict->GetElement((const char*)nSrctag);
+
while (pp) {
if (pp->KeyExist((const char*)nSrctag))
return pp->GetElement((const char*)nSrctag);
- if (pp->KeyExist("Parent")) {
- pp = (CPDF_Dictionary*)pp->GetElement("Parent")->GetDirect();
- if (pp->GetType() == PDFOBJ_NULL)
- break;
- } else
+ if (!pp->KeyExist("Parent")) {
break;
+ }
+ pp = ToDictionary(pp->GetElement("Parent")->GetDirect());
}
-
- return NULL;
+ return nullptr;
}
FX_BOOL CPDF_PageOrganizer::UpdateReference(CPDF_Object* pObj,
@@ -229,7 +225,7 @@
break;
}
case PDFOBJ_DICTIONARY: {
- CPDF_Dictionary* pDict = (CPDF_Dictionary*)pObj;
+ CPDF_Dictionary* pDict = pObj->AsDictionary();
FX_POSITION pos = pDict->GetStartPos();
while (pos) {
@@ -300,8 +296,7 @@
return 0;
}
- if (pClone->GetType() == PDFOBJ_DICTIONARY) {
- CPDF_Dictionary* pDictClone = (CPDF_Dictionary*)pClone;
+ if (CPDF_Dictionary* pDictClone = pClone->AsDictionary()) {
if (pDictClone->KeyExist("Type")) {
CFX_ByteString strType = pDictClone->GetString("Type");
if (!FXSYS_stricmp(strType, "Pages")) {
diff --git a/fpdfsdk/src/fpdfview.cpp b/fpdfsdk/src/fpdfview.cpp
index cfc2f0d..c2157e9 100644
--- a/fpdfsdk/src/fpdfview.cpp
+++ b/fpdfsdk/src/fpdfview.cpp
@@ -1051,8 +1051,8 @@
}
if (!pDestObj)
return NULL;
- if (pDestObj->GetType() == PDFOBJ_DICTIONARY) {
- pDestObj = ((CPDF_Dictionary*)pDestObj)->GetArray(FX_BSTRC("D"));
+ if (CPDF_Dictionary* pDict = pDestObj->AsDictionary()) {
+ pDestObj = pDict->GetArray(FX_BSTRC("D"));
if (!pDestObj)
return NULL;
}
diff --git a/fpdfsdk/src/fsdk_baseform.cpp b/fpdfsdk/src/fsdk_baseform.cpp
index 3dc48da..d7374a6 100644
--- a/fpdfsdk/src/fsdk_baseform.cpp
+++ b/fpdfsdk/src/fsdk_baseform.cpp
@@ -538,8 +538,7 @@
return psub->GetType() == PDFOBJ_STREAM;
case FIELDTYPE_CHECKBOX:
case FIELDTYPE_RADIOBUTTON:
- if (psub->GetType() == PDFOBJ_DICTIONARY) {
- CPDF_Dictionary* pSubDict = (CPDF_Dictionary*)psub;
+ if (CPDF_Dictionary* pSubDict = psub->AsDictionary()) {
return pSubDict->GetStream(GetAppState()) != NULL;
}
return FALSE;
diff --git a/fpdfsdk/src/fsdk_mgr.cpp b/fpdfsdk/src/fsdk_mgr.cpp
index fb5df1e..63ed642 100644
--- a/fpdfsdk/src/fsdk_mgr.cpp
+++ b/fpdfsdk/src/fsdk_mgr.cpp
@@ -485,8 +485,7 @@
if (pOpenAction->GetType() == PDFOBJ_ARRAY)
return TRUE;
- if (pOpenAction->GetType() == PDFOBJ_DICTIONARY) {
- CPDF_Dictionary* pDict = (CPDF_Dictionary*)pOpenAction;
+ if (CPDF_Dictionary* pDict = pOpenAction->AsDictionary()) {
CPDF_Action action(pDict);
if (m_pEnv->GetActionHander())
m_pEnv->GetActionHander()->DoAction_DocOpen(action, this);