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