From ce4f95d61f5aa5fb9a5fc6cb8487999a9cf46458 Mon Sep 17 00:00:00 2001 From: Dan Sinclair Date: Tue, 20 Oct 2015 16:38:12 -0400 Subject: Add type cast definitions for CPDF_Boolean. This CL adds ToBoolean, CPDF_Object::AsBoolean and CPDF_Object::IsBoolean and updates the src to use them as needed. BUG=pdfium:201 R=thestig@chromium.org, tsepez@chromium.org Review URL: https://codereview.chromium.org/1417623005 . --- core/include/fpdfapi/fpdf_objects.h | 11 +++++++++++ .../src/fpdfapi/fpdf_parser/fpdf_parser_objects.cpp | 21 ++++++++++++++------- fpdfsdk/src/javascript/Document.cpp | 3 ++- 3 files changed, 27 insertions(+), 8 deletions(-) diff --git a/core/include/fpdfapi/fpdf_objects.h b/core/include/fpdfapi/fpdf_objects.h index 4141ec854a..a52132f6b9 100644 --- a/core/include/fpdfapi/fpdf_objects.h +++ b/core/include/fpdfapi/fpdf_objects.h @@ -78,8 +78,12 @@ class CPDF_Object { FX_BOOL IsModified() const { return FALSE; } + bool IsBoolean() const { return m_Type == PDFOBJ_BOOLEAN; } bool IsDictionary() const { return m_Type == PDFOBJ_DICTIONARY; } + CPDF_Boolean* AsBoolean(); + const CPDF_Boolean* AsBoolean() const; + CPDF_Dictionary* AsDictionary(); const CPDF_Dictionary* AsDictionary() const; @@ -117,6 +121,13 @@ class CPDF_Boolean : public CPDF_Object { FX_BOOL m_bValue; friend class CPDF_Object; }; +inline CPDF_Boolean* ToBoolean(CPDF_Object* obj) { + return obj ? obj->AsBoolean() : nullptr; +} +inline const CPDF_Boolean* ToBoolean(const CPDF_Object* obj) { + return obj ? obj->AsBoolean() : nullptr; +} + class CPDF_Number : public CPDF_Object { public: static CPDF_Number* Create(int value) { return new CPDF_Number(value); } diff --git a/core/src/fpdfapi/fpdf_parser/fpdf_parser_objects.cpp b/core/src/fpdfapi/fpdf_parser/fpdf_parser_objects.cpp index 1e6695ce2a..2755493136 100644 --- a/core/src/fpdfapi/fpdf_parser/fpdf_parser_objects.cpp +++ b/core/src/fpdfapi/fpdf_parser/fpdf_parser_objects.cpp @@ -40,7 +40,7 @@ void CPDF_Object::Destroy() { CFX_ByteString CPDF_Object::GetString() const { switch (m_Type) { case PDFOBJ_BOOLEAN: - return ((CPDF_Boolean*)this)->m_bValue ? "true" : "false"; + return AsBoolean()->m_bValue ? "true" : "false"; case PDFOBJ_NUMBER: return ((CPDF_Number*)this)->GetString(); case PDFOBJ_STRING: @@ -114,7 +114,7 @@ int CPDF_Object::GetInteger() const { } switch (m_Type) { case PDFOBJ_BOOLEAN: - return ((CPDF_Boolean*)this)->m_bValue; + return this->AsBoolean()->m_bValue; case PDFOBJ_NUMBER: return ((CPDF_Number*)this)->GetInteger(); case PDFOBJ_REFERENCE: { @@ -168,7 +168,7 @@ void CPDF_Object::SetString(const CFX_ByteString& str) { ASSERT(this != NULL); switch (m_Type) { case PDFOBJ_BOOLEAN: - ((CPDF_Boolean*)this)->m_bValue = str == FX_BSTRC("true") ? 1 : 0; + AsBoolean()->m_bValue = (str == FX_BSTRC("true")); return; case PDFOBJ_NUMBER: ((CPDF_Number*)this)->SetString(str); @@ -207,7 +207,7 @@ FX_BOOL CPDF_Object::IsIdentical(CPDF_Object* pOther) const { } switch (m_Type) { case PDFOBJ_BOOLEAN: - return (((CPDF_Boolean*)this)->Identical((CPDF_Boolean*)pOther)); + return this->AsBoolean()->Identical(pOther->AsBoolean()); case PDFOBJ_NUMBER: return (((CPDF_Number*)this)->Identical((CPDF_Number*)pOther)); case PDFOBJ_STRING: @@ -245,7 +245,7 @@ CPDF_Object* CPDF_Object::CloneInternal(FX_BOOL bDirect, CFX_MapPtrToPtr* visited) const { switch (m_Type) { case PDFOBJ_BOOLEAN: - return new CPDF_Boolean(((CPDF_Boolean*)this)->m_bValue); + return new CPDF_Boolean(this->AsBoolean()->m_bValue); case PDFOBJ_NUMBER: return new CPDF_Number(((CPDF_Number*)this)->m_bInteger, &((CPDF_Number*)this)->m_Integer); @@ -337,6 +337,14 @@ void CPDF_Object::SetUnicodeText(const FX_WCHAR* pUnicodes, int len) { } } +CPDF_Boolean* CPDF_Object::AsBoolean() { + return IsBoolean() ? static_cast(this) : nullptr; +} + +const CPDF_Boolean* CPDF_Object::AsBoolean() const { + return IsBoolean() ? static_cast(this) : nullptr; +} + CPDF_Dictionary* CPDF_Object::AsDictionary() { return IsDictionary() ? static_cast(this) : nullptr; } @@ -663,9 +671,8 @@ FX_BOOL CPDF_Dictionary::GetBoolean(const CFX_ByteStringC& key, FX_BOOL bDefault) const { CPDF_Object* p = NULL; m_Map.Lookup(key, (void*&)p); - if (p && p->GetType() == PDFOBJ_BOOLEAN) { + if (ToBoolean(p)) return p->GetInteger(); - } return bDefault; } CPDF_Dictionary* CPDF_Dictionary::GetDict(const CFX_ByteStringC& key) const { diff --git a/fpdfsdk/src/javascript/Document.cpp b/fpdfsdk/src/javascript/Document.cpp index 24f55b03f9..81667cfa04 100644 --- a/fpdfsdk/src/javascript/Document.cpp +++ b/fpdfsdk/src/javascript/Document.cpp @@ -855,9 +855,10 @@ FX_BOOL Document::info(IJS_Context* cc, if (pValueObj->GetType() == PDFOBJ_NUMBER) FXJS_PutObjectNumber(isolate, pObj, wsKey.c_str(), (float)pValueObj->GetNumber()); - if (pValueObj->GetType() == PDFOBJ_BOOLEAN) + if (pValueObj->IsBoolean()) { FXJS_PutObjectBoolean(isolate, pObj, wsKey.c_str(), (bool)pValueObj->GetInteger()); + } } vp << pObj; } -- cgit v1.2.3