clang-format all pdfium code.
[pdfium.git] / core / include / fpdfapi / fpdf_objects.h
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 "../fxcrt/fx_coordinates.h"
11 #include "../fxcrt/fx_system.h"
12
13 class CPDF_Array;
14 class CPDF_Boolean;
15 class CPDF_CryptoHandler;
16 class CPDF_Dictionary;
17 class CPDF_Document;
18 class CPDF_IndirectObjects;
19 class CPDF_Null;
20 class CPDF_Number;
21 class CPDF_Parser;
22 class CPDF_Reference;
23 class CPDF_Stream;
24 class CPDF_StreamAcc;
25 class CPDF_StreamFilter;
26 class CPDF_String;
27 class IFX_FileRead;
28
29 #define PDFOBJ_INVALID 0
30 #define PDFOBJ_BOOLEAN 1
31 #define PDFOBJ_NUMBER 2
32 #define PDFOBJ_STRING 3
33 #define PDFOBJ_NAME 4
34 #define PDFOBJ_ARRAY 5
35 #define PDFOBJ_DICTIONARY 6
36 #define PDFOBJ_STREAM 7
37 #define PDFOBJ_NULL 8
38 #define PDFOBJ_REFERENCE 9
39
40 typedef IFX_FileStream* (*FPDF_LPFCloneStreamCallback)(CPDF_Stream* pStream,
41                                                        void* pUserData);
42 class CPDF_Object {
43  public:
44   int GetType() const { return m_Type; }
45
46   FX_DWORD GetObjNum() const { return m_ObjNum; }
47
48   FX_DWORD GetGenNum() const { return m_GenNum; }
49
50   FX_BOOL IsIdentical(CPDF_Object* pObj) const;
51
52   CPDF_Object* Clone(FX_BOOL bDirect = FALSE) const;
53
54   CPDF_Object* CloneRef(CPDF_IndirectObjects* pObjs) const;
55
56   CPDF_Object* GetDirect() const;
57
58   void Release();
59
60   CFX_ByteString GetString() const;
61
62   CFX_ByteStringC GetConstString() const;
63
64   CFX_WideString GetUnicodeText(CFX_CharMap* pCharMap = NULL) const;
65   FX_FLOAT GetNumber() const;
66
67   FX_FLOAT GetNumber16() const;
68
69   int GetInteger() const;
70
71   CPDF_Dictionary* GetDict() const;
72
73   CPDF_Array* GetArray() const;
74
75   void SetString(const CFX_ByteString& str);
76
77   void SetUnicodeText(const FX_WCHAR* pUnicodes, int len = -1);
78
79   int GetDirectType() const;
80
81   FX_BOOL IsModified() const { return FALSE; }
82
83  protected:
84   CPDF_Object(FX_DWORD type) : m_Type(type), m_ObjNum(0), m_GenNum(0) {}
85   ~CPDF_Object() {}
86   void Destroy();
87
88   static const int OBJECT_REF_MAX_DEPTH = 128;
89   static int s_nCurRefDepth;
90   FX_DWORD m_Type;
91   FX_DWORD m_ObjNum;
92   FX_DWORD m_GenNum;
93
94   friend class CPDF_IndirectObjects;
95   friend class CPDF_Parser;
96   friend class CPDF_SyntaxParser;
97
98  private:
99   CPDF_Object(const CPDF_Object& src) {}
100   CPDF_Object* CloneInternal(FX_BOOL bDirect, CFX_MapPtrToPtr* visited) const;
101 };
102 class CPDF_Boolean : public CPDF_Object {
103  public:
104   static CPDF_Boolean* Create(FX_BOOL value) { return new CPDF_Boolean(value); }
105
106   CPDF_Boolean() : CPDF_Object(PDFOBJ_BOOLEAN), m_bValue(false) {}
107   CPDF_Boolean(FX_BOOL value) : CPDF_Object(PDFOBJ_BOOLEAN), m_bValue(value) {}
108
109   FX_BOOL Identical(CPDF_Boolean* pOther) const {
110     return m_bValue == pOther->m_bValue;
111   }
112
113  protected:
114   FX_BOOL m_bValue;
115   friend class CPDF_Object;
116 };
117 class CPDF_Number : public CPDF_Object {
118  public:
119   static CPDF_Number* Create(int value) { return new CPDF_Number(value); }
120
121   static CPDF_Number* Create(FX_FLOAT value) { return new CPDF_Number(value); }
122
123   static CPDF_Number* Create(const CFX_ByteStringC& str) {
124     return new CPDF_Number(str);
125   }
126
127   static CPDF_Number* Create(FX_BOOL bInteger, void* pData) {
128     return new CPDF_Number(bInteger, pData);
129   }
130
131   CPDF_Number() : CPDF_Object(PDFOBJ_NUMBER), m_bInteger(false), m_Integer(0) {}
132
133   CPDF_Number(FX_BOOL bInteger, void* pData);
134
135   CPDF_Number(int value);
136
137   CPDF_Number(FX_FLOAT value);
138
139   CPDF_Number(const CFX_ByteStringC& str);
140
141   FX_BOOL Identical(CPDF_Number* pOther) const;
142
143   CFX_ByteString GetString() const;
144
145   void SetString(const CFX_ByteStringC& str);
146
147   FX_BOOL IsInteger() const { return m_bInteger; }
148
149   int GetInteger() const { return m_bInteger ? m_Integer : (int)m_Float; }
150
151   FX_FLOAT GetNumber() const {
152     return m_bInteger ? (FX_FLOAT)m_Integer : m_Float;
153   }
154
155   void SetNumber(FX_FLOAT value);
156
157   FX_FLOAT GetNumber16() const { return GetNumber(); }
158
159   FX_FLOAT GetFloat() const {
160     return m_bInteger ? (FX_FLOAT)m_Integer : m_Float;
161   }
162
163  protected:
164   FX_BOOL m_bInteger;
165
166   union {
167     int m_Integer;
168
169     FX_FLOAT m_Float;
170   };
171   friend class CPDF_Object;
172 };
173 class CPDF_String : public CPDF_Object {
174  public:
175   static CPDF_String* Create(const CFX_ByteString& str, FX_BOOL bHex = FALSE) {
176     return new CPDF_String(str, bHex);
177   }
178
179   static CPDF_String* Create(const CFX_WideString& str) {
180     return new CPDF_String(str);
181   }
182
183   CPDF_String() : CPDF_Object(PDFOBJ_STRING), m_bHex(FALSE) {}
184
185   CPDF_String(const CFX_ByteString& str, FX_BOOL bHex = FALSE)
186       : CPDF_Object(PDFOBJ_STRING), m_String(str), m_bHex(bHex) {}
187
188   CPDF_String(const CFX_WideString& str);
189
190   CFX_ByteString& GetString() { return m_String; }
191
192   FX_BOOL Identical(CPDF_String* pOther) const {
193     return m_String == pOther->m_String;
194   }
195
196   FX_BOOL IsHex() const { return m_bHex; }
197
198  protected:
199   CFX_ByteString m_String;
200
201   FX_BOOL m_bHex;
202   friend class CPDF_Object;
203 };
204 class CPDF_Name : public CPDF_Object {
205  public:
206   static CPDF_Name* Create(const CFX_ByteString& str) {
207     return new CPDF_Name(str);
208   }
209
210   static CPDF_Name* Create(const CFX_ByteStringC& str) {
211     return new CPDF_Name(str);
212   }
213
214   static CPDF_Name* Create(const FX_CHAR* str) { return new CPDF_Name(str); }
215
216   CPDF_Name(const CFX_ByteString& str)
217       : CPDF_Object(PDFOBJ_NAME), m_Name(str) {}
218   CPDF_Name(const CFX_ByteStringC& str)
219       : CPDF_Object(PDFOBJ_NAME), m_Name(str) {}
220   CPDF_Name(const FX_CHAR* str) : CPDF_Object(PDFOBJ_NAME), m_Name(str) {}
221
222   CFX_ByteString& GetString() { return m_Name; }
223
224   FX_BOOL Identical(CPDF_Name* pOther) const {
225     return m_Name == pOther->m_Name;
226   }
227
228  protected:
229   CFX_ByteString m_Name;
230   friend class CPDF_Object;
231 };
232 class CPDF_Array : public CPDF_Object {
233  public:
234   static CPDF_Array* Create() { return new CPDF_Array(); }
235
236   CPDF_Array() : CPDF_Object(PDFOBJ_ARRAY) {}
237
238   FX_DWORD GetCount() const { return m_Objects.GetSize(); }
239
240   CPDF_Object* GetElement(FX_DWORD index) const;
241
242   CPDF_Object* GetElementValue(FX_DWORD index) const;
243
244   CFX_AffineMatrix GetMatrix();
245
246   CFX_FloatRect GetRect();
247
248   CFX_ByteString GetString(FX_DWORD index) const;
249
250   CFX_ByteStringC GetConstString(FX_DWORD index) const;
251
252   int GetInteger(FX_DWORD index) const;
253
254   FX_FLOAT GetNumber(FX_DWORD index) const;
255
256   CPDF_Dictionary* GetDict(FX_DWORD index) const;
257
258   CPDF_Stream* GetStream(FX_DWORD index) const;
259
260   CPDF_Array* GetArray(FX_DWORD index) const;
261
262   FX_FLOAT GetFloat(FX_DWORD index) const { return GetNumber(index); }
263
264   void SetAt(FX_DWORD index,
265              CPDF_Object* pObj,
266              CPDF_IndirectObjects* pObjs = NULL);
267
268   void InsertAt(FX_DWORD index,
269                 CPDF_Object* pObj,
270                 CPDF_IndirectObjects* pObjs = NULL);
271
272   void RemoveAt(FX_DWORD index);
273
274   void Add(CPDF_Object* pObj, CPDF_IndirectObjects* pObjs = NULL);
275
276   void AddNumber(FX_FLOAT f);
277
278   void AddInteger(int i);
279
280   void AddString(const CFX_ByteString& str);
281
282   void AddName(const CFX_ByteString& str);
283
284   void AddReference(CPDF_IndirectObjects* pDoc, FX_DWORD objnum);
285
286   void AddReference(CPDF_IndirectObjects* pDoc, CPDF_Object* obj) {
287     AddReference(pDoc, obj->GetObjNum());
288   }
289
290   FX_FLOAT GetNumber16(FX_DWORD index) const { return GetNumber(index); }
291
292   void AddNumber16(FX_FLOAT value) { AddNumber(value); }
293
294   FX_BOOL Identical(CPDF_Array* pOther) const;
295
296  protected:
297   ~CPDF_Array();
298
299   CFX_PtrArray m_Objects;
300   friend class CPDF_Object;
301 };
302 class CPDF_Dictionary : public CPDF_Object {
303  public:
304   static CPDF_Dictionary* Create() { return new CPDF_Dictionary(); }
305
306   CPDF_Dictionary() : CPDF_Object(PDFOBJ_DICTIONARY) {}
307
308   CPDF_Object* GetElement(const CFX_ByteStringC& key) const;
309
310   CPDF_Object* GetElementValue(const CFX_ByteStringC& key) const;
311
312   CFX_ByteString GetString(const CFX_ByteStringC& key) const;
313
314   CFX_ByteStringC GetConstString(const CFX_ByteStringC& key) const;
315
316   CFX_ByteString GetString(const CFX_ByteStringC& key,
317                            const CFX_ByteStringC& default_str) const;
318
319   CFX_ByteStringC GetConstString(const CFX_ByteStringC& key,
320                                  const CFX_ByteStringC& default_str) const;
321
322   CFX_WideString GetUnicodeText(const CFX_ByteStringC& key,
323                                 CFX_CharMap* pCharMap = NULL) const;
324
325   int GetInteger(const CFX_ByteStringC& key) const;
326
327   int GetInteger(const CFX_ByteStringC& key, int default_int) const;
328
329   FX_BOOL GetBoolean(const CFX_ByteStringC& key,
330                      FX_BOOL bDefault = FALSE) const;
331
332   FX_FLOAT GetNumber(const CFX_ByteStringC& key) const;
333
334   CPDF_Dictionary* GetDict(const CFX_ByteStringC& key) const;
335
336   CPDF_Stream* GetStream(const CFX_ByteStringC& key) const;
337
338   CPDF_Array* GetArray(const CFX_ByteStringC& key) const;
339
340   CFX_FloatRect GetRect(const CFX_ByteStringC& key) const;
341
342   CFX_AffineMatrix GetMatrix(const CFX_ByteStringC& key) const;
343
344   FX_FLOAT GetFloat(const CFX_ByteStringC& key) const { return GetNumber(key); }
345
346   FX_BOOL KeyExist(const CFX_ByteStringC& key) const;
347
348   FX_POSITION GetStartPos() const;
349
350   CPDF_Object* GetNextElement(FX_POSITION& pos, CFX_ByteString& key) const;
351
352   void SetAt(const CFX_ByteStringC& key,
353              CPDF_Object* pObj,
354              CPDF_IndirectObjects* pObjs = NULL);
355
356   void SetAtName(const CFX_ByteStringC& key, const CFX_ByteString& name);
357
358   void SetAtString(const CFX_ByteStringC& key, const CFX_ByteString& string);
359
360   void SetAtInteger(const CFX_ByteStringC& key, int i);
361
362   void SetAtNumber(const CFX_ByteStringC& key, FX_FLOAT f);
363
364   void SetAtReference(const CFX_ByteStringC& key,
365                       CPDF_IndirectObjects* pDoc,
366                       FX_DWORD objnum);
367
368   void SetAtReference(const CFX_ByteStringC& key,
369                       CPDF_IndirectObjects* pDoc,
370                       CPDF_Object* obj) {
371     SetAtReference(key, pDoc, obj->GetObjNum());
372   }
373
374   void AddReference(const CFX_ByteStringC& key,
375                     CPDF_IndirectObjects* pDoc,
376                     FX_DWORD objnum);
377
378   void AddReference(const CFX_ByteStringC& key,
379                     CPDF_IndirectObjects* pDoc,
380                     CPDF_Object* obj) {
381     AddReference(key, pDoc, obj->GetObjNum());
382   }
383
384   void SetAtRect(const CFX_ByteStringC& key, const CFX_FloatRect& rect);
385
386   void SetAtMatrix(const CFX_ByteStringC& key, const CFX_AffineMatrix& matrix);
387
388   void SetAtBoolean(const CFX_ByteStringC& key, FX_BOOL bValue);
389
390   void RemoveAt(const CFX_ByteStringC& key);
391
392   void ReplaceKey(const CFX_ByteStringC& oldkey, const CFX_ByteStringC& newkey);
393
394   FX_BOOL Identical(CPDF_Dictionary* pDict) const;
395
396   int GetCount() const { return m_Map.GetCount(); }
397
398   void AddValue(const CFX_ByteStringC& key, CPDF_Object* pObj);
399
400  protected:
401   ~CPDF_Dictionary();
402
403   CFX_CMapByteStringToPtr m_Map;
404
405   friend class CPDF_Object;
406 };
407 class CPDF_Stream : public CPDF_Object {
408  public:
409   static CPDF_Stream* Create(uint8_t* pData,
410                              FX_DWORD size,
411                              CPDF_Dictionary* pDict) {
412     return new CPDF_Stream(pData, size, pDict);
413   }
414
415   CPDF_Stream(uint8_t* pData, FX_DWORD size, CPDF_Dictionary* pDict);
416
417   CPDF_Dictionary* GetDict() const { return m_pDict; }
418
419   void SetData(const uint8_t* pData,
420                FX_DWORD size,
421                FX_BOOL bCompressed,
422                FX_BOOL bKeepBuf);
423
424   void InitStream(uint8_t* pData, FX_DWORD size, CPDF_Dictionary* pDict);
425
426   void InitStream(IFX_FileRead* pFile, CPDF_Dictionary* pDict);
427
428   FX_BOOL Identical(CPDF_Stream* pOther) const;
429
430   CPDF_StreamFilter* GetStreamFilter(FX_BOOL bRaw = FALSE) const;
431
432   FX_DWORD GetRawSize() const { return m_dwSize; }
433
434   FX_BOOL ReadRawData(FX_FILESIZE start_pos,
435                       uint8_t* pBuf,
436                       FX_DWORD buf_size) const;
437
438   FX_BOOL IsMemoryBased() const { return m_GenNum == (FX_DWORD)-1; }
439
440   CPDF_Stream* Clone(FX_BOOL bDirect,
441                      FPDF_LPFCloneStreamCallback lpfCallback,
442                      void* pUserData) const;
443
444  protected:
445   ~CPDF_Stream();
446
447   CPDF_Dictionary* m_pDict;
448
449   FX_DWORD m_dwSize;
450
451   FX_DWORD m_GenNum;
452
453   union {
454     uint8_t* m_pDataBuf;
455
456     IFX_FileRead* m_pFile;
457   };
458
459   FX_FILESIZE m_FileOffset;
460
461   CPDF_CryptoHandler* m_pCryptoHandler;
462
463   void InitStream(CPDF_Dictionary* pDict);
464   friend class CPDF_Object;
465   friend class CPDF_StreamAcc;
466   friend class CPDF_AttachmentAcc;
467 };
468 class CPDF_StreamAcc {
469  public:
470   CPDF_StreamAcc();
471
472   ~CPDF_StreamAcc();
473
474   void LoadAllData(const CPDF_Stream* pStream,
475                    FX_BOOL bRawAccess = FALSE,
476                    FX_DWORD estimated_size = 0,
477                    FX_BOOL bImageAcc = FALSE);
478
479   const CPDF_Stream* GetStream() const { return m_pStream; }
480
481   CPDF_Dictionary* GetDict() const {
482     return m_pStream ? m_pStream->GetDict() : NULL;
483   }
484
485   const uint8_t* GetData() const;
486
487   FX_DWORD GetSize() const;
488
489   uint8_t* DetachData();
490
491   const CFX_ByteString& GetImageDecoder() { return m_ImageDecoder; }
492
493   const CPDF_Dictionary* GetImageParam() { return m_pImageParam; }
494
495  protected:
496   uint8_t* m_pData;
497
498   FX_DWORD m_dwSize;
499
500   FX_BOOL m_bNewBuf;
501
502   CFX_ByteString m_ImageDecoder;
503
504   CPDF_Dictionary* m_pImageParam;
505
506   const CPDF_Stream* m_pStream;
507
508   uint8_t* m_pSrcData;
509 };
510 CFX_DataFilter* FPDF_CreateFilter(const CFX_ByteStringC& name,
511                                   const CPDF_Dictionary* pParam,
512                                   int width = 0,
513                                   int height = 0);
514 #define FPDF_FILTER_BUFFER_SIZE 20480
515 class CPDF_StreamFilter {
516  public:
517   ~CPDF_StreamFilter();
518
519   FX_DWORD ReadBlock(uint8_t* buffer, FX_DWORD size);
520
521   FX_DWORD GetSrcPos() { return m_SrcOffset; }
522
523   const CPDF_Stream* GetStream() { return m_pStream; }
524
525  protected:
526   CPDF_StreamFilter() {}
527
528   FX_DWORD ReadLeftOver(uint8_t* buffer, FX_DWORD buf_size);
529
530   const CPDF_Stream* m_pStream;
531
532   CFX_DataFilter* m_pFilter;
533
534   CFX_BinaryBuf* m_pBuffer;
535
536   FX_DWORD m_BufOffset;
537
538   FX_DWORD m_SrcOffset;
539
540   uint8_t m_SrcBuffer[FPDF_FILTER_BUFFER_SIZE];
541   friend class CPDF_Stream;
542 };
543 class CPDF_Null : public CPDF_Object {
544  public:
545   static CPDF_Null* Create() { return new CPDF_Null(); }
546
547   CPDF_Null() : CPDF_Object(PDFOBJ_NULL) {}
548 };
549 class CPDF_Reference : public CPDF_Object {
550  public:
551   CPDF_Reference(CPDF_IndirectObjects* pDoc, int objnum)
552       : CPDF_Object(PDFOBJ_REFERENCE), m_pObjList(pDoc), m_RefObjNum(objnum) {}
553
554   CPDF_IndirectObjects* GetObjList() const { return m_pObjList; }
555
556   FX_DWORD GetRefObjNum() const { return m_RefObjNum; }
557
558   void SetRef(CPDF_IndirectObjects* pDoc, FX_DWORD objnum);
559
560   FX_BOOL Identical(CPDF_Reference* pOther) const {
561     return m_RefObjNum == pOther->m_RefObjNum;
562   }
563
564  protected:
565   CPDF_IndirectObjects* m_pObjList;
566
567   FX_DWORD m_RefObjNum;
568   friend class CPDF_Object;
569 };
570 class CPDF_IndirectObjects {
571  public:
572   CPDF_IndirectObjects(CPDF_Parser* pParser);
573
574   ~CPDF_IndirectObjects();
575
576   CPDF_Object* GetIndirectObject(FX_DWORD objnum,
577                                  struct PARSE_CONTEXT* pContext = NULL);
578
579   int GetIndirectType(FX_DWORD objnum);
580
581   FX_DWORD AddIndirectObject(CPDF_Object* pObj);
582
583   void ReleaseIndirectObject(FX_DWORD objnum);
584
585   void InsertIndirectObject(FX_DWORD objnum, CPDF_Object* pObj);
586
587   FX_DWORD GetLastObjNum() const;
588
589   FX_POSITION GetStartPosition() const {
590     return m_IndirectObjs.GetStartPosition();
591   }
592
593   void GetNextAssoc(FX_POSITION& rPos,
594                     FX_DWORD& objnum,
595                     CPDF_Object*& pObject) const {
596     m_IndirectObjs.GetNextAssoc(rPos, (void*&)objnum, (void*&)pObject);
597   }
598
599  protected:
600   CFX_MapPtrToPtr m_IndirectObjs;
601
602   CPDF_Parser* m_pParser;
603
604   FX_DWORD m_LastObjNum;
605 };
606
607 #endif  // CORE_INCLUDE_FPDFAPI_FPDF_OBJECTS_H_