Add type cast definitions for CPDF_Number.
authorDan Sinclair <dsinclair@chromium.org>
Wed, 21 Oct 2015 15:01:01 +0000 (11:01 -0400)
committerDan Sinclair <dsinclair@chromium.org>
Wed, 21 Oct 2015 15:01:01 +0000 (11:01 -0400)
This Cl adds ToNumber, CPDF_Object::AsNumber and CPDF_Object::IsNumber and
updates the src to use them as needed.

BUG=pdfium:201
R=thestig@chromium.org

Review URL: https://codereview.chromium.org/1410673005 .

core/include/fpdfapi/fpdf_objects.h
core/src/fpdfapi/fpdf_edit/fpdf_edit_create.cpp
core/src/fpdfapi/fpdf_parser/fpdf_parser_document.cpp
core/src/fpdfapi/fpdf_parser/fpdf_parser_objects.cpp
core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp
core/src/fpdfdoc/doc_basic.cpp
core/src/fpdfdoc/doc_formfield.cpp
core/src/fpdfdoc/doc_tagged.cpp
fpdfsdk/src/javascript/Document.cpp

index 0df8be7..438c89c 100644 (file)
@@ -80,6 +80,7 @@ class CPDF_Object {
 
   bool IsBoolean() const { return m_Type == PDFOBJ_BOOLEAN; }
   bool IsDictionary() const { return m_Type == PDFOBJ_DICTIONARY; }
+  bool IsNumber() const { return m_Type == PDFOBJ_NUMBER; }
 
   CPDF_Boolean* AsBoolean();
   const CPDF_Boolean* AsBoolean() const;
@@ -87,6 +88,9 @@ class CPDF_Object {
   CPDF_Dictionary* AsDictionary();
   const CPDF_Dictionary* AsDictionary() const;
 
+  CPDF_Number* AsNumber();
+  const CPDF_Number* AsNumber() const;
+
  protected:
   CPDF_Object(FX_DWORD type) : m_Type(type), m_ObjNum(0), m_GenNum(0) {}
   ~CPDF_Object() {}
@@ -178,6 +182,13 @@ class CPDF_Number : public CPDF_Object {
   };
   friend class CPDF_Object;
 };
+inline CPDF_Number* ToNumber(CPDF_Object* obj) {
+  return obj ? obj->AsNumber() : nullptr;
+}
+inline const CPDF_Number* ToNumber(const CPDF_Object* obj) {
+  return obj ? obj->AsNumber() : nullptr;
+}
+
 class CPDF_String : public CPDF_Object {
  public:
   static CPDF_String* Create(const CFX_ByteString& str, FX_BOOL bHex = FALSE) {
index 054cf10..3d669a0 100644 (file)
@@ -937,9 +937,10 @@ int32_t CPDF_Creator::WriteIndirectObjectToStream(const CPDF_Object* pObj) {
       m_pParser->m_ObjVersion[objnum] > 0) {
     return 1;
   }
-  if (pObj->GetType() == PDFOBJ_NUMBER) {
+
+  if (pObj->IsNumber())
     return 1;
-  }
+
   CPDF_Dictionary* pDict = pObj->GetDict();
   if (pObj->GetType() == PDFOBJ_STREAM) {
     if (pDict && pDict->GetString(FX_BSTRC("Type")) == FX_BSTRC("XRef")) {
index 29c1a00..3d9900d 100644 (file)
@@ -71,18 +71,17 @@ void CPDF_Document::LoadAsynDoc(CPDF_Dictionary* pLinearized) {
   }
   FX_DWORD dwPageCount = 0;
   CPDF_Object* pCount = pLinearized->GetElement(FX_BSTRC("N"));
-  if (pCount && pCount->GetType() == PDFOBJ_NUMBER) {
+  if (ToNumber(pCount))
     dwPageCount = pCount->GetInteger();
-  }
+
   m_PageList.SetSize(dwPageCount);
   CPDF_Object* pNo = pLinearized->GetElement(FX_BSTRC("P"));
-  if (pNo && pNo->GetType() == PDFOBJ_NUMBER) {
+  if (ToNumber(pNo))
     m_dwFirstPageNo = pNo->GetInteger();
-  }
+
   CPDF_Object* pObjNum = pLinearized->GetElement(FX_BSTRC("O"));
-  if (pObjNum && pObjNum->GetType() == PDFOBJ_NUMBER) {
+  if (ToNumber(pObjNum))
     m_dwFirstPageObjNum = pObjNum->GetInteger();
-  }
 }
 void CPDF_Document::LoadPages() {
   m_PageList.SetSize(_GetPageCount());
index e824791..59800dc 100644 (file)
@@ -28,7 +28,7 @@ void CPDF_Object::Destroy() {
       delete (CPDF_Array*)this;
       break;
     case PDFOBJ_DICTIONARY:
-      delete this->AsDictionary();
+      delete AsDictionary();
       break;
     case PDFOBJ_STREAM:
       delete (CPDF_Stream*)this;
@@ -42,7 +42,7 @@ CFX_ByteString CPDF_Object::GetString() const {
     case PDFOBJ_BOOLEAN:
       return AsBoolean()->m_bValue ? "true" : "false";
     case PDFOBJ_NUMBER:
-      return ((CPDF_Number*)this)->GetString();
+      return AsNumber()->GetString();
     case PDFOBJ_STRING:
       return ((CPDF_String*)this)->m_String;
     case PDFOBJ_NAME:
@@ -88,7 +88,7 @@ CFX_ByteStringC CPDF_Object::GetConstString() const {
 FX_FLOAT CPDF_Object::GetNumber() const {
   switch (m_Type) {
     case PDFOBJ_NUMBER:
-      return ((CPDF_Number*)this)->GetNumber();
+      return AsNumber()->GetNumber();
     case PDFOBJ_REFERENCE: {
       CPDF_Reference* pRef = (CPDF_Reference*)(void*)this;
       if (pRef->m_pObjList == NULL) {
@@ -114,9 +114,9 @@ int CPDF_Object::GetInteger() const {
   }
   switch (m_Type) {
     case PDFOBJ_BOOLEAN:
-      return this->AsBoolean()->m_bValue;
+      return AsBoolean()->m_bValue;
     case PDFOBJ_NUMBER:
-      return ((CPDF_Number*)this)->GetInteger();
+      return AsNumber()->GetInteger();
     case PDFOBJ_REFERENCE: {
       CPDF_Reference* pRef = (CPDF_Reference*)(void*)this;
       PARSE_CONTEXT context;
@@ -140,7 +140,7 @@ CPDF_Dictionary* CPDF_Object::GetDict() const {
     case PDFOBJ_DICTIONARY:
       // The method should be made non-const if we want to not be const.
       // See bug #234.
-      return const_cast<CPDF_Dictionary*>(this->AsDictionary());
+      return const_cast<CPDF_Dictionary*>(AsDictionary());
     case PDFOBJ_STREAM:
       return ((CPDF_Stream*)this)->GetDict();
     case PDFOBJ_REFERENCE: {
@@ -171,7 +171,7 @@ void CPDF_Object::SetString(const CFX_ByteString& str) {
       AsBoolean()->m_bValue = (str == FX_BSTRC("true"));
       return;
     case PDFOBJ_NUMBER:
-      ((CPDF_Number*)this)->SetString(str);
+      AsNumber()->SetString(str);
       return;
     case PDFOBJ_STRING:
       ((CPDF_String*)this)->m_String = str;
@@ -207,9 +207,9 @@ FX_BOOL CPDF_Object::IsIdentical(CPDF_Object* pOther) const {
   }
   switch (m_Type) {
     case PDFOBJ_BOOLEAN:
-      return this->AsBoolean()->Identical(pOther->AsBoolean());
+      return AsBoolean()->Identical(pOther->AsBoolean());
     case PDFOBJ_NUMBER:
-      return (((CPDF_Number*)this)->Identical((CPDF_Number*)pOther));
+      return AsNumber()->Identical(pOther->AsNumber());
     case PDFOBJ_STRING:
       return (((CPDF_String*)this)->Identical((CPDF_String*)pOther));
     case PDFOBJ_NAME:
@@ -217,7 +217,7 @@ FX_BOOL CPDF_Object::IsIdentical(CPDF_Object* pOther) const {
     case PDFOBJ_ARRAY:
       return (((CPDF_Array*)this)->Identical((CPDF_Array*)pOther));
     case PDFOBJ_DICTIONARY:
-      return this->AsDictionary()->Identical(pOther->AsDictionary());
+      return AsDictionary()->Identical(pOther->AsDictionary());
     case PDFOBJ_NULL:
       return TRUE;
     case PDFOBJ_STREAM:
@@ -245,11 +245,12 @@ CPDF_Object* CPDF_Object::CloneInternal(FX_BOOL bDirect,
                                         CFX_MapPtrToPtr* visited) const {
   switch (m_Type) {
     case PDFOBJ_BOOLEAN:
-      return new CPDF_Boolean(this->AsBoolean()->m_bValue);
-    case PDFOBJ_NUMBER:
-      if (((CPDF_Number*)this)->m_bInteger)
-        return new CPDF_Number(((CPDF_Number*)this)->m_Integer);
-      return new CPDF_Number(((CPDF_Number*)this)->m_Float);
+      return new CPDF_Boolean(AsBoolean()->m_bValue);
+    case PDFOBJ_NUMBER: {
+      const CPDF_Number* pThis = AsNumber();
+      return new CPDF_Number(pThis->m_bInteger ? pThis->m_Integer
+                                               : pThis->m_Float);
+    }
     case PDFOBJ_STRING:
       return new CPDF_String(((CPDF_String*)this)->m_String,
                              ((CPDF_String*)this)->IsHex());
@@ -267,7 +268,7 @@ CPDF_Object* CPDF_Object::CloneInternal(FX_BOOL bDirect,
     }
     case PDFOBJ_DICTIONARY: {
       CPDF_Dictionary* pCopy = new CPDF_Dictionary();
-      const CPDF_Dictionary* pThis = this->AsDictionary();
+      const CPDF_Dictionary* pThis = AsDictionary();
       FX_POSITION pos = pThis->m_Map.GetStartPosition();
       while (pos) {
         CFX_ByteString key;
@@ -354,6 +355,14 @@ const CPDF_Dictionary* CPDF_Object::AsDictionary() const {
   return IsDictionary() ? static_cast<const CPDF_Dictionary*>(this) : nullptr;
 }
 
+CPDF_Number* CPDF_Object::AsNumber() {
+  return IsNumber() ? static_cast<CPDF_Number*>(this) : nullptr;
+}
+
+const CPDF_Number* CPDF_Object::AsNumber() const {
+  return IsNumber() ? static_cast<const CPDF_Number*>(this) : nullptr;
+}
+
 CPDF_Number::CPDF_Number(int value)
     : CPDF_Object(PDFOBJ_NUMBER), m_bInteger(TRUE), m_Integer(value) {}
 
index b436ba1..d9a7453 100644 (file)
@@ -45,10 +45,8 @@ int32_t GetHeaderOffset(IFX_FileRead* pFile) {
 }
 
 int32_t GetDirectInteger(CPDF_Dictionary* pDict, const CFX_ByteStringC& key) {
-  CPDF_Object* pObj = pDict->GetElement(key);
-  if (pObj && (pObj->GetType() == PDFOBJ_NUMBER))
-    return ((CPDF_Number*)pObj)->GetInteger();
-  return 0;
+  CPDF_Number* pObj = ToNumber(pDict->GetElement(key));
+  return pObj ? pObj->GetInteger() : 0;
 }
 
 bool CheckDirectType(CPDF_Dictionary* pDict,
@@ -1048,8 +1046,7 @@ FX_BOOL CPDF_Parser::LoadCrossRefV5(FX_FILESIZE pos,
     for (FX_DWORD i = 0; i < nPairSize; i++) {
       CPDF_Object* pStartNumObj = pArray->GetElement(i * 2);
       CPDF_Object* pCountObj = pArray->GetElement(i * 2 + 1);
-      if (pStartNumObj && pStartNumObj->GetType() == PDFOBJ_NUMBER &&
-          pCountObj && pCountObj->GetType() == PDFOBJ_NUMBER) {
+      if (ToNumber(pStartNumObj) && ToNumber(pCountObj)) {
         int nStartNum = pStartNumObj->GetInteger();
         int nCount = pCountObj->GetInteger();
         if (nStartNum >= 0 && nCount > 0) {
@@ -1551,10 +1548,12 @@ FX_BOOL CPDF_Parser::IsLinearizedFile(IFX_FileRead* pFileAccess,
   if (!m_pLinearized) {
     return FALSE;
   }
-  if (m_pLinearized->GetDict() &&
-      m_pLinearized->GetDict()->GetElement(FX_BSTRC("Linearized"))) {
+
+  CPDF_Dictionary* pDict = m_pLinearized->GetDict();
+  if (pDict && pDict->GetElement(FX_BSTRC("Linearized"))) {
     m_Syntax.GetNextWord(bIsNumber);
-    CPDF_Object* pLen = m_pLinearized->GetDict()->GetElement(FX_BSTRC("L"));
+
+    CPDF_Object* pLen = pDict->GetElement(FX_BSTRC("L"));
     if (!pLen) {
       m_pLinearized->Release();
       m_pLinearized = NULL;
@@ -1563,14 +1562,13 @@ FX_BOOL CPDF_Parser::IsLinearizedFile(IFX_FileRead* pFileAccess,
     if (pLen->GetInteger() != (int)pFileAccess->GetSize()) {
       return FALSE;
     }
-    CPDF_Object* pNo = m_pLinearized->GetDict()->GetElement(FX_BSTRC("P"));
-    if (pNo && pNo->GetType() == PDFOBJ_NUMBER) {
+
+    if (CPDF_Number* pNo = ToNumber(pDict->GetElement(FX_BSTRC("P"))))
       m_dwFirstPageNo = pNo->GetInteger();
-    }
-    CPDF_Object* pTable = m_pLinearized->GetDict()->GetElement(FX_BSTRC("T"));
-    if (pTable && pTable->GetType() == PDFOBJ_NUMBER) {
+
+    if (CPDF_Number* pTable = ToNumber(pDict->GetElement(FX_BSTRC("T"))))
       m_LastXRefOffset = pTable->GetInteger();
-    }
+
     return TRUE;
   }
   m_pLinearized->Release();
@@ -3621,7 +3619,7 @@ FX_BOOL CPDF_DataAvail::CheckFirstPage(IFX_DownloadHints* pHints) {
     return FALSE;
   }
   FX_BOOL bNeedDownLoad = FALSE;
-  if (pEndOffSet->GetType() == PDFOBJ_NUMBER) {
+  if (pEndOffSet->IsNumber()) {
     FX_DWORD dwEnd = pEndOffSet->GetInteger();
     dwEnd += 512;
     if ((FX_FILESIZE)dwEnd > m_dwFileLen) {
@@ -3636,12 +3634,12 @@ FX_BOOL CPDF_DataAvail::CheckFirstPage(IFX_DownloadHints* pHints) {
   }
   m_dwLastXRefOffset = 0;
   FX_FILESIZE dwFileLen = 0;
-  if (pXRefOffset->GetType() == PDFOBJ_NUMBER) {
+  if (pXRefOffset->IsNumber())
     m_dwLastXRefOffset = pXRefOffset->GetInteger();
-  }
-  if (pFileLen->GetType() == PDFOBJ_NUMBER) {
+
+  if (pFileLen->IsNumber())
     dwFileLen = pFileLen->GetInteger();
-  }
+
   if (!m_pFileAvail->IsDataAvail(m_dwLastXRefOffset,
                                  (FX_DWORD)(dwFileLen - m_dwLastXRefOffset))) {
     if (m_docStatus == PDF_DATAAVAIL_FIRSTPAGE) {
@@ -3733,9 +3731,10 @@ FX_BOOL CPDF_DataAvail::IsLinearizedFile(uint8_t* pData, FX_DWORD dwLen) {
   if (!m_pLinearized) {
     return FALSE;
   }
-  if (m_pLinearized->GetDict() &&
-      m_pLinearized->GetDict()->GetElement(FX_BSTRC("Linearized"))) {
-    CPDF_Object* pLen = m_pLinearized->GetDict()->GetElement(FX_BSTRC("L"));
+
+  CPDF_Dictionary* pDict = m_pLinearized->GetDict();
+  if (pDict && pDict->GetElement(FX_BSTRC("Linearized"))) {
+    CPDF_Object* pLen = pDict->GetElement(FX_BSTRC("L"));
     if (!pLen) {
       return FALSE;
     }
@@ -3743,10 +3742,10 @@ FX_BOOL CPDF_DataAvail::IsLinearizedFile(uint8_t* pData, FX_DWORD dwLen) {
       return FALSE;
     }
     m_bLinearized = TRUE;
-    CPDF_Object* pNo = m_pLinearized->GetDict()->GetElement(FX_BSTRC("P"));
-    if (pNo && pNo->GetType() == PDFOBJ_NUMBER) {
+
+    if (CPDF_Number* pNo = ToNumber(pDict->GetElement(FX_BSTRC("P"))))
       m_dwFirstPageNo = pNo->GetInteger();
-    }
+
     return TRUE;
   }
   return FALSE;
index e3b6308..bbf5113 100644 (file)
@@ -11,15 +11,12 @@ int CPDF_Dest::GetPageIndex(CPDF_Document* pDoc) {
     return 0;
   }
   CPDF_Object* pPage = ((CPDF_Array*)m_pObj)->GetElementValue(0);
-  if (pPage == NULL) {
+  if (!pPage)
     return 0;
-  }
-  if (pPage->GetType() == PDFOBJ_NUMBER) {
+  if (pPage->IsNumber())
     return pPage->GetInteger();
-  }
-  if (!pPage->IsDictionary()) {
+  if (!pPage->IsDictionary())
     return 0;
-  }
   return pDoc->GetPageIndex(pPage->GetObjNum());
 }
 FX_DWORD CPDF_Dest::GetPageObjNum() {
@@ -27,15 +24,12 @@ FX_DWORD CPDF_Dest::GetPageObjNum() {
     return 0;
   }
   CPDF_Object* pPage = ((CPDF_Array*)m_pObj)->GetElementValue(0);
-  if (pPage == NULL) {
+  if (!pPage)
     return 0;
-  }
-  if (pPage->GetType() == PDFOBJ_NUMBER) {
+  if (pPage->IsNumber())
     return pPage->GetInteger();
-  }
-  if (pPage->IsDictionary()) {
+  if (pPage->IsDictionary())
     return pPage->GetObjNum();
-  }
   return 0;
 }
 const FX_CHAR* g_sZoomModes[] = {"XYZ",  "Fit",   "FitH",  "FitV", "FitR",
index 8541d9c..9ef2883 100644 (file)
@@ -431,7 +431,7 @@ int CPDF_FormField::CountSelectedItems() {
     }
     return 1;
   }
-  if (pValue->GetType() == PDFOBJ_NUMBER) {
+  if (pValue->IsNumber()) {
     if (pValue->GetString().IsEmpty()) {
       return 0;
     }
@@ -450,9 +450,9 @@ int CPDF_FormField::GetSelectedIndex(int index) {
       return -1;
     }
   }
-  if (pValue->GetType() == PDFOBJ_NUMBER) {
+  if (pValue->IsNumber())
     return pValue->GetInteger();
-  }
+
   CFX_WideString sel_value;
   if (pValue->GetType() == PDFOBJ_STRING) {
     if (index != 0) {
@@ -541,7 +541,7 @@ FX_BOOL CPDF_FormField::IsItemSelected(int index) {
     }
     return FALSE;
   }
-  if (pValue->GetType() == PDFOBJ_NUMBER) {
+  if (pValue->IsNumber()) {
     if (pValue->GetString().IsEmpty()) {
       return FALSE;
     }
index fb3a05d..d9d439f 100644 (file)
@@ -254,10 +254,10 @@ void CPDF_StructElementImpl::LoadKid(FX_DWORD PageObjNum,
                                      CPDF_Object* pKidObj,
                                      CPDF_StructKid* pKid) {
   pKid->m_Type = CPDF_StructKid::Invalid;
-  if (pKidObj == NULL) {
+  if (!pKidObj)
     return;
-  }
-  if (pKidObj->GetType() == PDFOBJ_NUMBER) {
+
+  if (pKidObj->IsNumber()) {
     if (m_pTree->m_pPage && m_pTree->m_pPage->GetObjNum() != PageObjNum) {
       return;
     }
@@ -266,6 +266,7 @@ void CPDF_StructElementImpl::LoadKid(FX_DWORD PageObjNum,
     pKid->m_PageContent.m_PageObjNum = PageObjNum;
     return;
   }
+
   CPDF_Dictionary* pKidDict = pKidObj->AsDictionary();
   if (!pKidDict)
     return;
@@ -441,10 +442,7 @@ FX_FLOAT CPDF_StructElementImpl::GetNumber(const CFX_ByteStringC& owner,
                                            FX_BOOL bInheritable,
                                            int subindex) {
   CPDF_Object* pAttr = GetAttr(owner, name, bInheritable, subindex);
-  if (pAttr == NULL || pAttr->GetType() != PDFOBJ_NUMBER) {
-    return default_value;
-  }
-  return pAttr->GetNumber();
+  return ToNumber(pAttr) ? pAttr->GetNumber() : default_value;
 }
 int CPDF_StructElementImpl::GetInteger(const CFX_ByteStringC& owner,
                                        const CFX_ByteStringC& name,
@@ -452,8 +450,5 @@ int CPDF_StructElementImpl::GetInteger(const CFX_ByteStringC& owner,
                                        FX_BOOL bInheritable,
                                        int subindex) {
   CPDF_Object* pAttr = GetAttr(owner, name, bInheritable, subindex);
-  if (pAttr == NULL || pAttr->GetType() != PDFOBJ_NUMBER) {
-    return default_value;
-  }
-  return pAttr->GetInteger();
+  return ToNumber(pAttr) ? pAttr->GetInteger() : default_value;
 }
index 81667cf..163323a 100644 (file)
@@ -852,9 +852,10 @@ FX_BOOL Document::info(IJS_Context* cc,
           (pValueObj->GetType() == PDFOBJ_NAME))
         FXJS_PutObjectString(isolate, pObj, wsKey.c_str(),
                              pValueObj->GetUnicodeText().c_str());
-      if (pValueObj->GetType() == PDFOBJ_NUMBER)
+      if (pValueObj->IsNumber()) {
         FXJS_PutObjectNumber(isolate, pObj, wsKey.c_str(),
                              (float)pValueObj->GetNumber());
+      }
       if (pValueObj->IsBoolean()) {
         FXJS_PutObjectBoolean(isolate, pObj, wsKey.c_str(),
                               (bool)pValueObj->GetInteger());