Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(410)

Side by Side Diff: core/include/fpdfapi/fpdf_objects.h

Issue 1634373003: Refactor CPDF_Object and its subclasses. (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@master
Patch Set: Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698