• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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() const28 uint64_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()36 RetainPtr<CPDF_Object> CPDF_Object::GetMutableDirect() {
37   return pdfium::WrapRetain(const_cast<CPDF_Object*>(GetDirectInternal()));
38 }
39 
GetDirect() const40 RetainPtr<const CPDF_Object> CPDF_Object::GetDirect() const {
41   return pdfium::WrapRetain(GetDirectInternal());
42 }
43 
GetDirectInternal() const44 const CPDF_Object* CPDF_Object::GetDirectInternal() const {
45   return this;
46 }
47 
CloneObjectNonCyclic(bool bDirect) const48 RetainPtr<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() const53 RetainPtr<CPDF_Object> CPDF_Object::CloneDirectObject() const {
54   return CloneObjectNonCyclic(true);
55 }
56 
CloneNonCyclic(bool bDirect,std::set<const CPDF_Object * > * pVisited) const57 RetainPtr<CPDF_Object> CPDF_Object::CloneNonCyclic(
58     bool bDirect,
59     std::set<const CPDF_Object*>* pVisited) const {
60   return Clone();
61 }
62 
GetString() const63 ByteString CPDF_Object::GetString() const {
64   return ByteString();
65 }
66 
GetUnicodeText() const67 WideString CPDF_Object::GetUnicodeText() const {
68   return WideString();
69 }
70 
GetNumber() const71 float CPDF_Object::GetNumber() const {
72   return 0;
73 }
74 
GetInteger() const75 int CPDF_Object::GetInteger() const {
76   return 0;
77 }
78 
GetDict() const79 RetainPtr<const CPDF_Dictionary> CPDF_Object::GetDict() const {
80   return pdfium::WrapRetain(GetDictInternal());
81 }
82 
GetMutableDict()83 RetainPtr<CPDF_Dictionary> CPDF_Object::GetMutableDict() {
84   return pdfium::WrapRetain(const_cast<CPDF_Dictionary*>(GetDictInternal()));
85 }
86 
GetDictInternal() const87 const CPDF_Dictionary* CPDF_Object::GetDictInternal() const {
88   return nullptr;
89 }
90 
SetString(const ByteString & str)91 void CPDF_Object::SetString(const ByteString& str) {
92   NOTREACHED_NORETURN();
93 }
94 
AsMutableArray()95 CPDF_Array* CPDF_Object::AsMutableArray() {
96   return nullptr;
97 }
98 
AsArray() const99 const CPDF_Array* CPDF_Object::AsArray() const {
100   return const_cast<CPDF_Object*>(this)->AsMutableArray();
101 }
102 
AsMutableBoolean()103 CPDF_Boolean* CPDF_Object::AsMutableBoolean() {
104   return nullptr;
105 }
106 
AsBoolean() const107 const CPDF_Boolean* CPDF_Object::AsBoolean() const {
108   return const_cast<CPDF_Object*>(this)->AsMutableBoolean();
109 }
110 
AsMutableDictionary()111 CPDF_Dictionary* CPDF_Object::AsMutableDictionary() {
112   return nullptr;
113 }
114 
AsDictionary() const115 const CPDF_Dictionary* CPDF_Object::AsDictionary() const {
116   return const_cast<CPDF_Object*>(this)->AsMutableDictionary();
117 }
118 
AsMutableName()119 CPDF_Name* CPDF_Object::AsMutableName() {
120   return nullptr;
121 }
122 
AsName() const123 const CPDF_Name* CPDF_Object::AsName() const {
124   return const_cast<CPDF_Object*>(this)->AsMutableName();
125 }
126 
AsMutableNull()127 CPDF_Null* CPDF_Object::AsMutableNull() {
128   return nullptr;
129 }
130 
AsNull() const131 const CPDF_Null* CPDF_Object::AsNull() const {
132   return const_cast<CPDF_Object*>(this)->AsMutableNull();
133 }
134 
AsMutableNumber()135 CPDF_Number* CPDF_Object::AsMutableNumber() {
136   return nullptr;
137 }
138 
AsNumber() const139 const CPDF_Number* CPDF_Object::AsNumber() const {
140   return const_cast<CPDF_Object*>(this)->AsMutableNumber();
141 }
142 
AsMutableReference()143 CPDF_Reference* CPDF_Object::AsMutableReference() {
144   return nullptr;
145 }
146 
AsReference() const147 const CPDF_Reference* CPDF_Object::AsReference() const {
148   return const_cast<CPDF_Object*>(this)->AsMutableReference();
149 }
150 
AsMutableStream()151 CPDF_Stream* CPDF_Object::AsMutableStream() {
152   return nullptr;
153 }
154 
AsStream() const155 const CPDF_Stream* CPDF_Object::AsStream() const {
156   return const_cast<CPDF_Object*>(this)->AsMutableStream();
157 }
158 
AsMutableString()159 CPDF_String* CPDF_Object::AsMutableString() {
160   return nullptr;
161 }
162 
AsString() const163 const CPDF_String* CPDF_Object::AsString() const {
164   return const_cast<CPDF_Object*>(this)->AsMutableString();
165 }
166 
MakeReference(CPDF_IndirectObjectHolder * holder) const167 RetainPtr<CPDF_Reference> CPDF_Object::MakeReference(
168     CPDF_IndirectObjectHolder* holder) const {
169   CHECK(!IsInline());
170   return pdfium::MakeRetain<CPDF_Reference>(holder, GetObjNum());
171 }
172