OLD | NEW |
1 // Copyright 2014 PDFium Authors. All rights reserved. | 1 // Copyright 2014 PDFium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
6 | 6 |
7 #ifndef CORE_INCLUDE_FPDFAPI_FPDF_OBJECTS_H_ | 7 #ifndef CORE_INCLUDE_FPDFAPI_FPDF_OBJECTS_H_ |
8 #define CORE_INCLUDE_FPDFAPI_FPDF_OBJECTS_H_ | 8 #define CORE_INCLUDE_FPDFAPI_FPDF_OBJECTS_H_ |
9 | 9 |
10 #include <map> | 10 #include <map> |
(...skipping 26 matching lines...) Expand all Loading... |
37 NUMBER, | 37 NUMBER, |
38 STRING, | 38 STRING, |
39 NAME, | 39 NAME, |
40 ARRAY, | 40 ARRAY, |
41 DICTIONARY, | 41 DICTIONARY, |
42 STREAM, | 42 STREAM, |
43 NULLOBJ, | 43 NULLOBJ, |
44 REFERENCE | 44 REFERENCE |
45 }; | 45 }; |
46 | 46 |
47 Type GetType() const { return m_Type; } | 47 virtual Type GetType() const = 0; |
48 FX_DWORD GetObjNum() const { return m_ObjNum; } | 48 FX_DWORD GetObjNum() const { return m_ObjNum; } |
49 FX_DWORD GetGenNum() const { return m_GenNum; } | 49 FX_DWORD GetGenNum() const { return m_GenNum; } |
50 | 50 |
51 FX_BOOL IsIdentical(CPDF_Object* pObj) const; | 51 virtual CPDF_Object* Clone(FX_BOOL bDirect = FALSE) const = 0; |
52 CPDF_Object* Clone(FX_BOOL bDirect = FALSE) const; | 52 virtual CPDF_Object* GetDirect() const { |
53 CPDF_Object* CloneRef(CPDF_IndirectObjectHolder* pObjs) const; | 53 return const_cast<CPDF_Object*>(this); |
| 54 } |
54 | 55 |
55 CPDF_Object* GetDirect() const; | |
56 FX_BOOL IsModified() const { return FALSE; } | 56 FX_BOOL IsModified() const { return FALSE; } |
57 | |
58 void Release(); | 57 void Release(); |
59 | 58 |
60 CFX_ByteString GetString() const; | 59 virtual CFX_ByteString GetString() const { return CFX_ByteString(); } |
61 CFX_ByteStringC GetConstString() const; | 60 virtual CFX_ByteStringC GetConstString() const { return CFX_ByteStringC(); } |
62 CFX_WideString GetUnicodeText(CFX_CharMap* pCharMap = NULL) const; | 61 virtual CFX_WideString GetUnicodeText(CFX_CharMap* pCharMap = nullptr) const { |
63 FX_FLOAT GetNumber() const; | 62 return CFX_WideString(); |
64 FX_FLOAT GetNumber16() const; | 63 } |
65 int GetInteger() const; | 64 virtual FX_FLOAT GetNumber() const { return 0; } |
66 CPDF_Dictionary* GetDict() const; | 65 virtual int GetInteger() const { return 0; } |
67 CPDF_Array* GetArray() const; | 66 virtual CPDF_Dictionary* GetDict() const { return nullptr; } |
| 67 virtual CPDF_Array* GetArray() const { return nullptr; } |
68 | 68 |
69 void SetString(const CFX_ByteString& str); | 69 virtual void SetString(const CFX_ByteString& str) { ASSERT(FALSE); } |
70 void SetUnicodeText(const FX_WCHAR* pUnicodes, int len = -1); | |
71 | 70 |
72 bool IsArray() const { return m_Type == ARRAY; } | 71 virtual bool IsArray() const { return false; } |
73 bool IsBoolean() const { return m_Type == BOOLEAN; } | 72 virtual bool IsBoolean() const { return false; } |
74 bool IsDictionary() const { return m_Type == DICTIONARY; } | 73 virtual bool IsDictionary() const { return false; } |
75 bool IsName() const { return m_Type == NAME; } | 74 virtual bool IsName() const { return false; } |
76 bool IsNumber() const { return m_Type == NUMBER; } | 75 virtual bool IsNumber() const { return false; } |
77 bool IsReference() const { return m_Type == REFERENCE; } | 76 virtual bool IsReference() const { return false; } |
78 bool IsStream() const { return m_Type == STREAM; } | 77 virtual bool IsStream() const { return false; } |
79 bool IsString() const { return m_Type == STRING; } | 78 virtual bool IsString() const { return false; } |
80 | 79 |
81 CPDF_Array* AsArray(); | 80 virtual CPDF_Array* AsArray() { return nullptr; } |
82 const CPDF_Array* AsArray() const; | 81 virtual const CPDF_Array* AsArray() const { return nullptr; } |
83 CPDF_Boolean* AsBoolean(); | 82 virtual CPDF_Boolean* AsBoolean() { return nullptr; } |
84 const CPDF_Boolean* AsBoolean() const; | 83 virtual const CPDF_Boolean* AsBoolean() const { return nullptr; } |
85 CPDF_Dictionary* AsDictionary(); | 84 virtual CPDF_Dictionary* AsDictionary() { return nullptr; } |
86 const CPDF_Dictionary* AsDictionary() const; | 85 virtual const CPDF_Dictionary* AsDictionary() const { return nullptr; } |
87 CPDF_Name* AsName(); | 86 virtual CPDF_Name* AsName() { return nullptr; } |
88 const CPDF_Name* AsName() const; | 87 virtual const CPDF_Name* AsName() const { return nullptr; } |
89 CPDF_Number* AsNumber(); | 88 virtual CPDF_Number* AsNumber() { return nullptr; } |
90 const CPDF_Number* AsNumber() const; | 89 virtual const CPDF_Number* AsNumber() const { return nullptr; } |
91 CPDF_Reference* AsReference(); | 90 virtual CPDF_Reference* AsReference() { return nullptr; } |
92 const CPDF_Reference* AsReference() const; | 91 virtual const CPDF_Reference* AsReference() const { return nullptr; } |
93 CPDF_Stream* AsStream(); | 92 virtual CPDF_Stream* AsStream() { return nullptr; } |
94 const CPDF_Stream* AsStream() const; | 93 virtual const CPDF_Stream* AsStream() const { return nullptr; } |
95 CPDF_String* AsString(); | 94 virtual CPDF_String* AsString() { return nullptr; } |
96 const CPDF_String* AsString() const; | 95 virtual const CPDF_String* AsString() const { return nullptr; } |
97 | 96 |
98 protected: | 97 protected: |
99 explicit CPDF_Object(Type type) : m_Type(type), m_ObjNum(0), m_GenNum(0) {} | 98 CPDF_Object() : m_ObjNum(0), m_GenNum(0) {} |
100 ~CPDF_Object() {} | 99 virtual ~CPDF_Object() {} |
101 void Destroy(); | 100 void Destroy() { delete this; } |
102 | 101 |
103 const CPDF_Object* GetBasicObject() const; | |
104 | |
105 const Type m_Type; | |
106 FX_DWORD m_ObjNum; | 102 FX_DWORD m_ObjNum; |
107 FX_DWORD m_GenNum; | 103 FX_DWORD m_GenNum; |
108 | 104 |
109 friend class CPDF_IndirectObjectHolder; | 105 friend class CPDF_IndirectObjectHolder; |
110 friend class CPDF_Parser; | 106 friend class CPDF_Parser; |
111 friend class CPDF_SyntaxParser; | 107 friend class CPDF_SyntaxParser; |
112 | 108 |
113 private: | 109 private: |
114 CPDF_Object* CloneInternal(FX_BOOL bDirect, | 110 CPDF_Object(const CPDF_Object& src) {} |
115 std::set<FX_DWORD>* visited) const; | |
116 }; | 111 }; |
| 112 |
117 class CPDF_Boolean : public CPDF_Object { | 113 class CPDF_Boolean : public CPDF_Object { |
118 public: | 114 public: |
119 CPDF_Boolean() : CPDF_Object(BOOLEAN), m_bValue(false) {} | 115 CPDF_Boolean() : m_bValue(false) {} |
120 explicit CPDF_Boolean(FX_BOOL value) | 116 explicit CPDF_Boolean(FX_BOOL value) : m_bValue(value) {} |
121 : CPDF_Object(BOOLEAN), m_bValue(value) {} | |
122 | 117 |
123 FX_BOOL Identical(CPDF_Boolean* pOther) const { | 118 // CPDF_Object. |
124 return m_bValue == pOther->m_bValue; | 119 Type GetType() const override { return BOOLEAN; } |
| 120 CPDF_Object* Clone(FX_BOOL bDirect = FALSE) const override { |
| 121 return new CPDF_Boolean(m_bValue); |
125 } | 122 } |
126 | 123 CFX_ByteString GetString() const override { |
127 CFX_ByteString GetString() const { return m_bValue ? "true" : "false"; } | 124 return m_bValue ? "true" : "false"; |
128 FX_BOOL GetValue() const { return m_bValue; } | 125 } |
| 126 int GetInteger() const override { return m_bValue; } |
| 127 void SetString(const CFX_ByteString& str) override { |
| 128 m_bValue = (str == "true"); |
| 129 } |
| 130 bool IsBoolean() const override { return true; } |
| 131 CPDF_Boolean* AsBoolean() override { return this; } |
| 132 const CPDF_Boolean* AsBoolean() const override { return this; } |
129 | 133 |
130 protected: | 134 protected: |
| 135 ~CPDF_Boolean() {} |
| 136 |
131 FX_BOOL m_bValue; | 137 FX_BOOL m_bValue; |
132 friend class CPDF_Object; | |
133 }; | 138 }; |
| 139 |
134 inline CPDF_Boolean* ToBoolean(CPDF_Object* obj) { | 140 inline CPDF_Boolean* ToBoolean(CPDF_Object* obj) { |
135 return obj ? obj->AsBoolean() : nullptr; | 141 return obj ? obj->AsBoolean() : nullptr; |
136 } | 142 } |
| 143 |
137 inline const CPDF_Boolean* ToBoolean(const CPDF_Object* obj) { | 144 inline const CPDF_Boolean* ToBoolean(const CPDF_Object* obj) { |
138 return obj ? obj->AsBoolean() : nullptr; | 145 return obj ? obj->AsBoolean() : nullptr; |
139 } | 146 } |
140 | 147 |
141 class CPDF_Number : public CPDF_Object { | 148 class CPDF_Number : public CPDF_Object { |
142 public: | 149 public: |
143 CPDF_Number() : CPDF_Object(NUMBER), m_bInteger(TRUE), m_Integer(0) {} | 150 CPDF_Number() : m_bInteger(TRUE), m_Integer(0) {} |
144 | 151 explicit CPDF_Number(int value) : m_bInteger(TRUE), m_Integer(value) {} |
145 explicit CPDF_Number(int value); | 152 explicit CPDF_Number(FX_FLOAT value) : m_bInteger(FALSE), m_Float(value) {} |
146 | |
147 explicit CPDF_Number(FX_FLOAT value); | |
148 | |
149 explicit CPDF_Number(const CFX_ByteStringC& str); | 153 explicit CPDF_Number(const CFX_ByteStringC& str); |
150 | 154 |
151 FX_BOOL Identical(CPDF_Number* pOther) const; | 155 // CPDF_Object. |
| 156 Type GetType() const override { return NUMBER; } |
| 157 CPDF_Object* Clone(FX_BOOL bDirect = FALSE) const override { |
| 158 return m_bInteger ? new CPDF_Number(m_Integer) : new CPDF_Number(m_Float); |
| 159 } |
| 160 CFX_ByteString GetString() const override; |
| 161 FX_FLOAT GetNumber() const override { |
| 162 return m_bInteger ? static_cast<FX_FLOAT>(m_Integer) : m_Float; |
| 163 } |
| 164 int GetInteger() const override { |
| 165 return m_bInteger ? m_Integer : static_cast<int>(m_Float); |
| 166 } |
| 167 void SetString(const CFX_ByteString& str) override; |
| 168 bool IsNumber() const override { return true; } |
| 169 CPDF_Number* AsNumber() override { return this; } |
| 170 const CPDF_Number* AsNumber() const override { return this; } |
152 | 171 |
153 CFX_ByteString GetString() const; | 172 FX_BOOL IsInteger() { return m_bInteger; } |
154 | |
155 void SetString(const CFX_ByteStringC& str); | |
156 | |
157 FX_BOOL IsInteger() const { return m_bInteger; } | |
158 | |
159 int GetInteger() const { return m_bInteger ? m_Integer : (int)m_Float; } | |
160 | |
161 FX_FLOAT GetNumber() const { | |
162 return m_bInteger ? (FX_FLOAT)m_Integer : m_Float; | |
163 } | |
164 | |
165 void SetNumber(FX_FLOAT value); | |
166 | |
167 FX_FLOAT GetNumber16() const { return GetNumber(); } | |
168 | |
169 FX_FLOAT GetFloat() const { | |
170 return m_bInteger ? (FX_FLOAT)m_Integer : m_Float; | |
171 } | |
172 | 173 |
173 protected: | 174 protected: |
| 175 ~CPDF_Number() {} |
| 176 |
174 FX_BOOL m_bInteger; | 177 FX_BOOL m_bInteger; |
175 | 178 |
176 union { | 179 union { |
177 int m_Integer; | 180 int m_Integer; |
178 | 181 |
179 FX_FLOAT m_Float; | 182 FX_FLOAT m_Float; |
180 }; | 183 }; |
181 friend class CPDF_Object; | |
182 }; | 184 }; |
| 185 |
183 inline CPDF_Number* ToNumber(CPDF_Object* obj) { | 186 inline CPDF_Number* ToNumber(CPDF_Object* obj) { |
184 return obj ? obj->AsNumber() : nullptr; | 187 return obj ? obj->AsNumber() : nullptr; |
185 } | 188 } |
| 189 |
186 inline const CPDF_Number* ToNumber(const CPDF_Object* obj) { | 190 inline const CPDF_Number* ToNumber(const CPDF_Object* obj) { |
187 return obj ? obj->AsNumber() : nullptr; | 191 return obj ? obj->AsNumber() : nullptr; |
188 } | 192 } |
189 | 193 |
190 class CPDF_String : public CPDF_Object { | 194 class CPDF_String : public CPDF_Object { |
191 public: | 195 public: |
192 CPDF_String() : CPDF_Object(STRING), m_bHex(FALSE) {} | 196 CPDF_String() : m_bHex(FALSE) {} |
193 | |
194 CPDF_String(const CFX_ByteString& str, FX_BOOL bHex) | 197 CPDF_String(const CFX_ByteString& str, FX_BOOL bHex) |
195 : CPDF_Object(STRING), m_String(str), m_bHex(bHex) {} | 198 : m_String(str), m_bHex(bHex) {} |
196 | |
197 explicit CPDF_String(const CFX_WideString& str); | 199 explicit CPDF_String(const CFX_WideString& str); |
198 | 200 |
199 CFX_ByteString GetString() const { return m_String; } | 201 // CPDF_Object. |
200 | 202 Type GetType() const override { return STRING; } |
201 FX_BOOL Identical(CPDF_String* pOther) const { | 203 CPDF_Object* Clone(FX_BOOL bDirect = FALSE) const override { |
202 return m_String == pOther->m_String; | 204 return new CPDF_String(m_String, m_bHex); |
203 } | 205 } |
| 206 CFX_ByteString GetString() const override { return m_String; } |
| 207 CFX_ByteStringC GetConstString() const override { |
| 208 return CFX_ByteStringC(m_String); |
| 209 } |
| 210 CFX_WideString GetUnicodeText(CFX_CharMap* pCharMap = nullptr) const override; |
| 211 void SetString(const CFX_ByteString& str) override { m_String = str; } |
| 212 bool IsString() const override { return true; } |
| 213 CPDF_String* AsString() override { return this; } |
| 214 const CPDF_String* AsString() const override { return this; } |
204 | 215 |
205 FX_BOOL IsHex() const { return m_bHex; } | 216 FX_BOOL IsHex() const { return m_bHex; } |
206 | 217 |
207 protected: | 218 protected: |
| 219 ~CPDF_String() {} |
| 220 |
208 CFX_ByteString m_String; | 221 CFX_ByteString m_String; |
| 222 FX_BOOL m_bHex; |
| 223 }; |
209 | 224 |
210 FX_BOOL m_bHex; | |
211 friend class CPDF_Object; | |
212 }; | |
213 inline CPDF_String* ToString(CPDF_Object* obj) { | 225 inline CPDF_String* ToString(CPDF_Object* obj) { |
214 return obj ? obj->AsString() : nullptr; | 226 return obj ? obj->AsString() : nullptr; |
215 } | 227 } |
| 228 |
216 inline const CPDF_String* ToString(const CPDF_Object* obj) { | 229 inline const CPDF_String* ToString(const CPDF_Object* obj) { |
217 return obj ? obj->AsString() : nullptr; | 230 return obj ? obj->AsString() : nullptr; |
218 } | 231 } |
219 | 232 |
220 class CPDF_Name : public CPDF_Object { | 233 class CPDF_Name : public CPDF_Object { |
221 public: | 234 public: |
222 explicit CPDF_Name(const CFX_ByteString& str) | 235 explicit CPDF_Name(const CFX_ByteString& str) : m_Name(str) {} |
223 : CPDF_Object(NAME), m_Name(str) {} | 236 explicit CPDF_Name(const CFX_ByteStringC& str) : m_Name(str) {} |
224 explicit CPDF_Name(const CFX_ByteStringC& str) | 237 explicit CPDF_Name(const FX_CHAR* str) : m_Name(str) {} |
225 : CPDF_Object(NAME), m_Name(str) {} | |
226 explicit CPDF_Name(const FX_CHAR* str) : CPDF_Object(NAME), m_Name(str) {} | |
227 | 238 |
228 CFX_ByteString GetString() const { return m_Name; } | 239 // CPDF_Object. |
229 | 240 Type GetType() const override { return NAME; } |
230 FX_BOOL Identical(CPDF_Name* pOther) const { | 241 CPDF_Object* Clone(FX_BOOL bDirect = FALSE) const override { |
231 return m_Name == pOther->m_Name; | 242 return new CPDF_Name(m_Name); |
232 } | 243 } |
| 244 CFX_ByteString GetString() const override { return m_Name; } |
| 245 CFX_ByteStringC GetConstString() const override { |
| 246 return CFX_ByteStringC(m_Name); |
| 247 } |
| 248 CFX_WideString GetUnicodeText(CFX_CharMap* pCharMap = nullptr) const override; |
| 249 void SetString(const CFX_ByteString& str) override { m_Name = str; } |
| 250 bool IsName() const override { return true; } |
| 251 CPDF_Name* AsName() override { return this; } |
| 252 const CPDF_Name* AsName() const override { return this; } |
233 | 253 |
234 protected: | 254 protected: |
| 255 ~CPDF_Name() {} |
| 256 |
235 CFX_ByteString m_Name; | 257 CFX_ByteString m_Name; |
236 friend class CPDF_Object; | |
237 }; | 258 }; |
| 259 |
238 inline CPDF_Name* ToName(CPDF_Object* obj) { | 260 inline CPDF_Name* ToName(CPDF_Object* obj) { |
239 return obj ? obj->AsName() : nullptr; | 261 return obj ? obj->AsName() : nullptr; |
240 } | 262 } |
| 263 |
241 inline const CPDF_Name* ToName(const CPDF_Object* obj) { | 264 inline const CPDF_Name* ToName(const CPDF_Object* obj) { |
242 return obj ? obj->AsName() : nullptr; | 265 return obj ? obj->AsName() : nullptr; |
243 } | 266 } |
244 | 267 |
245 class CPDF_Array : public CPDF_Object { | 268 class CPDF_Array : public CPDF_Object { |
246 public: | 269 public: |
247 CPDF_Array() : CPDF_Object(ARRAY) {} | 270 CPDF_Array() {} |
| 271 |
| 272 // CPDF_Object. |
| 273 Type GetType() const override { return ARRAY; } |
| 274 CPDF_Object* Clone(FX_BOOL bDirect = FALSE) const override; |
| 275 CPDF_Array* GetArray() const override { |
| 276 // The method should be made non-const if we want to not be const. |
| 277 // See bug #234. |
| 278 return const_cast<CPDF_Array*>(this); |
| 279 } |
| 280 bool IsArray() const override { return true; } |
| 281 CPDF_Array* AsArray() override { return this; } |
| 282 const CPDF_Array* AsArray() const override { return this; } |
248 | 283 |
249 FX_DWORD GetCount() const { return m_Objects.GetSize(); } | 284 FX_DWORD GetCount() const { return m_Objects.GetSize(); } |
250 | |
251 CPDF_Object* GetElement(FX_DWORD index) const; | 285 CPDF_Object* GetElement(FX_DWORD index) const; |
252 | |
253 CPDF_Object* GetElementValue(FX_DWORD index) const; | 286 CPDF_Object* GetElementValue(FX_DWORD index) const; |
254 | |
255 CFX_Matrix GetMatrix(); | 287 CFX_Matrix GetMatrix(); |
256 | |
257 CFX_FloatRect GetRect(); | 288 CFX_FloatRect GetRect(); |
258 | |
259 CFX_ByteString GetStringAt(FX_DWORD index) const; | 289 CFX_ByteString GetStringAt(FX_DWORD index) const; |
260 | |
261 CFX_ByteStringC GetConstStringAt(FX_DWORD index) const; | 290 CFX_ByteStringC GetConstStringAt(FX_DWORD index) const; |
262 | |
263 int GetIntegerAt(FX_DWORD index) const; | 291 int GetIntegerAt(FX_DWORD index) const; |
264 | |
265 FX_FLOAT GetNumberAt(FX_DWORD index) const; | 292 FX_FLOAT GetNumberAt(FX_DWORD index) const; |
266 | |
267 CPDF_Dictionary* GetDictAt(FX_DWORD index) const; | 293 CPDF_Dictionary* GetDictAt(FX_DWORD index) const; |
268 | |
269 CPDF_Stream* GetStreamAt(FX_DWORD index) const; | 294 CPDF_Stream* GetStreamAt(FX_DWORD index) const; |
270 | |
271 CPDF_Array* GetArrayAt(FX_DWORD index) const; | 295 CPDF_Array* GetArrayAt(FX_DWORD index) const; |
272 | |
273 FX_FLOAT GetFloatAt(FX_DWORD index) const { return GetNumberAt(index); } | 296 FX_FLOAT GetFloatAt(FX_DWORD index) const { return GetNumberAt(index); } |
274 | 297 |
275 void SetAt(FX_DWORD index, | 298 void SetAt(FX_DWORD index, |
276 CPDF_Object* pObj, | 299 CPDF_Object* pObj, |
277 CPDF_IndirectObjectHolder* pObjs = NULL); | 300 CPDF_IndirectObjectHolder* pObjs = nullptr); |
278 | |
279 void InsertAt(FX_DWORD index, | 301 void InsertAt(FX_DWORD index, |
280 CPDF_Object* pObj, | 302 CPDF_Object* pObj, |
281 CPDF_IndirectObjectHolder* pObjs = NULL); | 303 CPDF_IndirectObjectHolder* pObjs = nullptr); |
282 | |
283 void RemoveAt(FX_DWORD index, int nCount = 1); | 304 void RemoveAt(FX_DWORD index, int nCount = 1); |
284 | 305 |
285 void Add(CPDF_Object* pObj, CPDF_IndirectObjectHolder* pObjs = NULL); | 306 void Add(CPDF_Object* pObj, CPDF_IndirectObjectHolder* pObjs = nullptr); |
286 | |
287 void AddNumber(FX_FLOAT f); | 307 void AddNumber(FX_FLOAT f); |
288 | |
289 void AddInteger(int i); | 308 void AddInteger(int i); |
290 | |
291 void AddString(const CFX_ByteString& str); | 309 void AddString(const CFX_ByteString& str); |
292 | |
293 void AddName(const CFX_ByteString& str); | 310 void AddName(const CFX_ByteString& str); |
294 | |
295 void AddReference(CPDF_IndirectObjectHolder* pDoc, FX_DWORD objnum); | 311 void AddReference(CPDF_IndirectObjectHolder* pDoc, FX_DWORD objnum); |
296 | |
297 void AddReference(CPDF_IndirectObjectHolder* pDoc, CPDF_Object* obj) { | 312 void AddReference(CPDF_IndirectObjectHolder* pDoc, CPDF_Object* obj) { |
298 AddReference(pDoc, obj->GetObjNum()); | 313 AddReference(pDoc, obj->GetObjNum()); |
299 } | 314 } |
300 | |
301 FX_FLOAT GetNumber16(FX_DWORD index) const { return GetNumberAt(index); } | |
302 | |
303 void AddNumber16(FX_FLOAT value) { AddNumber(value); } | 315 void AddNumber16(FX_FLOAT value) { AddNumber(value); } |
304 | 316 |
305 FX_BOOL Identical(CPDF_Array* pOther) const; | |
306 | |
307 protected: | 317 protected: |
308 ~CPDF_Array(); | 318 ~CPDF_Array(); |
309 | 319 |
310 CFX_ArrayTemplate<CPDF_Object*> m_Objects; | 320 CFX_ArrayTemplate<CPDF_Object*> m_Objects; |
311 friend class CPDF_Object; | |
312 }; | 321 }; |
| 322 |
313 inline CPDF_Array* ToArray(CPDF_Object* obj) { | 323 inline CPDF_Array* ToArray(CPDF_Object* obj) { |
314 return obj ? obj->AsArray() : nullptr; | 324 return obj ? obj->AsArray() : nullptr; |
315 } | 325 } |
| 326 |
316 inline const CPDF_Array* ToArray(const CPDF_Object* obj) { | 327 inline const CPDF_Array* ToArray(const CPDF_Object* obj) { |
317 return obj ? obj->AsArray() : nullptr; | 328 return obj ? obj->AsArray() : nullptr; |
318 } | 329 } |
319 | 330 |
320 class CPDF_Dictionary : public CPDF_Object { | 331 class CPDF_Dictionary : public CPDF_Object { |
321 public: | 332 public: |
322 using iterator = std::map<CFX_ByteString, CPDF_Object*>::iterator; | 333 using iterator = std::map<CFX_ByteString, CPDF_Object*>::iterator; |
323 using const_iterator = std::map<CFX_ByteString, CPDF_Object*>::const_iterator; | 334 using const_iterator = std::map<CFX_ByteString, CPDF_Object*>::const_iterator; |
324 | 335 |
325 CPDF_Dictionary() : CPDF_Object(DICTIONARY) {} | 336 CPDF_Dictionary() {} |
326 | 337 |
| 338 // CPDF_Object. |
| 339 Type GetType() const override { return DICTIONARY; } |
| 340 CPDF_Object* Clone(FX_BOOL bDirect = FALSE) const override; |
| 341 CPDF_Dictionary* GetDict() const override { |
| 342 // The method should be made non-const if we want to not be const. |
| 343 // See bug #234. |
| 344 return const_cast<CPDF_Dictionary*>(this); |
| 345 } |
| 346 bool IsDictionary() const override { return true; } |
| 347 CPDF_Dictionary* AsDictionary() override { return this; } |
| 348 const CPDF_Dictionary* AsDictionary() const override { return this; } |
| 349 |
| 350 size_t GetCount() const { return m_Map.size(); } |
327 CPDF_Object* GetElement(const CFX_ByteStringC& key) const; | 351 CPDF_Object* GetElement(const CFX_ByteStringC& key) const; |
328 | |
329 CPDF_Object* GetElementValue(const CFX_ByteStringC& key) const; | 352 CPDF_Object* GetElementValue(const CFX_ByteStringC& key) const; |
330 | |
331 CFX_ByteString GetStringBy(const CFX_ByteStringC& key) const; | 353 CFX_ByteString GetStringBy(const CFX_ByteStringC& key) const; |
332 | |
333 CFX_ByteStringC GetConstStringBy(const CFX_ByteStringC& key) const; | 354 CFX_ByteStringC GetConstStringBy(const CFX_ByteStringC& key) const; |
334 | |
335 CFX_ByteString GetStringBy(const CFX_ByteStringC& key, | 355 CFX_ByteString GetStringBy(const CFX_ByteStringC& key, |
336 const CFX_ByteStringC& default_str) const; | 356 const CFX_ByteStringC& default_str) const; |
337 | |
338 CFX_ByteStringC GetConstStringBy(const CFX_ByteStringC& key, | 357 CFX_ByteStringC GetConstStringBy(const CFX_ByteStringC& key, |
339 const CFX_ByteStringC& default_str) const; | 358 const CFX_ByteStringC& default_str) const; |
340 | |
341 CFX_WideString GetUnicodeTextBy(const CFX_ByteStringC& key, | 359 CFX_WideString GetUnicodeTextBy(const CFX_ByteStringC& key, |
342 CFX_CharMap* pCharMap = NULL) const; | 360 CFX_CharMap* pCharMap = NULL) const; |
343 | |
344 int GetIntegerBy(const CFX_ByteStringC& key) const; | 361 int GetIntegerBy(const CFX_ByteStringC& key) const; |
345 | |
346 int GetIntegerBy(const CFX_ByteStringC& key, int default_int) const; | 362 int GetIntegerBy(const CFX_ByteStringC& key, int default_int) const; |
347 | |
348 FX_BOOL GetBooleanBy(const CFX_ByteStringC& key, | 363 FX_BOOL GetBooleanBy(const CFX_ByteStringC& key, |
349 FX_BOOL bDefault = FALSE) const; | 364 FX_BOOL bDefault = FALSE) const; |
350 | |
351 FX_FLOAT GetNumberBy(const CFX_ByteStringC& key) const; | 365 FX_FLOAT GetNumberBy(const CFX_ByteStringC& key) const; |
352 | |
353 CPDF_Dictionary* GetDictBy(const CFX_ByteStringC& key) const; | 366 CPDF_Dictionary* GetDictBy(const CFX_ByteStringC& key) const; |
354 | |
355 CPDF_Stream* GetStreamBy(const CFX_ByteStringC& key) const; | 367 CPDF_Stream* GetStreamBy(const CFX_ByteStringC& key) const; |
356 | |
357 CPDF_Array* GetArrayBy(const CFX_ByteStringC& key) const; | 368 CPDF_Array* GetArrayBy(const CFX_ByteStringC& key) const; |
358 | |
359 CFX_FloatRect GetRectBy(const CFX_ByteStringC& key) const; | 369 CFX_FloatRect GetRectBy(const CFX_ByteStringC& key) const; |
360 | |
361 CFX_Matrix GetMatrixBy(const CFX_ByteStringC& key) const; | 370 CFX_Matrix GetMatrixBy(const CFX_ByteStringC& key) const; |
362 | |
363 FX_FLOAT GetFloatBy(const CFX_ByteStringC& key) const { | 371 FX_FLOAT GetFloatBy(const CFX_ByteStringC& key) const { |
364 return GetNumberBy(key); | 372 return GetNumberBy(key); |
365 } | 373 } |
366 | 374 |
367 FX_BOOL KeyExist(const CFX_ByteStringC& key) const; | 375 FX_BOOL KeyExist(const CFX_ByteStringC& key) const; |
368 | 376 |
369 // Set* functions invalidate iterators for the element with the key |key|. | 377 // Set* functions invalidate iterators for the element with the key |key|. |
370 void SetAt(const CFX_ByteStringC& key, CPDF_Object* pObj); | 378 void SetAt(const CFX_ByteStringC& key, CPDF_Object* pObj); |
371 | |
372 void SetAtName(const CFX_ByteStringC& key, const CFX_ByteString& name); | 379 void SetAtName(const CFX_ByteStringC& key, const CFX_ByteString& name); |
373 | |
374 void SetAtString(const CFX_ByteStringC& key, const CFX_ByteString& string); | 380 void SetAtString(const CFX_ByteStringC& key, const CFX_ByteString& string); |
375 | |
376 void SetAtInteger(const CFX_ByteStringC& key, int i); | 381 void SetAtInteger(const CFX_ByteStringC& key, int i); |
377 | |
378 void SetAtNumber(const CFX_ByteStringC& key, FX_FLOAT f); | 382 void SetAtNumber(const CFX_ByteStringC& key, FX_FLOAT f); |
379 | |
380 void SetAtReference(const CFX_ByteStringC& key, | 383 void SetAtReference(const CFX_ByteStringC& key, |
381 CPDF_IndirectObjectHolder* pDoc, | 384 CPDF_IndirectObjectHolder* pDoc, |
382 FX_DWORD objnum); | 385 FX_DWORD objnum); |
383 | |
384 void SetAtReference(const CFX_ByteStringC& key, | 386 void SetAtReference(const CFX_ByteStringC& key, |
385 CPDF_IndirectObjectHolder* pDoc, | 387 CPDF_IndirectObjectHolder* pDoc, |
386 CPDF_Object* obj) { | 388 CPDF_Object* obj) { |
387 SetAtReference(key, pDoc, obj->GetObjNum()); | 389 SetAtReference(key, pDoc, obj->GetObjNum()); |
388 } | 390 } |
| 391 void SetAtRect(const CFX_ByteStringC& key, const CFX_FloatRect& rect); |
| 392 void SetAtMatrix(const CFX_ByteStringC& key, const CFX_Matrix& matrix); |
| 393 void SetAtBoolean(const CFX_ByteStringC& key, FX_BOOL bValue); |
389 | 394 |
390 void AddReference(const CFX_ByteStringC& key, | 395 void AddReference(const CFX_ByteStringC& key, |
391 CPDF_IndirectObjectHolder* pDoc, | 396 CPDF_IndirectObjectHolder* pDoc, |
392 FX_DWORD objnum); | 397 FX_DWORD objnum); |
393 | 398 |
394 void SetAtRect(const CFX_ByteStringC& key, const CFX_FloatRect& rect); | |
395 | |
396 void SetAtMatrix(const CFX_ByteStringC& key, const CFX_Matrix& matrix); | |
397 | |
398 void SetAtBoolean(const CFX_ByteStringC& key, FX_BOOL bValue); | |
399 | |
400 // Invalidates iterators for the element with the key |key|. | 399 // Invalidates iterators for the element with the key |key|. |
401 void RemoveAt(const CFX_ByteStringC& key); | 400 void RemoveAt(const CFX_ByteStringC& key); |
402 | 401 |
403 // Invalidates iterators for the element with the key |oldkey|. | 402 // Invalidates iterators for the element with the key |oldkey|. |
404 void ReplaceKey(const CFX_ByteStringC& oldkey, const CFX_ByteStringC& newkey); | 403 void ReplaceKey(const CFX_ByteStringC& oldkey, const CFX_ByteStringC& newkey); |
405 | 404 |
406 FX_BOOL Identical(CPDF_Dictionary* pDict) const; | |
407 | |
408 size_t GetCount() const { return m_Map.size(); } | |
409 | |
410 iterator begin() { return m_Map.begin(); } | 405 iterator begin() { return m_Map.begin(); } |
411 | |
412 iterator end() { return m_Map.end(); } | 406 iterator end() { return m_Map.end(); } |
413 | |
414 const_iterator begin() const { return m_Map.begin(); } | 407 const_iterator begin() const { return m_Map.begin(); } |
415 | |
416 const_iterator end() const { return m_Map.end(); } | 408 const_iterator end() const { return m_Map.end(); } |
417 | 409 |
418 protected: | 410 protected: |
419 ~CPDF_Dictionary(); | 411 ~CPDF_Dictionary(); |
420 | 412 |
421 std::map<CFX_ByteString, CPDF_Object*> m_Map; | 413 std::map<CFX_ByteString, CPDF_Object*> m_Map; |
| 414 }; |
422 | 415 |
423 friend class CPDF_Object; | |
424 }; | |
425 inline CPDF_Dictionary* ToDictionary(CPDF_Object* obj) { | 416 inline CPDF_Dictionary* ToDictionary(CPDF_Object* obj) { |
426 return obj ? obj->AsDictionary() : nullptr; | 417 return obj ? obj->AsDictionary() : nullptr; |
427 } | 418 } |
| 419 |
428 inline const CPDF_Dictionary* ToDictionary(const CPDF_Object* obj) { | 420 inline const CPDF_Dictionary* ToDictionary(const CPDF_Object* obj) { |
429 return obj ? obj->AsDictionary() : nullptr; | 421 return obj ? obj->AsDictionary() : nullptr; |
430 } | 422 } |
431 | 423 |
432 class CPDF_Stream : public CPDF_Object { | 424 class CPDF_Stream : public CPDF_Object { |
433 public: | 425 public: |
434 CPDF_Stream(uint8_t* pData, FX_DWORD size, CPDF_Dictionary* pDict); | 426 CPDF_Stream(uint8_t* pData, FX_DWORD size, CPDF_Dictionary* pDict); |
435 | 427 |
436 CPDF_Dictionary* GetDict() const { return m_pDict; } | 428 // CPDF_Object. |
| 429 Type GetType() const override { return STREAM; } |
| 430 CPDF_Object* Clone(FX_BOOL bDirect = FALSE) const override; |
| 431 CPDF_Dictionary* GetDict() const override { return m_pDict; } |
| 432 CFX_WideString GetUnicodeText(CFX_CharMap* pCharMap = nullptr) const override; |
| 433 bool IsStream() const override { return true; } |
| 434 CPDF_Stream* AsStream() override { return this; } |
| 435 const CPDF_Stream* AsStream() const override { return this; } |
| 436 |
| 437 FX_DWORD GetRawSize() const { return m_dwSize; } |
| 438 uint8_t* GetRawData() const { return m_pDataBuf; } |
437 | 439 |
438 void SetData(const uint8_t* pData, | 440 void SetData(const uint8_t* pData, |
439 FX_DWORD size, | 441 FX_DWORD size, |
440 FX_BOOL bCompressed, | 442 FX_BOOL bCompressed, |
441 FX_BOOL bKeepBuf); | 443 FX_BOOL bKeepBuf); |
442 | 444 |
443 void InitStream(uint8_t* pData, FX_DWORD size, CPDF_Dictionary* pDict); | 445 void InitStream(uint8_t* pData, FX_DWORD size, CPDF_Dictionary* pDict); |
444 | |
445 void InitStreamFromFile(IFX_FileRead* pFile, CPDF_Dictionary* pDict); | 446 void InitStreamFromFile(IFX_FileRead* pFile, CPDF_Dictionary* pDict); |
446 | 447 |
447 FX_BOOL Identical(CPDF_Stream* pOther) const; | |
448 | |
449 FX_DWORD GetRawSize() const { return m_dwSize; } | |
450 | |
451 FX_BOOL ReadRawData(FX_FILESIZE start_pos, | 448 FX_BOOL ReadRawData(FX_FILESIZE start_pos, |
452 uint8_t* pBuf, | 449 uint8_t* pBuf, |
453 FX_DWORD buf_size) const; | 450 FX_DWORD buf_size) const; |
454 | 451 |
455 FX_BOOL IsMemoryBased() const { return m_GenNum == kMemoryBasedGenNum; } | 452 FX_BOOL IsMemoryBased() const { return m_GenNum == kMemoryBasedGenNum; } |
456 | 453 |
457 protected: | 454 protected: |
458 friend class CPDF_Object; | 455 static const FX_DWORD kMemoryBasedGenNum = (FX_DWORD)-1; |
459 friend class CPDF_StreamAcc; | |
460 | 456 |
461 static const FX_DWORD kMemoryBasedGenNum = (FX_DWORD)-1; | |
462 ~CPDF_Stream(); | 457 ~CPDF_Stream(); |
463 | 458 |
464 void InitStreamInternal(CPDF_Dictionary* pDict); | 459 void InitStreamInternal(CPDF_Dictionary* pDict); |
465 | 460 |
466 CPDF_Dictionary* m_pDict; | 461 CPDF_Dictionary* m_pDict; |
467 | |
468 FX_DWORD m_dwSize; | 462 FX_DWORD m_dwSize; |
469 | |
470 FX_DWORD m_GenNum; | 463 FX_DWORD m_GenNum; |
471 | 464 |
472 union { | 465 union { |
473 uint8_t* m_pDataBuf; | 466 uint8_t* m_pDataBuf; |
474 | |
475 IFX_FileRead* m_pFile; | 467 IFX_FileRead* m_pFile; |
476 }; | 468 }; |
477 }; | 469 }; |
| 470 |
478 inline CPDF_Stream* ToStream(CPDF_Object* obj) { | 471 inline CPDF_Stream* ToStream(CPDF_Object* obj) { |
479 return obj ? obj->AsStream() : nullptr; | 472 return obj ? obj->AsStream() : nullptr; |
480 } | 473 } |
| 474 |
481 inline const CPDF_Stream* ToStream(const CPDF_Object* obj) { | 475 inline const CPDF_Stream* ToStream(const CPDF_Object* obj) { |
482 return obj ? obj->AsStream() : nullptr; | 476 return obj ? obj->AsStream() : nullptr; |
483 } | 477 } |
484 | 478 |
485 class CPDF_StreamAcc { | 479 class CPDF_StreamAcc { |
486 public: | 480 public: |
487 CPDF_StreamAcc(); | 481 CPDF_StreamAcc(); |
488 | |
489 ~CPDF_StreamAcc(); | 482 ~CPDF_StreamAcc(); |
490 | 483 |
491 void LoadAllData(const CPDF_Stream* pStream, | 484 void LoadAllData(const CPDF_Stream* pStream, |
492 FX_BOOL bRawAccess = FALSE, | 485 FX_BOOL bRawAccess = FALSE, |
493 FX_DWORD estimated_size = 0, | 486 FX_DWORD estimated_size = 0, |
494 FX_BOOL bImageAcc = FALSE); | 487 FX_BOOL bImageAcc = FALSE); |
495 | 488 |
496 const CPDF_Stream* GetStream() const { return m_pStream; } | 489 const CPDF_Stream* GetStream() const { return m_pStream; } |
497 | |
498 CPDF_Dictionary* GetDict() const { | 490 CPDF_Dictionary* GetDict() const { |
499 return m_pStream ? m_pStream->GetDict() : nullptr; | 491 return m_pStream ? m_pStream->GetDict() : nullptr; |
500 } | 492 } |
501 | |
502 const uint8_t* GetData() const; | 493 const uint8_t* GetData() const; |
503 | |
504 FX_DWORD GetSize() const; | 494 FX_DWORD GetSize() const; |
| 495 const CFX_ByteString& GetImageDecoder() const { return m_ImageDecoder; } |
| 496 const CPDF_Dictionary* GetImageParam() const { return m_pImageParam; } |
505 | 497 |
506 uint8_t* DetachData(); | 498 uint8_t* DetachData(); |
507 | 499 |
508 const CFX_ByteString& GetImageDecoder() { return m_ImageDecoder; } | |
509 | |
510 const CPDF_Dictionary* GetImageParam() { return m_pImageParam; } | |
511 | |
512 protected: | 500 protected: |
513 uint8_t* m_pData; | 501 uint8_t* m_pData; |
514 | |
515 FX_DWORD m_dwSize; | 502 FX_DWORD m_dwSize; |
516 | |
517 FX_BOOL m_bNewBuf; | 503 FX_BOOL m_bNewBuf; |
518 | |
519 CFX_ByteString m_ImageDecoder; | 504 CFX_ByteString m_ImageDecoder; |
520 | |
521 CPDF_Dictionary* m_pImageParam; | 505 CPDF_Dictionary* m_pImageParam; |
522 | |
523 const CPDF_Stream* m_pStream; | 506 const CPDF_Stream* m_pStream; |
524 | |
525 uint8_t* m_pSrcData; | 507 uint8_t* m_pSrcData; |
526 }; | 508 }; |
527 | 509 |
528 class CPDF_Null : public CPDF_Object { | 510 class CPDF_Null : public CPDF_Object { |
529 public: | 511 public: |
530 CPDF_Null() : CPDF_Object(NULLOBJ) {} | 512 CPDF_Null() {} |
| 513 |
| 514 // CPDF_Object. |
| 515 Type GetType() const override { return NULLOBJ; } |
| 516 CPDF_Object* Clone(FX_BOOL bDirect = FALSE) const override { |
| 517 return new CPDF_Null; |
| 518 } |
531 }; | 519 }; |
532 | 520 |
533 class CPDF_Reference : public CPDF_Object { | 521 class CPDF_Reference : public CPDF_Object { |
534 public: | 522 public: |
535 CPDF_Reference(CPDF_IndirectObjectHolder* pDoc, int objnum) | 523 CPDF_Reference(CPDF_IndirectObjectHolder* pDoc, int objnum) |
536 : CPDF_Object(REFERENCE), m_pObjList(pDoc), m_RefObjNum(objnum) {} | 524 : m_pObjList(pDoc), m_RefObjNum(objnum) {} |
| 525 |
| 526 // CPDF_Object. |
| 527 Type GetType() const override { return REFERENCE; } |
| 528 CPDF_Object* Clone(FX_BOOL bDirect = FALSE) const override; |
| 529 CPDF_Object* GetDirect() const override; |
| 530 CFX_ByteString GetString() const override { |
| 531 CPDF_Object* obj = SafeGetDirect(); |
| 532 return obj ? obj->GetString() : CFX_ByteString(); |
| 533 } |
| 534 CFX_ByteStringC GetConstString() const override { |
| 535 CPDF_Object* obj = SafeGetDirect(); |
| 536 return obj ? obj->GetConstString() : CFX_ByteStringC(); |
| 537 } |
| 538 FX_FLOAT GetNumber() const override { |
| 539 CPDF_Object* obj = SafeGetDirect(); |
| 540 return obj ? obj->GetNumber() : 0; |
| 541 } |
| 542 int GetInteger() const override { |
| 543 CPDF_Object* obj = SafeGetDirect(); |
| 544 return obj ? obj->GetInteger() : 0; |
| 545 } |
| 546 CPDF_Dictionary* GetDict() const override { |
| 547 CPDF_Object* obj = SafeGetDirect(); |
| 548 return obj ? obj->GetDict() : nullptr; |
| 549 } |
| 550 // TODO(weili): check whether GetUnicodeText() and GetArray() are needed. |
| 551 bool IsReference() const override { return true; } |
| 552 CPDF_Reference* AsReference() override { return this; } |
| 553 const CPDF_Reference* AsReference() const override { return this; } |
537 | 554 |
538 CPDF_IndirectObjectHolder* GetObjList() const { return m_pObjList; } | 555 CPDF_IndirectObjectHolder* GetObjList() const { return m_pObjList; } |
539 | |
540 FX_DWORD GetRefObjNum() const { return m_RefObjNum; } | 556 FX_DWORD GetRefObjNum() const { return m_RefObjNum; } |
541 | 557 |
542 void SetRef(CPDF_IndirectObjectHolder* pDoc, FX_DWORD objnum); | 558 void SetRef(CPDF_IndirectObjectHolder* pDoc, FX_DWORD objnum); |
543 | 559 |
544 FX_BOOL Identical(CPDF_Reference* pOther) const { | 560 protected: |
545 return m_RefObjNum == pOther->m_RefObjNum; | 561 ~CPDF_Reference() {} |
| 562 CPDF_Object* SafeGetDirect() const { |
| 563 CPDF_Object* obj = GetDirect(); |
| 564 if (!obj || obj->IsReference()) |
| 565 return nullptr; |
| 566 return obj; |
546 } | 567 } |
547 | 568 |
548 protected: | |
549 CPDF_IndirectObjectHolder* m_pObjList; | 569 CPDF_IndirectObjectHolder* m_pObjList; |
| 570 FX_DWORD m_RefObjNum; |
| 571 }; |
550 | 572 |
551 FX_DWORD m_RefObjNum; | |
552 friend class CPDF_Object; | |
553 }; | |
554 inline CPDF_Reference* ToReference(CPDF_Object* obj) { | 573 inline CPDF_Reference* ToReference(CPDF_Object* obj) { |
555 return obj ? obj->AsReference() : nullptr; | 574 return obj ? obj->AsReference() : nullptr; |
556 } | 575 } |
| 576 |
557 inline const CPDF_Reference* ToReference(const CPDF_Object* obj) { | 577 inline const CPDF_Reference* ToReference(const CPDF_Object* obj) { |
558 return obj ? obj->AsReference() : nullptr; | 578 return obj ? obj->AsReference() : nullptr; |
559 } | 579 } |
560 | 580 |
561 class CPDF_IndirectObjectHolder { | 581 class CPDF_IndirectObjectHolder { |
562 public: | 582 public: |
563 using iterator = std::map<FX_DWORD, CPDF_Object*>::iterator; | 583 using iterator = std::map<FX_DWORD, CPDF_Object*>::iterator; |
564 using const_iterator = std::map<FX_DWORD, CPDF_Object*>::const_iterator; | 584 using const_iterator = std::map<FX_DWORD, CPDF_Object*>::const_iterator; |
565 | 585 |
566 explicit CPDF_IndirectObjectHolder(CPDF_Parser* pParser); | 586 explicit CPDF_IndirectObjectHolder(CPDF_Parser* pParser); |
567 ~CPDF_IndirectObjectHolder(); | 587 ~CPDF_IndirectObjectHolder(); |
568 | 588 |
569 CPDF_Object* GetIndirectObject(FX_DWORD objnum); | 589 CPDF_Object* GetIndirectObject(FX_DWORD objnum); |
570 FX_DWORD AddIndirectObject(CPDF_Object* pObj); | 590 FX_DWORD AddIndirectObject(CPDF_Object* pObj); |
571 void ReleaseIndirectObject(FX_DWORD objnum); | 591 void ReleaseIndirectObject(FX_DWORD objnum); |
572 | 592 |
573 // Takes ownership of |pObj|. | 593 // Takes ownership of |pObj|. |
574 FX_BOOL InsertIndirectObject(FX_DWORD objnum, CPDF_Object* pObj); | 594 FX_BOOL InsertIndirectObject(FX_DWORD objnum, CPDF_Object* pObj); |
575 | 595 |
576 FX_DWORD GetLastObjNum() const { return m_LastObjNum; } | 596 FX_DWORD GetLastObjNum() const { return m_LastObjNum; } |
577 iterator begin() { return m_IndirectObjs.begin(); } | 597 iterator begin() { return m_IndirectObjs.begin(); } |
578 const_iterator begin() const { return m_IndirectObjs.cbegin(); } | 598 const_iterator begin() const { return m_IndirectObjs.begin(); } |
579 iterator end() { return m_IndirectObjs.end(); } | 599 iterator end() { return m_IndirectObjs.end(); } |
580 const_iterator end() const { return m_IndirectObjs.end(); } | 600 const_iterator end() const { return m_IndirectObjs.end(); } |
581 | 601 |
582 protected: | 602 protected: |
583 CPDF_Parser* m_pParser; | 603 CPDF_Parser* m_pParser; |
584 FX_DWORD m_LastObjNum; | 604 FX_DWORD m_LastObjNum; |
585 std::map<FX_DWORD, CPDF_Object*> m_IndirectObjs; | 605 std::map<FX_DWORD, CPDF_Object*> m_IndirectObjs; |
586 }; | 606 }; |
587 | 607 |
588 #endif // CORE_INCLUDE_FPDFAPI_FPDF_OBJECTS_H_ | 608 #endif // CORE_INCLUDE_FPDFAPI_FPDF_OBJECTS_H_ |
OLD | NEW |