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

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

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

Powered by Google App Engine
This is Rietveld 408576698