From 8f952279866afb647b7098c0cbdc25e35e8c0531 Mon Sep 17 00:00:00 2001 From: Wei Li Date: Fri, 29 Jan 2016 18:04:42 -0800 Subject: Merge to XFA: Refactor CPDF_Object and its subclasses. Mainly use virtual functions to replace functions with switch statements. Also remove a few unused functions and make some format changes. BUG=pdfium:63 TBR=thestig@chromium.org Review URL: https://codereview.chromium.org/1634373003 . (cherry picked from commit df1ab41e000069dda7bf21527308f3bf41e126ca) Review URL: https://codereview.chromium.org/1650493003 . --- core/include/fpdfapi/fpdf_objects.h | 440 +++++++++++++++++++----------------- 1 file changed, 230 insertions(+), 210 deletions(-) (limited to 'core/include/fpdfapi') diff --git a/core/include/fpdfapi/fpdf_objects.h b/core/include/fpdfapi/fpdf_objects.h index 0478acc3e0..86035a86ad 100644 --- a/core/include/fpdfapi/fpdf_objects.h +++ b/core/include/fpdfapi/fpdf_objects.h @@ -44,65 +44,61 @@ class CPDF_Object { REFERENCE }; - Type GetType() const { return m_Type; } + virtual Type GetType() const = 0; FX_DWORD GetObjNum() const { return m_ObjNum; } FX_DWORD GetGenNum() const { return m_GenNum; } - FX_BOOL IsIdentical(CPDF_Object* pObj) const; - CPDF_Object* Clone(FX_BOOL bDirect = FALSE) const; - CPDF_Object* CloneRef(CPDF_IndirectObjectHolder* pObjs) const; + virtual CPDF_Object* Clone(FX_BOOL bDirect = FALSE) const = 0; + virtual CPDF_Object* GetDirect() const { + return const_cast(this); + } - CPDF_Object* GetDirect() const; FX_BOOL IsModified() const { return FALSE; } - void Release(); - CFX_ByteString GetString() const; - CFX_ByteStringC GetConstString() const; - CFX_WideString GetUnicodeText(CFX_CharMap* pCharMap = NULL) const; - FX_FLOAT GetNumber() const; - FX_FLOAT GetNumber16() const; - int GetInteger() const; - CPDF_Dictionary* GetDict() const; - CPDF_Array* GetArray() const; - - void SetString(const CFX_ByteString& str); - void SetUnicodeText(const FX_WCHAR* pUnicodes, int len = -1); - - bool IsArray() const { return m_Type == ARRAY; } - bool IsBoolean() const { return m_Type == BOOLEAN; } - bool IsDictionary() const { return m_Type == DICTIONARY; } - bool IsName() const { return m_Type == NAME; } - bool IsNumber() const { return m_Type == NUMBER; } - bool IsReference() const { return m_Type == REFERENCE; } - bool IsStream() const { return m_Type == STREAM; } - bool IsString() const { return m_Type == STRING; } - - CPDF_Array* AsArray(); - const CPDF_Array* AsArray() const; - CPDF_Boolean* AsBoolean(); - const CPDF_Boolean* AsBoolean() const; - CPDF_Dictionary* AsDictionary(); - const CPDF_Dictionary* AsDictionary() const; - CPDF_Name* AsName(); - const CPDF_Name* AsName() const; - CPDF_Number* AsNumber(); - const CPDF_Number* AsNumber() const; - CPDF_Reference* AsReference(); - const CPDF_Reference* AsReference() const; - CPDF_Stream* AsStream(); - const CPDF_Stream* AsStream() const; - CPDF_String* AsString(); - const CPDF_String* AsString() const; + virtual CFX_ByteString GetString() const { return CFX_ByteString(); } + virtual CFX_ByteStringC GetConstString() const { return CFX_ByteStringC(); } + virtual CFX_WideString GetUnicodeText(CFX_CharMap* pCharMap = nullptr) const { + return CFX_WideString(); + } + virtual FX_FLOAT GetNumber() const { return 0; } + virtual int GetInteger() const { return 0; } + virtual CPDF_Dictionary* GetDict() const { return nullptr; } + virtual CPDF_Array* GetArray() const { return nullptr; } + + virtual void SetString(const CFX_ByteString& str) { ASSERT(FALSE); } + + virtual bool IsArray() const { return false; } + virtual bool IsBoolean() const { return false; } + virtual bool IsDictionary() const { return false; } + virtual bool IsName() const { return false; } + virtual bool IsNumber() const { return false; } + virtual bool IsReference() const { return false; } + virtual bool IsStream() const { return false; } + virtual bool IsString() const { return false; } + + virtual CPDF_Array* AsArray() { return nullptr; } + virtual const CPDF_Array* AsArray() const { return nullptr; } + virtual CPDF_Boolean* AsBoolean() { return nullptr; } + virtual const CPDF_Boolean* AsBoolean() const { return nullptr; } + virtual CPDF_Dictionary* AsDictionary() { return nullptr; } + virtual const CPDF_Dictionary* AsDictionary() const { return nullptr; } + virtual CPDF_Name* AsName() { return nullptr; } + virtual const CPDF_Name* AsName() const { return nullptr; } + virtual CPDF_Number* AsNumber() { return nullptr; } + virtual const CPDF_Number* AsNumber() const { return nullptr; } + virtual CPDF_Reference* AsReference() { return nullptr; } + virtual const CPDF_Reference* AsReference() const { return nullptr; } + virtual CPDF_Stream* AsStream() { return nullptr; } + virtual const CPDF_Stream* AsStream() const { return nullptr; } + virtual CPDF_String* AsString() { return nullptr; } + virtual const CPDF_String* AsString() const { return nullptr; } protected: - explicit CPDF_Object(Type type) : m_Type(type), m_ObjNum(0), m_GenNum(0) {} - ~CPDF_Object() {} - void Destroy(); + CPDF_Object() : m_ObjNum(0), m_GenNum(0) {} + virtual ~CPDF_Object() {} + void Destroy() { delete this; } - const CPDF_Object* GetBasicObject() const; - - const Type m_Type; FX_DWORD m_ObjNum; FX_DWORD m_GenNum; @@ -111,66 +107,73 @@ class CPDF_Object { friend class CPDF_SyntaxParser; private: - CPDF_Object* CloneInternal(FX_BOOL bDirect, - std::set* visited) const; + CPDF_Object(const CPDF_Object& src) {} }; + class CPDF_Boolean : public CPDF_Object { public: - CPDF_Boolean() : CPDF_Object(BOOLEAN), m_bValue(false) {} - explicit CPDF_Boolean(FX_BOOL value) - : CPDF_Object(BOOLEAN), m_bValue(value) {} + CPDF_Boolean() : m_bValue(false) {} + explicit CPDF_Boolean(FX_BOOL value) : m_bValue(value) {} - FX_BOOL Identical(CPDF_Boolean* pOther) const { - return m_bValue == pOther->m_bValue; + // CPDF_Object. + Type GetType() const override { return BOOLEAN; } + CPDF_Object* Clone(FX_BOOL bDirect = FALSE) const override { + return new CPDF_Boolean(m_bValue); } - - CFX_ByteString GetString() const { return m_bValue ? "true" : "false"; } - FX_BOOL GetValue() const { return m_bValue; } + CFX_ByteString GetString() const override { + return m_bValue ? "true" : "false"; + } + int GetInteger() const override { return m_bValue; } + void SetString(const CFX_ByteString& str) override { + m_bValue = (str == "true"); + } + bool IsBoolean() const override { return true; } + CPDF_Boolean* AsBoolean() override { return this; } + const CPDF_Boolean* AsBoolean() const override { return this; } protected: + ~CPDF_Boolean() {} + FX_BOOL m_bValue; - friend class CPDF_Object; }; + inline CPDF_Boolean* ToBoolean(CPDF_Object* obj) { return obj ? obj->AsBoolean() : nullptr; } + inline const CPDF_Boolean* ToBoolean(const CPDF_Object* obj) { return obj ? obj->AsBoolean() : nullptr; } class CPDF_Number : public CPDF_Object { public: - CPDF_Number() : CPDF_Object(NUMBER), m_bInteger(TRUE), m_Integer(0) {} - - explicit CPDF_Number(int value); - - explicit CPDF_Number(FX_FLOAT value); - + CPDF_Number() : m_bInteger(TRUE), m_Integer(0) {} + explicit CPDF_Number(int value) : m_bInteger(TRUE), m_Integer(value) {} + explicit CPDF_Number(FX_FLOAT value) : m_bInteger(FALSE), m_Float(value) {} explicit CPDF_Number(const CFX_ByteStringC& str); - FX_BOOL Identical(CPDF_Number* pOther) const; - - CFX_ByteString GetString() const; - - void SetString(const CFX_ByteStringC& str); - - FX_BOOL IsInteger() const { return m_bInteger; } - - int GetInteger() const { return m_bInteger ? m_Integer : (int)m_Float; } - - FX_FLOAT GetNumber() const { - return m_bInteger ? (FX_FLOAT)m_Integer : m_Float; + // CPDF_Object. + Type GetType() const override { return NUMBER; } + CPDF_Object* Clone(FX_BOOL bDirect = FALSE) const override { + return m_bInteger ? new CPDF_Number(m_Integer) : new CPDF_Number(m_Float); } - - void SetNumber(FX_FLOAT value); - - FX_FLOAT GetNumber16() const { return GetNumber(); } - - FX_FLOAT GetFloat() const { - return m_bInteger ? (FX_FLOAT)m_Integer : m_Float; + CFX_ByteString GetString() const override; + FX_FLOAT GetNumber() const override { + return m_bInteger ? static_cast(m_Integer) : m_Float; } + int GetInteger() const override { + return m_bInteger ? m_Integer : static_cast(m_Float); + } + void SetString(const CFX_ByteString& str) override; + bool IsNumber() const override { return true; } + CPDF_Number* AsNumber() override { return this; } + const CPDF_Number* AsNumber() const override { return this; } + + FX_BOOL IsInteger() { return m_bInteger; } protected: + ~CPDF_Number() {} + FX_BOOL m_bInteger; union { @@ -178,141 +181,149 @@ class CPDF_Number : public CPDF_Object { FX_FLOAT m_Float; }; - friend class CPDF_Object; }; + inline CPDF_Number* ToNumber(CPDF_Object* obj) { return obj ? obj->AsNumber() : nullptr; } + inline const CPDF_Number* ToNumber(const CPDF_Object* obj) { return obj ? obj->AsNumber() : nullptr; } class CPDF_String : public CPDF_Object { public: - CPDF_String() : CPDF_Object(STRING), m_bHex(FALSE) {} - + CPDF_String() : m_bHex(FALSE) {} CPDF_String(const CFX_ByteString& str, FX_BOOL bHex) - : CPDF_Object(STRING), m_String(str), m_bHex(bHex) {} - + : m_String(str), m_bHex(bHex) {} explicit CPDF_String(const CFX_WideString& str); - CFX_ByteString GetString() const { return m_String; } - - FX_BOOL Identical(CPDF_String* pOther) const { - return m_String == pOther->m_String; + // CPDF_Object. + Type GetType() const override { return STRING; } + CPDF_Object* Clone(FX_BOOL bDirect = FALSE) const override { + return new CPDF_String(m_String, m_bHex); + } + CFX_ByteString GetString() const override { return m_String; } + CFX_ByteStringC GetConstString() const override { + return CFX_ByteStringC(m_String); } + CFX_WideString GetUnicodeText(CFX_CharMap* pCharMap = nullptr) const override; + void SetString(const CFX_ByteString& str) override { m_String = str; } + bool IsString() const override { return true; } + CPDF_String* AsString() override { return this; } + const CPDF_String* AsString() const override { return this; } FX_BOOL IsHex() const { return m_bHex; } protected: - CFX_ByteString m_String; + ~CPDF_String() {} + CFX_ByteString m_String; FX_BOOL m_bHex; - friend class CPDF_Object; }; + inline CPDF_String* ToString(CPDF_Object* obj) { return obj ? obj->AsString() : nullptr; } + inline const CPDF_String* ToString(const CPDF_Object* obj) { return obj ? obj->AsString() : nullptr; } class CPDF_Name : public CPDF_Object { public: - explicit CPDF_Name(const CFX_ByteString& str) - : CPDF_Object(NAME), m_Name(str) {} - explicit CPDF_Name(const CFX_ByteStringC& str) - : CPDF_Object(NAME), m_Name(str) {} - explicit CPDF_Name(const FX_CHAR* str) : CPDF_Object(NAME), m_Name(str) {} - - CFX_ByteString GetString() const { return m_Name; } - - FX_BOOL Identical(CPDF_Name* pOther) const { - return m_Name == pOther->m_Name; + explicit CPDF_Name(const CFX_ByteString& str) : m_Name(str) {} + explicit CPDF_Name(const CFX_ByteStringC& str) : m_Name(str) {} + explicit CPDF_Name(const FX_CHAR* str) : m_Name(str) {} + + // CPDF_Object. + Type GetType() const override { return NAME; } + CPDF_Object* Clone(FX_BOOL bDirect = FALSE) const override { + return new CPDF_Name(m_Name); } + CFX_ByteString GetString() const override { return m_Name; } + CFX_ByteStringC GetConstString() const override { + return CFX_ByteStringC(m_Name); + } + CFX_WideString GetUnicodeText(CFX_CharMap* pCharMap = nullptr) const override; + void SetString(const CFX_ByteString& str) override { m_Name = str; } + bool IsName() const override { return true; } + CPDF_Name* AsName() override { return this; } + const CPDF_Name* AsName() const override { return this; } protected: + ~CPDF_Name() {} + CFX_ByteString m_Name; - friend class CPDF_Object; }; + inline CPDF_Name* ToName(CPDF_Object* obj) { return obj ? obj->AsName() : nullptr; } + inline const CPDF_Name* ToName(const CPDF_Object* obj) { return obj ? obj->AsName() : nullptr; } class CPDF_Array : public CPDF_Object { public: - CPDF_Array() : CPDF_Object(ARRAY) {} + CPDF_Array() {} + + // CPDF_Object. + Type GetType() const override { return ARRAY; } + CPDF_Object* Clone(FX_BOOL bDirect = FALSE) const override; + CPDF_Array* GetArray() const override { + // The method should be made non-const if we want to not be const. + // See bug #234. + return const_cast(this); + } + bool IsArray() const override { return true; } + CPDF_Array* AsArray() override { return this; } + const CPDF_Array* AsArray() const override { return this; } FX_DWORD GetCount() const { return m_Objects.GetSize(); } - CPDF_Object* GetElement(FX_DWORD index) const; - CPDF_Object* GetElementValue(FX_DWORD index) const; - CFX_Matrix GetMatrix(); - CFX_FloatRect GetRect(); - CFX_ByteString GetStringAt(FX_DWORD index) const; - CFX_ByteStringC GetConstStringAt(FX_DWORD index) const; - int GetIntegerAt(FX_DWORD index) const; - FX_FLOAT GetNumberAt(FX_DWORD index) const; - CPDF_Dictionary* GetDictAt(FX_DWORD index) const; - CPDF_Stream* GetStreamAt(FX_DWORD index) const; - CPDF_Array* GetArrayAt(FX_DWORD index) const; - FX_FLOAT GetFloatAt(FX_DWORD index) const { return GetNumberAt(index); } void SetAt(FX_DWORD index, CPDF_Object* pObj, - CPDF_IndirectObjectHolder* pObjs = NULL); - + CPDF_IndirectObjectHolder* pObjs = nullptr); void InsertAt(FX_DWORD index, CPDF_Object* pObj, - CPDF_IndirectObjectHolder* pObjs = NULL); - + CPDF_IndirectObjectHolder* pObjs = nullptr); void RemoveAt(FX_DWORD index, int nCount = 1); - void Add(CPDF_Object* pObj, CPDF_IndirectObjectHolder* pObjs = NULL); - + void Add(CPDF_Object* pObj, CPDF_IndirectObjectHolder* pObjs = nullptr); void AddNumber(FX_FLOAT f); - void AddInteger(int i); - void AddString(const CFX_ByteString& str); - void AddName(const CFX_ByteString& str); - void AddReference(CPDF_IndirectObjectHolder* pDoc, FX_DWORD objnum); - void AddReference(CPDF_IndirectObjectHolder* pDoc, CPDF_Object* obj) { AddReference(pDoc, obj->GetObjNum()); } - - FX_FLOAT GetNumber16(FX_DWORD index) const { return GetNumberAt(index); } - void AddNumber16(FX_FLOAT value) { AddNumber(value); } - FX_BOOL Identical(CPDF_Array* pOther) const; - protected: ~CPDF_Array(); CFX_ArrayTemplate m_Objects; - friend class CPDF_Object; }; + inline CPDF_Array* ToArray(CPDF_Object* obj) { return obj ? obj->AsArray() : nullptr; } + inline const CPDF_Array* ToArray(const CPDF_Object* obj) { return obj ? obj->AsArray() : nullptr; } @@ -322,44 +333,41 @@ class CPDF_Dictionary : public CPDF_Object { using iterator = std::map::iterator; using const_iterator = std::map::const_iterator; - CPDF_Dictionary() : CPDF_Object(DICTIONARY) {} + CPDF_Dictionary() {} - CPDF_Object* GetElement(const CFX_ByteStringC& key) const; + // CPDF_Object. + Type GetType() const override { return DICTIONARY; } + CPDF_Object* Clone(FX_BOOL bDirect = FALSE) const override; + CPDF_Dictionary* GetDict() const override { + // The method should be made non-const if we want to not be const. + // See bug #234. + return const_cast(this); + } + bool IsDictionary() const override { return true; } + CPDF_Dictionary* AsDictionary() override { return this; } + const CPDF_Dictionary* AsDictionary() const override { return this; } + size_t GetCount() const { return m_Map.size(); } + CPDF_Object* GetElement(const CFX_ByteStringC& key) const; CPDF_Object* GetElementValue(const CFX_ByteStringC& key) const; - CFX_ByteString GetStringBy(const CFX_ByteStringC& key) const; - CFX_ByteStringC GetConstStringBy(const CFX_ByteStringC& key) const; - CFX_ByteString GetStringBy(const CFX_ByteStringC& key, const CFX_ByteStringC& default_str) const; - CFX_ByteStringC GetConstStringBy(const CFX_ByteStringC& key, const CFX_ByteStringC& default_str) const; - CFX_WideString GetUnicodeTextBy(const CFX_ByteStringC& key, CFX_CharMap* pCharMap = NULL) const; - int GetIntegerBy(const CFX_ByteStringC& key) const; - int GetIntegerBy(const CFX_ByteStringC& key, int default_int) const; - FX_BOOL GetBooleanBy(const CFX_ByteStringC& key, FX_BOOL bDefault = FALSE) const; - FX_FLOAT GetNumberBy(const CFX_ByteStringC& key) const; - CPDF_Dictionary* GetDictBy(const CFX_ByteStringC& key) const; - CPDF_Stream* GetStreamBy(const CFX_ByteStringC& key) const; - CPDF_Array* GetArrayBy(const CFX_ByteStringC& key) const; - CFX_FloatRect GetRectBy(const CFX_ByteStringC& key) const; - CFX_Matrix GetMatrixBy(const CFX_ByteStringC& key) const; - FX_FLOAT GetFloatBy(const CFX_ByteStringC& key) const { return GetNumberBy(key); } @@ -368,63 +376,47 @@ class CPDF_Dictionary : public CPDF_Object { // Set* functions invalidate iterators for the element with the key |key|. void SetAt(const CFX_ByteStringC& key, CPDF_Object* pObj); - void SetAtName(const CFX_ByteStringC& key, const CFX_ByteString& name); - void SetAtString(const CFX_ByteStringC& key, const CFX_ByteString& string); - void SetAtInteger(const CFX_ByteStringC& key, int i); - void SetAtNumber(const CFX_ByteStringC& key, FX_FLOAT f); - void SetAtReference(const CFX_ByteStringC& key, CPDF_IndirectObjectHolder* pDoc, FX_DWORD objnum); - void SetAtReference(const CFX_ByteStringC& key, CPDF_IndirectObjectHolder* pDoc, CPDF_Object* obj) { SetAtReference(key, pDoc, obj->GetObjNum()); } + void SetAtRect(const CFX_ByteStringC& key, const CFX_FloatRect& rect); + void SetAtMatrix(const CFX_ByteStringC& key, const CFX_Matrix& matrix); + void SetAtBoolean(const CFX_ByteStringC& key, FX_BOOL bValue); void AddReference(const CFX_ByteStringC& key, CPDF_IndirectObjectHolder* pDoc, FX_DWORD objnum); - void SetAtRect(const CFX_ByteStringC& key, const CFX_FloatRect& rect); - - void SetAtMatrix(const CFX_ByteStringC& key, const CFX_Matrix& matrix); - - void SetAtBoolean(const CFX_ByteStringC& key, FX_BOOL bValue); - // Invalidates iterators for the element with the key |key|. void RemoveAt(const CFX_ByteStringC& key); // Invalidates iterators for the element with the key |oldkey|. void ReplaceKey(const CFX_ByteStringC& oldkey, const CFX_ByteStringC& newkey); - FX_BOOL Identical(CPDF_Dictionary* pDict) const; - - size_t GetCount() const { return m_Map.size(); } - iterator begin() { return m_Map.begin(); } - iterator end() { return m_Map.end(); } - const_iterator begin() const { return m_Map.begin(); } - const_iterator end() const { return m_Map.end(); } protected: ~CPDF_Dictionary(); std::map m_Map; - - friend class CPDF_Object; }; + inline CPDF_Dictionary* ToDictionary(CPDF_Object* obj) { return obj ? obj->AsDictionary() : nullptr; } + inline const CPDF_Dictionary* ToDictionary(const CPDF_Object* obj) { return obj ? obj->AsDictionary() : nullptr; } @@ -433,7 +425,17 @@ class CPDF_Stream : public CPDF_Object { public: CPDF_Stream(uint8_t* pData, FX_DWORD size, CPDF_Dictionary* pDict); - CPDF_Dictionary* GetDict() const { return m_pDict; } + // CPDF_Object. + Type GetType() const override { return STREAM; } + CPDF_Object* Clone(FX_BOOL bDirect = FALSE) const override; + CPDF_Dictionary* GetDict() const override { return m_pDict; } + CFX_WideString GetUnicodeText(CFX_CharMap* pCharMap = nullptr) const override; + bool IsStream() const override { return true; } + CPDF_Stream* AsStream() override { return this; } + const CPDF_Stream* AsStream() const override { return this; } + + FX_DWORD GetRawSize() const { return m_dwSize; } + uint8_t* GetRawData() const { return m_pDataBuf; } void SetData(const uint8_t* pData, FX_DWORD size, @@ -441,13 +443,8 @@ class CPDF_Stream : public CPDF_Object { FX_BOOL bKeepBuf); void InitStream(uint8_t* pData, FX_DWORD size, CPDF_Dictionary* pDict); - void InitStreamFromFile(IFX_FileRead* pFile, CPDF_Dictionary* pDict); - FX_BOOL Identical(CPDF_Stream* pOther) const; - - FX_DWORD GetRawSize() const { return m_dwSize; } - FX_BOOL ReadRawData(FX_FILESIZE start_pos, uint8_t* pBuf, FX_DWORD buf_size) const; @@ -455,29 +452,26 @@ class CPDF_Stream : public CPDF_Object { FX_BOOL IsMemoryBased() const { return m_GenNum == kMemoryBasedGenNum; } protected: - friend class CPDF_Object; - friend class CPDF_StreamAcc; - static const FX_DWORD kMemoryBasedGenNum = (FX_DWORD)-1; + ~CPDF_Stream(); void InitStreamInternal(CPDF_Dictionary* pDict); CPDF_Dictionary* m_pDict; - FX_DWORD m_dwSize; - FX_DWORD m_GenNum; union { uint8_t* m_pDataBuf; - IFX_FileRead* m_pFile; }; }; + inline CPDF_Stream* ToStream(CPDF_Object* obj) { return obj ? obj->AsStream() : nullptr; } + inline const CPDF_Stream* ToStream(const CPDF_Object* obj) { return obj ? obj->AsStream() : nullptr; } @@ -485,7 +479,6 @@ inline const CPDF_Stream* ToStream(const CPDF_Object* obj) { class CPDF_StreamAcc { public: CPDF_StreamAcc(); - ~CPDF_StreamAcc(); void LoadAllData(const CPDF_Stream* pStream, @@ -494,66 +487,93 @@ class CPDF_StreamAcc { FX_BOOL bImageAcc = FALSE); const CPDF_Stream* GetStream() const { return m_pStream; } - CPDF_Dictionary* GetDict() const { return m_pStream ? m_pStream->GetDict() : nullptr; } - const uint8_t* GetData() const; - FX_DWORD GetSize() const; + const CFX_ByteString& GetImageDecoder() const { return m_ImageDecoder; } + const CPDF_Dictionary* GetImageParam() const { return m_pImageParam; } uint8_t* DetachData(); - const CFX_ByteString& GetImageDecoder() { return m_ImageDecoder; } - - const CPDF_Dictionary* GetImageParam() { return m_pImageParam; } - protected: uint8_t* m_pData; - FX_DWORD m_dwSize; - FX_BOOL m_bNewBuf; - CFX_ByteString m_ImageDecoder; - CPDF_Dictionary* m_pImageParam; - const CPDF_Stream* m_pStream; - uint8_t* m_pSrcData; }; class CPDF_Null : public CPDF_Object { public: - CPDF_Null() : CPDF_Object(NULLOBJ) {} + CPDF_Null() {} + + // CPDF_Object. + Type GetType() const override { return NULLOBJ; } + CPDF_Object* Clone(FX_BOOL bDirect = FALSE) const override { + return new CPDF_Null; + } }; class CPDF_Reference : public CPDF_Object { public: CPDF_Reference(CPDF_IndirectObjectHolder* pDoc, int objnum) - : CPDF_Object(REFERENCE), m_pObjList(pDoc), m_RefObjNum(objnum) {} + : m_pObjList(pDoc), m_RefObjNum(objnum) {} + + // CPDF_Object. + Type GetType() const override { return REFERENCE; } + CPDF_Object* Clone(FX_BOOL bDirect = FALSE) const override; + CPDF_Object* GetDirect() const override; + CFX_ByteString GetString() const override { + CPDF_Object* obj = SafeGetDirect(); + return obj ? obj->GetString() : CFX_ByteString(); + } + CFX_ByteStringC GetConstString() const override { + CPDF_Object* obj = SafeGetDirect(); + return obj ? obj->GetConstString() : CFX_ByteStringC(); + } + FX_FLOAT GetNumber() const override { + CPDF_Object* obj = SafeGetDirect(); + return obj ? obj->GetNumber() : 0; + } + int GetInteger() const override { + CPDF_Object* obj = SafeGetDirect(); + return obj ? obj->GetInteger() : 0; + } + CPDF_Dictionary* GetDict() const override { + CPDF_Object* obj = SafeGetDirect(); + return obj ? obj->GetDict() : nullptr; + } + // TODO(weili): check whether GetUnicodeText() and GetArray() are needed. + bool IsReference() const override { return true; } + CPDF_Reference* AsReference() override { return this; } + const CPDF_Reference* AsReference() const override { return this; } CPDF_IndirectObjectHolder* GetObjList() const { return m_pObjList; } - FX_DWORD GetRefObjNum() const { return m_RefObjNum; } void SetRef(CPDF_IndirectObjectHolder* pDoc, FX_DWORD objnum); - FX_BOOL Identical(CPDF_Reference* pOther) const { - return m_RefObjNum == pOther->m_RefObjNum; + protected: + ~CPDF_Reference() {} + CPDF_Object* SafeGetDirect() const { + CPDF_Object* obj = GetDirect(); + if (!obj || obj->IsReference()) + return nullptr; + return obj; } - protected: CPDF_IndirectObjectHolder* m_pObjList; - FX_DWORD m_RefObjNum; - friend class CPDF_Object; }; + inline CPDF_Reference* ToReference(CPDF_Object* obj) { return obj ? obj->AsReference() : nullptr; } + inline const CPDF_Reference* ToReference(const CPDF_Object* obj) { return obj ? obj->AsReference() : nullptr; } @@ -575,7 +595,7 @@ class CPDF_IndirectObjectHolder { FX_DWORD GetLastObjNum() const { return m_LastObjNum; } iterator begin() { return m_IndirectObjs.begin(); } - const_iterator begin() const { return m_IndirectObjs.cbegin(); } + const_iterator begin() const { return m_IndirectObjs.begin(); } iterator end() { return m_IndirectObjs.end(); } const_iterator end() const { return m_IndirectObjs.end(); } -- cgit v1.2.3