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