| OLD | NEW |
| (Empty) |
| 1 // Copyright 2014 PDFium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | |
| 6 | |
| 7 #ifndef CORE_INCLUDE_FPDFAPI_FPDF_OBJECTS_H_ | |
| 8 #define CORE_INCLUDE_FPDFAPI_FPDF_OBJECTS_H_ | |
| 9 | |
| 10 #include <map> | |
| 11 #include <set> | |
| 12 | |
| 13 #include "core/include/fxcrt/fx_coordinates.h" | |
| 14 #include "core/include/fxcrt/fx_system.h" | |
| 15 | |
| 16 class CPDF_Array; | |
| 17 class CPDF_Boolean; | |
| 18 class CPDF_Dictionary; | |
| 19 class CPDF_IndirectObjectHolder; | |
| 20 class CPDF_Name; | |
| 21 class CPDF_Null; | |
| 22 class CPDF_Number; | |
| 23 class CPDF_Parser; | |
| 24 class CPDF_Reference; | |
| 25 class CPDF_Stream; | |
| 26 class CPDF_StreamAcc; | |
| 27 class CPDF_String; | |
| 28 class IFX_FileRead; | |
| 29 | |
| 30 class CPDF_Object { | |
| 31 public: | |
| 32 enum Type { | |
| 33 BOOLEAN = 1, | |
| 34 NUMBER, | |
| 35 STRING, | |
| 36 NAME, | |
| 37 ARRAY, | |
| 38 DICTIONARY, | |
| 39 STREAM, | |
| 40 NULLOBJ, | |
| 41 REFERENCE | |
| 42 }; | |
| 43 | |
| 44 virtual Type GetType() const = 0; | |
| 45 FX_DWORD GetObjNum() const { return m_ObjNum; } | |
| 46 FX_DWORD GetGenNum() const { return m_GenNum; } | |
| 47 | |
| 48 virtual CPDF_Object* Clone(FX_BOOL bDirect = FALSE) const = 0; | |
| 49 virtual CPDF_Object* GetDirect() const; | |
| 50 | |
| 51 FX_BOOL IsModified() const { return FALSE; } | |
| 52 void Release(); | |
| 53 | |
| 54 virtual CFX_ByteString GetString() const; | |
| 55 virtual CFX_ByteStringC GetConstString() const; | |
| 56 virtual CFX_WideString GetUnicodeText() const; | |
| 57 virtual FX_FLOAT GetNumber() const; | |
| 58 virtual int GetInteger() const; | |
| 59 virtual CPDF_Dictionary* GetDict() const; | |
| 60 virtual CPDF_Array* GetArray() const; | |
| 61 | |
| 62 virtual void SetString(const CFX_ByteString& str); | |
| 63 | |
| 64 virtual bool IsArray() const; | |
| 65 virtual bool IsBoolean() const; | |
| 66 virtual bool IsDictionary() const; | |
| 67 virtual bool IsName() const; | |
| 68 virtual bool IsNumber() const; | |
| 69 virtual bool IsReference() const; | |
| 70 virtual bool IsStream() const; | |
| 71 virtual bool IsString() const; | |
| 72 | |
| 73 virtual CPDF_Array* AsArray(); | |
| 74 virtual const CPDF_Array* AsArray() const; | |
| 75 virtual CPDF_Boolean* AsBoolean(); | |
| 76 virtual const CPDF_Boolean* AsBoolean() const; | |
| 77 virtual CPDF_Dictionary* AsDictionary(); | |
| 78 virtual const CPDF_Dictionary* AsDictionary() const; | |
| 79 virtual CPDF_Name* AsName(); | |
| 80 virtual const CPDF_Name* AsName() const; | |
| 81 virtual CPDF_Number* AsNumber(); | |
| 82 virtual const CPDF_Number* AsNumber() const; | |
| 83 virtual CPDF_Reference* AsReference(); | |
| 84 virtual const CPDF_Reference* AsReference() const; | |
| 85 virtual CPDF_Stream* AsStream(); | |
| 86 virtual const CPDF_Stream* AsStream() const; | |
| 87 virtual CPDF_String* AsString(); | |
| 88 virtual const CPDF_String* AsString() const; | |
| 89 | |
| 90 protected: | |
| 91 CPDF_Object() : m_ObjNum(0), m_GenNum(0) {} | |
| 92 virtual ~CPDF_Object(); | |
| 93 void Destroy() { delete this; } | |
| 94 | |
| 95 FX_DWORD m_ObjNum; | |
| 96 FX_DWORD m_GenNum; | |
| 97 | |
| 98 friend class CPDF_IndirectObjectHolder; | |
| 99 friend class CPDF_Parser; | |
| 100 | |
| 101 private: | |
| 102 CPDF_Object(const CPDF_Object& src) {} | |
| 103 }; | |
| 104 | |
| 105 class CPDF_Boolean : public CPDF_Object { | |
| 106 public: | |
| 107 CPDF_Boolean() : m_bValue(false) {} | |
| 108 explicit CPDF_Boolean(FX_BOOL value) : m_bValue(value) {} | |
| 109 | |
| 110 // CPDF_Object. | |
| 111 Type GetType() const override; | |
| 112 CPDF_Object* Clone(FX_BOOL bDirect = FALSE) const override; | |
| 113 CFX_ByteString GetString() const override; | |
| 114 int GetInteger() const override; | |
| 115 void SetString(const CFX_ByteString& str) override; | |
| 116 bool IsBoolean() const override; | |
| 117 CPDF_Boolean* AsBoolean() override; | |
| 118 const CPDF_Boolean* AsBoolean() const override; | |
| 119 | |
| 120 protected: | |
| 121 ~CPDF_Boolean() override; | |
| 122 | |
| 123 FX_BOOL m_bValue; | |
| 124 }; | |
| 125 | |
| 126 inline CPDF_Boolean* ToBoolean(CPDF_Object* obj) { | |
| 127 return obj ? obj->AsBoolean() : nullptr; | |
| 128 } | |
| 129 | |
| 130 inline const CPDF_Boolean* ToBoolean(const CPDF_Object* obj) { | |
| 131 return obj ? obj->AsBoolean() : nullptr; | |
| 132 } | |
| 133 | |
| 134 class CPDF_Number : public CPDF_Object { | |
| 135 public: | |
| 136 CPDF_Number() : m_bInteger(TRUE), m_Integer(0) {} | |
| 137 explicit CPDF_Number(int value) : m_bInteger(TRUE), m_Integer(value) {} | |
| 138 explicit CPDF_Number(FX_FLOAT value) : m_bInteger(FALSE), m_Float(value) {} | |
| 139 explicit CPDF_Number(const CFX_ByteStringC& str); | |
| 140 | |
| 141 // CPDF_Object. | |
| 142 Type GetType() const override; | |
| 143 CPDF_Object* Clone(FX_BOOL bDirect = FALSE) const override; | |
| 144 CFX_ByteString GetString() const override; | |
| 145 FX_FLOAT GetNumber() const override; | |
| 146 int GetInteger() const override; | |
| 147 void SetString(const CFX_ByteString& str) override; | |
| 148 bool IsNumber() const override; | |
| 149 CPDF_Number* AsNumber() override; | |
| 150 const CPDF_Number* AsNumber() const override; | |
| 151 | |
| 152 FX_BOOL IsInteger() { return m_bInteger; } | |
| 153 | |
| 154 protected: | |
| 155 ~CPDF_Number() override; | |
| 156 | |
| 157 FX_BOOL m_bInteger; | |
| 158 union { | |
| 159 int m_Integer; | |
| 160 FX_FLOAT m_Float; | |
| 161 }; | |
| 162 }; | |
| 163 | |
| 164 inline CPDF_Number* ToNumber(CPDF_Object* obj) { | |
| 165 return obj ? obj->AsNumber() : nullptr; | |
| 166 } | |
| 167 | |
| 168 inline const CPDF_Number* ToNumber(const CPDF_Object* obj) { | |
| 169 return obj ? obj->AsNumber() : nullptr; | |
| 170 } | |
| 171 | |
| 172 class CPDF_String : public CPDF_Object { | |
| 173 public: | |
| 174 CPDF_String() : m_bHex(FALSE) {} | |
| 175 CPDF_String(const CFX_ByteString& str, FX_BOOL bHex) | |
| 176 : m_String(str), m_bHex(bHex) {} | |
| 177 explicit CPDF_String(const CFX_WideString& str); | |
| 178 | |
| 179 // CPDF_Object. | |
| 180 Type GetType() const override; | |
| 181 CPDF_Object* Clone(FX_BOOL bDirect = FALSE) const override; | |
| 182 CFX_ByteString GetString() const override; | |
| 183 CFX_ByteStringC GetConstString() const override; | |
| 184 CFX_WideString GetUnicodeText() const override; | |
| 185 void SetString(const CFX_ByteString& str) override; | |
| 186 bool IsString() const override; | |
| 187 CPDF_String* AsString() override; | |
| 188 const CPDF_String* AsString() const override; | |
| 189 | |
| 190 FX_BOOL IsHex() const { return m_bHex; } | |
| 191 | |
| 192 protected: | |
| 193 ~CPDF_String() override; | |
| 194 | |
| 195 CFX_ByteString m_String; | |
| 196 FX_BOOL m_bHex; | |
| 197 }; | |
| 198 | |
| 199 inline CPDF_String* ToString(CPDF_Object* obj) { | |
| 200 return obj ? obj->AsString() : nullptr; | |
| 201 } | |
| 202 | |
| 203 inline const CPDF_String* ToString(const CPDF_Object* obj) { | |
| 204 return obj ? obj->AsString() : nullptr; | |
| 205 } | |
| 206 | |
| 207 class CPDF_Name : public CPDF_Object { | |
| 208 public: | |
| 209 explicit CPDF_Name(const CFX_ByteString& str) : m_Name(str) {} | |
| 210 explicit CPDF_Name(const CFX_ByteStringC& str) : m_Name(str) {} | |
| 211 explicit CPDF_Name(const FX_CHAR* str) : m_Name(str) {} | |
| 212 | |
| 213 // CPDF_Object. | |
| 214 Type GetType() const override; | |
| 215 CPDF_Object* Clone(FX_BOOL bDirect = FALSE) const override; | |
| 216 CFX_ByteString GetString() const override; | |
| 217 CFX_ByteStringC GetConstString() const override; | |
| 218 CFX_WideString GetUnicodeText() const override; | |
| 219 void SetString(const CFX_ByteString& str) override; | |
| 220 bool IsName() const override; | |
| 221 CPDF_Name* AsName() override; | |
| 222 const CPDF_Name* AsName() const override; | |
| 223 | |
| 224 protected: | |
| 225 ~CPDF_Name() override; | |
| 226 | |
| 227 CFX_ByteString m_Name; | |
| 228 }; | |
| 229 | |
| 230 inline CPDF_Name* ToName(CPDF_Object* obj) { | |
| 231 return obj ? obj->AsName() : nullptr; | |
| 232 } | |
| 233 | |
| 234 inline const CPDF_Name* ToName(const CPDF_Object* obj) { | |
| 235 return obj ? obj->AsName() : nullptr; | |
| 236 } | |
| 237 | |
| 238 class CPDF_Array : public CPDF_Object { | |
| 239 public: | |
| 240 CPDF_Array(); | |
| 241 | |
| 242 // CPDF_Object. | |
| 243 Type GetType() const override; | |
| 244 CPDF_Object* Clone(FX_BOOL bDirect = FALSE) const override; | |
| 245 CPDF_Array* GetArray() const override; | |
| 246 bool IsArray() const override; | |
| 247 CPDF_Array* AsArray() override; | |
| 248 const CPDF_Array* AsArray() const override; | |
| 249 | |
| 250 FX_DWORD GetCount() const { return m_Objects.GetSize(); } | |
| 251 CPDF_Object* GetElement(FX_DWORD index) const; | |
| 252 CPDF_Object* GetElementValue(FX_DWORD index) const; | |
| 253 CFX_Matrix GetMatrix(); | |
| 254 CFX_FloatRect GetRect(); | |
| 255 CFX_ByteString GetStringAt(FX_DWORD index) const; | |
| 256 CFX_ByteStringC GetConstStringAt(FX_DWORD index) const; | |
| 257 int GetIntegerAt(FX_DWORD index) const; | |
| 258 FX_FLOAT GetNumberAt(FX_DWORD index) const; | |
| 259 CPDF_Dictionary* GetDictAt(FX_DWORD index) const; | |
| 260 CPDF_Stream* GetStreamAt(FX_DWORD index) const; | |
| 261 CPDF_Array* GetArrayAt(FX_DWORD index) const; | |
| 262 FX_FLOAT GetFloatAt(FX_DWORD index) const { return GetNumberAt(index); } | |
| 263 | |
| 264 void SetAt(FX_DWORD index, | |
| 265 CPDF_Object* pObj, | |
| 266 CPDF_IndirectObjectHolder* pObjs = nullptr); | |
| 267 void InsertAt(FX_DWORD index, | |
| 268 CPDF_Object* pObj, | |
| 269 CPDF_IndirectObjectHolder* pObjs = nullptr); | |
| 270 void RemoveAt(FX_DWORD index, int nCount = 1); | |
| 271 | |
| 272 void Add(CPDF_Object* pObj, CPDF_IndirectObjectHolder* pObjs = nullptr); | |
| 273 void AddNumber(FX_FLOAT f); | |
| 274 void AddInteger(int i); | |
| 275 void AddString(const CFX_ByteString& str); | |
| 276 void AddName(const CFX_ByteString& str); | |
| 277 void AddReference(CPDF_IndirectObjectHolder* pDoc, FX_DWORD objnum); | |
| 278 void AddReference(CPDF_IndirectObjectHolder* pDoc, CPDF_Object* obj) { | |
| 279 AddReference(pDoc, obj->GetObjNum()); | |
| 280 } | |
| 281 | |
| 282 protected: | |
| 283 ~CPDF_Array() override; | |
| 284 | |
| 285 CFX_ArrayTemplate<CPDF_Object*> m_Objects; | |
| 286 }; | |
| 287 | |
| 288 inline CPDF_Array* ToArray(CPDF_Object* obj) { | |
| 289 return obj ? obj->AsArray() : nullptr; | |
| 290 } | |
| 291 | |
| 292 inline const CPDF_Array* ToArray(const CPDF_Object* obj) { | |
| 293 return obj ? obj->AsArray() : nullptr; | |
| 294 } | |
| 295 | |
| 296 class CPDF_Dictionary : public CPDF_Object { | |
| 297 public: | |
| 298 using iterator = std::map<CFX_ByteString, CPDF_Object*>::iterator; | |
| 299 using const_iterator = std::map<CFX_ByteString, CPDF_Object*>::const_iterator; | |
| 300 | |
| 301 CPDF_Dictionary(); | |
| 302 | |
| 303 // CPDF_Object. | |
| 304 Type GetType() const override; | |
| 305 CPDF_Object* Clone(FX_BOOL bDirect = FALSE) const override; | |
| 306 CPDF_Dictionary* GetDict() const override; | |
| 307 bool IsDictionary() const override; | |
| 308 CPDF_Dictionary* AsDictionary() override; | |
| 309 const CPDF_Dictionary* AsDictionary() const override; | |
| 310 | |
| 311 size_t GetCount() const { return m_Map.size(); } | |
| 312 CPDF_Object* GetElement(const CFX_ByteStringC& key) const; | |
| 313 CPDF_Object* GetElementValue(const CFX_ByteStringC& key) const; | |
| 314 CFX_ByteString GetStringBy(const CFX_ByteStringC& key) const; | |
| 315 CFX_ByteStringC GetConstStringBy(const CFX_ByteStringC& key) const; | |
| 316 CFX_ByteString GetStringBy(const CFX_ByteStringC& key, | |
| 317 const CFX_ByteStringC& default_str) const; | |
| 318 CFX_ByteStringC GetConstStringBy(const CFX_ByteStringC& key, | |
| 319 const CFX_ByteStringC& default_str) const; | |
| 320 CFX_WideString GetUnicodeTextBy(const CFX_ByteStringC& key) const; | |
| 321 int GetIntegerBy(const CFX_ByteStringC& key) const; | |
| 322 int GetIntegerBy(const CFX_ByteStringC& key, int default_int) const; | |
| 323 FX_BOOL GetBooleanBy(const CFX_ByteStringC& key, | |
| 324 FX_BOOL bDefault = FALSE) const; | |
| 325 FX_FLOAT GetNumberBy(const CFX_ByteStringC& key) const; | |
| 326 CPDF_Dictionary* GetDictBy(const CFX_ByteStringC& key) const; | |
| 327 CPDF_Stream* GetStreamBy(const CFX_ByteStringC& key) const; | |
| 328 CPDF_Array* GetArrayBy(const CFX_ByteStringC& key) const; | |
| 329 CFX_FloatRect GetRectBy(const CFX_ByteStringC& key) const; | |
| 330 CFX_Matrix GetMatrixBy(const CFX_ByteStringC& key) const; | |
| 331 FX_FLOAT GetFloatBy(const CFX_ByteStringC& key) const { | |
| 332 return GetNumberBy(key); | |
| 333 } | |
| 334 | |
| 335 FX_BOOL KeyExist(const CFX_ByteStringC& key) const; | |
| 336 bool IsSignatureDict() const; | |
| 337 | |
| 338 // Set* functions invalidate iterators for the element with the key |key|. | |
| 339 void SetAt(const CFX_ByteStringC& key, CPDF_Object* pObj); | |
| 340 void SetAtName(const CFX_ByteStringC& key, const CFX_ByteString& name); | |
| 341 void SetAtString(const CFX_ByteStringC& key, const CFX_ByteString& str); | |
| 342 void SetAtInteger(const CFX_ByteStringC& key, int i); | |
| 343 void SetAtNumber(const CFX_ByteStringC& key, FX_FLOAT f); | |
| 344 void SetAtReference(const CFX_ByteStringC& key, | |
| 345 CPDF_IndirectObjectHolder* pDoc, | |
| 346 FX_DWORD objnum); | |
| 347 void SetAtReference(const CFX_ByteStringC& key, | |
| 348 CPDF_IndirectObjectHolder* pDoc, | |
| 349 CPDF_Object* obj) { | |
| 350 SetAtReference(key, pDoc, obj->GetObjNum()); | |
| 351 } | |
| 352 void SetAtRect(const CFX_ByteStringC& key, const CFX_FloatRect& rect); | |
| 353 void SetAtMatrix(const CFX_ByteStringC& key, const CFX_Matrix& matrix); | |
| 354 void SetAtBoolean(const CFX_ByteStringC& key, FX_BOOL bValue); | |
| 355 | |
| 356 void AddReference(const CFX_ByteStringC& key, | |
| 357 CPDF_IndirectObjectHolder* pDoc, | |
| 358 FX_DWORD objnum); | |
| 359 | |
| 360 // Invalidates iterators for the element with the key |key|. | |
| 361 void RemoveAt(const CFX_ByteStringC& key); | |
| 362 | |
| 363 // Invalidates iterators for the element with the key |oldkey|. | |
| 364 void ReplaceKey(const CFX_ByteStringC& oldkey, const CFX_ByteStringC& newkey); | |
| 365 | |
| 366 iterator begin() { return m_Map.begin(); } | |
| 367 iterator end() { return m_Map.end(); } | |
| 368 const_iterator begin() const { return m_Map.begin(); } | |
| 369 const_iterator end() const { return m_Map.end(); } | |
| 370 | |
| 371 protected: | |
| 372 ~CPDF_Dictionary() override; | |
| 373 | |
| 374 std::map<CFX_ByteString, CPDF_Object*> m_Map; | |
| 375 }; | |
| 376 | |
| 377 inline CPDF_Dictionary* ToDictionary(CPDF_Object* obj) { | |
| 378 return obj ? obj->AsDictionary() : nullptr; | |
| 379 } | |
| 380 | |
| 381 inline const CPDF_Dictionary* ToDictionary(const CPDF_Object* obj) { | |
| 382 return obj ? obj->AsDictionary() : nullptr; | |
| 383 } | |
| 384 | |
| 385 class CPDF_Stream : public CPDF_Object { | |
| 386 public: | |
| 387 CPDF_Stream(uint8_t* pData, FX_DWORD size, CPDF_Dictionary* pDict); | |
| 388 | |
| 389 // CPDF_Object. | |
| 390 Type GetType() const override; | |
| 391 CPDF_Object* Clone(FX_BOOL bDirect = FALSE) const override; | |
| 392 CPDF_Dictionary* GetDict() const override; | |
| 393 CFX_WideString GetUnicodeText() const override; | |
| 394 bool IsStream() const override; | |
| 395 CPDF_Stream* AsStream() override; | |
| 396 const CPDF_Stream* AsStream() const override; | |
| 397 | |
| 398 FX_DWORD GetRawSize() const { return m_dwSize; } | |
| 399 uint8_t* GetRawData() const { return m_pDataBuf; } | |
| 400 | |
| 401 void SetData(const uint8_t* pData, | |
| 402 FX_DWORD size, | |
| 403 FX_BOOL bCompressed, | |
| 404 FX_BOOL bKeepBuf); | |
| 405 | |
| 406 void InitStream(uint8_t* pData, FX_DWORD size, CPDF_Dictionary* pDict); | |
| 407 void InitStreamFromFile(IFX_FileRead* pFile, CPDF_Dictionary* pDict); | |
| 408 | |
| 409 FX_BOOL ReadRawData(FX_FILESIZE start_pos, | |
| 410 uint8_t* pBuf, | |
| 411 FX_DWORD buf_size) const; | |
| 412 | |
| 413 bool IsMemoryBased() const { return m_GenNum == kMemoryBasedGenNum; } | |
| 414 | |
| 415 protected: | |
| 416 static const FX_DWORD kMemoryBasedGenNum = (FX_DWORD)-1; | |
| 417 | |
| 418 ~CPDF_Stream() override; | |
| 419 | |
| 420 void InitStreamInternal(CPDF_Dictionary* pDict); | |
| 421 | |
| 422 CPDF_Dictionary* m_pDict; | |
| 423 FX_DWORD m_dwSize; | |
| 424 FX_DWORD m_GenNum; | |
| 425 | |
| 426 union { | |
| 427 uint8_t* m_pDataBuf; | |
| 428 IFX_FileRead* m_pFile; | |
| 429 }; | |
| 430 }; | |
| 431 | |
| 432 inline CPDF_Stream* ToStream(CPDF_Object* obj) { | |
| 433 return obj ? obj->AsStream() : nullptr; | |
| 434 } | |
| 435 | |
| 436 inline const CPDF_Stream* ToStream(const CPDF_Object* obj) { | |
| 437 return obj ? obj->AsStream() : nullptr; | |
| 438 } | |
| 439 | |
| 440 class CPDF_StreamAcc { | |
| 441 public: | |
| 442 CPDF_StreamAcc(); | |
| 443 ~CPDF_StreamAcc(); | |
| 444 | |
| 445 void LoadAllData(const CPDF_Stream* pStream, | |
| 446 FX_BOOL bRawAccess = FALSE, | |
| 447 FX_DWORD estimated_size = 0, | |
| 448 FX_BOOL bImageAcc = FALSE); | |
| 449 | |
| 450 const CPDF_Stream* GetStream() const { return m_pStream; } | |
| 451 CPDF_Dictionary* GetDict() const { | |
| 452 return m_pStream ? m_pStream->GetDict() : nullptr; | |
| 453 } | |
| 454 const uint8_t* GetData() const; | |
| 455 FX_DWORD GetSize() const; | |
| 456 const CFX_ByteString& GetImageDecoder() const { return m_ImageDecoder; } | |
| 457 const CPDF_Dictionary* GetImageParam() const { return m_pImageParam; } | |
| 458 | |
| 459 uint8_t* DetachData(); | |
| 460 | |
| 461 protected: | |
| 462 uint8_t* m_pData; | |
| 463 FX_DWORD m_dwSize; | |
| 464 FX_BOOL m_bNewBuf; | |
| 465 CFX_ByteString m_ImageDecoder; | |
| 466 CPDF_Dictionary* m_pImageParam; | |
| 467 const CPDF_Stream* m_pStream; | |
| 468 uint8_t* m_pSrcData; | |
| 469 }; | |
| 470 | |
| 471 class CPDF_Null : public CPDF_Object { | |
| 472 public: | |
| 473 CPDF_Null() {} | |
| 474 | |
| 475 // CPDF_Object. | |
| 476 Type GetType() const override; | |
| 477 CPDF_Object* Clone(FX_BOOL bDirect = FALSE) const override; | |
| 478 }; | |
| 479 | |
| 480 class CPDF_Reference : public CPDF_Object { | |
| 481 public: | |
| 482 CPDF_Reference(CPDF_IndirectObjectHolder* pDoc, int objnum) | |
| 483 : m_pObjList(pDoc), m_RefObjNum(objnum) {} | |
| 484 | |
| 485 // CPDF_Object. | |
| 486 Type GetType() const override; | |
| 487 CPDF_Object* Clone(FX_BOOL bDirect = FALSE) const override; | |
| 488 CPDF_Object* GetDirect() const override; | |
| 489 CFX_ByteString GetString() const override; | |
| 490 CFX_ByteStringC GetConstString() const override; | |
| 491 FX_FLOAT GetNumber() const override; | |
| 492 int GetInteger() const override; | |
| 493 CPDF_Dictionary* GetDict() const override; | |
| 494 | |
| 495 // TODO(weili): check whether GetUnicodeText() and GetArray() are needed. | |
| 496 bool IsReference() const override; | |
| 497 CPDF_Reference* AsReference() override; | |
| 498 const CPDF_Reference* AsReference() const override; | |
| 499 | |
| 500 CPDF_IndirectObjectHolder* GetObjList() const { return m_pObjList; } | |
| 501 FX_DWORD GetRefObjNum() const { return m_RefObjNum; } | |
| 502 | |
| 503 void SetRef(CPDF_IndirectObjectHolder* pDoc, FX_DWORD objnum); | |
| 504 | |
| 505 protected: | |
| 506 ~CPDF_Reference() override; | |
| 507 CPDF_Object* SafeGetDirect() const { | |
| 508 CPDF_Object* obj = GetDirect(); | |
| 509 if (!obj || obj->IsReference()) | |
| 510 return nullptr; | |
| 511 return obj; | |
| 512 } | |
| 513 | |
| 514 CPDF_IndirectObjectHolder* m_pObjList; | |
| 515 FX_DWORD m_RefObjNum; | |
| 516 }; | |
| 517 | |
| 518 inline CPDF_Reference* ToReference(CPDF_Object* obj) { | |
| 519 return obj ? obj->AsReference() : nullptr; | |
| 520 } | |
| 521 | |
| 522 inline const CPDF_Reference* ToReference(const CPDF_Object* obj) { | |
| 523 return obj ? obj->AsReference() : nullptr; | |
| 524 } | |
| 525 | |
| 526 class CPDF_IndirectObjectHolder { | |
| 527 public: | |
| 528 using iterator = std::map<FX_DWORD, CPDF_Object*>::iterator; | |
| 529 using const_iterator = std::map<FX_DWORD, CPDF_Object*>::const_iterator; | |
| 530 | |
| 531 explicit CPDF_IndirectObjectHolder(CPDF_Parser* pParser); | |
| 532 ~CPDF_IndirectObjectHolder(); | |
| 533 | |
| 534 CPDF_Object* GetIndirectObject(FX_DWORD objnum); | |
| 535 FX_DWORD AddIndirectObject(CPDF_Object* pObj); | |
| 536 void ReleaseIndirectObject(FX_DWORD objnum); | |
| 537 | |
| 538 // Takes ownership of |pObj|. | |
| 539 FX_BOOL InsertIndirectObject(FX_DWORD objnum, CPDF_Object* pObj); | |
| 540 | |
| 541 FX_DWORD GetLastObjNum() const { return m_LastObjNum; } | |
| 542 iterator begin() { return m_IndirectObjs.begin(); } | |
| 543 const_iterator begin() const { return m_IndirectObjs.begin(); } | |
| 544 iterator end() { return m_IndirectObjs.end(); } | |
| 545 const_iterator end() const { return m_IndirectObjs.end(); } | |
| 546 | |
| 547 protected: | |
| 548 CPDF_Parser* m_pParser; | |
| 549 FX_DWORD m_LastObjNum; | |
| 550 std::map<FX_DWORD, CPDF_Object*> m_IndirectObjs; | |
| 551 }; | |
| 552 | |
| 553 #endif // CORE_INCLUDE_FPDFAPI_FPDF_OBJECTS_H_ | |
| OLD | NEW |