Add proper const/non-const versions of CPDF_Object methods. Instead of having const methods that return non-const pointers. BUG=pdfium:234 Change-Id: I598e9b4f267f702e2e71001cfe3aa3c9e9d8c12f Reviewed-on: https://pdfium-review.googlesource.com/32182 Commit-Queue: Lei Zhang <thestig@chromium.org> Reviewed-by: Henrique Nakashima <hnakashima@chromium.org>
diff --git a/core/fpdfapi/page/cpdf_colorspace.cpp b/core/fpdfapi/page/cpdf_colorspace.cpp index aa664d4..4f68329 100644 --- a/core/fpdfapi/page/cpdf_colorspace.cpp +++ b/core/fpdfapi/page/cpdf_colorspace.cpp
@@ -458,7 +458,7 @@ return pdfium::WrapUnique(ColorspaceFromName(pObj->GetString())); if (const CPDF_Stream* pStream = pObj->AsStream()) { - CPDF_Dictionary* pDict = pStream->GetDict(); + const CPDF_Dictionary* pDict = pStream->GetDict(); if (!pDict) return nullptr;
diff --git a/core/fpdfapi/page/cpdf_stitchfunc.cpp b/core/fpdfapi/page/cpdf_stitchfunc.cpp index 2083a91..042e090 100644 --- a/core/fpdfapi/page/cpdf_stitchfunc.cpp +++ b/core/fpdfapi/page/cpdf_stitchfunc.cpp
@@ -27,7 +27,7 @@ if (m_nInputs != kRequiredNumInputs) return false; - CPDF_Dictionary* pDict = pObj->GetDict(); + const CPDF_Dictionary* pDict = pObj->GetDict(); if (!pDict) return false;
diff --git a/core/fpdfapi/parser/cpdf_array.cpp b/core/fpdfapi/parser/cpdf_array.cpp index 5a5cdc9..9293101 100644 --- a/core/fpdfapi/parser/cpdf_array.cpp +++ b/core/fpdfapi/parser/cpdf_array.cpp
@@ -66,7 +66,7 @@ return std::move(pCopy); } -CFX_FloatRect CPDF_Array::GetRect() { +CFX_FloatRect CPDF_Array::GetRect() const { CFX_FloatRect rect; if (!IsArray() || m_Objects.size() != 4) return rect; @@ -78,7 +78,7 @@ return rect; } -CFX_Matrix CPDF_Array::GetMatrix() { +CFX_Matrix CPDF_Array::GetMatrix() const { CFX_Matrix matrix; if (!IsArray() || m_Objects.size() != 6) return CFX_Matrix();
diff --git a/core/fpdfapi/parser/cpdf_array.h b/core/fpdfapi/parser/cpdf_array.h index bf8cb42..442b85c 100644 --- a/core/fpdfapi/parser/cpdf_array.h +++ b/core/fpdfapi/parser/cpdf_array.h
@@ -47,8 +47,8 @@ CPDF_Stream* GetStreamAt(size_t index) const; CPDF_Array* GetArrayAt(size_t index) const; float GetFloatAt(size_t index) const { return GetNumberAt(index); } - CFX_Matrix GetMatrix(); - CFX_FloatRect GetRect(); + CFX_Matrix GetMatrix() const; + CFX_FloatRect GetRect() const; // Takes ownership of |pObj|, returns unowned pointer to it. CPDF_Object* Add(std::unique_ptr<CPDF_Object> pObj);
diff --git a/core/fpdfapi/parser/cpdf_dictionary.cpp b/core/fpdfapi/parser/cpdf_dictionary.cpp index b3195b5..29571d6c 100644 --- a/core/fpdfapi/parser/cpdf_dictionary.cpp +++ b/core/fpdfapi/parser/cpdf_dictionary.cpp
@@ -42,10 +42,12 @@ return DICTIONARY; } -CPDF_Dictionary* CPDF_Dictionary::GetDict() const { - // The method should be made non-const if we want to not be const. - // See bug #234. - return const_cast<CPDF_Dictionary*>(this); +CPDF_Dictionary* CPDF_Dictionary::GetDict() { + return this; +} + +const CPDF_Dictionary* CPDF_Dictionary::GetDict() const { + return this; } bool CPDF_Dictionary::IsDictionary() const {
diff --git a/core/fpdfapi/parser/cpdf_dictionary.h b/core/fpdfapi/parser/cpdf_dictionary.h index 688e88e..8ecbe2d 100644 --- a/core/fpdfapi/parser/cpdf_dictionary.h +++ b/core/fpdfapi/parser/cpdf_dictionary.h
@@ -33,7 +33,8 @@ // CPDF_Object: Type GetType() const override; std::unique_ptr<CPDF_Object> Clone() const override; - CPDF_Dictionary* GetDict() const override; + CPDF_Dictionary* GetDict() override; + const CPDF_Dictionary* GetDict() const override; bool IsDictionary() const override; CPDF_Dictionary* AsDictionary() override; const CPDF_Dictionary* AsDictionary() const override;
diff --git a/core/fpdfapi/parser/cpdf_object.cpp b/core/fpdfapi/parser/cpdf_object.cpp index 67632a0..8190d34 100644 --- a/core/fpdfapi/parser/cpdf_object.cpp +++ b/core/fpdfapi/parser/cpdf_object.cpp
@@ -19,8 +19,12 @@ CPDF_Object::~CPDF_Object() {} -CPDF_Object* CPDF_Object::GetDirect() const { - return const_cast<CPDF_Object*>(this); +CPDF_Object* CPDF_Object::GetDirect() { + return this; +} + +const CPDF_Object* CPDF_Object::GetDirect() const { + return this; } std::unique_ptr<CPDF_Object> CPDF_Object::CloneObjectNonCyclic( @@ -55,7 +59,11 @@ return 0; } -CPDF_Dictionary* CPDF_Object::GetDict() const { +CPDF_Dictionary* CPDF_Object::GetDict() { + return nullptr; +} + +const CPDF_Dictionary* CPDF_Object::GetDict() const { return nullptr; }
diff --git a/core/fpdfapi/parser/cpdf_object.h b/core/fpdfapi/parser/cpdf_object.h index 7a14492..21eec62 100644 --- a/core/fpdfapi/parser/cpdf_object.h +++ b/core/fpdfapi/parser/cpdf_object.h
@@ -56,12 +56,14 @@ // copied to the object it points to directly. virtual std::unique_ptr<CPDF_Object> CloneDirectObject() const; - virtual CPDF_Object* GetDirect() const; + virtual CPDF_Object* GetDirect(); + virtual const CPDF_Object* GetDirect() const; virtual ByteString GetString() const; virtual WideString GetUnicodeText() const; virtual float GetNumber() const; virtual int GetInteger() const; - virtual CPDF_Dictionary* GetDict() const; + virtual CPDF_Dictionary* GetDict(); + virtual const CPDF_Dictionary* GetDict() const; virtual void SetString(const ByteString& str);
diff --git a/core/fpdfapi/parser/cpdf_reference.cpp b/core/fpdfapi/parser/cpdf_reference.cpp index 2ca0bdd..3f45a96 100644 --- a/core/fpdfapi/parser/cpdf_reference.cpp +++ b/core/fpdfapi/parser/cpdf_reference.cpp
@@ -21,25 +21,30 @@ } ByteString CPDF_Reference::GetString() const { - CPDF_Object* obj = SafeGetDirect(); + const CPDF_Object* obj = SafeGetDirect(); return obj ? obj->GetString() : ByteString(); } float CPDF_Reference::GetNumber() const { - CPDF_Object* obj = SafeGetDirect(); + const CPDF_Object* obj = SafeGetDirect(); return obj ? obj->GetNumber() : 0; } int CPDF_Reference::GetInteger() const { - CPDF_Object* obj = SafeGetDirect(); + const CPDF_Object* obj = SafeGetDirect(); return obj ? obj->GetInteger() : 0; } -CPDF_Dictionary* CPDF_Reference::GetDict() const { +CPDF_Dictionary* CPDF_Reference::GetDict() { CPDF_Object* obj = SafeGetDirect(); return obj ? obj->GetDict() : nullptr; } +const CPDF_Dictionary* CPDF_Reference::GetDict() const { + const CPDF_Object* obj = SafeGetDirect(); + return obj ? obj->GetDict() : nullptr; +} + bool CPDF_Reference::IsReference() const { return true; } @@ -69,17 +74,27 @@ return pdfium::MakeUnique<CPDF_Reference>(m_pObjList.Get(), m_RefObjNum); } -CPDF_Object* CPDF_Reference::SafeGetDirect() const { +CPDF_Object* CPDF_Reference::SafeGetDirect() { CPDF_Object* obj = GetDirect(); return (obj && !obj->IsReference()) ? obj : nullptr; } +const CPDF_Object* CPDF_Reference::SafeGetDirect() const { + const CPDF_Object* obj = GetDirect(); + return (obj && !obj->IsReference()) ? obj : nullptr; +} + void CPDF_Reference::SetRef(CPDF_IndirectObjectHolder* pDoc, uint32_t objnum) { m_pObjList = pDoc; m_RefObjNum = objnum; } -CPDF_Object* CPDF_Reference::GetDirect() const { +CPDF_Object* CPDF_Reference::GetDirect() { + return m_pObjList ? m_pObjList->GetOrParseIndirectObject(m_RefObjNum) + : nullptr; +} + +const CPDF_Object* CPDF_Reference::GetDirect() const { return m_pObjList ? m_pObjList->GetOrParseIndirectObject(m_RefObjNum) : nullptr; }
diff --git a/core/fpdfapi/parser/cpdf_reference.h b/core/fpdfapi/parser/cpdf_reference.h index b472b4a..4cfb5c2 100644 --- a/core/fpdfapi/parser/cpdf_reference.h +++ b/core/fpdfapi/parser/cpdf_reference.h
@@ -23,11 +23,13 @@ // CPDF_Object: Type GetType() const override; std::unique_ptr<CPDF_Object> Clone() const override; - CPDF_Object* GetDirect() const override; + CPDF_Object* GetDirect() override; + const CPDF_Object* GetDirect() const override; ByteString GetString() const override; float GetNumber() const override; int GetInteger() const override; - CPDF_Dictionary* GetDict() const override; + CPDF_Dictionary* GetDict() override; + const CPDF_Dictionary* GetDict() const override; bool IsReference() const override; CPDF_Reference* AsReference() override; const CPDF_Reference* AsReference() const override; @@ -41,7 +43,8 @@ std::unique_ptr<CPDF_Object> CloneNonCyclic( bool bDirect, std::set<const CPDF_Object*>* pVisited) const override; - CPDF_Object* SafeGetDirect() const; + CPDF_Object* SafeGetDirect(); + const CPDF_Object* SafeGetDirect() const; UnownedPtr<CPDF_IndirectObjectHolder> m_pObjList; uint32_t m_RefObjNum;
diff --git a/core/fpdfapi/parser/cpdf_stream.cpp b/core/fpdfapi/parser/cpdf_stream.cpp index 45d2ebb..fdbe308 100644 --- a/core/fpdfapi/parser/cpdf_stream.cpp +++ b/core/fpdfapi/parser/cpdf_stream.cpp
@@ -37,7 +37,11 @@ return STREAM; } -CPDF_Dictionary* CPDF_Stream::GetDict() const { +CPDF_Dictionary* CPDF_Stream::GetDict() { + return m_pDict.get(); +} + +const CPDF_Dictionary* CPDF_Stream::GetDict() const { return m_pDict.get(); } @@ -84,11 +88,12 @@ pAcc->LoadAllDataRaw(); uint32_t streamSize = pAcc->GetSize(); - CPDF_Dictionary* pDict = GetDict(); + const CPDF_Dictionary* pDict = GetDict(); std::unique_ptr<CPDF_Dictionary> pNewDict; if (pDict && !pdfium::ContainsKey(*pVisited, pDict)) { - pNewDict = ToDictionary( - static_cast<CPDF_Object*>(pDict)->CloneNonCyclic(bDirect, pVisited)); + pNewDict = + ToDictionary(static_cast<const CPDF_Object*>(pDict)->CloneNonCyclic( + bDirect, pVisited)); } return pdfium::MakeUnique<CPDF_Stream>(pAcc->DetachData(), streamSize, std::move(pNewDict));
diff --git a/core/fpdfapi/parser/cpdf_stream.h b/core/fpdfapi/parser/cpdf_stream.h index f8b09af..cc3dcac 100644 --- a/core/fpdfapi/parser/cpdf_stream.h +++ b/core/fpdfapi/parser/cpdf_stream.h
@@ -19,7 +19,6 @@ public: CPDF_Stream(); - // Takes ownership of |pData|. CPDF_Stream(std::unique_ptr<uint8_t, FxFreeDeleter> pData, uint32_t size, std::unique_ptr<CPDF_Dictionary> pDict); @@ -29,7 +28,8 @@ // CPDF_Object: Type GetType() const override; std::unique_ptr<CPDF_Object> Clone() const override; - CPDF_Dictionary* GetDict() const override; + CPDF_Dictionary* GetDict() override; + const CPDF_Dictionary* GetDict() const override; WideString GetUnicodeText() const override; bool IsStream() const override; CPDF_Stream* AsStream() override;
diff --git a/core/fpdfapi/parser/cpdf_stream_acc.cpp b/core/fpdfapi/parser/cpdf_stream_acc.cpp index 9cce894..9cf9a1f 100644 --- a/core/fpdfapi/parser/cpdf_stream_acc.cpp +++ b/core/fpdfapi/parser/cpdf_stream_acc.cpp
@@ -64,7 +64,7 @@ LoadAllData(true, 0, false); } -CPDF_Dictionary* CPDF_StreamAcc::GetDict() const { +const CPDF_Dictionary* CPDF_StreamAcc::GetDict() const { return m_pStream ? m_pStream->GetDict() : nullptr; }
diff --git a/core/fpdfapi/parser/cpdf_stream_acc.h b/core/fpdfapi/parser/cpdf_stream_acc.h index 89a454a..1c9d5ef 100644 --- a/core/fpdfapi/parser/cpdf_stream_acc.h +++ b/core/fpdfapi/parser/cpdf_stream_acc.h
@@ -29,7 +29,7 @@ void LoadAllDataRaw(); const CPDF_Stream* GetStream() const { return m_pStream.Get(); } - CPDF_Dictionary* GetDict() const; + const CPDF_Dictionary* GetDict() const; uint8_t* GetData() const; uint32_t GetSize() const;
diff --git a/fpdfsdk/cpdfsdk_helpers.cpp b/fpdfsdk/cpdfsdk_helpers.cpp index 1b90497..5498909 100644 --- a/fpdfsdk/cpdfsdk_helpers.cpp +++ b/fpdfsdk/cpdfsdk_helpers.cpp
@@ -330,8 +330,9 @@ ASSERT(stream); uint8_t* data = stream->GetRawData(); uint32_t len = stream->GetRawSize(); - CPDF_Dictionary* dict = stream->GetDict(); - CPDF_Object* decoder = dict ? dict->GetDirectObjectFor("Filter") : nullptr; + const CPDF_Dictionary* dict = stream->GetDict(); + const CPDF_Object* decoder = + dict ? dict->GetDirectObjectFor("Filter") : nullptr; if (decoder && (decoder->IsArray() || decoder->IsName())) { // Decode the stream if one or more stream filters are specified. uint8_t* decoded_data = nullptr;
diff --git a/fpdfsdk/fpdf_ppo.cpp b/fpdfsdk/fpdf_ppo.cpp index c3b6402..bf8ed25 100644 --- a/fpdfsdk/fpdf_ppo.cpp +++ b/fpdfsdk/fpdf_ppo.cpp
@@ -168,7 +168,7 @@ CFX_FloatRect GetMediaBox(const CPDF_Dictionary* pPageDict) { const CPDF_Object* pMediaBox = PageDictGetInheritableTag(pPageDict, "MediaBox"); - CPDF_Array* pArray = ToArray(pMediaBox->GetDirect()); + const CPDF_Array* pArray = ToArray(pMediaBox->GetDirect()); if (!pArray) return CFX_FloatRect(); return pArray->GetRect();