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
7ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "core/include/fpdfapi/fpdf_objects.h"
8e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
9ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include <algorithm>
10ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
11ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "core/include/fpdfapi/fpdf_parser.h"
12ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "core/include/fxcrt/fx_string.h"
13ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "third_party/base/stl_util.h"
14ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
15ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannnamespace {
16ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
17ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannconst FX_DWORD kBlockSize = 1024;
18ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
19ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}  // namespace
20ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
21ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann// static
22e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovint CPDF_Object::s_nCurRefDepth = 0;
23e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
24ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_Object::Release() {
25ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_ObjNum) {
26ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
27ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
28ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  Destroy();
29ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
30ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_Object::Destroy() {
31ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  switch (m_Type) {
32ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case PDFOBJ_STRING:
33ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      delete AsString();
34ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
35ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case PDFOBJ_NAME:
36ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      delete AsName();
37ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
38ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case PDFOBJ_ARRAY:
39ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      delete AsArray();
40ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
41ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case PDFOBJ_DICTIONARY:
42ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      delete AsDictionary();
43ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
44ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case PDFOBJ_STREAM:
45ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      delete AsStream();
46ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
47ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    default:
48ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      delete this;
49ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
50ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
51ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_ByteString CPDF_Object::GetString() const {
52ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  switch (m_Type) {
53ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case PDFOBJ_BOOLEAN:
54ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return AsBoolean()->m_bValue ? "true" : "false";
55ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case PDFOBJ_NUMBER:
56ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return AsNumber()->GetString();
57ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case PDFOBJ_STRING:
58ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return AsString()->m_String;
59ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case PDFOBJ_NAME:
60ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return AsName()->m_Name;
61ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case PDFOBJ_REFERENCE: {
62ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      const CPDF_Reference* pRef = AsReference();
63ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (!pRef->m_pObjList)
64ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        break;
65ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
66ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      CPDF_Object* pObj =
67ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          pRef->m_pObjList->GetIndirectObject(pRef->GetRefObjNum(), nullptr);
68ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return pObj ? pObj->GetString() : CFX_ByteString();
69ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
70ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
71ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return CFX_ByteString();
72ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
73ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_ByteStringC CPDF_Object::GetConstString() const {
74ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  switch (m_Type) {
75ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case PDFOBJ_STRING: {
76ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      CFX_ByteString str = AsString()->m_String;
77ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return CFX_ByteStringC((const uint8_t*)str, str.GetLength());
78ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
79ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case PDFOBJ_NAME: {
80ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      CFX_ByteString name = AsName()->m_Name;
81ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return CFX_ByteStringC((const uint8_t*)name, name.GetLength());
82ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
83ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case PDFOBJ_REFERENCE: {
84ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      const CPDF_Reference* pRef = AsReference();
85ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (!pRef->m_pObjList)
86ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        break;
87ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
88ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      CPDF_Object* pObj =
89ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          pRef->m_pObjList->GetIndirectObject(pRef->GetRefObjNum(), nullptr);
90ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return pObj ? pObj->GetConstString() : CFX_ByteStringC();
91e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
92ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
93ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return CFX_ByteStringC();
94e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
95ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
96ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_FLOAT CPDF_Object::GetNumber() const {
97ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  switch (m_Type) {
98ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case PDFOBJ_NUMBER:
99ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return AsNumber()->GetNumber();
100ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case PDFOBJ_REFERENCE: {
101ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      const CPDF_Reference* pRef = AsReference();
102ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (!pRef->m_pObjList)
103ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        break;
104ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
105ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      CPDF_Object* pObj =
106ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          pRef->m_pObjList->GetIndirectObject(pRef->GetRefObjNum(), nullptr);
107ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return pObj ? pObj->GetNumber() : 0;
108e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
109ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
110ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return 0;
111e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
112ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
113ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_FLOAT CPDF_Object::GetNumber16() const {
114ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return GetNumber();
115e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
116ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
117ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint CPDF_Object::GetInteger() const {
118ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_AutoRestorer<int> restorer(&s_nCurRefDepth);
119ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (++s_nCurRefDepth > kObjectRefMaxDepth)
120e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return 0;
121ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
122ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  switch (m_Type) {
123ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case PDFOBJ_BOOLEAN:
124ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return AsBoolean()->m_bValue;
125ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case PDFOBJ_NUMBER:
126ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return AsNumber()->GetInteger();
127ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case PDFOBJ_REFERENCE: {
128ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      const CPDF_Reference* pRef = AsReference();
129ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      PARSE_CONTEXT context;
130ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      FXSYS_memset(&context, 0, sizeof(PARSE_CONTEXT));
131ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (!pRef->m_pObjList)
132e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        return 0;
133ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
134ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      CPDF_Object* pObj =
135ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          pRef->m_pObjList->GetIndirectObject(pRef->GetRefObjNum(), &context);
136ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return pObj ? pObj->GetInteger() : 0;
137e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
138ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
139ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return 0;
140e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
141ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
142ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_Dictionary* CPDF_Object::GetDict() const {
143ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  switch (m_Type) {
144ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case PDFOBJ_DICTIONARY:
145ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      // The method should be made non-const if we want to not be const.
146ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      // See bug #234.
147ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return const_cast<CPDF_Dictionary*>(AsDictionary());
148ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case PDFOBJ_STREAM:
149ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return AsStream()->GetDict();
150ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case PDFOBJ_REFERENCE: {
151ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      const CPDF_Reference* pRef = AsReference();
152ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      CPDF_IndirectObjectHolder* pIndirect = pRef->GetObjList();
153ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (!pIndirect)
154ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        return nullptr;
155ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      CPDF_Object* pObj =
156ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          pIndirect->GetIndirectObject(pRef->GetRefObjNum(), nullptr);
157ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (!pObj || (pObj == this))
158ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        return nullptr;
159ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return pObj->GetDict();
160ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
161ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    default:
162ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return nullptr;
163ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
164e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
165ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
166ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_Array* CPDF_Object::GetArray() const {
167ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  // The method should be made non-const if we want to not be const.
168ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  // See bug #234.
169ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return const_cast<CPDF_Array*>(AsArray());
170e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
171ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
172ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_Object::SetString(const CFX_ByteString& str) {
173ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  switch (m_Type) {
174ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case PDFOBJ_BOOLEAN:
175ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      AsBoolean()->m_bValue = (str == "true");
176ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return;
177ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case PDFOBJ_NUMBER:
178ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      AsNumber()->SetString(str);
179ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return;
180ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case PDFOBJ_STRING:
181ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      AsString()->m_String = str;
182ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return;
183ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case PDFOBJ_NAME:
184ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      AsName()->m_Name = str;
185ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return;
186ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
187ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  ASSERT(FALSE);
188ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
189ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint CPDF_Object::GetDirectType() const {
190ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  const CPDF_Reference* pRef = AsReference();
191ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pRef)
192ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return m_Type;
193ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return pRef->m_pObjList->GetIndirectType(pRef->GetRefObjNum());
194ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
195ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CPDF_Object::IsIdentical(CPDF_Object* pOther) const {
196ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (this == pOther)
197ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return TRUE;
198ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pOther)
199e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return FALSE;
200ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (pOther->m_Type != m_Type) {
201ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (IsReference() && GetDirect())
202ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return GetDirect()->IsIdentical(pOther);
203ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (pOther->IsReference())
204ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return IsIdentical(pOther->GetDirect());
205ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return FALSE;
206ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
207ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  switch (m_Type) {
208ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case PDFOBJ_BOOLEAN:
209ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return AsBoolean()->Identical(pOther->AsBoolean());
210ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case PDFOBJ_NUMBER:
211ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return AsNumber()->Identical(pOther->AsNumber());
212ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case PDFOBJ_STRING:
213ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return AsString()->Identical(pOther->AsString());
214ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case PDFOBJ_NAME:
215ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return AsName()->Identical(pOther->AsName());
216ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case PDFOBJ_ARRAY:
217ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return AsArray()->Identical(pOther->AsArray());
218ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case PDFOBJ_DICTIONARY:
219ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return AsDictionary()->Identical(pOther->AsDictionary());
220ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case PDFOBJ_NULL:
221ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return TRUE;
222ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case PDFOBJ_STREAM:
223ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return AsStream()->Identical(pOther->AsStream());
224ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case PDFOBJ_REFERENCE:
225ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return AsReference()->Identical(pOther->AsReference());
226ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
227ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return FALSE;
228e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
229e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
230ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_Object* CPDF_Object::GetDirect() const {
231ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  const CPDF_Reference* pRef = AsReference();
232ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pRef)
233ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return const_cast<CPDF_Object*>(this);
234ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pRef->m_pObjList)
235ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return nullptr;
236ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return pRef->m_pObjList->GetIndirectObject(pRef->GetRefObjNum(), nullptr);
237e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
238e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
239ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_Object* CPDF_Object::Clone(FX_BOOL bDirect) const {
240ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  std::set<FX_DWORD> visited;
241ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return CloneInternal(bDirect, &visited);
242ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
243ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_Object* CPDF_Object::CloneInternal(FX_BOOL bDirect,
244ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                        std::set<FX_DWORD>* visited) const {
245ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  switch (m_Type) {
246ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case PDFOBJ_BOOLEAN:
247ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return new CPDF_Boolean(AsBoolean()->m_bValue);
248ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case PDFOBJ_NUMBER: {
249ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      const CPDF_Number* pThis = AsNumber();
250ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return new CPDF_Number(pThis->m_bInteger ? pThis->m_Integer
251ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                               : pThis->m_Float);
252ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
253ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case PDFOBJ_STRING: {
254ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      const CPDF_String* pString = AsString();
255ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return new CPDF_String(pString->m_String, pString->IsHex());
256ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
257ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case PDFOBJ_NAME:
258ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return new CPDF_Name(AsName()->m_Name);
259ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case PDFOBJ_ARRAY: {
260ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      CPDF_Array* pCopy = new CPDF_Array();
261ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      const CPDF_Array* pThis = AsArray();
262ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      int n = pThis->GetCount();
263ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      for (int i = 0; i < n; i++) {
264ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        CPDF_Object* value = pThis->m_Objects.GetAt(i);
265ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        pCopy->m_Objects.Add(value->CloneInternal(bDirect, visited));
266ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
267ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return pCopy;
268ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
269ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case PDFOBJ_DICTIONARY: {
270ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      CPDF_Dictionary* pCopy = new CPDF_Dictionary();
271ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      const CPDF_Dictionary* pThis = AsDictionary();
272ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      for (const auto& it : *pThis) {
273ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        pCopy->m_Map.insert(std::make_pair(
274ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            it.first, it.second->CloneInternal(bDirect, visited)));
275ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
276ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return pCopy;
277ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
278ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case PDFOBJ_NULL: {
279ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return new CPDF_Null;
280ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
281ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case PDFOBJ_STREAM: {
282ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      const CPDF_Stream* pThis = AsStream();
283ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      CPDF_StreamAcc acc;
284ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      acc.LoadAllData(pThis, TRUE);
285ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      FX_DWORD streamSize = acc.GetSize();
286ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      CPDF_Dictionary* pDict = pThis->GetDict();
287ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (pDict) {
288ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        pDict = ToDictionary(pDict->CloneInternal(bDirect, visited));
289ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
290ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return new CPDF_Stream(acc.DetachData(), streamSize, pDict);
291ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
292ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case PDFOBJ_REFERENCE: {
293ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      const CPDF_Reference* pRef = AsReference();
294ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      FX_DWORD obj_num = pRef->GetRefObjNum();
295ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (bDirect && !pdfium::ContainsKey(*visited, obj_num)) {
296ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        visited->insert(obj_num);
297ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        auto* pDirect = pRef->GetDirect();
298ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        return pDirect ? pDirect->CloneInternal(TRUE, visited) : nullptr;
299ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
300ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return new CPDF_Reference(pRef->m_pObjList, obj_num);
301ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
302ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
303ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return NULL;
304ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
305ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_Object* CPDF_Object::CloneRef(CPDF_IndirectObjectHolder* pDoc) const {
306ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_ObjNum) {
307ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return new CPDF_Reference(pDoc, m_ObjNum);
308ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
309ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return Clone();
310ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
311ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_WideString CPDF_Object::GetUnicodeText(CFX_CharMap* pCharMap) const {
312ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (const CPDF_String* pString = AsString())
313ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return PDF_DecodeText(pString->m_String, pCharMap);
314e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
315ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (const CPDF_Stream* pStream = AsStream()) {
316ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CPDF_StreamAcc stream;
317ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    stream.LoadAllData(pStream, FALSE);
318ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CFX_WideString result =
319ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        PDF_DecodeText(stream.GetData(), stream.GetSize(), pCharMap);
320ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return result;
321ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
322ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (const CPDF_Name* pName = AsName())
323ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return PDF_DecodeText(pName->m_Name, pCharMap);
324ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return CFX_WideString();
325ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
326ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_Object::SetUnicodeText(const FX_WCHAR* pUnicodes, int len) {
327ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (CPDF_String* pString = AsString()) {
328ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pString->m_String = PDF_EncodeText(pUnicodes, len);
329ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else if (CPDF_Stream* pStream = AsStream()) {
330ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CFX_ByteString result = PDF_EncodeText(pUnicodes, len);
331ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pStream->SetData((uint8_t*)result.c_str(), result.GetLength(), FALSE,
332ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                     FALSE);
333ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
334e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
335e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
336ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_Array* CPDF_Object::AsArray() {
337ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return IsArray() ? static_cast<CPDF_Array*>(this) : nullptr;
338e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
339e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
340ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannconst CPDF_Array* CPDF_Object::AsArray() const {
341ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return IsArray() ? static_cast<const CPDF_Array*>(this) : nullptr;
342e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
343ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
344ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_Boolean* CPDF_Object::AsBoolean() {
345ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return IsBoolean() ? static_cast<CPDF_Boolean*>(this) : nullptr;
346e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
347ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
348ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannconst CPDF_Boolean* CPDF_Object::AsBoolean() const {
349ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return IsBoolean() ? static_cast<const CPDF_Boolean*>(this) : nullptr;
350e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
351ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
352ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_Dictionary* CPDF_Object::AsDictionary() {
353ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return IsDictionary() ? static_cast<CPDF_Dictionary*>(this) : nullptr;
354e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
355ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
356ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannconst CPDF_Dictionary* CPDF_Object::AsDictionary() const {
357ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return IsDictionary() ? static_cast<const CPDF_Dictionary*>(this) : nullptr;
358e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
359ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
360ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_Name* CPDF_Object::AsName() {
361ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return IsName() ? static_cast<CPDF_Name*>(this) : nullptr;
362e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
363ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
364ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannconst CPDF_Name* CPDF_Object::AsName() const {
365ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return IsName() ? static_cast<const CPDF_Name*>(this) : nullptr;
366e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
367ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
368ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_Number* CPDF_Object::AsNumber() {
369ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return IsNumber() ? static_cast<CPDF_Number*>(this) : nullptr;
370e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
371ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
372ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannconst CPDF_Number* CPDF_Object::AsNumber() const {
373ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return IsNumber() ? static_cast<const CPDF_Number*>(this) : nullptr;
374e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
375ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
376ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_Reference* CPDF_Object::AsReference() {
377ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return IsReference() ? static_cast<CPDF_Reference*>(this) : nullptr;
378e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
379ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
380ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannconst CPDF_Reference* CPDF_Object::AsReference() const {
381ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return IsReference() ? static_cast<const CPDF_Reference*>(this) : nullptr;
382e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
383ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
384ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_Stream* CPDF_Object::AsStream() {
385ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return IsStream() ? static_cast<CPDF_Stream*>(this) : nullptr;
386e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
387ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
388ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannconst CPDF_Stream* CPDF_Object::AsStream() const {
389ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return IsStream() ? static_cast<const CPDF_Stream*>(this) : nullptr;
390e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
391ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
392ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_String* CPDF_Object::AsString() {
393ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return IsString() ? static_cast<CPDF_String*>(this) : nullptr;
394e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
395ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
396ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannconst CPDF_String* CPDF_Object::AsString() const {
397ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return IsString() ? static_cast<const CPDF_String*>(this) : nullptr;
398e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
399ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
400ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_Number::CPDF_Number(int value)
401ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    : CPDF_Object(PDFOBJ_NUMBER), m_bInteger(TRUE), m_Integer(value) {}
402ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
403ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_Number::CPDF_Number(FX_FLOAT value)
404ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    : CPDF_Object(PDFOBJ_NUMBER), m_bInteger(FALSE), m_Float(value) {}
405ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
406ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_Number::CPDF_Number(const CFX_ByteStringC& str)
407ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    : CPDF_Object(PDFOBJ_NUMBER) {
408ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_atonum(str, m_bInteger, &m_Integer);
409e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
410ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
411ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_Number::SetString(const CFX_ByteStringC& str) {
412ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_atonum(str, m_bInteger, &m_Integer);
413ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
414ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CPDF_Number::Identical(CPDF_Number* pOther) const {
415ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return m_bInteger == pOther->m_bInteger && m_Integer == pOther->m_Integer;
416ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
417ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_ByteString CPDF_Number::GetString() const {
418ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return m_bInteger ? CFX_ByteString::FormatInteger(m_Integer, FXFORMAT_SIGNED)
419ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                    : CFX_ByteString::FormatFloat(m_Float);
420ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
421ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_Number::SetNumber(FX_FLOAT value) {
422ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_bInteger = FALSE;
423ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_Float = value;
424ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
425ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_String::CPDF_String(const CFX_WideString& str)
426ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    : CPDF_Object(PDFOBJ_STRING), m_bHex(FALSE) {
427ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_String = PDF_EncodeText(str);
428ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
429ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_Array::~CPDF_Array() {
430ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int size = m_Objects.GetSize();
431ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Object** pList = m_Objects.GetData();
432ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  for (int i = 0; i < size; i++) {
433ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (pList[i])
434ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      pList[i]->Release();
435ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
436ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
437ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_FloatRect CPDF_Array::GetRect() {
438ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_FloatRect rect;
439ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!IsArray() || m_Objects.GetSize() != 4)
440ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return rect;
441ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
442ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  rect.left = GetNumber(0);
443ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  rect.bottom = GetNumber(1);
444ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  rect.right = GetNumber(2);
445ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  rect.top = GetNumber(3);
446ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return rect;
447ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
448ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_Matrix CPDF_Array::GetMatrix() {
449ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_Matrix matrix;
450ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!IsArray() || m_Objects.GetSize() != 6)
451ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return matrix;
452ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
453ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  matrix.Set(GetNumber(0), GetNumber(1), GetNumber(2), GetNumber(3),
454ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann             GetNumber(4), GetNumber(5));
455ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return matrix;
456ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
457ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_Object* CPDF_Array::GetElement(FX_DWORD i) const {
458ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (i >= (FX_DWORD)m_Objects.GetSize())
459ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return nullptr;
460ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return m_Objects.GetAt(i);
461ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
462ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_Object* CPDF_Array::GetElementValue(FX_DWORD i) const {
463ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (i >= (FX_DWORD)m_Objects.GetSize())
464ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return nullptr;
465ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return m_Objects.GetAt(i)->GetDirect();
466ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
467ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_ByteString CPDF_Array::GetString(FX_DWORD i) const {
468ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (i >= (FX_DWORD)m_Objects.GetSize())
469ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return CFX_ByteString();
470ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return m_Objects.GetAt(i)->GetString();
471e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
472ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_ByteStringC CPDF_Array::GetConstString(FX_DWORD i) const {
473ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (i >= (FX_DWORD)m_Objects.GetSize())
474ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return CFX_ByteStringC();
475ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return m_Objects.GetAt(i)->GetConstString();
476e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
477ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint CPDF_Array::GetInteger(FX_DWORD i) const {
478ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (i >= (FX_DWORD)m_Objects.GetSize())
479e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return 0;
480ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return m_Objects.GetAt(i)->GetInteger();
481e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
482ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_FLOAT CPDF_Array::GetNumber(FX_DWORD i) const {
483ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (i >= (FX_DWORD)m_Objects.GetSize())
484e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return 0;
485ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return m_Objects.GetAt(i)->GetNumber();
486e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
487ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_Dictionary* CPDF_Array::GetDict(FX_DWORD i) const {
488ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Object* p = GetElementValue(i);
489ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!p)
490e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return NULL;
491ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (CPDF_Dictionary* pDict = p->AsDictionary())
492ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return pDict;
493ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (CPDF_Stream* pStream = p->AsStream())
494ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return pStream->GetDict();
495ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return NULL;
496e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
497ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_Stream* CPDF_Array::GetStream(FX_DWORD i) const {
498ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return ToStream(GetElementValue(i));
499e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
500ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_Array* CPDF_Array::GetArray(FX_DWORD i) const {
501ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return ToArray(GetElementValue(i));
502e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
503ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_Array::RemoveAt(FX_DWORD i, int nCount) {
504ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (i >= (FX_DWORD)m_Objects.GetSize())
505ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
506ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
507ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (nCount <= 0 || nCount > m_Objects.GetSize() - i)
508ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
509ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
510ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  for (int j = 0; j < nCount; ++j) {
511ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (CPDF_Object* p = m_Objects.GetAt(i + j))
512ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      p->Release();
513ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
514ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_Objects.RemoveAt(i, nCount);
515ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
516ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_Array::SetAt(FX_DWORD i,
517ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                       CPDF_Object* pObj,
518ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                       CPDF_IndirectObjectHolder* pObjs) {
519ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  ASSERT(IsArray());
520ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  ASSERT(i < (FX_DWORD)m_Objects.GetSize());
521ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (i >= (FX_DWORD)m_Objects.GetSize())
522ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
523ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (CPDF_Object* pOld = m_Objects.GetAt(i))
524ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pOld->Release();
525ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (pObj->GetObjNum()) {
526ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    ASSERT(pObjs);
527ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pObj = new CPDF_Reference(pObjs, pObj->GetObjNum());
528ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
529ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_Objects.SetAt(i, pObj);
530ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
531ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_Array::InsertAt(FX_DWORD index,
532ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                          CPDF_Object* pObj,
533ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                          CPDF_IndirectObjectHolder* pObjs) {
534ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (pObj->GetObjNum()) {
535ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    ASSERT(pObjs);
536ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pObj = new CPDF_Reference(pObjs, pObj->GetObjNum());
537ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
538ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_Objects.InsertAt(index, pObj);
539ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
540ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_Array::Add(CPDF_Object* pObj, CPDF_IndirectObjectHolder* pObjs) {
541ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (pObj->GetObjNum()) {
542ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    ASSERT(pObjs);
543ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pObj = new CPDF_Reference(pObjs, pObj->GetObjNum());
544ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
545ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_Objects.Add(pObj);
546ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
547ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_Array::AddName(const CFX_ByteString& str) {
548ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  ASSERT(IsArray());
549ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  Add(new CPDF_Name(str));
550ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
551ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_Array::AddString(const CFX_ByteString& str) {
552ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  ASSERT(IsArray());
553ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  Add(new CPDF_String(str, FALSE));
554ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
555ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_Array::AddInteger(int i) {
556ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  ASSERT(IsArray());
557ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  Add(new CPDF_Number(i));
558ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
559ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_Array::AddNumber(FX_FLOAT f) {
560ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  ASSERT(IsArray());
561ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Number* pNumber = new CPDF_Number;
562ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pNumber->SetNumber(f);
563ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  Add(pNumber);
564ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
565ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_Array::AddReference(CPDF_IndirectObjectHolder* pDoc,
566ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                              FX_DWORD objnum) {
567ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  ASSERT(IsArray());
568ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  Add(new CPDF_Reference(pDoc, objnum));
569ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
570ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CPDF_Array::Identical(CPDF_Array* pOther) const {
571ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_Objects.GetSize() != pOther->m_Objects.GetSize()) {
572ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return FALSE;
573ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
574ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  for (int i = 0; i < m_Objects.GetSize(); i++) {
575ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (!m_Objects[i]->IsIdentical(pOther->m_Objects[i]))
576ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return FALSE;
577ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
578ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return TRUE;
579ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
580ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_Dictionary::~CPDF_Dictionary() {
581ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  for (const auto& it : m_Map) {
582ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    it.second->Release();
583ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
584ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
585ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_Object* CPDF_Dictionary::GetElement(const CFX_ByteStringC& key) const {
586ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  auto it = m_Map.find(key);
587ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (it == m_Map.end())
588ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return nullptr;
589ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return it->second;
590ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
591ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_Object* CPDF_Dictionary::GetElementValue(
592ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    const CFX_ByteStringC& key) const {
593ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Object* p = GetElement(key);
594ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return p ? p->GetDirect() : nullptr;
595ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
596ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_ByteString CPDF_Dictionary::GetString(const CFX_ByteStringC& key) const {
597ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Object* p = GetElement(key);
598ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (p) {
599ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return p->GetString();
600ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
601ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return CFX_ByteString();
602ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
603ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_ByteStringC CPDF_Dictionary::GetConstString(
604ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    const CFX_ByteStringC& key) const {
605ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Object* p = GetElement(key);
606ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (p) {
607ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return p->GetConstString();
608ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
609ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return CFX_ByteStringC();
610ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
611ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_WideString CPDF_Dictionary::GetUnicodeText(const CFX_ByteStringC& key,
612ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                               CFX_CharMap* pCharMap) const {
613ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Object* p = GetElement(key);
614ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (CPDF_Reference* pRef = ToReference(p))
615ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    p = pRef->GetDirect();
616ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return p ? p->GetUnicodeText(pCharMap) : CFX_WideString();
617ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
618ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_ByteString CPDF_Dictionary::GetString(const CFX_ByteStringC& key,
619ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                          const CFX_ByteStringC& def) const {
620ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Object* p = GetElement(key);
621ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (p) {
622ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return p->GetString();
623ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
624ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return CFX_ByteString(def);
625ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
626ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_ByteStringC CPDF_Dictionary::GetConstString(
627ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    const CFX_ByteStringC& key,
628ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    const CFX_ByteStringC& def) const {
629ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Object* p = GetElement(key);
630ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (p) {
631ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return p->GetConstString();
632ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
633ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return CFX_ByteStringC(def);
634ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
635ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint CPDF_Dictionary::GetInteger(const CFX_ByteStringC& key) const {
636ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Object* p = GetElement(key);
637ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (p) {
638ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return p->GetInteger();
639ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
640ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return 0;
641e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
642ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint CPDF_Dictionary::GetInteger(const CFX_ByteStringC& key, int def) const {
643ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Object* p = GetElement(key);
644ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (p) {
645ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return p->GetInteger();
646ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
647ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return def;
648e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
649ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_FLOAT CPDF_Dictionary::GetNumber(const CFX_ByteStringC& key) const {
650ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Object* p = GetElement(key);
651ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (p) {
652ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return p->GetNumber();
653ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
654ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return 0;
655e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
656ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CPDF_Dictionary::GetBoolean(const CFX_ByteStringC& key,
657ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                    FX_BOOL bDefault) const {
658ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Object* p = GetElement(key);
659ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (ToBoolean(p))
660ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return p->GetInteger();
661ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return bDefault;
662ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
663ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_Dictionary* CPDF_Dictionary::GetDict(const CFX_ByteStringC& key) const {
664ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Object* p = GetElementValue(key);
665ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!p)
666ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return nullptr;
667ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (CPDF_Dictionary* pDict = p->AsDictionary())
668ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return pDict;
669ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (CPDF_Stream* pStream = p->AsStream())
670ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return pStream->GetDict();
671ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return nullptr;
672ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
673ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_Array* CPDF_Dictionary::GetArray(const CFX_ByteStringC& key) const {
674ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return ToArray(GetElementValue(key));
675ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
676ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_Stream* CPDF_Dictionary::GetStream(const CFX_ByteStringC& key) const {
677ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return ToStream(GetElementValue(key));
678ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
679ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_FloatRect CPDF_Dictionary::GetRect(const CFX_ByteStringC& key) const {
680ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_FloatRect rect;
681ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Array* pArray = GetArray(key);
682ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (pArray)
683ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    rect = pArray->GetRect();
684ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return rect;
685ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
686ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_Matrix CPDF_Dictionary::GetMatrix(const CFX_ByteStringC& key) const {
687ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_Matrix matrix;
688ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Array* pArray = GetArray(key);
689ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (pArray)
690ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    matrix = pArray->GetMatrix();
691ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return matrix;
692ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
693ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CPDF_Dictionary::KeyExist(const CFX_ByteStringC& key) const {
694ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return pdfium::ContainsKey(m_Map, key);
695ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
696ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
697ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_Dictionary::SetAt(const CFX_ByteStringC& key, CPDF_Object* pObj) {
698ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  ASSERT(IsDictionary());
699ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  // Avoid 2 constructions of CFX_ByteString.
700ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_ByteString key_bytestring = key;
701ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  auto it = m_Map.find(key_bytestring);
702ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (it == m_Map.end()) {
703ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (pObj) {
704ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_Map.insert(std::make_pair(key_bytestring, pObj));
705e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
706ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
707ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
708ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
709ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (it->second == pObj)
710ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
711ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  it->second->Release();
712ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
713ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (pObj)
714ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    it->second = pObj;
715ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  else
716ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_Map.erase(it);
717ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
718ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_Dictionary::RemoveAt(const CFX_ByteStringC& key) {
719ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  ASSERT(m_Type == PDFOBJ_DICTIONARY);
720ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  auto it = m_Map.find(key);
721ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (it == m_Map.end())
722ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
723ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
724ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  it->second->Release();
725ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_Map.erase(it);
726ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
727ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_Dictionary::ReplaceKey(const CFX_ByteStringC& oldkey,
728ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                 const CFX_ByteStringC& newkey) {
729ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  ASSERT(m_Type == PDFOBJ_DICTIONARY);
730ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  auto old_it = m_Map.find(oldkey);
731ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (old_it == m_Map.end())
732ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
733ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
734ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  // Avoid 2 constructions of CFX_ByteString.
735ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_ByteString newkey_bytestring = newkey;
736ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  auto new_it = m_Map.find(newkey_bytestring);
737ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (new_it == old_it)
738ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
739ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
740ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (new_it != m_Map.end()) {
741ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    new_it->second->Release();
742ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    new_it->second = old_it->second;
743ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else {
744ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_Map.insert(std::make_pair(newkey_bytestring, old_it->second));
745ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
746ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_Map.erase(old_it);
747ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
748ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CPDF_Dictionary::Identical(CPDF_Dictionary* pOther) const {
749ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pOther) {
750ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return FALSE;
751ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
752ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_Map.size() != pOther->m_Map.size()) {
753ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return FALSE;
754ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
755ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  for (const auto& it : m_Map) {
756ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    const CFX_ByteString& key = it.first;
757ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (!it.second->IsIdentical(pOther->GetElement(key)))
758ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return FALSE;
759ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
760ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return TRUE;
761ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
762ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_Dictionary::SetAtInteger(const CFX_ByteStringC& key, int i) {
763ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  SetAt(key, new CPDF_Number(i));
764ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
765ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_Dictionary::SetAtName(const CFX_ByteStringC& key,
766ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                const CFX_ByteString& name) {
767ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  SetAt(key, new CPDF_Name(name));
768ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
769ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_Dictionary::SetAtString(const CFX_ByteStringC& key,
770ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                  const CFX_ByteString& str) {
771ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  SetAt(key, new CPDF_String(str, FALSE));
772ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
773ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_Dictionary::SetAtReference(const CFX_ByteStringC& key,
774ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                     CPDF_IndirectObjectHolder* pDoc,
775ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                     FX_DWORD objnum) {
776ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  SetAt(key, new CPDF_Reference(pDoc, objnum));
777ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
778ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_Dictionary::AddReference(const CFX_ByteStringC& key,
779ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                   CPDF_IndirectObjectHolder* pDoc,
780ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                   FX_DWORD objnum) {
781ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  SetAt(key, new CPDF_Reference(pDoc, objnum));
782ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
783ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_Dictionary::SetAtNumber(const CFX_ByteStringC& key, FX_FLOAT f) {
784ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Number* pNumber = new CPDF_Number;
785ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pNumber->SetNumber(f);
786ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  SetAt(key, pNumber);
787ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
788ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_Dictionary::SetAtBoolean(const CFX_ByteStringC& key, FX_BOOL bValue) {
789ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  SetAt(key, new CPDF_Boolean(bValue));
790ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
791ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_Dictionary::SetAtRect(const CFX_ByteStringC& key,
792ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                const CFX_FloatRect& rect) {
793ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Array* pArray = new CPDF_Array;
794ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pArray->AddNumber(rect.left);
795ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pArray->AddNumber(rect.bottom);
796ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pArray->AddNumber(rect.right);
797ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pArray->AddNumber(rect.top);
798ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  SetAt(key, pArray);
799ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
800ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_Dictionary::SetAtMatrix(const CFX_ByteStringC& key,
801ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                  const CFX_Matrix& matrix) {
802ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Array* pArray = new CPDF_Array;
803ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pArray->AddNumber16(matrix.a);
804ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pArray->AddNumber16(matrix.b);
805ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pArray->AddNumber16(matrix.c);
806ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pArray->AddNumber16(matrix.d);
807ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pArray->AddNumber(matrix.e);
808ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pArray->AddNumber(matrix.f);
809ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  SetAt(key, pArray);
810ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
811ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_Stream::CPDF_Stream(uint8_t* pData, FX_DWORD size, CPDF_Dictionary* pDict)
812ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    : CPDF_Object(PDFOBJ_STREAM),
813ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pDict(pDict),
814ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_dwSize(size),
815ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_GenNum(kMemoryBasedGenNum),
816ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pDataBuf(pData) {}
817ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
818ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_Stream::~CPDF_Stream() {
819ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (IsMemoryBased())
820ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    FX_Free(m_pDataBuf);
821ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
822ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_pDict)
823ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pDict->Release();
824e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
825ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
826ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_Stream::InitStreamInternal(CPDF_Dictionary* pDict) {
827ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (pDict) {
828ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (m_pDict)
829ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pDict->Release();
830e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    m_pDict = pDict;
831ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
832ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (IsMemoryBased())
833ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    FX_Free(m_pDataBuf);
834ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
835ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_GenNum = 0;
836ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pFile = nullptr;
837e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
838ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
839ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_Stream::InitStream(uint8_t* pData,
840ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                             FX_DWORD size,
841ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                             CPDF_Dictionary* pDict) {
842ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  InitStreamInternal(pDict);
843ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_GenNum = kMemoryBasedGenNum;
844ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pDataBuf = FX_Alloc(uint8_t, size);
845ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (pData) {
846ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    FXSYS_memcpy(m_pDataBuf, pData, size);
847ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
848ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_dwSize = size;
849ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_pDict) {
850ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pDict->SetAtInteger("Length", size);
851ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
852ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
853ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_Stream::SetData(const uint8_t* pData,
854ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                          FX_DWORD size,
855ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                          FX_BOOL bCompressed,
856ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                          FX_BOOL bKeepBuf) {
857ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (IsMemoryBased())
858ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    FX_Free(m_pDataBuf);
859ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_GenNum = kMemoryBasedGenNum;
860ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
861ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (bKeepBuf) {
862ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pDataBuf = (uint8_t*)pData;
863ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else {
864ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pDataBuf = FX_Alloc(uint8_t, size);
865e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    if (pData) {
866ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      FXSYS_memcpy(m_pDataBuf, pData, size);
867ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
868ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
869ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_dwSize = size;
870ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!m_pDict)
871ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pDict = new CPDF_Dictionary;
872ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pDict->SetAtInteger("Length", size);
873ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!bCompressed) {
874ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pDict->RemoveAt("Filter");
875ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pDict->RemoveAt("DecodeParms");
876ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
877ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
878ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CPDF_Stream::ReadRawData(FX_FILESIZE offset,
879ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                 uint8_t* buf,
880ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                 FX_DWORD size) const {
881ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!IsMemoryBased() && m_pFile)
882ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return m_pFile->ReadBlock(buf, offset, size);
883ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
884ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_pDataBuf)
885ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    FXSYS_memcpy(buf, m_pDataBuf + offset, size);
886ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return TRUE;
887ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
888ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_Stream::InitStreamFromFile(IFX_FileRead* pFile,
889ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                     CPDF_Dictionary* pDict) {
890ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  InitStreamInternal(pDict);
891ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pFile = pFile;
892ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_dwSize = (FX_DWORD)pFile->GetSize();
893ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_pDict) {
894ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pDict->SetAtInteger("Length", m_dwSize);
895ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
896e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
897e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
898ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CPDF_Stream::Identical(CPDF_Stream* pOther) const {
899ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!m_pDict)
900ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return !pOther->m_pDict;
901ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
902ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!m_pDict->Identical(pOther->m_pDict))
903ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return FALSE;
904ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
905ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_dwSize != pOther->m_dwSize)
906ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return FALSE;
907ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
908ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!IsMemoryBased() && !pOther->IsMemoryBased()) {
909ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (m_pFile == pOther->m_pFile && !m_pFile)
910ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return TRUE;
911ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
912ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (!m_pFile || !pOther->m_pFile)
913ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return FALSE;
914ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
915ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    uint8_t srcBuf[kBlockSize];
916ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    uint8_t destBuf[kBlockSize];
917ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    FX_DWORD size = m_dwSize;
918ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (m_pFile == pOther->m_pFile)
919ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return TRUE;
920ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
921ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    FX_DWORD offset = 0;
922ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    while (size > 0) {
923ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      FX_DWORD actualSize = std::min(size, kBlockSize);
924ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pFile->ReadBlock(srcBuf, offset, actualSize);
925ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      pOther->m_pFile->ReadBlock(destBuf, offset, actualSize);
926ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (FXSYS_memcmp(srcBuf, destBuf, actualSize) != 0)
927e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        return FALSE;
928ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
929ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      size -= actualSize;
930ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      offset += actualSize;
931e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
932ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return TRUE;
933ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
934ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
935ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!IsMemoryBased() || !pOther->IsMemoryBased()) {
936ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    IFX_FileRead* pFile = nullptr;
937ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    uint8_t* pBuf = nullptr;
938ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (!pOther->IsMemoryBased()) {
939ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      pFile = pOther->m_pFile;
940ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      pBuf = m_pDataBuf;
941ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    } else if (!IsMemoryBased()) {
942ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      pFile = m_pFile;
943ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      pBuf = pOther->m_pDataBuf;
944ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
945ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (!pBuf)
946ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return FALSE;
947ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
948ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    uint8_t srcBuf[kBlockSize];
949ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    FX_DWORD size = m_dwSize;
950ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    FX_DWORD offset = 0;
951ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    while (size > 0) {
952ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      FX_DWORD actualSize = std::min(size, kBlockSize);
953ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      pFile->ReadBlock(srcBuf, offset, actualSize);
954ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (FXSYS_memcmp(srcBuf, pBuf, actualSize) != 0)
955e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        return FALSE;
956ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
957ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      pBuf += actualSize;
958ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      size -= actualSize;
959ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      offset += actualSize;
960e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
961ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return TRUE;
962ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
963ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return FXSYS_memcmp(m_pDataBuf, pOther->m_pDataBuf, m_dwSize) == 0;
964e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
965ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
966ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_StreamAcc::CPDF_StreamAcc() {
967ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_bNewBuf = FALSE;
968ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pData = NULL;
969ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_dwSize = 0;
970ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pImageParam = NULL;
971ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pStream = NULL;
972ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pSrcData = NULL;
973ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
974ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_StreamAcc::LoadAllData(const CPDF_Stream* pStream,
975ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                 FX_BOOL bRawAccess,
976ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                 FX_DWORD estimated_size,
977ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                 FX_BOOL bImageAcc) {
978ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pStream)
979ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
980ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
981ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pStream = pStream;
982ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (pStream->IsMemoryBased() &&
983ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      (!pStream->GetDict()->KeyExist("Filter") || bRawAccess)) {
984ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_dwSize = pStream->m_dwSize;
985ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pData = (uint8_t*)pStream->m_pDataBuf;
986ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
987ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
988ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  uint8_t* pSrcData;
989ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_DWORD dwSrcSize = pStream->m_dwSize;
990ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (dwSrcSize == 0)
991ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
992ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
993ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pStream->IsMemoryBased()) {
994ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pSrcData = m_pSrcData = FX_Alloc(uint8_t, dwSrcSize);
995ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (!pStream->ReadRawData(0, pSrcData, dwSrcSize))
996ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return;
997ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else {
998ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pSrcData = pStream->m_pDataBuf;
999ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1000ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  uint8_t* pDecryptedData = pSrcData;
1001ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_DWORD dwDecryptedSize = dwSrcSize;
1002ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pStream->GetDict()->KeyExist("Filter") || bRawAccess) {
1003ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pData = pDecryptedData;
1004ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_dwSize = dwDecryptedSize;
1005ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else {
1006ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    FX_BOOL bRet = PDF_DataDecode(
1007ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        pDecryptedData, dwDecryptedSize, m_pStream->GetDict(), m_pData,
1008ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        m_dwSize, m_ImageDecoder, m_pImageParam, estimated_size, bImageAcc);
1009ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (!bRet) {
1010ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pData = pDecryptedData;
1011ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_dwSize = dwDecryptedSize;
1012ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
1013ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1014ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (pSrcData != pStream->m_pDataBuf && pSrcData != m_pData) {
1015ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    FX_Free(pSrcData);
1016ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1017ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (pDecryptedData != pSrcData && pDecryptedData != m_pData) {
1018ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    FX_Free(pDecryptedData);
1019ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1020ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pSrcData = NULL;
1021ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_bNewBuf = m_pData != pStream->m_pDataBuf;
1022ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1023ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_StreamAcc::~CPDF_StreamAcc() {
1024ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_bNewBuf) {
1025ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    FX_Free(m_pData);
1026ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1027ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_Free(m_pSrcData);
1028ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1029ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannconst uint8_t* CPDF_StreamAcc::GetData() const {
1030ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_bNewBuf) {
1031ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return m_pData;
1032ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1033ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!m_pStream) {
1034ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return NULL;
1035ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1036ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return m_pStream->m_pDataBuf;
1037ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1038ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_DWORD CPDF_StreamAcc::GetSize() const {
1039ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_bNewBuf) {
1040ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return m_dwSize;
1041ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1042ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!m_pStream) {
1043ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return 0;
1044ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1045ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return m_pStream->m_dwSize;
1046e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1047ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannuint8_t* CPDF_StreamAcc::DetachData() {
1048ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_bNewBuf) {
1049ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    uint8_t* p = m_pData;
1050ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pData = NULL;
1051ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_dwSize = 0;
1052e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return p;
1053ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1054ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  uint8_t* p = FX_Alloc(uint8_t, m_dwSize);
1055ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXSYS_memcpy(p, m_pData, m_dwSize);
1056ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return p;
1057ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1058ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_Reference::SetRef(CPDF_IndirectObjectHolder* pDoc, FX_DWORD objnum) {
1059ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pObjList = pDoc;
1060ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_RefObjNum = objnum;
1061ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1062ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_IndirectObjectHolder::CPDF_IndirectObjectHolder(CPDF_Parser* pParser)
1063ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    : m_pParser(pParser), m_LastObjNum(0) {
1064ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (pParser)
1065ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_LastObjNum = m_pParser->GetLastObjNum();
1066ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1067ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_IndirectObjectHolder::~CPDF_IndirectObjectHolder() {
1068ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  for (const auto& pair : m_IndirectObjs) {
1069ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pair.second->Destroy();
1070ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1071ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1072ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_Object* CPDF_IndirectObjectHolder::GetIndirectObject(
1073ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    FX_DWORD objnum,
1074ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    PARSE_CONTEXT* pContext) {
1075ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (objnum == 0)
1076ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return nullptr;
1077ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
1078ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  auto it = m_IndirectObjs.find(objnum);
1079ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (it != m_IndirectObjs.end())
1080ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return it->second->GetObjNum() != -1 ? it->second : nullptr;
1081ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
1082ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!m_pParser)
1083ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return nullptr;
1084ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
1085ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Object* pObj = m_pParser->ParseIndirectObject(this, objnum, pContext);
1086ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pObj)
1087ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return nullptr;
1088ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
1089ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pObj->m_ObjNum = objnum;
1090ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_LastObjNum = std::max(m_LastObjNum, objnum);
1091ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_IndirectObjs[objnum])
1092ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_IndirectObjs[objnum]->Destroy();
1093ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
1094ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_IndirectObjs[objnum] = pObj;
1095ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return pObj;
1096e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1097ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint CPDF_IndirectObjectHolder::GetIndirectType(FX_DWORD objnum) {
1098ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  auto it = m_IndirectObjs.find(objnum);
1099ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (it != m_IndirectObjs.end())
1100ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return it->second->GetType();
1101ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
1102ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!m_pParser)
1103e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return 0;
1104ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
1105ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  PARSE_CONTEXT context;
1106ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXSYS_memset(&context, 0, sizeof(PARSE_CONTEXT));
1107ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  context.m_Flags = PDFPARSE_TYPEONLY;
1108ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return (int)(uintptr_t)m_pParser->ParseIndirectObject(this, objnum, &context);
1109ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1110ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_DWORD CPDF_IndirectObjectHolder::AddIndirectObject(CPDF_Object* pObj) {
1111ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (pObj->m_ObjNum) {
1112ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return pObj->m_ObjNum;
1113ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1114ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_LastObjNum++;
1115ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_IndirectObjs[m_LastObjNum] = pObj;
1116ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pObj->m_ObjNum = m_LastObjNum;
1117ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return m_LastObjNum;
1118ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1119ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_IndirectObjectHolder::ReleaseIndirectObject(FX_DWORD objnum) {
1120ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  auto it = m_IndirectObjs.find(objnum);
1121ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (it == m_IndirectObjs.end() || it->second->GetObjNum() == -1)
1122ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
1123ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  it->second->Destroy();
1124ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_IndirectObjs.erase(it);
1125ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1126ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CPDF_IndirectObjectHolder::InsertIndirectObject(FX_DWORD objnum,
1127ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                                        CPDF_Object* pObj) {
1128ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!objnum || !pObj)
1129ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return FALSE;
1130ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  auto it = m_IndirectObjs.find(objnum);
1131ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (it != m_IndirectObjs.end()) {
1132ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (pObj->GetGenNum() <= it->second->GetGenNum()) {
1133ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      pObj->Destroy();
1134ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return FALSE;
1135ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
1136ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    it->second->Destroy();
1137ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1138ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pObj->m_ObjNum = objnum;
1139ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_IndirectObjs[objnum] = pObj;
1140ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_LastObjNum = std::max(m_LastObjNum, objnum);
1141ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return TRUE;
1142e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1143