Chromium Code Reviews| Index: core/include/fpdfapi/fpdf_objects.h |
| diff --git a/core/include/fpdfapi/fpdf_objects.h b/core/include/fpdfapi/fpdf_objects.h |
| index ca4bb51fda6433571e3ad37a23ba4aa57d20c943..2cd6c9f1198e34cb933ba63827745b6d1139b2a5 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<CPDF_Object*>(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 = NULL) const { |
|
Lei Zhang
2016/01/27 23:16:59
NULL -> nullptr since we are changing this line an
Wei Li
2016/01/28 18:23:14
Done.
|
| + 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,75 @@ class CPDF_Object { |
| friend class CPDF_SyntaxParser; |
| private: |
| - CPDF_Object* CloneInternal(FX_BOOL bDirect, |
| - std::set<FX_DWORD>* 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; |
| + // From CPDF_Object. |
|
Lei Zhang
2016/01/27 23:16:59
nit: We usually just write this as: // CPDF_Object
Wei Li
2016/01/28 18:23:14
Done.
|
| + 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 const_cast<CPDF_Boolean*>(this); } |
|
Lei Zhang
2016/01/27 23:16:59
Do you need the const_cast?
Wei Li
2016/01/28 18:23:14
Done.
|
| + 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; |
| + // From CPDF_Object. |
| + Type GetType() const override { return NUMBER; } |
| + CPDF_Object* Clone(FX_BOOL bDirect = FALSE) const override { |
| + if (m_bInteger) |
|
Lei Zhang
2016/01/27 23:16:59
One liner: return m_bInteger ? new CPDF_Number(m_I
Wei Li
2016/01/28 18:23:14
Done.
|
| + return new CPDF_Number(m_Integer); |
| + return 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<FX_FLOAT>(m_Integer) : m_Float; |
| + } |
| + int GetInteger() const override { |
| + return m_bInteger ? m_Integer : static_cast<int>(m_Float); |
| } |
| + void SetString(const CFX_ByteString& str) override; |
| + bool IsNumber() const override { return true; } |
| + CPDF_Number* AsNumber() override { return const_cast<CPDF_Number*>(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 +183,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; |
| + // From 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 = NULL) const override; |
| + void SetString(const CFX_ByteString& str) override { m_String = str; } |
| + bool IsString() const override { return true; } |
| + CPDF_String* AsString() override { return const_cast<CPDF_String*>(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) {} |
| + |
| + // From 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 = NULL) const override; |
| + void SetString(const CFX_ByteString& str) override { m_Name = str; } |
| + bool IsName() const override { return true; } |
| + CPDF_Name* AsName() override { return const_cast<CPDF_Name*>(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() {} |
| + |
| + // From 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<CPDF_Array*>(this); |
| + } |
| + bool IsArray() const override { return true; } |
| + CPDF_Array* AsArray() override { return const_cast<CPDF_Array*>(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 GetString(FX_DWORD index) const; |
| - |
| CFX_ByteStringC GetConstString(FX_DWORD index) const; |
| - |
| int GetInteger(FX_DWORD index) const; |
| - |
| FX_FLOAT GetNumber(FX_DWORD index) const; |
| - |
| CPDF_Dictionary* GetDict(FX_DWORD index) const; |
| - |
| CPDF_Stream* GetStream(FX_DWORD index) const; |
| - |
| CPDF_Array* GetArray(FX_DWORD index) const; |
| - |
| FX_FLOAT GetFloat(FX_DWORD index) const { return GetNumber(index); } |
| void SetAt(FX_DWORD index, |
| CPDF_Object* pObj, |
| CPDF_IndirectObjectHolder* pObjs = NULL); |
| - |
| void InsertAt(FX_DWORD index, |
| CPDF_Object* pObj, |
| CPDF_IndirectObjectHolder* pObjs = NULL); |
| - |
| void RemoveAt(FX_DWORD index, int nCount = 1); |
| void Add(CPDF_Object* pObj, CPDF_IndirectObjectHolder* pObjs = NULL); |
| - |
| 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 GetNumber(index); } |
| - |
| void AddNumber16(FX_FLOAT value) { AddNumber(value); } |
| - FX_BOOL Identical(CPDF_Array* pOther) const; |
| - |
| protected: |
| ~CPDF_Array(); |
| CFX_ArrayTemplate<CPDF_Object*> 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,107 +335,90 @@ class CPDF_Dictionary : public CPDF_Object { |
| using iterator = std::map<CFX_ByteString, CPDF_Object*>::iterator; |
| using const_iterator = std::map<CFX_ByteString, CPDF_Object*>::const_iterator; |
| - CPDF_Dictionary() : CPDF_Object(DICTIONARY) {} |
| + CPDF_Dictionary() {} |
| - CPDF_Object* GetElement(const CFX_ByteStringC& key) const; |
| + // From 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<CPDF_Dictionary*>(this); |
| + } |
| + bool IsDictionary() const override { return true; } |
| + CPDF_Dictionary* AsDictionary() override { |
| + return const_cast<CPDF_Dictionary*>(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 GetString(const CFX_ByteStringC& key) const; |
| - |
| CFX_ByteStringC GetConstString(const CFX_ByteStringC& key) const; |
| - |
| CFX_ByteString GetString(const CFX_ByteStringC& key, |
| const CFX_ByteStringC& default_str) const; |
| - |
| CFX_ByteStringC GetConstString(const CFX_ByteStringC& key, |
| const CFX_ByteStringC& default_str) const; |
| - |
| CFX_WideString GetUnicodeText(const CFX_ByteStringC& key, |
| CFX_CharMap* pCharMap = NULL) const; |
| - |
| int GetInteger(const CFX_ByteStringC& key) const; |
| - |
| int GetInteger(const CFX_ByteStringC& key, int default_int) const; |
| - |
| FX_BOOL GetBoolean(const CFX_ByteStringC& key, |
| FX_BOOL bDefault = FALSE) const; |
| - |
| FX_FLOAT GetNumber(const CFX_ByteStringC& key) const; |
| - |
| CPDF_Dictionary* GetDict(const CFX_ByteStringC& key) const; |
| - |
| CPDF_Stream* GetStream(const CFX_ByteStringC& key) const; |
| - |
| CPDF_Array* GetArray(const CFX_ByteStringC& key) const; |
| - |
| CFX_FloatRect GetRect(const CFX_ByteStringC& key) const; |
| - |
| CFX_Matrix GetMatrix(const CFX_ByteStringC& key) const; |
| - |
| FX_FLOAT GetFloat(const CFX_ByteStringC& key) const { return GetNumber(key); } |
| FX_BOOL KeyExist(const CFX_ByteStringC& key) const; |
| // 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<CFX_ByteString, CPDF_Object*> 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; |
| } |
| @@ -431,7 +427,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; } |
| + // From 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 = NULL) const override; |
| + bool IsStream() const override { return true; } |
| + CPDF_Stream* AsStream() override { return const_cast<CPDF_Stream*>(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, |
| @@ -439,13 +445,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; |
| @@ -453,29 +454,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; |
| } |
| @@ -483,7 +481,6 @@ inline const CPDF_Stream* ToStream(const CPDF_Object* obj) { |
| class CPDF_StreamAcc { |
| public: |
| CPDF_StreamAcc(); |
| - |
| ~CPDF_StreamAcc(); |
| void LoadAllData(const CPDF_Stream* pStream, |
| @@ -492,66 +489,95 @@ 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; |
| - |
| - uint8_t* DetachData(); |
| - |
| const CFX_ByteString& GetImageDecoder() { return m_ImageDecoder; } |
|
Lei Zhang
2016/01/27 23:16:59
Can these two methods be const?
Wei Li
2016/01/28 18:23:14
Done.
|
| - |
| const CPDF_Dictionary* GetImageParam() { return m_pImageParam; } |
| + uint8_t* DetachData(); |
| + |
| 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() {} |
| + |
| + // From 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) {} |
| + |
| + // From 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 const_cast<CPDF_Reference*>(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; |
| } |
| @@ -573,7 +599,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(); } |