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