Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
cpdf_object.h
Go to the documentation of this file.
1// Copyright 2016 The PDFium Authors
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_FPDFAPI_PARSER_CPDF_OBJECT_H_
8#define CORE_FPDFAPI_PARSER_CPDF_OBJECT_H_
9
10#include <stdint.h>
11
12#include <set>
13#include <type_traits>
14
15#include "core/fxcrt/fx_string.h"
16#include "core/fxcrt/retain_ptr.h"
17
18class CPDF_Array;
19class CPDF_Boolean;
20class CPDF_Dictionary;
21class CPDF_Encryptor;
23class CPDF_Name;
24class CPDF_Null;
25class CPDF_Number;
26class CPDF_Reference;
27class CPDF_Stream;
28class CPDF_String;
30
31// ISO 32000-1:2008 defines PDF objects. When CPDF_Parser parses a PDF object,
32// it represents the PDF object using CPDF_Objects. Take this PDF object for
33// example:
34//
35// 4 0 obj <<
36// /Type /Pages
37// /Count 1
38// /Kids [9 0 R]
39// >>
40//
41// Multiple CPDF_Objects instances are necessary to represent this PDF object:
42// 1) A CPDF_Dictionary with object number 4 that contains 3 elements.
43// 2) A CPDF_Name for /Pages.
44// 3) A CPDF_Number for the count of 1.
45// 4) A CPDF_Array for [9 0 R], which contains 1 element.
46// 5) A CPDF_Reference that references object 9 0.
47//
48// CPDF_Object (1) has an object number of 4. All the other CPDF_Objects are
49// inline objects. CPDF_Object represent that by using an object number of 0.
50class CPDF_Object : public Retainable {
51 public:
52 static constexpr uint32_t kInvalidObjNum = static_cast<uint32_t>(-1);
64
65 uint32_t GetObjNum() const { return m_ObjNum; }
66 void SetObjNum(uint32_t objnum) { m_ObjNum = objnum; }
67 uint32_t GetGenNum() const { return m_GenNum; }
68 void SetGenNum(uint32_t gennum) { m_GenNum = gennum; }
69 bool IsInline() const { return m_ObjNum == 0; }
70 uint64_t KeyForCache() const;
71
72 virtual Type GetType() const = 0;
73
74 // Create a deep copy of the object.
75 virtual RetainPtr<CPDF_Object> Clone() const = 0;
76
77 // Create a deep copy of the object except any reference object be
78 // copied to the object it points to directly.
80
81 virtual ByteString GetString() const;
82 virtual WideString GetUnicodeText() const;
83 virtual float GetNumber() const;
84 virtual int GetInteger() const;
85
86 // Can only be called for objects of types: `kBoolean`, `kNumber`, `kName`,
87 // and `kString`.
88 virtual void SetString(const ByteString& str);
89
90 virtual CPDF_Array* AsMutableArray();
91 virtual CPDF_Boolean* AsMutableBoolean();
93 virtual CPDF_Name* AsMutableName();
94 virtual CPDF_Null* AsMutableNull();
95 virtual CPDF_Number* AsMutableNumber();
96 virtual CPDF_Reference* AsMutableReference();
97 virtual CPDF_Stream* AsMutableStream();
98 virtual CPDF_String* AsMutableString();
99
100 virtual bool WriteTo(IFX_ArchiveStream* archive,
101 const CPDF_Encryptor* encryptor) const = 0;
102
103 // Create a deep copy of the object with the option to either
104 // copy a reference object or directly copy the object it refers to
105 // when |bDirect| is true.
106 // Also check cyclic reference against |pVisited|, no copy if it is found.
107 // Complex objects should implement their own CloneNonCyclic()
108 // function to properly check for possible loop.
110 bool bDirect,
111 std::set<const CPDF_Object*>* pVisited) const;
112
113 // Return a reference to itself.
114 // The object must be direct (!IsInlined).
115 virtual RetainPtr<CPDF_Reference> MakeReference(
116 CPDF_IndirectObjectHolder* holder) const;
117
118 RetainPtr<const CPDF_Object> GetDirect() const; // Wraps virtual method.
119 RetainPtr<CPDF_Object> GetMutableDirect(); // Wraps virtual method.
120 RetainPtr<const CPDF_Dictionary> GetDict() const; // Wraps virtual method.
121 RetainPtr<CPDF_Dictionary> GetMutableDict(); // Wraps virtual method.
122
123 // Const methods wrapping non-const virtual As*() methods.
124 const CPDF_Array* AsArray() const;
125 const CPDF_Boolean* AsBoolean() const;
126 const CPDF_Dictionary* AsDictionary() const;
127 const CPDF_Name* AsName() const;
128 const CPDF_Null* AsNull() const;
129 const CPDF_Number* AsNumber() const;
130 const CPDF_Reference* AsReference() const;
131 const CPDF_Stream* AsStream() const;
132 const CPDF_String* AsString() const;
133
134 // Type-testing methods merely wrap As*() methods.
135 bool IsArray() const { return !!AsArray(); }
136 bool IsBoolean() const { return !!AsBoolean(); }
137 bool IsDictionary() const { return !!AsDictionary(); }
138 bool IsName() const { return !!AsName(); }
139 bool IsNull() const { return !!AsNull(); }
140 bool IsNumber() const { return !!AsNumber(); }
141 bool IsReference() const { return !!AsReference(); }
142 bool IsStream() const { return !!AsStream(); }
143 bool IsString() const { return !!AsString(); }
144
145 protected:
146 friend class CPDF_Dictionary;
147 friend class CPDF_Reference;
148
149 CPDF_Object() = default;
150 CPDF_Object(const CPDF_Object& src) = delete;
151 ~CPDF_Object() override;
152
153 virtual const CPDF_Object* GetDirectInternal() const;
154 virtual const CPDF_Dictionary* GetDictInternal() const;
155 RetainPtr<CPDF_Object> CloneObjectNonCyclic(bool bDirect) const;
156
157 uint32_t m_ObjNum = 0;
158 uint32_t m_GenNum = 0;
159};
160
161template <typename T>
163 static constexpr bool value = std::is_same<T, CPDF_Array>::value ||
164 std::is_same<T, CPDF_Dictionary>::value ||
165 std::is_same<T, CPDF_Name>::value ||
166 std::is_same<T, CPDF_String>::value;
167};
168
169#endif // CORE_FPDFAPI_PARSER_CPDF_OBJECT_H_
fxcrt::ByteString ByteString
Definition bytestring.h:180
#define DCHECK
Definition check.h:33
CPDF_ArrayLocker(RetainPtr< CPDF_Array > pArray)
const_iterator begin() const
Definition cpdf_array.h:185
const_iterator end() const
Definition cpdf_array.h:189
CPDF_ArrayLocker(const CPDF_Array *pArray)
CPDF_ArrayLocker(RetainPtr< const CPDF_Array > pArray)
size_t size() const
Definition cpdf_array.h:41
void Append(RetainPtr< CPDF_Stream > stream)=delete
bool GetBooleanAt(size_t index, bool bDefault) const
void SetAt(size_t index, RetainPtr< CPDF_Object > object)
RetainPtr< CPDF_Dictionary > GetMutableDictAt(size_t index)
RetainPtr< CPDF_Object > CloneNonCyclic(bool bDirect, std::set< const CPDF_Object * > *pVisited) const override
bool IsEmpty() const
Definition cpdf_array.h:40
RetainPtr< const CPDF_Object > GetDirectObjectAt(size_t index) const
RetainPtr< const CPDF_Stream > GetStreamAt(size_t index) const
Type GetType() const override
CPDF_Array * AsMutableArray() override
RetainPtr< const CPDF_Object > GetObjectAt(size_t index) const
RetainPtr< CPDF_Object > GetMutableObjectAt(size_t index)
std::enable_if<!CanInternStrings< T >::value, RetainPtr< T > >::type AppendNew(Args &&... args)
Definition cpdf_array.h:85
WideString GetUnicodeTextAt(size_t index) const
RetainPtr< CPDF_Array > GetMutableArrayAt(size_t index)
RetainPtr< CPDF_Object > Clone() const override
std::enable_if< CanInternStrings< T >::value, RetainPtr< T > >::type AppendNew(Args &&... args)
Definition cpdf_array.h:94
RetainPtr< const CPDF_Dictionary > GetDictAt(size_t index) const
std::vector< RetainPtr< CPDF_Object > >::const_iterator const_iterator
Definition cpdf_array.h:29
std::enable_if<!CanInternStrings< T >::value, RetainPtr< T > >::type InsertNewAt(size_t index, Args &&... args)
Definition cpdf_array.h:115
bool IsLocked() const
Definition cpdf_array.h:150
RetainPtr< CPDF_Stream > GetMutableStreamAt(size_t index)
bool Contains(const CPDF_Object *pThat) const
void ConvertToIndirectObjectAt(size_t index, CPDF_IndirectObjectHolder *pHolder)
std::optional< size_t > Find(const CPDF_Object *pThat) const
std::enable_if< CanInternStrings< T >::value, RetainPtr< T > >::type InsertNewAt(size_t index, Args &&... args)
Definition cpdf_array.h:124
std::enable_if<!CanInternStrings< T >::value, RetainPtr< T > >::type SetNewAt(size_t index, Args &&... args)
Definition cpdf_array.h:100
bool WriteTo(IFX_ArchiveStream *archive, const CPDF_Encryptor *encryptor) const override
RetainPtr< CPDF_Object > GetMutableDirectObjectAt(size_t index)
CFX_Matrix GetMatrix() const
~CPDF_Array() override
int GetIntegerAt(size_t index) const
void SetAt(size_t index, RetainPtr< CPDF_Stream > stream)=delete
void InsertAt(size_t index, RetainPtr< CPDF_Object > object)
ByteString GetByteStringAt(size_t index) const
std::enable_if< CanInternStrings< T >::value, RetainPtr< T > >::type SetNewAt(size_t index, Args &&... args)
Definition cpdf_array.h:109
void Append(RetainPtr< CPDF_Object > object)
RetainPtr< const CPDF_String > GetStringAt(size_t index) const
RetainPtr< const CPDF_Array > GetArrayAt(size_t index) const
RetainPtr< const CPDF_Number > GetNumberAt(size_t index) const
CFX_FloatRect GetRect() const
void InsertAt(size_t index, RetainPtr< CPDF_Stream > stream)=delete
void RemoveAt(size_t index)
float GetFloatAt(size_t index) const
CPDF_Creator(CPDF_Document *pDoc, RetainPtr< IFX_RetainableWriteStream > archive)
bool SetFileVersion(int32_t fileVersion)
void RemoveSecurity()
bool Create(uint32_t flags)
std::map< ByteString, RetainPtr< CPDF_Object >, std::less<> > DictMap
RetainPtr< const CPDF_Object > GetIndirectObject(uint32_t objnum) const
std::enable_if<!CanInternStrings< T >::value, RetainPtr< T > >::type New(Args &&... args)
RetainPtr< T > NewIndirect(Args &&... args)
RetainPtr< CPDF_Object > GetOrParseIndirectObject(uint32_t objnum)
WeakPtr< ByteStringPool > GetByteStringPool() const
std::enable_if< CanInternStrings< T >::value, RetainPtr< T > >::type New(Args &&... args)
virtual RetainPtr< CPDF_Object > ParseIndirectObject(uint32_t objnum)
RetainPtr< CPDF_Object > GetMutableIndirectObject(uint32_t objnum)
uint32_t AddIndirectObject(RetainPtr< CPDF_Object > pObj)
bool ReplaceIndirectObjectIfHigherGeneration(uint32_t objnum, RetainPtr< CPDF_Object > pObj)
void SetGenNum(uint32_t gennum)
Definition cpdf_object.h:68
RetainPtr< const CPDF_Dictionary > GetDict() const
bool IsInline() const
Definition cpdf_object.h:69
uint32_t GetGenNum() const
Definition cpdf_object.h:67
virtual Type GetType() const =0
virtual WideString GetUnicodeText() const
virtual ByteString GetString() const
RetainPtr< const CPDF_Object > GetDirect() const
uint32_t m_GenNum
bool IsName() const
virtual CPDF_Null * AsMutableNull()
const CPDF_Name * AsName() const
bool IsArray() const
const CPDF_Boolean * AsBoolean() const
virtual void SetString(const ByteString &str)
const CPDF_Null * AsNull() const
bool IsDictionary() const
bool IsStream() const
virtual RetainPtr< CPDF_Reference > MakeReference(CPDF_IndirectObjectHolder *holder) const
RetainPtr< CPDF_Object > GetMutableDirect()
const CPDF_Array * AsArray() const
virtual int GetInteger() const
CPDF_Object()=default
virtual float GetNumber() const
bool IsNull() const
bool IsBoolean() const
uint32_t GetObjNum() const
Definition cpdf_object.h:65
const CPDF_Dictionary * AsDictionary() const
virtual bool WriteTo(IFX_ArchiveStream *archive, const CPDF_Encryptor *encryptor) const =0
RetainPtr< CPDF_Object > CloneDirectObject() const
virtual CPDF_Stream * AsMutableStream()
bool IsString() const
virtual CPDF_Number * AsMutableNumber()
virtual CPDF_Dictionary * AsMutableDictionary()
virtual RetainPtr< CPDF_Object > Clone() const =0
bool IsNumber() const
virtual CPDF_Reference * AsMutableReference()
uint32_t m_ObjNum
CPDF_Object(const CPDF_Object &src)=delete
const CPDF_Stream * AsStream() const
static constexpr uint32_t kInvalidObjNum
Definition cpdf_object.h:52
virtual const CPDF_Object * GetDirectInternal() const
virtual CPDF_Name * AsMutableName()
bool IsReference() const
void SetObjNum(uint32_t objnum)
Definition cpdf_object.h:66
const CPDF_String * AsString() const
uint64_t KeyForCache() const
virtual CPDF_Array * AsMutableArray()
const CPDF_Reference * AsReference() const
virtual RetainPtr< CPDF_Object > CloneNonCyclic(bool bDirect, std::set< const CPDF_Object * > *pVisited) const
virtual CPDF_String * AsMutableString()
const CPDF_Number * AsNumber() const
RetainPtr< CPDF_Dictionary > GetMutableDict()
RetainPtr< CPDF_Object > CloneObjectNonCyclic(bool bDirect) const
virtual const CPDF_Dictionary * GetDictInternal() const
~CPDF_Object() override
virtual CPDF_Boolean * AsMutableBoolean()
virtual FX_FILESIZE CurrentOffset() const =0
static RetainPtr< IFX_SeekableReadStream > CreateFromFilename(const char *filename)
Definition fx_stream.cpp:68
virtual FX_FILESIZE GetPosition()
Definition fx_stream.cpp:80
virtual bool ReadBlockAtOffset(pdfium::span< uint8_t > buffer, FX_FILESIZE offset)=0
virtual bool IsEOF()
Definition fx_stream.cpp:76
virtual bool Flush()=0
virtual FX_FILESIZE GetSize()=0
bool WriteFilesize(FX_FILESIZE size)
Definition fx_stream.cpp:61
bool WriteByte(uint8_t byte)
Definition fx_stream.cpp:50
bool WriteString(ByteStringView str)
Definition fx_stream.cpp:46
virtual ~IFX_WriteStream()=default
bool WriteDWord(uint32_t i)
Definition fx_stream.cpp:54
virtual bool WriteBlock(pdfium::span< const uint8_t > data)=0
static ByteString Format(const char *pFormat,...)
ByteString & operator=(ByteString &&that) noexcept
T * get() const noexcept
UnownedPtr(const UnownedPtr< U > &that)
Definition unowned_ptr.h:99
bool operator==(const UnownedPtr &that) const
operator T*() const noexcept
UnownedPtr(UnownedPtr< U > &&that) noexcept
UnownedPtr & operator=(UnownedPtr< U > &&that) noexcept
constexpr UnownedPtr(const UnownedPtr &that) noexcept=default
constexpr UnownedPtr(T *pObj) noexcept
Definition unowned_ptr.h:84
UnownedPtr & operator=(T *that) noexcept
bool operator==(std::nullptr_t ptr) const
UnownedPtr & operator=(UnownedPtr &&that) noexcept
UnownedPtr & operator=(std::nullptr_t) noexcept
UnownedPtr & operator=(const UnownedPtr< U > &that) noexcept
T * operator->() const
constexpr UnownedPtr() noexcept=default
bool operator<(const UnownedPtr &that) const
UnownedPtr & operator=(const UnownedPtr &that) noexcept=default
T & operator*() const
constexpr UnownedPtr(UnownedPtr &&that) noexcept
Definition unowned_ptr.h:92
constexpr UnownedPtr(std::nullptr_t ptr)
Definition unowned_ptr.h:82
#define GSL_POINTER
#define TRIVIAL_ABI
CPDF_Array * ToArray(CPDF_Object *obj)
Definition cpdf_array.h:198
const CPDF_Array * ToArray(const CPDF_Object *obj)
Definition cpdf_array.h:202
RetainPtr< CPDF_Array > ToArray(RetainPtr< CPDF_Object > obj)
Definition cpdf_array.h:206
#define FPDFCREATE_INCREMENTAL
#define FPDFCREATE_NO_ORIGINAL
void * FX_Random_MT_Start(uint32_t dwSeed)
Definition fx_random.cpp:87
void FX_Random_MT_Close(void *pContext)
pdfium::CheckedNumeric< FX_FILESIZE > FX_SAFE_FILESIZE
#define FX_FILESIZE
Definition fx_types.h:19
UnownedPtr< T > WrapUnowned(T *that)
#define CHECK(cvref)
#define CONSTRUCT_VIA_MAKE_RETAIN
Definition retain_ptr.h:222
fxcrt::ByteStringView ByteStringView
static constexpr bool value
#define UNOWNED_PTR_EXCLUSION
fxcrt::WideString WideString
Definition widestring.h:207