Initial commit.
[pdfium.git] / core / include / fpdfapi / fpdf_objects.h
1 // Copyright 2014 PDFium Authors. All rights reserved.\r
2 // Use of this source code is governed by a BSD-style license that can be\r
3 // found in the LICENSE file.\r
4  \r
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\r
6 \r
7 #ifndef _FPDF_OBJECTS_\r
8 #define _FPDF_OBJECTS_\r
9 #ifndef _FXCRT_EXTENSION_\r
10 #include "../fxcrt/fx_ext.h"\r
11 #endif\r
12 class CPDF_Document;\r
13 class CPDF_IndirectObjects;\r
14 class CPDF_Null;\r
15 class CPDF_Boolean;\r
16 class CPDF_Number;\r
17 class CPDF_String;\r
18 class CPDF_Stream;\r
19 class CPDF_StreamAcc;\r
20 class CPDF_StreamFilter;\r
21 class CPDF_Array;\r
22 class CPDF_Dictionary;\r
23 class CPDF_Reference;\r
24 class IPDF_DocParser;\r
25 class IFX_FileRead;\r
26 class CPDF_CryptoHandler;\r
27 #define PDFOBJ_INVALID          0\r
28 #define PDFOBJ_BOOLEAN          1\r
29 #define PDFOBJ_NUMBER           2\r
30 #define PDFOBJ_STRING           3\r
31 #define PDFOBJ_NAME                     4\r
32 #define PDFOBJ_ARRAY            5\r
33 #define PDFOBJ_DICTIONARY       6\r
34 #define PDFOBJ_STREAM           7\r
35 #define PDFOBJ_NULL                     8\r
36 #define PDFOBJ_REFERENCE        9\r
37 typedef IFX_FileStream* (*FPDF_LPFCloneStreamCallback)(CPDF_Stream *pStream, FX_LPVOID pUserData);\r
38 class CPDF_Object : public CFX_Object\r
39 {\r
40 public:\r
41 \r
42     int                                         GetType() const\r
43     {\r
44         return m_Type;\r
45     }\r
46 \r
47     FX_DWORD                            GetObjNum() const\r
48     {\r
49         return m_ObjNum;\r
50     }\r
51 \r
52     FX_BOOL                                     IsIdentical(CPDF_Object* pObj) const;\r
53 \r
54     CPDF_Object*                        Clone(FX_BOOL bDirect = FALSE) const;\r
55 \r
56     CPDF_Object*                        CloneRef(CPDF_IndirectObjects* pObjs) const;\r
57 \r
58     CPDF_Object*                        GetDirect() const;\r
59 \r
60     void                                        Release();\r
61 \r
62     CFX_ByteString                      GetString() const;\r
63 \r
64     CFX_ByteStringC                     GetConstString() const;\r
65 \r
66     CFX_WideString                      GetUnicodeText(CFX_CharMap* pCharMap = NULL) const;\r
67 \r
68     FX_FLOAT                            GetNumber() const;\r
69 \r
70     FX_FLOAT                            GetNumber16() const;\r
71 \r
72     int                                         GetInteger() const;\r
73 \r
74     CPDF_Dictionary*            GetDict() const;\r
75 \r
76     CPDF_Array*                         GetArray() const;\r
77 \r
78     void                                        SetString(const CFX_ByteString& str);\r
79 \r
80     void                                        SetUnicodeText(FX_LPCWSTR pUnicodes, int len = -1);\r
81 \r
82     int                                         GetDirectType() const;\r
83 \r
84     FX_BOOL                                     IsModified() const\r
85     {\r
86         return FALSE;\r
87     }\r
88 protected:\r
89     FX_DWORD                            m_Type;\r
90     CPDF_Object()\r
91     {\r
92         m_ObjNum = 0;\r
93     }\r
94 \r
95     FX_DWORD                            m_ObjNum;\r
96 \r
97     void                                        Destroy();\r
98 \r
99 \r
100     ~CPDF_Object() {}\r
101     friend class                        CPDF_IndirectObjects;\r
102     friend class                        CPDF_Parser;\r
103     friend class                        CPDF_SyntaxParser;\r
104 private:\r
105     CPDF_Object(const CPDF_Object& src) {}\r
106     CPDF_Object* CloneInternal(FX_BOOL bDirect, CFX_MapPtrToPtr* visited) const;\r
107 };\r
108 class CPDF_Boolean : public CPDF_Object\r
109 {\r
110 public:\r
111 \r
112     static CPDF_Boolean*        Create(FX_BOOL value)\r
113     {\r
114         return FX_NEW CPDF_Boolean(value);\r
115     }\r
116 \r
117     CPDF_Boolean()\r
118     {\r
119         m_Type = PDFOBJ_BOOLEAN;\r
120     }\r
121 \r
122     CPDF_Boolean(FX_BOOL value)\r
123     {\r
124         m_Type = PDFOBJ_BOOLEAN;\r
125         m_bValue = value;\r
126     }\r
127 \r
128     FX_BOOL                                     Identical(CPDF_Boolean* pOther) const\r
129     {\r
130         return m_bValue == pOther->m_bValue;\r
131     }\r
132 protected:\r
133 \r
134     FX_BOOL                                     m_bValue;\r
135     friend class                        CPDF_Object;\r
136 };\r
137 class CPDF_Number : public CPDF_Object\r
138 {\r
139 public:\r
140 \r
141     static CPDF_Number*         Create(int value)\r
142     {\r
143         return FX_NEW CPDF_Number(value);\r
144     }\r
145 \r
146     static CPDF_Number*         Create(FX_FLOAT value)\r
147     {\r
148         return FX_NEW CPDF_Number(value);\r
149     }\r
150 \r
151     static CPDF_Number*         Create(FX_BSTR str)\r
152     {\r
153         return FX_NEW CPDF_Number(str);\r
154     }\r
155 \r
156     static CPDF_Number*         Create(FX_BOOL bInteger, void* pData)\r
157     {\r
158         return FX_NEW CPDF_Number(bInteger, pData);\r
159     }\r
160 \r
161     CPDF_Number()\r
162     {\r
163         m_Type = PDFOBJ_NUMBER;\r
164     }\r
165 \r
166     CPDF_Number(FX_BOOL bInteger, void* pData);\r
167 \r
168     CPDF_Number(int value);\r
169 \r
170     CPDF_Number(FX_FLOAT value);\r
171 \r
172     CPDF_Number(FX_BSTR str);\r
173 \r
174     FX_BOOL                                     Identical(CPDF_Number* pOther) const;\r
175 \r
176     CFX_ByteString                      GetString() const;\r
177 \r
178     void                                        SetString(FX_BSTR str);\r
179 \r
180     FX_BOOL                                     IsInteger() const\r
181     {\r
182         return m_bInteger;\r
183     }\r
184 \r
185     int                                         GetInteger() const\r
186     {\r
187         return m_bInteger ? m_Integer : (int)m_Float;\r
188     }\r
189 \r
190     FX_FLOAT                            GetNumber() const\r
191     {\r
192         return m_bInteger ? (FX_FLOAT)m_Integer : m_Float;\r
193     }\r
194 \r
195     void                                        SetNumber(FX_FLOAT value);\r
196 \r
197     FX_FLOAT                    GetNumber16() const\r
198     {\r
199         return GetNumber();\r
200     }\r
201 \r
202     FX_FLOAT                            GetFloat() const\r
203     {\r
204         return m_bInteger ? (FX_FLOAT)m_Integer : m_Float;\r
205     }\r
206 protected:\r
207 \r
208     FX_BOOL                                     m_bInteger;\r
209 \r
210     union {\r
211 \r
212         int                                     m_Integer;\r
213 \r
214         FX_FLOAT                        m_Float;\r
215     };\r
216     friend class                        CPDF_Object;\r
217 };\r
218 class CPDF_String : public CPDF_Object\r
219 {\r
220 public:\r
221 \r
222     static CPDF_String*         Create(const CFX_ByteString& str, FX_BOOL bHex = FALSE)\r
223     {\r
224         return FX_NEW CPDF_String(str, bHex);\r
225     }\r
226 \r
227     static CPDF_String*         Create(const CFX_WideString& str)\r
228     {\r
229         return FX_NEW CPDF_String(str);\r
230     }\r
231 \r
232     CPDF_String()\r
233     {\r
234         m_Type = PDFOBJ_STRING;\r
235         m_bHex = FALSE;\r
236     }\r
237 \r
238     CPDF_String(const CFX_ByteString& str, FX_BOOL bHex = FALSE) : m_String(str)\r
239     {\r
240         m_Type = PDFOBJ_STRING;\r
241         m_bHex = bHex;\r
242     }\r
243 \r
244     CPDF_String(const CFX_WideString& str);\r
245 \r
246     CFX_ByteString&                     GetString()\r
247     {\r
248         return m_String;\r
249     }\r
250 \r
251     FX_BOOL                                     Identical(CPDF_String* pOther) const\r
252     {\r
253         return m_String == pOther->m_String;\r
254     }\r
255 \r
256     FX_BOOL                                     IsHex() const\r
257     {\r
258         return m_bHex;\r
259     }\r
260 protected:\r
261 \r
262     CFX_ByteString                      m_String;\r
263 \r
264     FX_BOOL                                     m_bHex;\r
265     friend class                        CPDF_Object;\r
266 };\r
267 class CPDF_Name : public CPDF_Object\r
268 {\r
269 public:\r
270 \r
271     static CPDF_Name*           Create(const CFX_ByteString& str)\r
272     {\r
273         return FX_NEW CPDF_Name(str);\r
274     }\r
275 \r
276     static CPDF_Name*           Create(FX_BSTR str)\r
277     {\r
278         return FX_NEW CPDF_Name(str);\r
279     }\r
280 \r
281     static CPDF_Name*           Create(FX_LPCSTR str)\r
282     {\r
283         return FX_NEW CPDF_Name(str);\r
284     }\r
285 \r
286     CPDF_Name(const CFX_ByteString& str) : m_Name(str)\r
287     {\r
288         m_Type = PDFOBJ_NAME;\r
289     }\r
290 \r
291     CPDF_Name(FX_BSTR str) : m_Name(str)\r
292     {\r
293         m_Type = PDFOBJ_NAME;\r
294     }\r
295 \r
296     CPDF_Name(FX_LPCSTR str) : m_Name(str)\r
297     {\r
298         m_Type = PDFOBJ_NAME;\r
299     }\r
300 \r
301     CFX_ByteString&                     GetString()\r
302     {\r
303         return m_Name;\r
304     }\r
305 \r
306     FX_BOOL                                     Identical(CPDF_Name* pOther) const\r
307     {\r
308         return m_Name == pOther->m_Name;\r
309     }\r
310 protected:\r
311 \r
312     CFX_ByteString                      m_Name;\r
313     friend class                        CPDF_Object;\r
314 };\r
315 class CPDF_Array : public CPDF_Object\r
316 {\r
317 public:\r
318 \r
319     static CPDF_Array*          Create()\r
320     {\r
321         return FX_NEW CPDF_Array();\r
322     }\r
323 \r
324     CPDF_Array()\r
325     {\r
326         m_Type = PDFOBJ_ARRAY;\r
327     }\r
328 \r
329     FX_DWORD                            GetCount() const\r
330     {\r
331         return m_Objects.GetSize();\r
332     }\r
333 \r
334     CPDF_Object*                        GetElement(FX_DWORD index) const;\r
335 \r
336     CPDF_Object*                        GetElementValue(FX_DWORD index) const;\r
337 \r
338 \r
339 \r
340     CFX_AffineMatrix            GetMatrix();\r
341 \r
342     CFX_FloatRect                       GetRect();\r
343 \r
344 \r
345 \r
346 \r
347     CFX_ByteString                      GetString(FX_DWORD index) const;\r
348 \r
349     CFX_ByteStringC                     GetConstString(FX_DWORD index) const;\r
350 \r
351     int                                         GetInteger(FX_DWORD index) const;\r
352 \r
353     FX_FLOAT                            GetNumber(FX_DWORD index) const;\r
354 \r
355     CPDF_Dictionary*            GetDict(FX_DWORD index) const;\r
356 \r
357     CPDF_Stream*                        GetStream(FX_DWORD index) const;\r
358 \r
359     CPDF_Array*                         GetArray(FX_DWORD index) const;\r
360 \r
361     FX_FLOAT                            GetFloat(FX_DWORD index) const\r
362     {\r
363         return GetNumber(index);\r
364     }\r
365 \r
366 \r
367 \r
368 \r
369     void                                        SetAt(FX_DWORD index, CPDF_Object* pObj, CPDF_IndirectObjects* pObjs = NULL);\r
370 \r
371 \r
372     void                                        InsertAt(FX_DWORD index, CPDF_Object* pObj, CPDF_IndirectObjects* pObjs = NULL);\r
373 \r
374     void                                        RemoveAt(FX_DWORD index);\r
375 \r
376 \r
377     void                                        Add(CPDF_Object* pObj, CPDF_IndirectObjects* pObjs = NULL);\r
378 \r
379 \r
380 \r
381     void                                        AddNumber(FX_FLOAT f);\r
382 \r
383     void                                        AddInteger(int i);\r
384 \r
385     void                                        AddString(const CFX_ByteString& str);\r
386 \r
387     void                                        AddName(const CFX_ByteString& str);\r
388 \r
389     void                                        AddReference(CPDF_IndirectObjects* pDoc, FX_DWORD objnum);\r
390 \r
391     void                                        AddReference(CPDF_IndirectObjects* pDoc, CPDF_Object* obj)\r
392     {\r
393         AddReference(pDoc, obj->GetObjNum());\r
394     }\r
395 \r
396 \r
397     FX_FLOAT                    GetNumber16(FX_DWORD index) const\r
398     {\r
399         return GetNumber(index);\r
400     }\r
401 \r
402     void                                        AddNumber16(FX_FLOAT value)\r
403     {\r
404         AddNumber(value);\r
405     }\r
406 \r
407     FX_BOOL                                     Identical(CPDF_Array* pOther) const;\r
408 protected:\r
409 \r
410     ~CPDF_Array();\r
411 \r
412     CFX_PtrArray                        m_Objects;\r
413     friend class                        CPDF_Object;\r
414 };\r
415 class CPDF_Dictionary : public CPDF_Object\r
416 {\r
417 public:\r
418 \r
419     static CPDF_Dictionary*     Create()\r
420     {\r
421         return FX_NEW CPDF_Dictionary();\r
422     }\r
423 \r
424     CPDF_Dictionary()\r
425     {\r
426         m_Type = PDFOBJ_DICTIONARY;\r
427     }\r
428 \r
429 \r
430 \r
431     CPDF_Object*                        GetElement(FX_BSTR key) const;\r
432 \r
433     CPDF_Object*                        GetElementValue(FX_BSTR key) const;\r
434 \r
435 \r
436 \r
437 \r
438 \r
439     CFX_ByteString                      GetString(FX_BSTR key) const;\r
440 \r
441     CFX_ByteStringC                     GetConstString(FX_BSTR key) const;\r
442 \r
443     CFX_ByteString                      GetString(FX_BSTR key, FX_BSTR default_str) const;\r
444 \r
445     CFX_ByteStringC                     GetConstString(FX_BSTR key, FX_BSTR default_str) const;\r
446 \r
447     CFX_WideString                      GetUnicodeText(FX_BSTR key, CFX_CharMap* pCharMap = NULL) const;\r
448 \r
449     int                                         GetInteger(FX_BSTR key) const;\r
450 \r
451     int                                         GetInteger(FX_BSTR key, int default_int) const;\r
452 \r
453     FX_BOOL                                     GetBoolean(FX_BSTR key, FX_BOOL bDefault = FALSE) const;\r
454 \r
455     FX_FLOAT                            GetNumber(FX_BSTR key) const;\r
456 \r
457     CPDF_Dictionary*            GetDict(FX_BSTR key) const;\r
458 \r
459     CPDF_Stream*                        GetStream(FX_BSTR key) const;\r
460 \r
461     CPDF_Array*                         GetArray(FX_BSTR key) const;\r
462 \r
463     CFX_FloatRect                       GetRect(FX_BSTR key) const;\r
464 \r
465     CFX_AffineMatrix            GetMatrix(FX_BSTR key) const;\r
466 \r
467     FX_FLOAT                            GetFloat(FX_BSTR key) const\r
468     {\r
469         return GetNumber(key);\r
470     }\r
471 \r
472 \r
473     FX_BOOL                                     KeyExist(FX_BSTR key) const;\r
474 \r
475     FX_POSITION                         GetStartPos() const;\r
476 \r
477     CPDF_Object*                        GetNextElement(FX_POSITION& pos, CFX_ByteString& key) const;\r
478 \r
479     void                                        SetAt(FX_BSTR key, CPDF_Object* pObj, CPDF_IndirectObjects* pObjs = NULL);\r
480 \r
481 \r
482 \r
483     void                                        SetAtName(FX_BSTR key, const CFX_ByteString& name);\r
484 \r
485 \r
486     void                                        SetAtString(FX_BSTR key, const CFX_ByteString& string);\r
487 \r
488 \r
489     void                                        SetAtInteger(FX_BSTR key, int i);\r
490 \r
491 \r
492     void                                        SetAtNumber(FX_BSTR key, FX_FLOAT f);\r
493 \r
494     void                                        SetAtReference(FX_BSTR key, CPDF_IndirectObjects* pDoc, FX_DWORD objnum);\r
495 \r
496     void                                        SetAtReference(FX_BSTR key, CPDF_IndirectObjects* pDoc, CPDF_Object* obj)\r
497     {\r
498         SetAtReference(key, pDoc, obj->GetObjNum());\r
499     }\r
500 \r
501     void                                        AddReference(FX_BSTR key, CPDF_IndirectObjects* pDoc, FX_DWORD objnum);\r
502 \r
503     void                                        AddReference(FX_BSTR key, CPDF_IndirectObjects* pDoc, CPDF_Object* obj)\r
504     {\r
505         AddReference(key, pDoc, obj->GetObjNum());\r
506     }\r
507 \r
508     void                                        SetAtRect(FX_BSTR key, const CFX_FloatRect& rect);\r
509 \r
510     void                                        SetAtMatrix(FX_BSTR key, const CFX_AffineMatrix& matrix);\r
511 \r
512     void                                        SetAtBoolean(FX_BSTR key, FX_BOOL bValue);\r
513 \r
514 \r
515 \r
516     void                                        RemoveAt(FX_BSTR key);\r
517 \r
518 \r
519     void                                        ReplaceKey(FX_BSTR oldkey, FX_BSTR newkey);\r
520 \r
521     FX_BOOL                                     Identical(CPDF_Dictionary* pDict) const;\r
522 \r
523     int                                         GetCount() const\r
524     {\r
525         return m_Map.GetCount();\r
526     }\r
527 \r
528     void                                        AddValue(FX_BSTR key, CPDF_Object* pObj);\r
529 protected:\r
530 \r
531     ~CPDF_Dictionary();\r
532 \r
533     CFX_CMapByteStringToPtr     m_Map;\r
534 \r
535     friend class                        CPDF_Object;\r
536 };\r
537 class CPDF_Stream : public CPDF_Object\r
538 {\r
539 public:\r
540 \r
541     static CPDF_Stream*         Create(FX_LPBYTE pData, FX_DWORD size, CPDF_Dictionary* pDict)\r
542     {\r
543         return FX_NEW CPDF_Stream(pData, size, pDict);\r
544     }\r
545 \r
546     CPDF_Stream(FX_LPBYTE pData, FX_DWORD size, CPDF_Dictionary* pDict);\r
547 \r
548     CPDF_Dictionary*            GetDict() const\r
549     {\r
550         return m_pDict;\r
551     }\r
552 \r
553     void                                        SetData(FX_LPCBYTE pData, FX_DWORD size, FX_BOOL bCompressed, FX_BOOL bKeepBuf);\r
554 \r
555     void                                        InitStream(FX_BYTE* pData, FX_DWORD size, CPDF_Dictionary* pDict);\r
556 \r
557     void                                        InitStream(IFX_FileRead *pFile, CPDF_Dictionary* pDict);\r
558 \r
559     FX_BOOL                                     Identical(CPDF_Stream* pOther) const;\r
560 \r
561     CPDF_StreamFilter*          GetStreamFilter(FX_BOOL bRaw = FALSE) const;\r
562 \r
563 \r
564 \r
565     FX_DWORD                            GetRawSize() const\r
566     {\r
567         return m_dwSize;\r
568     }\r
569 \r
570     FX_BOOL                                     ReadRawData(FX_FILESIZE start_pos, FX_LPBYTE pBuf, FX_DWORD buf_size) const;\r
571 \r
572 \r
573     FX_BOOL                                     IsMemoryBased() const\r
574     {\r
575         return m_GenNum == (FX_DWORD) - 1;\r
576     }\r
577 \r
578     CPDF_Stream*                        Clone(FX_BOOL bDirect, FPDF_LPFCloneStreamCallback lpfCallback, FX_LPVOID pUserData) const;\r
579 protected:\r
580 \r
581     ~CPDF_Stream();\r
582 \r
583     CPDF_Dictionary*            m_pDict;\r
584 \r
585     FX_DWORD                            m_dwSize;\r
586 \r
587     FX_DWORD                            m_GenNum;\r
588 \r
589     union {\r
590 \r
591         FX_LPBYTE                       m_pDataBuf;\r
592 \r
593         IFX_FileRead*           m_pFile;\r
594     };\r
595 \r
596     FX_FILESIZE                         m_FileOffset;\r
597 \r
598     CPDF_CryptoHandler*         m_pCryptoHandler;\r
599 \r
600     void                                        InitStream(CPDF_Dictionary* pDict);\r
601     friend class                        CPDF_Object;\r
602     friend class                        CPDF_StreamAcc;\r
603     friend class                        CPDF_AttachmentAcc;\r
604 };\r
605 class CPDF_StreamAcc : public CFX_Object\r
606 {\r
607 public:\r
608 \r
609     CPDF_StreamAcc();\r
610 \r
611     ~CPDF_StreamAcc();\r
612 \r
613     void                                        LoadAllData(const CPDF_Stream* pStream, FX_BOOL bRawAccess = FALSE,\r
614                                         FX_DWORD estimated_size = 0, FX_BOOL bImageAcc = FALSE);\r
615 \r
616     const CPDF_Stream*          GetStream() const\r
617     {\r
618         return m_pStream;\r
619     }\r
620 \r
621     CPDF_Dictionary*            GetDict() const\r
622     {\r
623         return m_pStream->GetDict();\r
624     }\r
625 \r
626     FX_LPCBYTE                          GetData() const;\r
627 \r
628     FX_DWORD                            GetSize() const;\r
629 \r
630     FX_LPBYTE                           DetachData();\r
631 \r
632     const CFX_ByteString&       GetImageDecoder()\r
633     {\r
634         return m_ImageDecoder;\r
635     }\r
636 \r
637     const CPDF_Dictionary*      GetImageParam()\r
638     {\r
639         return m_pImageParam;\r
640     }\r
641 protected:\r
642 \r
643     FX_LPBYTE                           m_pData;\r
644 \r
645     FX_DWORD                            m_dwSize;\r
646 \r
647     FX_BOOL                                     m_bNewBuf;\r
648 \r
649     CFX_ByteString                      m_ImageDecoder;\r
650 \r
651     CPDF_Dictionary*            m_pImageParam;\r
652 \r
653     const CPDF_Stream*          m_pStream;\r
654 \r
655     FX_LPBYTE                           m_pSrcData;\r
656 };\r
657 CFX_DataFilter* FPDF_CreateFilter(FX_BSTR name, const CPDF_Dictionary* pParam, int width = 0, int height = 0);\r
658 #define FPDF_FILTER_BUFFER_SIZE         20480\r
659 class CPDF_StreamFilter : public CFX_Object\r
660 {\r
661 public:\r
662 \r
663     ~CPDF_StreamFilter();\r
664 \r
665     FX_DWORD                    ReadBlock(FX_LPBYTE buffer, FX_DWORD size);\r
666 \r
667     FX_DWORD                    GetSrcPos()\r
668     {\r
669         return m_SrcOffset;\r
670     }\r
671 \r
672     const CPDF_Stream*  GetStream()\r
673     {\r
674         return m_pStream;\r
675     }\r
676 protected:\r
677 \r
678     CPDF_StreamFilter() {}\r
679 \r
680     FX_DWORD                    ReadLeftOver(FX_LPBYTE buffer, FX_DWORD buf_size);\r
681 \r
682     const CPDF_Stream*  m_pStream;\r
683 \r
684     CFX_DataFilter*             m_pFilter;\r
685 \r
686     CFX_BinaryBuf*              m_pBuffer;\r
687 \r
688     FX_DWORD                    m_BufOffset;\r
689 \r
690     FX_DWORD                    m_SrcOffset;\r
691 \r
692     FX_BYTE                             m_SrcBuffer[FPDF_FILTER_BUFFER_SIZE];\r
693     friend class CPDF_Stream;\r
694 };\r
695 class CPDF_Null : public CPDF_Object\r
696 {\r
697 public:\r
698 \r
699     static CPDF_Null*           Create()\r
700     {\r
701         return FX_NEW CPDF_Null();\r
702     }\r
703 \r
704     CPDF_Null()\r
705     {\r
706         m_Type = PDFOBJ_NULL;\r
707     }\r
708 };\r
709 class CPDF_Reference : public CPDF_Object\r
710 {\r
711 public:\r
712 \r
713     static CPDF_Reference*      Create(CPDF_IndirectObjects* pDoc, int objnum)\r
714     {\r
715         return FX_NEW CPDF_Reference(pDoc, objnum);\r
716     }\r
717 \r
718     CPDF_Reference(CPDF_IndirectObjects* pDoc, int objnum)\r
719     {\r
720         m_Type = PDFOBJ_REFERENCE;\r
721         m_pObjList = pDoc;\r
722         m_RefObjNum = objnum;\r
723     }\r
724 \r
725     CPDF_IndirectObjects*       GetObjList() const\r
726     {\r
727         return m_pObjList;\r
728     }\r
729 \r
730     FX_DWORD                            GetRefObjNum() const\r
731     {\r
732         return m_RefObjNum;\r
733     }\r
734 \r
735     void                                        SetRef(CPDF_IndirectObjects* pDoc, FX_DWORD objnum);\r
736 \r
737     FX_BOOL                                     Identical(CPDF_Reference* pOther) const\r
738     {\r
739         return m_RefObjNum == pOther->m_RefObjNum;\r
740     }\r
741 protected:\r
742 \r
743     CPDF_IndirectObjects*       m_pObjList;\r
744 \r
745     FX_DWORD                            m_RefObjNum;\r
746     friend class                        CPDF_Object;\r
747 };\r
748 class CPDF_IndirectObjects : public CFX_Object\r
749 {\r
750 public:\r
751 \r
752     CPDF_IndirectObjects(IPDF_DocParser* pParser);\r
753 \r
754     ~CPDF_IndirectObjects();\r
755 \r
756     CPDF_Object*                        GetIndirectObject(FX_DWORD objnum, struct PARSE_CONTEXT* pContext = NULL);\r
757 \r
758     int                                         GetIndirectType(FX_DWORD objnum);\r
759 \r
760     FX_DWORD                            AddIndirectObject(CPDF_Object* pObj);\r
761 \r
762     void                                        ReleaseIndirectObject(FX_DWORD objnum);\r
763 \r
764     void                                        InsertIndirectObject(FX_DWORD objnum, CPDF_Object* pObj);\r
765 \r
766     FX_DWORD                            GetLastObjNum() const;\r
767 \r
768     FX_POSITION                         GetStartPosition() const\r
769     {\r
770         return m_IndirectObjs.GetStartPosition();\r
771     }\r
772 \r
773     void                                        GetNextAssoc(FX_POSITION& rPos, FX_DWORD& objnum, CPDF_Object*& pObject) const\r
774     {\r
775         m_IndirectObjs.GetNextAssoc(rPos, (void*&)objnum, (void*&)pObject);\r
776     }\r
777 protected:\r
778 \r
779     CFX_MapPtrToPtr                     m_IndirectObjs;\r
780 \r
781     IPDF_DocParser*                     m_pParser;\r
782 \r
783     FX_DWORD                            m_LastObjNum;\r
784 };\r
785 #endif\r