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