1 // Copyright 2016 The PDFium Authors 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 6 7 #include "core/fpdfapi/parser/cpdf_object.h" 8 9 #include <algorithm> 10 11 #include "core/fpdfapi/parser/cpdf_array.h" 12 #include "core/fpdfapi/parser/cpdf_dictionary.h" 13 #include "core/fpdfapi/parser/cpdf_indirect_object_holder.h" 14 #include "core/fpdfapi/parser/cpdf_parser.h" 15 #include "core/fpdfapi/parser/cpdf_reference.h" 16 #include "core/fxcrt/check.h" 17 #include "core/fxcrt/fx_string.h" 18 #include "core/fxcrt/notreached.h" 19 20 CPDF_Object::~CPDF_Object() = default; 21 22 static_assert(sizeof(uint64_t) >= sizeof(CPDF_Object*), 23 "Need a bigger type for cache keys"); 24 25 static_assert(CPDF_Parser::kMaxObjectNumber < static_cast<uint32_t>(1) << 31, 26 "Need a smaller kMaxObjNumber for cache keys"); 27 KeyForCache() const28uint64_t CPDF_Object::KeyForCache() const { 29 if (IsInline()) 30 return (static_cast<uint64_t>(1) << 63) | reinterpret_cast<uint64_t>(this); 31 32 return (static_cast<uint64_t>(m_ObjNum) << 32) | 33 static_cast<uint64_t>(m_GenNum); 34 } 35 GetMutableDirect()36RetainPtr<CPDF_Object> CPDF_Object::GetMutableDirect() { 37 return pdfium::WrapRetain(const_cast<CPDF_Object*>(GetDirectInternal())); 38 } 39 GetDirect() const40RetainPtr<const CPDF_Object> CPDF_Object::GetDirect() const { 41 return pdfium::WrapRetain(GetDirectInternal()); 42 } 43 GetDirectInternal() const44const CPDF_Object* CPDF_Object::GetDirectInternal() const { 45 return this; 46 } 47 CloneObjectNonCyclic(bool bDirect) const48RetainPtr<CPDF_Object> CPDF_Object::CloneObjectNonCyclic(bool bDirect) const { 49 std::set<const CPDF_Object*> visited_objs; 50 return CloneNonCyclic(bDirect, &visited_objs); 51 } 52 CloneDirectObject() const53RetainPtr<CPDF_Object> CPDF_Object::CloneDirectObject() const { 54 return CloneObjectNonCyclic(true); 55 } 56 CloneNonCyclic(bool bDirect,std::set<const CPDF_Object * > * pVisited) const57RetainPtr<CPDF_Object> CPDF_Object::CloneNonCyclic( 58 bool bDirect, 59 std::set<const CPDF_Object*>* pVisited) const { 60 return Clone(); 61 } 62 GetString() const63ByteString CPDF_Object::GetString() const { 64 return ByteString(); 65 } 66 GetUnicodeText() const67WideString CPDF_Object::GetUnicodeText() const { 68 return WideString(); 69 } 70 GetNumber() const71float CPDF_Object::GetNumber() const { 72 return 0; 73 } 74 GetInteger() const75int CPDF_Object::GetInteger() const { 76 return 0; 77 } 78 GetDict() const79RetainPtr<const CPDF_Dictionary> CPDF_Object::GetDict() const { 80 return pdfium::WrapRetain(GetDictInternal()); 81 } 82 GetMutableDict()83RetainPtr<CPDF_Dictionary> CPDF_Object::GetMutableDict() { 84 return pdfium::WrapRetain(const_cast<CPDF_Dictionary*>(GetDictInternal())); 85 } 86 GetDictInternal() const87const CPDF_Dictionary* CPDF_Object::GetDictInternal() const { 88 return nullptr; 89 } 90 SetString(const ByteString & str)91void CPDF_Object::SetString(const ByteString& str) { 92 NOTREACHED_NORETURN(); 93 } 94 AsMutableArray()95CPDF_Array* CPDF_Object::AsMutableArray() { 96 return nullptr; 97 } 98 AsArray() const99const CPDF_Array* CPDF_Object::AsArray() const { 100 return const_cast<CPDF_Object*>(this)->AsMutableArray(); 101 } 102 AsMutableBoolean()103CPDF_Boolean* CPDF_Object::AsMutableBoolean() { 104 return nullptr; 105 } 106 AsBoolean() const107const CPDF_Boolean* CPDF_Object::AsBoolean() const { 108 return const_cast<CPDF_Object*>(this)->AsMutableBoolean(); 109 } 110 AsMutableDictionary()111CPDF_Dictionary* CPDF_Object::AsMutableDictionary() { 112 return nullptr; 113 } 114 AsDictionary() const115const CPDF_Dictionary* CPDF_Object::AsDictionary() const { 116 return const_cast<CPDF_Object*>(this)->AsMutableDictionary(); 117 } 118 AsMutableName()119CPDF_Name* CPDF_Object::AsMutableName() { 120 return nullptr; 121 } 122 AsName() const123const CPDF_Name* CPDF_Object::AsName() const { 124 return const_cast<CPDF_Object*>(this)->AsMutableName(); 125 } 126 AsMutableNull()127CPDF_Null* CPDF_Object::AsMutableNull() { 128 return nullptr; 129 } 130 AsNull() const131const CPDF_Null* CPDF_Object::AsNull() const { 132 return const_cast<CPDF_Object*>(this)->AsMutableNull(); 133 } 134 AsMutableNumber()135CPDF_Number* CPDF_Object::AsMutableNumber() { 136 return nullptr; 137 } 138 AsNumber() const139const CPDF_Number* CPDF_Object::AsNumber() const { 140 return const_cast<CPDF_Object*>(this)->AsMutableNumber(); 141 } 142 AsMutableReference()143CPDF_Reference* CPDF_Object::AsMutableReference() { 144 return nullptr; 145 } 146 AsReference() const147const CPDF_Reference* CPDF_Object::AsReference() const { 148 return const_cast<CPDF_Object*>(this)->AsMutableReference(); 149 } 150 AsMutableStream()151CPDF_Stream* CPDF_Object::AsMutableStream() { 152 return nullptr; 153 } 154 AsStream() const155const CPDF_Stream* CPDF_Object::AsStream() const { 156 return const_cast<CPDF_Object*>(this)->AsMutableStream(); 157 } 158 AsMutableString()159CPDF_String* CPDF_Object::AsMutableString() { 160 return nullptr; 161 } 162 AsString() const163const CPDF_String* CPDF_Object::AsString() const { 164 return const_cast<CPDF_Object*>(this)->AsMutableString(); 165 } 166 MakeReference(CPDF_IndirectObjectHolder * holder) const167RetainPtr<CPDF_Reference> CPDF_Object::MakeReference( 168 CPDF_IndirectObjectHolder* holder) const { 169 CHECK(!IsInline()); 170 return pdfium::MakeRetain<CPDF_Reference>(holder, GetObjNum()); 171 } 172