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