1ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Copyright 2014 PDFium Authors. All rights reserved.
2ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Use of this source code is governed by a BSD-style license that can be
3ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// found in the LICENSE file.
4ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
5ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
7ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../../include/fpdfapi/fpdf_parser.h"
8ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_Object::Release()
9ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
10ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (this == NULL) {
11ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return;
12ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
13ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_ObjNum) {
14ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return;
15ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
16ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    Destroy();
17ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
18ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_Object::Destroy()
19ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
20ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    switch (m_Type) {
21ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        case PDFOBJ_STRING:
22ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            delete (CPDF_String*)this;
23ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            break;
24ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        case PDFOBJ_NAME:
25ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            delete (CPDF_Name*)this;
26ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            break;
27ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        case PDFOBJ_ARRAY:
28ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            delete (CPDF_Array*)this;
29ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            break;
30ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        case PDFOBJ_DICTIONARY:
31ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            delete (CPDF_Dictionary*)this;
32ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            break;
33ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        case PDFOBJ_STREAM:
34ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            delete (CPDF_Stream*)this;
35ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            break;
36ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        default:
37ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            delete this;
38ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
39ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
40ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFX_ByteString CPDF_Object::GetString() const
41ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
42ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (this == NULL) {
43ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return CFX_ByteString();
44ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
45ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    switch (m_Type) {
46ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        case PDFOBJ_BOOLEAN:
47ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return ((CPDF_Boolean*)this)->m_bValue ? "true" : "false";
48ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        case PDFOBJ_NUMBER:
49ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return ((CPDF_Number*)this)->GetString();
50ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        case PDFOBJ_STRING:
51ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return ((CPDF_String*)this)->m_String;
52ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        case PDFOBJ_NAME:
53ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return ((CPDF_Name*)this)->m_Name;
54ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        case PDFOBJ_REFERENCE: {
55ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                CPDF_Reference* pRef = (CPDF_Reference*)(FX_LPVOID)this;
56ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if (pRef->m_pObjList == NULL) {
57ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    break;
58ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
59ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                CPDF_Object* pObj = pRef->m_pObjList->GetIndirectObject(pRef->m_RefObjNum);
60ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if (pObj == NULL) {
61ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    return CFX_ByteString();
62ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
63ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return pObj->GetString();
64ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
65ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
66ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return CFX_ByteString();
67ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
68ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFX_ByteStringC CPDF_Object::GetConstString() const
69ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
70ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (this == NULL) {
71ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return CFX_ByteStringC();
72ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
73ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    switch (m_Type) {
74ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        case PDFOBJ_STRING:
75ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return CFX_ByteStringC((FX_LPCBYTE)((CPDF_String*)this)->m_String, ((CPDF_String*)this)->m_String.GetLength());
76ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        case PDFOBJ_NAME:
77ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return CFX_ByteStringC((FX_LPCBYTE)((CPDF_Name*)this)->m_Name, ((CPDF_Name*)this)->m_Name.GetLength());
78ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        case PDFOBJ_REFERENCE: {
79ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                CPDF_Reference* pRef = (CPDF_Reference*)(FX_LPVOID)this;
80ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if (pRef->m_pObjList == NULL) {
81ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    break;
82ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
83ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                CPDF_Object* pObj = pRef->m_pObjList->GetIndirectObject(pRef->m_RefObjNum);
84ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if (pObj == NULL) {
85ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    return CFX_ByteStringC();
86ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
87ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return pObj->GetConstString();
88ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
89ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
90ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return CFX_ByteStringC();
91ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
92ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_FLOAT CPDF_Object::GetNumber() const
93ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
94ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (this == NULL) {
95ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return 0;
96ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
97ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    switch (m_Type) {
98ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        case PDFOBJ_NUMBER:
99ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return ((CPDF_Number*)this)->GetNumber();
100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        case PDFOBJ_REFERENCE: {
101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                CPDF_Reference* pRef = (CPDF_Reference*)(FX_LPVOID)this;
102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if (pRef->m_pObjList == NULL) {
103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    break;
104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                CPDF_Object* pObj = pRef->m_pObjList->GetIndirectObject(pRef->m_RefObjNum);
106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if (pObj == NULL) {
107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    return 0;
108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return pObj->GetNumber();
110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return 0;
113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
114ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_FLOAT CPDF_Object::GetNumber16() const
115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return GetNumber();
117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovint CPDF_Object::GetInteger() const
119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (this == NULL) {
121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return 0;
122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    switch (m_Type) {
124ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        case PDFOBJ_BOOLEAN:
125ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return ((CPDF_Boolean*)this)->m_bValue;
126ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        case PDFOBJ_NUMBER:
127ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return ((CPDF_Number*)this)->GetInteger();
128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        case PDFOBJ_REFERENCE: {
129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                CPDF_Reference* pRef = (CPDF_Reference*)(FX_LPVOID)this;
130ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                PARSE_CONTEXT context;
131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                FXSYS_memset32(&context, 0, sizeof(PARSE_CONTEXT));
132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if (pRef->m_pObjList == NULL) {
133ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    return 0;
134ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                CPDF_Object* pObj = pRef->m_pObjList->GetIndirectObject(pRef->m_RefObjNum, &context);
136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if (pObj == NULL) {
137ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    return 0;
138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return pObj->GetInteger();
140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
142ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return 0;
143ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
144ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Dictionary* CPDF_Object::GetDict() const
145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
146ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (this == NULL) {
147ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
148ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
149ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    switch (m_Type) {
150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        case PDFOBJ_DICTIONARY:
151ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return (CPDF_Dictionary*)this;
152ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        case PDFOBJ_STREAM:
153ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return ((CPDF_Stream*)this)->GetDict();
154ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        case PDFOBJ_REFERENCE: {
155ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                CPDF_Reference* pRef = (CPDF_Reference*)this;
156ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if (pRef->m_pObjList == NULL) {
157ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    break;
158ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
159ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                CPDF_Object* pObj = pRef->m_pObjList->GetIndirectObject(pRef->m_RefObjNum);
160ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if (pObj == NULL) {
161ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    return NULL;
162ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
163ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return pObj->GetDict();
164ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
165ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
166ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return NULL;
167ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
168ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Array* CPDF_Object::GetArray() const
169ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
170ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (this == NULL) {
171ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
172ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
173ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_Type == PDFOBJ_ARRAY) {
174ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return (CPDF_Array*)this;
175ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
176ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return NULL;
177ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
178ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_Object::SetString(const CFX_ByteString& str)
179ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
180ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    ASSERT(this != NULL);
181ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    switch (m_Type) {
182ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        case PDFOBJ_BOOLEAN:
183ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            ((CPDF_Boolean*)this)->m_bValue = str == FX_BSTRC("true") ? 1 : 0;
184ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return;
185ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        case PDFOBJ_NUMBER:
186ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            ((CPDF_Number*)this)->SetString(str);
187ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return;
188ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        case PDFOBJ_STRING:
189ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            ((CPDF_String*)this)->m_String = str;
190ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return;
191ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        case PDFOBJ_NAME:
192ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            ((CPDF_Name*)this)->m_Name = str;
193ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return;
194ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
195ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    ASSERT(FALSE);
196ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
197ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovint CPDF_Object::GetDirectType() const
198ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
199ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_Type != PDFOBJ_REFERENCE) {
200ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return m_Type;
201ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
202ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Reference* pRef = (CPDF_Reference*)this;
203ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return pRef->m_pObjList->GetIndirectType(pRef->m_RefObjNum);
204ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
205ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_Object::IsIdentical(CPDF_Object* pOther) const
206ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
207ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (this == pOther) {
208ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return TRUE;
209ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
210ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (this == NULL || pOther == NULL) {
211ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
212ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
213ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pOther->m_Type != m_Type) {
214ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (m_Type == PDFOBJ_REFERENCE) {
215ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return GetDirect()->IsIdentical(pOther);
216ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        } else if (pOther->m_Type == PDFOBJ_REFERENCE) {
217ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return IsIdentical(pOther->GetDirect());
218ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
219ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
220ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
221ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    switch (m_Type) {
222ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        case PDFOBJ_BOOLEAN:
223ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return (((CPDF_Boolean*)this)->Identical((CPDF_Boolean*)pOther));
224ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        case PDFOBJ_NUMBER:
225ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return (((CPDF_Number*)this)->Identical((CPDF_Number*)pOther));
226ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        case PDFOBJ_STRING:
227ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return (((CPDF_String*)this)->Identical((CPDF_String*)pOther));
228ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        case PDFOBJ_NAME:
229ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return (((CPDF_Name*)this)->Identical((CPDF_Name*)pOther));
230ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        case PDFOBJ_ARRAY:
231ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return (((CPDF_Array*)this)->Identical((CPDF_Array*)pOther));
232ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        case PDFOBJ_DICTIONARY:
233ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return (((CPDF_Dictionary*)this)->Identical((CPDF_Dictionary*)pOther));
234ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        case PDFOBJ_NULL:
235ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return TRUE;
236ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        case PDFOBJ_STREAM:
237ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return (((CPDF_Stream*)this)->Identical((CPDF_Stream*)pOther));
238ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        case PDFOBJ_REFERENCE:
239ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return (((CPDF_Reference*)this)->Identical((CPDF_Reference*)pOther));
240ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
241ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return FALSE;
242ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
243ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Object* CPDF_Object::GetDirect() const
244ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
245ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (this == NULL) {
246ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
247ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
248ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_Type != PDFOBJ_REFERENCE) {
249ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return (CPDF_Object*)this;
250ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
251ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Reference* pRef = (CPDF_Reference*)(FX_LPVOID)this;
252ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pRef->m_pObjList == NULL) {
253ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
254ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
255ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return pRef->m_pObjList->GetIndirectObject(pRef->m_RefObjNum);
256ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
257ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Object* CPDF_Object::Clone(FX_BOOL bDirect) const
258ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
259ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_MapPtrToPtr visited;
260ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return CloneInternal(bDirect, &visited);
261ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
262ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Object* CPDF_Object::CloneInternal(FX_BOOL bDirect, CFX_MapPtrToPtr* visited) const
263ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
264ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (this == NULL) {
265ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
266ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
267ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    switch (m_Type) {
268ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        case PDFOBJ_BOOLEAN:
269ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return FX_NEW CPDF_Boolean(((CPDF_Boolean*)this)->m_bValue);
270ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        case PDFOBJ_NUMBER:
271ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return FX_NEW CPDF_Number(((CPDF_Number*)this)->m_bInteger, &((CPDF_Number*)this)->m_Integer);
272ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        case PDFOBJ_STRING:
273ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return FX_NEW CPDF_String(((CPDF_String*)this)->m_String, ((CPDF_String*)this)->IsHex());
274ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        case PDFOBJ_NAME:
275ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return FX_NEW CPDF_Name(((CPDF_Name*)this)->m_Name);
276ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        case PDFOBJ_ARRAY: {
277ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                CPDF_Array* pCopy = FX_NEW CPDF_Array();
278ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                CPDF_Array* pThis = (CPDF_Array*)this;
279ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                int n = pThis->GetCount();
280ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                for (int i = 0; i < n; i ++) {
281ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    CPDF_Object* value = (CPDF_Object*)pThis->m_Objects.GetAt(i);
282ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    pCopy->m_Objects.Add(value->CloneInternal(bDirect, visited));
283ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
284ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return pCopy;
285ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
286ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        case PDFOBJ_DICTIONARY: {
287ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                CPDF_Dictionary* pCopy = FX_NEW CPDF_Dictionary();
288ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                CPDF_Dictionary* pThis = (CPDF_Dictionary*)this;
289ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                FX_POSITION pos = pThis->m_Map.GetStartPosition();
290ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                while (pos) {
291ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    CFX_ByteString key;
292ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    CPDF_Object* value;
293ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    pThis->m_Map.GetNextAssoc(pos, key, (void*&)value);
294ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    pCopy->m_Map.SetAt(key, value->CloneInternal(bDirect, visited));
295ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
296ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return pCopy;
297ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
298ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        case PDFOBJ_NULL: {
299ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return FX_NEW CPDF_Null;
300ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
301ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        case PDFOBJ_STREAM: {
302ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                CPDF_Stream* pThis = (CPDF_Stream*)this;
303ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                CPDF_StreamAcc acc;
304ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                acc.LoadAllData(pThis, TRUE);
305ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                FX_DWORD streamSize = acc.GetSize();
306ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                CPDF_Stream* pObj = FX_NEW CPDF_Stream(acc.DetachData(), streamSize, (CPDF_Dictionary*)((CPDF_Object*)pThis->GetDict())->CloneInternal(bDirect, visited));
307ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return pObj;
308ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
309ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        case PDFOBJ_REFERENCE: {
310ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                CPDF_Reference* pRef = (CPDF_Reference*)this;
311ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                FX_DWORD obj_num = pRef->m_RefObjNum;
312ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                if (bDirect && !visited->GetValueAt((void*)(FX_UINTPTR)obj_num)) {
313ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    visited->SetAt((void*)(FX_UINTPTR)obj_num, (void*)1);
314ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    CPDF_Object* ret = pRef->GetDirect()->CloneInternal(TRUE, visited);
315ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    return ret;
316ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                } else {
317ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    return FX_NEW CPDF_Reference(pRef->m_pObjList, obj_num);
318ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                }
319ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
320ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
321ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return NULL;
322ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
323ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Object* CPDF_Object::CloneRef(CPDF_IndirectObjects* pDoc) const
324ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
325ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (this == NULL) {
326ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
327ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
328ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_ObjNum) {
329ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FX_NEW CPDF_Reference(pDoc, m_ObjNum);
330ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
331ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return Clone();
332ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
333ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFX_WideString CPDF_Object::GetUnicodeText(CFX_CharMap* pCharMap) const
334ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
335ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (this == NULL) {
336ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return CFX_WideString();
337ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
338ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_Type == PDFOBJ_STRING) {
339ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return PDF_DecodeText(((CPDF_String*)this)->m_String, pCharMap);
340ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    } else if (m_Type == PDFOBJ_STREAM) {
341ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_StreamAcc stream;
342ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        stream.LoadAllData((CPDF_Stream*)this, FALSE);
343ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CFX_WideString result = PDF_DecodeText(stream.GetData(), stream.GetSize(), pCharMap);
344ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return result;
345ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    } else if (m_Type == PDFOBJ_NAME) {
346ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return PDF_DecodeText(((CPDF_Name*)this)->m_Name, pCharMap);
347ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
348ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return CFX_WideString();
349ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
350ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_Object::SetUnicodeText(FX_LPCWSTR pUnicodes, int len)
351ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
352ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (this == NULL) {
353ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return;
354ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
355ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_Type == PDFOBJ_STRING) {
356ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        ((CPDF_String*)this)->m_String = PDF_EncodeText(pUnicodes, len);
357ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    } else if (m_Type == PDFOBJ_STREAM) {
358ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CFX_ByteString result = PDF_EncodeText(pUnicodes, len);
359ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        ((CPDF_Stream*)this)->SetData((FX_LPBYTE)(FX_LPCSTR)result, result.GetLength(), FALSE, FALSE);
360ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
361ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
362ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Number::CPDF_Number(int value)
363ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
364ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_Type = PDFOBJ_NUMBER;
365ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_bInteger = TRUE;
366ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_Integer = value;
367ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
368ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Number::CPDF_Number(FX_FLOAT value)
369ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
370ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_Type = PDFOBJ_NUMBER;
371ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_bInteger = FALSE;
372ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_Float = value;
373ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
374ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Number::CPDF_Number(FX_BOOL bInteger, void* pData)
375ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
376ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_Type = PDFOBJ_NUMBER;
377ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_bInteger = bInteger;
378ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_Integer = *(int*)pData;
379ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
380ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovextern void FX_atonum(FX_BSTR, FX_BOOL&, void*);
381ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Number::CPDF_Number(FX_BSTR str)
382ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
383ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_Type = PDFOBJ_NUMBER;
384ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_atonum(str, m_bInteger, &m_Integer);
385ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
386ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_Number::SetString(FX_BSTR str)
387ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
388ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_atonum(str, m_bInteger, &m_Integer);
389ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
390ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_Number::Identical(CPDF_Number* pOther) const
391ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
392ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return m_bInteger == pOther->m_bInteger && m_Integer == pOther->m_Integer;
393ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
394ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFX_ByteString CPDF_Number::GetString() const
395ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
396ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return m_bInteger ? CFX_ByteString::FormatInteger(m_Integer, FXFORMAT_SIGNED) : CFX_ByteString::FormatFloat(m_Float);
397ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
398ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_Number::SetNumber(FX_FLOAT value)
399ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
400ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_bInteger = FALSE;
401ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_Float = value;
402ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
403ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_String::CPDF_String(const CFX_WideString& str)
404ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
405ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_Type = PDFOBJ_STRING;
406ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_String = PDF_EncodeText(str, str.GetLength());
407ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_bHex = FALSE;
408ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
409ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Array::~CPDF_Array()
410ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
411ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int size = m_Objects.GetSize();
412ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Object** pList = (CPDF_Object**)m_Objects.GetData();
413ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    for (int i = 0; i < size; i ++) {
414ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        pList[i]->Release();
415ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
416ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
417ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFX_FloatRect CPDF_Array::GetRect()
418ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
419ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_FloatRect rect;
420ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (this == NULL || m_Type != PDFOBJ_ARRAY || m_Objects.GetSize() != 4) {
421ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return rect;
422ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
423ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    rect.left = GetNumber(0);
424ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    rect.bottom = GetNumber(1);
425ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    rect.right = GetNumber(2);
426ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    rect.top = GetNumber(3);
427ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return rect;
428ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
429ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFX_AffineMatrix CPDF_Array::GetMatrix()
430ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
431ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_AffineMatrix matrix;
432ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (this == NULL || m_Type != PDFOBJ_ARRAY || m_Objects.GetSize() != 6) {
433ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return matrix;
434ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
435ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    matrix.Set(GetNumber(0), GetNumber(1), GetNumber(2), GetNumber(3), GetNumber(4), GetNumber(5));
436ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return matrix;
437ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
438ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Object* CPDF_Array::GetElement(FX_DWORD i) const
439ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
440ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (this == NULL) {
441ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
442ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
443ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (i >= (FX_DWORD)m_Objects.GetSize()) {
444ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
445ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
446ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return (CPDF_Object*)m_Objects.GetAt(i);
447ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
448ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Object* CPDF_Array::GetElementValue(FX_DWORD i) const
449ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
450ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (this == NULL) {
451ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
452ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
453ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (i >= (FX_DWORD)m_Objects.GetSize()) {
454ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
455ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
456ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return ((CPDF_Object*)m_Objects.GetAt(i))->GetDirect();
457ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
458ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFX_ByteString CPDF_Array::GetString(FX_DWORD i) const
459ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
460ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (this && i < (FX_DWORD)m_Objects.GetSize()) {
461ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_Object* p = (CPDF_Object*)m_Objects.GetAt(i);
462ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return p->GetString();
463ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
464ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return CFX_ByteString();
465ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
466ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFX_ByteStringC CPDF_Array::GetConstString(FX_DWORD i) const
467ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
468ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (this && i < (FX_DWORD)m_Objects.GetSize()) {
469ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_Object* p = (CPDF_Object*)m_Objects.GetAt(i);
470ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return p->GetConstString();
471ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
472ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return CFX_ByteStringC();
473ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
474ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovint CPDF_Array::GetInteger(FX_DWORD i) const
475ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
476ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (this == NULL || i >= (FX_DWORD)m_Objects.GetSize()) {
477ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return 0;
478ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
479ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Object* p = (CPDF_Object*)m_Objects.GetAt(i);
480ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return p->GetInteger();
481ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
482ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_FLOAT CPDF_Array::GetNumber(FX_DWORD i) const
483ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
484ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (this == NULL || i >= (FX_DWORD)m_Objects.GetSize()) {
485ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return 0;
486ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
487ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Object* p = (CPDF_Object*)m_Objects.GetAt(i);
488ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return p->GetNumber();
489ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
490ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Dictionary* CPDF_Array::GetDict(FX_DWORD i) const
491ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
492ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Object* p = GetElementValue(i);
493ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (p == NULL) {
494ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
495ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    } else if (p->GetType() == PDFOBJ_DICTIONARY) {
496ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return (CPDF_Dictionary*)p;
497ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    } else if (p->GetType() == PDFOBJ_STREAM) {
498ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return ((CPDF_Stream*)p)->GetDict();
499ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
500ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return NULL;
501ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
502ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Stream* CPDF_Array::GetStream(FX_DWORD i) const
503ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
504ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Object* p = GetElementValue(i);
505ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (p == NULL || p->GetType() != PDFOBJ_STREAM) {
506ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
507ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
508ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return (CPDF_Stream*)p;
509ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
510ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Array* CPDF_Array::GetArray(FX_DWORD i) const
511ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
512ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Object* p = GetElementValue(i);
513ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (p == NULL || p->GetType() != PDFOBJ_ARRAY) {
514ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
515ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
516ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return (CPDF_Array*)p;
517ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
518ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_Array::RemoveAt(FX_DWORD i)
519ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
520ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    ASSERT(this != NULL && m_Type == PDFOBJ_ARRAY);
521ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (i >= (FX_DWORD)m_Objects.GetSize()) {
522ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return;
523ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
524ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Object* p = (CPDF_Object*)m_Objects.GetAt(i);
525ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    p->Release();
526ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_Objects.RemoveAt(i);
527ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
528ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_Array::SetAt(FX_DWORD i, CPDF_Object* pObj, CPDF_IndirectObjects* pObjs)
529ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
530ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    ASSERT(this != NULL && m_Type == PDFOBJ_ARRAY);
531ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    ASSERT(i < (FX_DWORD)m_Objects.GetSize());
532ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (i >= (FX_DWORD)m_Objects.GetSize()) {
533ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return;
534ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
535ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Object* pOld = (CPDF_Object*)m_Objects.GetAt(i);
536ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    pOld->Release();
537ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pObj->GetObjNum()) {
538ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        ASSERT(pObjs != NULL);
539ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        pObj = CPDF_Reference::Create(pObjs, pObj->GetObjNum());
540ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
541ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_Objects.SetAt(i, pObj);
542ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
543ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_Array::InsertAt(FX_DWORD index, CPDF_Object* pObj, CPDF_IndirectObjects* pObjs)
544ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
545ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    ASSERT(pObj != NULL);
546ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pObj->GetObjNum()) {
547ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        ASSERT(pObjs != NULL);
548ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        pObj = CPDF_Reference::Create(pObjs, pObj->GetObjNum());
549ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
550ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_Objects.InsertAt(index, pObj);
551ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
552ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_Array::Add(CPDF_Object* pObj, CPDF_IndirectObjects* pObjs)
553ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
554ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    ASSERT(pObj != NULL);
555ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pObj->GetObjNum()) {
556ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        ASSERT(pObjs != NULL);
557ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        pObj = CPDF_Reference::Create(pObjs, pObj->GetObjNum());
558ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
559ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_Objects.Add(pObj);
560ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
561ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_Array::AddName(const CFX_ByteString& str)
562ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
563ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    ASSERT(this != NULL && m_Type == PDFOBJ_ARRAY);
564ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    Add(FX_NEW CPDF_Name(str));
565ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
566ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_Array::AddString(const CFX_ByteString& str)
567ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
568ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    ASSERT(this != NULL && m_Type == PDFOBJ_ARRAY);
569ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    Add(FX_NEW CPDF_String(str));
570ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
571ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_Array::AddInteger(int i)
572ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
573ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    ASSERT(this != NULL && m_Type == PDFOBJ_ARRAY);
574ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    Add(FX_NEW CPDF_Number(i));
575ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
576ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_Array::AddNumber(FX_FLOAT f)
577ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
578ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    ASSERT(this != NULL && m_Type == PDFOBJ_ARRAY);
579ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Number* pNumber = FX_NEW CPDF_Number;
580ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    pNumber->SetNumber(f);
581ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    Add(pNumber);
582ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
583ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_Array::AddReference(CPDF_IndirectObjects* pDoc, FX_DWORD objnum)
584ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
585ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    ASSERT(this != NULL && m_Type == PDFOBJ_ARRAY);
586ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    Add(FX_NEW CPDF_Reference(pDoc, objnum));
587ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
588ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_Array::Identical(CPDF_Array* pOther) const
589ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
590ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_Objects.GetSize() != pOther->m_Objects.GetSize()) {
591ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
592ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
593ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    for (int i = 0; i < m_Objects.GetSize(); i ++)
594ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (!((CPDF_Object*)m_Objects[i])->IsIdentical((CPDF_Object*)pOther->m_Objects[i])) {
595ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return FALSE;
596ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
597ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return TRUE;
598ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
599ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Dictionary::~CPDF_Dictionary()
600ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
601ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_POSITION pos = m_Map.GetStartPosition();
602ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    while (pos) {
603ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_LPVOID value = m_Map.GetNextValue(pos);
604ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        ((CPDF_Object*)value)->Release();
605ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
606ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
607ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_POSITION CPDF_Dictionary::GetStartPos() const
608ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
609ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return m_Map.GetStartPosition();
610ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
611ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Object* CPDF_Dictionary::GetNextElement(FX_POSITION& pos, CFX_ByteString& key) const
612ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
613ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pos == NULL) {
614ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
615ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
616ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Object* p;
617ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_Map.GetNextAssoc(pos, key, (FX_LPVOID&)p);
618ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return p;
619ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
620ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Object* CPDF_Dictionary::GetElement(FX_BSTR key) const
621ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
622ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (this == NULL) {
623ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
624ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
625ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Object* p = NULL;
626ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_Map.Lookup(key, (void*&)p);
627ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return p;
628ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
629ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Object* CPDF_Dictionary::GetElementValue(FX_BSTR key) const
630ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
631ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (this == NULL) {
632ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
633ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
634ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Object* p = NULL;
635ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_Map.Lookup(key, (void*&)p);
636ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return p->GetDirect();
637ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
638ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFX_ByteString CPDF_Dictionary::GetString(FX_BSTR key) const
639ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
640ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (this) {
641ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_Object* p = NULL;
642ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_Map.Lookup(key, (void*&)p);
643ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (p) {
644ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return p->GetString();
645ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
646ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
647ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return CFX_ByteString();
648ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
649ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFX_ByteStringC CPDF_Dictionary::GetConstString(FX_BSTR key) const
650ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
651ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (this) {
652ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_Object* p = NULL;
653ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_Map.Lookup(key, (void*&)p);
654ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (p) {
655ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return p->GetConstString();
656ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
657ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
658ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return CFX_ByteStringC();
659ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
660ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFX_WideString CPDF_Dictionary::GetUnicodeText(FX_BSTR key, CFX_CharMap* pCharMap) const
661ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
662ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (this) {
663ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_Object* p = NULL;
664ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_Map.Lookup(key, (void*&)p);
665ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (p) {
666ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if(p->GetType() == PDFOBJ_REFERENCE) {
667ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                p = ((CPDF_Reference*)p)->GetDirect();
668ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return p->GetUnicodeText(pCharMap);
669ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            } else {
670ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return p->GetUnicodeText(pCharMap);
671ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
672ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
673ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
674ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return CFX_WideString();
675ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
676ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFX_ByteString CPDF_Dictionary::GetString(FX_BSTR key, FX_BSTR def) const
677ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
678ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (this) {
679ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_Object* p = NULL;
680ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_Map.Lookup(key, (void*&)p);
681ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (p) {
682ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return p->GetString();
683ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
684ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
685ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return CFX_ByteString(def);
686ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
687ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFX_ByteStringC CPDF_Dictionary::GetConstString(FX_BSTR key, FX_BSTR def) const
688ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
689ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (this) {
690ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_Object* p = NULL;
691ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_Map.Lookup(key, (void*&)p);
692ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (p) {
693ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return p->GetConstString();
694ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
695ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
696ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return CFX_ByteStringC(def);
697ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
698ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovint CPDF_Dictionary::GetInteger(FX_BSTR key) const
699ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
700ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (this) {
701ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_Object* p = NULL;
702ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_Map.Lookup(key, (void*&)p);
703ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (p) {
704ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return p->GetInteger();
705ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
706ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
707ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return 0;
708ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
709ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovint CPDF_Dictionary::GetInteger(FX_BSTR key, int def) const
710ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
711ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (this) {
712ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_Object* p = NULL;
713ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_Map.Lookup(key, (void*&)p);
714ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (p) {
715ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return p->GetInteger();
716ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
717ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
718ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return def;
719ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
720ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_FLOAT CPDF_Dictionary::GetNumber(FX_BSTR key) const
721ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
722ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (this) {
723ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_Object* p = NULL;
724ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_Map.Lookup(key, (void*&)p);
725ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (p) {
726ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return p->GetNumber();
727ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
728ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
729ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return 0;
730ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
731ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_Dictionary::GetBoolean(FX_BSTR key, FX_BOOL bDefault) const
732ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
733ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (this) {
734ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_Object* p = NULL;
735ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_Map.Lookup(key, (void*&)p);
736ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (p && p->GetType() == PDFOBJ_BOOLEAN) {
737ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return p->GetInteger();
738ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
739ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
740ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return bDefault;
741ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
742ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Dictionary* CPDF_Dictionary::GetDict(FX_BSTR key) const
743ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
744ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Object* p = GetElementValue(key);
745ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (p == NULL) {
746ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
747ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    } else if (p->GetType() == PDFOBJ_DICTIONARY) {
748ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return (CPDF_Dictionary*)p;
749ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    } else if (p->GetType() == PDFOBJ_STREAM) {
750ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return ((CPDF_Stream*)p)->GetDict();
751ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
752ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return NULL;
753ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
754ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Array* CPDF_Dictionary::GetArray(FX_BSTR key) const
755ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
756ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Object* p = GetElementValue(key);
757ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (p == NULL || p->GetType() != PDFOBJ_ARRAY) {
758ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
759ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
760ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return (CPDF_Array*)p;
761ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
762ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Stream* CPDF_Dictionary::GetStream(FX_BSTR key) const
763ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
764ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Object* p = GetElementValue(key);
765ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (p == NULL || p->GetType() != PDFOBJ_STREAM) {
766ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
767ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
768ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return (CPDF_Stream*)p;
769ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
770ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFX_FloatRect CPDF_Dictionary::GetRect(FX_BSTR key) const
771ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
772ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_FloatRect rect;
773ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Array* pArray = GetArray(key);
774ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pArray) {
775ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        rect = pArray->GetRect();
776ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
777ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return rect;
778ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
779ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFX_AffineMatrix CPDF_Dictionary::GetMatrix(FX_BSTR key) const
780ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
781ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CFX_AffineMatrix matrix;
782ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Array* pArray = GetArray(key);
783ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pArray) {
784ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        matrix = pArray->GetMatrix();
785ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
786ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return matrix;
787ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
788ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_Dictionary::KeyExist(FX_BSTR key) const
789ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
790ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (this == NULL) {
791ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
792ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
793ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_LPVOID value;
794ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return m_Map.Lookup(key, value);
795ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
796ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_Dictionary::SetAt(FX_BSTR key, CPDF_Object* pObj, CPDF_IndirectObjects* pObjs)
797ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
798ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    ASSERT(this != NULL && m_Type == PDFOBJ_DICTIONARY);
799ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Object* p = NULL;
800ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_Map.Lookup(key, (void*&)p);
801ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (p == pObj) {
802ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return;
803ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
804ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (p) {
805ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        p->Release();
806ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
807ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pObj) {
808ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (pObj->GetObjNum()) {
809ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            ASSERT(pObjs != NULL);
810ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            pObj = CPDF_Reference::Create(pObjs, pObj->GetObjNum());
811ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
812ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_Map.SetAt(key, pObj);
813ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    } else {
814ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_Map.RemoveKey(key);
815ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
816ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
817ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_Dictionary::AddValue(FX_BSTR key, CPDF_Object* pObj)
818ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
819ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    ASSERT(this != NULL && m_Type == PDFOBJ_DICTIONARY);
820ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_Map.AddValue(key, pObj);
821ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
822ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_Dictionary::RemoveAt(FX_BSTR key)
823ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
824ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    ASSERT(this != NULL && m_Type == PDFOBJ_DICTIONARY);
825ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Object* p = NULL;
826ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_Map.Lookup(key, (void*&)p);
827ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (p == NULL) {
828ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return;
829ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
830ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    p->Release();
831ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_Map.RemoveKey(key);
832ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
833ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_Dictionary::ReplaceKey(FX_BSTR oldkey, FX_BSTR newkey)
834ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
835ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    ASSERT(this != NULL && m_Type == PDFOBJ_DICTIONARY);
836ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Object* p = NULL;
837ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_Map.Lookup(oldkey, (void*&)p);
838ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (p == NULL) {
839ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return;
840ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
841ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_Map.RemoveKey(oldkey);
842ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_Map.SetAt(newkey, p);
843ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
844ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_Dictionary::Identical(CPDF_Dictionary* pOther) const
845ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
846ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (this == NULL) {
847ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (pOther == NULL) {
848ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return TRUE;
849ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
850ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
851ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
852ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pOther == NULL) {
853ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
854ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
855ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_Map.GetCount() != pOther->m_Map.GetCount()) {
856ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
857ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
858ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_POSITION pos = m_Map.GetStartPosition();
859ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    while (pos) {
860ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CFX_ByteString key;
861ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_LPVOID value;
862ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_Map.GetNextAssoc(pos, key, value);
863ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (!((CPDF_Object*)value)->IsIdentical(pOther->GetElement(key))) {
864ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return FALSE;
865ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
866ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
867ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return TRUE;
868ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
869ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_Dictionary::SetAtInteger(FX_BSTR key, int i)
870ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
871ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    SetAt(key, FX_NEW CPDF_Number(i));
872ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
873ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_Dictionary::SetAtName(FX_BSTR key, const CFX_ByteString& name)
874ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
875ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    SetAt(key, FX_NEW CPDF_Name(name));
876ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
877ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_Dictionary::SetAtString(FX_BSTR key, const CFX_ByteString& str)
878ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
879ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    SetAt(key, FX_NEW CPDF_String(str));
880ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
881ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_Dictionary::SetAtReference(FX_BSTR key, CPDF_IndirectObjects* pDoc, FX_DWORD objnum)
882ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
883ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    SetAt(key, FX_NEW CPDF_Reference(pDoc, objnum));
884ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
885ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_Dictionary::AddReference(FX_BSTR key, CPDF_IndirectObjects* pDoc, FX_DWORD objnum)
886ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
887ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    AddValue(key, FX_NEW CPDF_Reference(pDoc, objnum));
888ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
889ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_Dictionary::SetAtNumber(FX_BSTR key, FX_FLOAT f)
890ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
891ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Number* pNumber = FX_NEW CPDF_Number;
892ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    pNumber->SetNumber(f);
893ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    SetAt(key, pNumber);
894ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
895ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_Dictionary::SetAtBoolean(FX_BSTR key, FX_BOOL bValue)
896ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
897ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    SetAt(key, FX_NEW CPDF_Boolean(bValue));
898ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
899ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_Dictionary::SetAtRect(FX_BSTR key, const CFX_FloatRect& rect)
900ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
901ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Array* pArray = FX_NEW CPDF_Array;
902ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    pArray->AddNumber(rect.left);
903ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    pArray->AddNumber(rect.bottom);
904ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    pArray->AddNumber(rect.right);
905ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    pArray->AddNumber(rect.top);
906ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    SetAt(key, pArray);
907ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
908ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_Dictionary::SetAtMatrix(FX_BSTR key, const CFX_AffineMatrix& matrix)
909ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
910ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Array* pArray = FX_NEW CPDF_Array;
911ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    pArray->AddNumber16(matrix.a);
912ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    pArray->AddNumber16(matrix.b);
913ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    pArray->AddNumber16(matrix.c);
914ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    pArray->AddNumber16(matrix.d);
915ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    pArray->AddNumber(matrix.e);
916ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    pArray->AddNumber(matrix.f);
917ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    SetAt(key, pArray);
918ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
919ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Stream::CPDF_Stream(FX_LPBYTE pData, FX_DWORD size, CPDF_Dictionary* pDict)
920ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
921ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_Type = PDFOBJ_STREAM;
922ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_pDict = pDict;
923ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_dwSize = size;
924ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_GenNum = (FX_DWORD) - 1;
925ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_pDataBuf = pData;
926ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_pCryptoHandler = NULL;
927ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
928ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Stream::~CPDF_Stream()
929ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
930ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_GenNum == (FX_DWORD) - 1 && m_pDataBuf != NULL) {
931ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_Free(m_pDataBuf);
932ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
933ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_pDict) {
934ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_pDict->Release();
935ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
936ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
937ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_Stream::InitStream(CPDF_Dictionary* pDict)
938ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
939ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pDict) {
940ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (m_pDict) {
941ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_pDict->Release();
942ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
943ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_pDict = pDict;
944ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
945ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_GenNum == (FX_DWORD) - 1) {
946ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (m_pDataBuf) {
947ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            FX_Free(m_pDataBuf);
948ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
949ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
950ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_GenNum = 0;
951ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_pFile = NULL;
952ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_pCryptoHandler = NULL;
953ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_FileOffset = 0;
954ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
955ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_Stream::InitStream(FX_LPBYTE pData, FX_DWORD size, CPDF_Dictionary* pDict)
956ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
957ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    InitStream(pDict);
958ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_GenNum = (FX_DWORD) - 1;
959ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_pDataBuf = FX_Alloc(FX_BYTE, size);
960ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pData) {
961ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FXSYS_memcpy32(m_pDataBuf, pData, size);
962ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
963ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_dwSize = size;
964ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_pDict) {
965ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_pDict->SetAtInteger(FX_BSTRC("Length"), size);
966ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
967ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
968ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_Stream::SetData(FX_LPCBYTE pData, FX_DWORD size, FX_BOOL bCompressed, FX_BOOL bKeepBuf)
969ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
970ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_GenNum == (FX_DWORD) - 1) {
971ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (m_pDataBuf) {
972ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            FX_Free(m_pDataBuf);
973ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
974ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    } else {
975ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_GenNum = (FX_DWORD) - 1;
976ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_pCryptoHandler = NULL;
977ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
978ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (bKeepBuf) {
979ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_pDataBuf = (FX_LPBYTE)pData;
980ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    } else {
981ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_pDataBuf = FX_Alloc(FX_BYTE, size);
982ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (pData) {
983ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            FXSYS_memcpy32(m_pDataBuf, pData, size);
984ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
985ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
986ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_dwSize = size;
987ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_pDict == NULL) {
988ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_pDict = FX_NEW CPDF_Dictionary;
989ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
990ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_pDict->SetAtInteger(FX_BSTRC("Length"), size);
991ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!bCompressed) {
992ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_pDict->RemoveAt(FX_BSTRC("Filter"));
993ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_pDict->RemoveAt(FX_BSTRC("DecodeParms"));
994ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
995ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
996ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_Stream::ReadRawData(FX_FILESIZE offset, FX_LPBYTE buf, FX_DWORD size) const
997ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
998ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if ((m_GenNum != (FX_DWORD) - 1) && m_pFile) {
999ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return m_pFile->ReadBlock(buf, m_FileOffset + offset, size);
1000ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1001ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_pDataBuf) {
1002ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FXSYS_memcpy32(buf, m_pDataBuf + offset, size);
1003ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1004ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return TRUE;
1005ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1006ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_Stream::InitStream(IFX_FileRead *pFile, CPDF_Dictionary* pDict)
1007ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1008ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    InitStream(pDict);
1009ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_pFile = pFile;
1010ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_dwSize = (FX_DWORD)pFile->GetSize();
1011ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_pDict) {
1012ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_pDict->SetAtInteger(FX_BSTRC("Length"), m_dwSize);
1013ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1014ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1015ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_Stream::Identical(CPDF_Stream* pOther) const
1016ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1017ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!m_pDict->Identical(pOther->m_pDict)) {
1018ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
1019ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1020ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_dwSize != pOther->m_dwSize) {
1021ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
1022ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1023ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_GenNum != (FX_DWORD) - 1 && pOther->m_GenNum != (FX_DWORD) - 1) {
1024ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (m_pFile == pOther->m_pFile && m_pFile == NULL) {
1025ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return TRUE;
1026ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1027ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (!m_pFile || !pOther->m_pFile) {
1028ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return FALSE;
1029ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1030ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_BYTE srcBuf[1024];
1031ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_BYTE destBuf[1024];
1032ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_DWORD size = m_dwSize;
1033ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_DWORD srcOffset = m_FileOffset;
1034ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_DWORD destOffset = pOther->m_FileOffset;
1035ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (m_pFile == pOther->m_pFile && srcOffset == destOffset) {
1036ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return TRUE;
1037ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1038ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        while (size > 0) {
1039ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            FX_DWORD actualSize = size > 1024 ? 1024 : size;
1040ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_pFile->ReadBlock(srcBuf, srcOffset, actualSize);
1041ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            pOther->m_pFile->ReadBlock(destBuf, destOffset, actualSize);
1042ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (FXSYS_memcmp32(srcBuf, destBuf, actualSize) != 0) {
1043ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return FALSE;
1044ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
1045ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            size -= actualSize;
1046ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            srcOffset += actualSize;
1047ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            destOffset += actualSize;
1048ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1049ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return TRUE;
1050ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1051ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_GenNum != (FX_DWORD) - 1 || pOther->m_GenNum != (FX_DWORD) - 1) {
1052ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        IFX_FileRead* pFile = NULL;
1053ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_LPBYTE pBuf = NULL;
1054ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_DWORD offset = 0;
1055ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (m_GenNum != (FX_DWORD) - 1) {
1056ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            pFile = m_pFile;
1057ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            pBuf = pOther->m_pDataBuf;
1058ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            offset = m_FileOffset;
1059ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1060ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (pOther->m_GenNum != (FX_DWORD) - 1) {
1061ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            pFile = pOther->m_pFile;
1062ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            pBuf = m_pDataBuf;
1063ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            offset = pOther->m_FileOffset;
1064ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1065ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (NULL == pBuf) {
1066ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return FALSE;
1067ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1068ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_BYTE srcBuf[1024];
1069ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_DWORD size = m_dwSize;
1070ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        while (size > 0) {
1071ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            FX_DWORD actualSize = size > 1024 ? 1024 : size;
1072ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_pFile->ReadBlock(srcBuf, offset, actualSize);
1073ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (FXSYS_memcmp32(srcBuf, pBuf, actualSize) != 0) {
1074ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return FALSE;
1075ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
1076ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            pBuf += actualSize;
1077ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            size -= actualSize;
1078ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            offset += actualSize;
1079ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1080ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return TRUE;
1081ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1082ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return FXSYS_memcmp32(m_pDataBuf, pOther->m_pDataBuf, m_dwSize) == 0;
1083ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1084ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Stream* CPDF_Stream::Clone(FX_BOOL bDirect, FPDF_LPFCloneStreamCallback lpfCallback, FX_LPVOID pUserData) const
1085ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1086ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Dictionary *pCloneDict = (CPDF_Dictionary*)m_pDict->Clone(bDirect);
1087ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    IFX_FileStream *pFS = NULL;
1088ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (lpfCallback) {
1089ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        pFS = lpfCallback((CPDF_Stream*)this, pUserData);
1090ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1091ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!pFS) {
1092ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_StreamAcc acc;
1093ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        acc.LoadAllData(this, TRUE);
1094ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_DWORD streamSize = acc.GetSize();
1095ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CPDF_Stream* pObj = FX_NEW CPDF_Stream(acc.DetachData(), streamSize, pCloneDict);
1096ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return pObj;
1097ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1098ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Stream* pObj = FX_NEW CPDF_Stream(NULL, 0, NULL);
1099ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_StreamFilter *pSF = GetStreamFilter(TRUE);
1100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pSF) {
1101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_LPBYTE pBuf = FX_Alloc(FX_BYTE, 4096);
1102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_DWORD dwRead;
1103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        do {
1104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            dwRead = pSF->ReadBlock(pBuf, 4096);
1105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (dwRead) {
1106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                pFS->WriteBlock(pBuf, dwRead);
1107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
1108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        } while (dwRead == 4096);
1109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        pFS->Flush();
1110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_Free(pBuf);
1111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        delete pSF;
1112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    pObj->InitStream((IFX_FileRead*)pFS, pCloneDict);
1114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return pObj;
1115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovextern FX_BOOL PDF_DataDecode(FX_LPCBYTE src_buf, FX_DWORD src_size, const CPDF_Dictionary* pDict,
1117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                              FX_LPBYTE& dest_buf, FX_DWORD& dest_size, CFX_ByteString& ImageEncoding,
1118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                              CPDF_Dictionary*& pImageParms, FX_DWORD estimated_size, FX_BOOL bImageAcc);
1119ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_StreamAcc::CPDF_StreamAcc()
1120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_bNewBuf = FALSE;
1122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_pData = NULL;
1123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_dwSize = 0;
1124ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_pImageParam = NULL;
1125ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_pStream = NULL;
1126ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_pSrcData = NULL;
1127ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_StreamAcc::LoadAllData(const CPDF_Stream* pStream, FX_BOOL bRawAccess, FX_DWORD estimated_size,
1129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                 FX_BOOL bImageAcc)
1130ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pStream == NULL || pStream->GetType() != PDFOBJ_STREAM) {
1132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return;
1133ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1134ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_pStream = pStream;
1135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pStream->IsMemoryBased() &&
1136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            (!pStream->GetDict()->KeyExist(FX_BSTRC("Filter")) || bRawAccess)) {
1137ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_dwSize = pStream->m_dwSize;
1138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_pData = (FX_LPBYTE)pStream->m_pDataBuf;
1139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return;
1140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_LPBYTE pSrcData;
1142ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_DWORD dwSrcSize = pStream->m_dwSize;
1143ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (dwSrcSize == 0) {
1144ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return;
1145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1146ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!pStream->IsMemoryBased()) {
1147ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        pSrcData = m_pSrcData = FX_Alloc(FX_BYTE, dwSrcSize);
1148ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (!pSrcData || !pStream->ReadRawData(0, pSrcData, dwSrcSize)) {
1149ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return;
1150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1151ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    } else {
1152ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        pSrcData = pStream->m_pDataBuf;
1153ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1154ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_LPBYTE pDecryptedData;
1155ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_DWORD dwDecryptedSize;
1156ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pStream->m_pCryptoHandler) {
1157ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        CFX_BinaryBuf dest_buf;
1158ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        dest_buf.EstimateSize(pStream->m_pCryptoHandler->DecryptGetSize(dwSrcSize));
1159ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_LPVOID context = pStream->m_pCryptoHandler->DecryptStart(pStream->GetObjNum(), pStream->m_GenNum);
1160ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        pStream->m_pCryptoHandler->DecryptStream(context, pSrcData, dwSrcSize, dest_buf);
1161ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        pStream->m_pCryptoHandler->DecryptFinish(context, dest_buf);
1162ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        pDecryptedData = dest_buf.GetBuffer();
1163ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        dwDecryptedSize = dest_buf.GetSize();
1164ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        dest_buf.DetachBuffer();
1165ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    } else {
1166ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        pDecryptedData = pSrcData;
1167ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        dwDecryptedSize = dwSrcSize;
1168ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1169ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!pStream->GetDict()->KeyExist(FX_BSTRC("Filter")) || bRawAccess) {
1170ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_pData = pDecryptedData;
1171ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_dwSize = dwDecryptedSize;
1172ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    } else {
1173ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_BOOL bRet = PDF_DataDecode(pDecryptedData, dwDecryptedSize, m_pStream->GetDict(),
1174ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                      m_pData, m_dwSize, m_ImageDecoder, m_pImageParam, estimated_size, bImageAcc);
1175ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (!bRet) {
1176ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_pData = pDecryptedData;
1177ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            m_dwSize = dwDecryptedSize;
1178ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1179ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1180ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pSrcData != pStream->m_pDataBuf && pSrcData != m_pData) {
1181ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_Free(pSrcData);
1182ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1183ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pDecryptedData != pSrcData && pDecryptedData != m_pData) {
1184ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_Free(pDecryptedData);
1185ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1186ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_pSrcData = NULL;
1187ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_bNewBuf = m_pData != pStream->m_pDataBuf;
1188ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1189ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_StreamAcc::~CPDF_StreamAcc()
1190ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1191ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_bNewBuf && m_pData) {
1192ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_Free(m_pData);
1193ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1194ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_pSrcData) {
1195ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_Free(m_pSrcData);
1196ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1197ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1198ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_LPCBYTE CPDF_StreamAcc::GetData() const
1199ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1200ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_bNewBuf) {
1201ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return m_pData;
1202ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1203ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!m_pStream) {
1204ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
1205ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1206ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return m_pStream->m_pDataBuf;
1207ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1208ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_DWORD CPDF_StreamAcc::GetSize() const
1209ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1210ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_bNewBuf) {
1211ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return m_dwSize;
1212ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1213ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!m_pStream) {
1214ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return 0;
1215ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1216ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return m_pStream->m_dwSize;
1217ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1218ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_LPBYTE CPDF_StreamAcc::DetachData()
1219ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1220ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_bNewBuf) {
1221ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_LPBYTE p = m_pData;
1222ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_pData = NULL;
1223ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_dwSize = 0;
1224ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return p;
1225ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1226ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_LPBYTE p = FX_Alloc(FX_BYTE, m_dwSize);
1227ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (p == NULL) {
1228ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
1229ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1230ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FXSYS_memcpy32(p, m_pData, m_dwSize);
1231ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return p;
1232ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1233ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_Reference::SetRef(CPDF_IndirectObjects* pDoc, FX_DWORD objnum)
1234ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1235ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_pObjList = pDoc;
1236ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_RefObjNum = objnum;
1237ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1238ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_IndirectObjects::CPDF_IndirectObjects(IPDF_DocParser* pParser)
1239ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1240ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_pParser = pParser;
1241ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_IndirectObjs.InitHashTable(1013);
1242ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pParser) {
1243ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_LastObjNum = m_pParser->GetLastObjNum();
1244ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    } else {
1245ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_LastObjNum = 0;
1246ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1247ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1248ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_IndirectObjects::~CPDF_IndirectObjects()
1249ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1250ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_POSITION pos = m_IndirectObjs.GetStartPosition();
1251ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    while (pos) {
1252ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_LPVOID key, value;
1253ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_IndirectObjs.GetNextAssoc(pos, key, value);
1254ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        ((CPDF_Object*)value)->Destroy();
1255ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1256ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1257ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Object* CPDF_IndirectObjects::GetIndirectObject(FX_DWORD objnum, struct PARSE_CONTEXT* pContext)
1258ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1259ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (objnum == 0) {
1260ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
1261ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1262ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_LPVOID value;
1263ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
1264ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (m_IndirectObjs.Lookup((FX_LPVOID)(FX_UINTPTR)objnum, value)) {
1265ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if (((CPDF_Object*)value)->GetObjNum() == -1) {
1266ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                return NULL;
1267ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
1268ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return (CPDF_Object*)value;
1269ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1270ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1271ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CPDF_Object* pObj = NULL;
1272ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_pParser) {
1273ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        pObj = m_pParser->ParseIndirectObject(this, objnum, pContext);
1274ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1275ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pObj == NULL) {
1276ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return NULL;
1277ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1278ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    pObj->m_ObjNum = objnum;
1279ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_LastObjNum < objnum) {
1280ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_LastObjNum = objnum;
1281ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1282ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_IndirectObjs.Lookup((FX_LPVOID)(FX_UINTPTR)objnum, value)) {
1283ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (value) {
1284ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            ((CPDF_Object *)value)->Destroy();
1285ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
1286ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1287ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_IndirectObjs.SetAt((FX_LPVOID)(FX_UINTPTR)objnum, pObj);
1288ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return pObj;
1289ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1290ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovint CPDF_IndirectObjects::GetIndirectType(FX_DWORD objnum)
1291ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1292ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_LPVOID value;
1293ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_IndirectObjs.Lookup((FX_LPVOID)(FX_UINTPTR)objnum, value)) {
1294ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return ((CPDF_Object*)value)->GetType();
1295ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1296ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_pParser) {
1297ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        PARSE_CONTEXT context;
1298ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FXSYS_memset32(&context, 0, sizeof(PARSE_CONTEXT));
1299ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        context.m_Flags = PDFPARSE_TYPEONLY;
1300ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return (int)(FX_UINTPTR)m_pParser->ParseIndirectObject(this, objnum, &context);
1301ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1302ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return 0;
1303ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1304ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_DWORD CPDF_IndirectObjects::AddIndirectObject(CPDF_Object* pObj)
1305ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1306ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pObj->m_ObjNum) {
1307ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return pObj->m_ObjNum;
1308ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1309ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_LastObjNum ++;
1310ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_IndirectObjs.SetAt((FX_LPVOID)(FX_UINTPTR)m_LastObjNum, pObj);
1311ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    pObj->m_ObjNum = m_LastObjNum;
1312ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return m_LastObjNum;
1313ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1314ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_IndirectObjects::ReleaseIndirectObject(FX_DWORD objnum)
1315ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1316ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_LPVOID value;
1317ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!m_IndirectObjs.Lookup((FX_LPVOID)(FX_UINTPTR)objnum, value)) {
1318ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return;
1319ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1320ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (((CPDF_Object*)value)->GetObjNum() == -1) {
1321ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return;
1322ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1323ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    ((CPDF_Object*)value)->Destroy();
1324ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_IndirectObjs.RemoveKey((FX_LPVOID)(FX_UINTPTR)objnum);
1325ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1326ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_IndirectObjects::InsertIndirectObject(FX_DWORD objnum, CPDF_Object* pObj)
1327ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1328ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (objnum == 0 || pObj == NULL) {
1329ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return;
1330ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1331ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_LPVOID value;
1332ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_IndirectObjs.Lookup((FX_LPVOID)(FX_UINTPTR)objnum, value)) {
1333ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        ((CPDF_Object*)value)->Destroy();
1334ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1335ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    pObj->m_ObjNum = objnum;
1336ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_IndirectObjs.SetAt((FX_LPVOID)(FX_UINTPTR)objnum, pObj);
1337ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_LastObjNum < objnum) {
1338ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_LastObjNum = objnum;
1339ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
1340ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1341ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_DWORD CPDF_IndirectObjects::GetLastObjNum() const
1342ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
1343ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return m_LastObjNum;
1344ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
1345