PoDoFo 1.2.0
Loading...
Searching...
No Matches
PdfIndirectObjectList.h
1// SPDX-FileCopyrightText: 2005 Dominik Seichter <domseichter@web.de>
2// SPDX-FileCopyrightText: 2020 Francesco Pretto <ceztko@gmail.com>
3// SPDX-License-Identifier: LGPL-2.0-or-later OR MPL-2.0
4
5#ifndef PDF_INDIRECT_OBJECT_LIST_H
6#define PDF_INDIRECT_OBJECT_LIST_H
7
8#include "PdfObject.h"
9
10namespace PoDoFo {
11
12class PdfObjectStreamProvider;
13using PdfFreeObjectList = std::deque<PdfReference>;
14using PdfObjectNumSet = std::set<uint32_t>;
15
28{
29 friend class PdfDocument;
30 friend class PdfObject;
31 friend class PdfObjectOutputStream;
32 friend class PdfParser;
33 friend class PdfWriter;
34 PODOFO_PRIVATE_FRIEND(class PdfObjectStreamParser);
35 PODOFO_PRIVATE_FRIEND(class PdfImmediateWriter);
36 PODOFO_PRIVATE_FRIEND(class PdfParser);
37 PODOFO_PRIVATE_FRIEND(class PdfWriter);
38 PODOFO_PRIVATE_FRIEND(class PdfParserTest);
39 PODOFO_PRIVATE_FRIEND(class PdfEncodingTest);
40 PODOFO_PRIVATE_FRIEND(class PdfEncryptTest);
41
42private:
43 // NOTE: For testing only
45
46public:
48
49public:
56 PdfObject& MustGetObject(const PdfReference& ref) const;
57
62 PdfObject* GetObject(const PdfReference& ref) const;
63
70 PdfObject& CreateDictionaryObject(const PdfName& type = PdfName::Null,
71 const PdfName& subtype = PdfName::Null);
72
73 PdfObject& CreateArrayObject();
74
80 PdfObject& CreateObject(const PdfObject& obj);
81 PdfObject& CreateObject(PdfObject&& obj);
82
86 void CollectGarbage();
87
88public:
91 unsigned GetSize() const;
92
98 unsigned GetObjectCount() const;
99
104 inline uint32_t GetLastObjectNumber() const { return m_LastObjectNumber; }
105
107 inline const PdfFreeObjectList& GetFreeObjects() const { return m_FreeObjects; }
108
109 inline const PdfObjectNumSet& GetUnavailableObjects() const { return m_UnavailableObjects; }
110
112 inline PdfDocument& GetDocument() const { return *m_Document; }
113
114private:
116 class PODOFO_API Observer
117 {
118 friend class PdfIndirectObjectList;
119 public:
120 virtual ~Observer() { }
121
124 virtual void BeginAppendStream(PdfObjectStream& stream) = 0;
125
128 virtual void EndAppendStream(PdfObjectStream& stream) = 0;
129 };
130
132 class PODOFO_API StreamFactory
133 {
134 public:
135 virtual ~StreamFactory() { }
136
142 virtual std::unique_ptr<PdfObjectStreamProvider> CreateStream() = 0;
143 };
144
145 using ReferenceSet = std::set<PdfReference>;
146 using ObserverList = std::vector<Observer*>;
147 using ObjectList = std::set<PdfObject*, PdfObjectInequality>;
148
149public:
150
151 // An incomplete set of container typedefs, just enough to handle
152 // the begin() and end() methods we wrap from the internal vector.
153 // TODO: proper wrapper iterator class.
154 using iterator = ObjectList::const_iterator;
155 using reverse_iterator = ObjectList::const_reverse_iterator;
156
159 iterator begin() const;
160
163 iterator end() const;
164
165 reverse_iterator rbegin() const;
166
167 reverse_iterator rend() const;
168
169 size_t size() const;
170
171private:
172 PdfIndirectObjectList(PdfDocument& document);
173 PdfIndirectObjectList(PdfDocument& document, const PdfIndirectObjectList& rhs);
174
175 PdfIndirectObjectList(const PdfIndirectObjectList&) = delete;
176 PdfIndirectObjectList& operator=(const PdfIndirectObjectList&) = delete;
177
178private:
179 void CollectGarbage(PdfObject& trailer);
180
187 std::unique_ptr<PdfObjectStreamProvider> CreateStream();
188
196 std::unique_ptr<PdfObject> RemoveObject(const PdfReference& ref);
197
201 std::unique_ptr<PdfObject> RemoveObject(const iterator& it);
202
211 void Clear();
212
215 void AttachObserver(Observer& observer);
216
220 void DetachObserver(Observer& observer);
221
224 void BeginAppendStream(PdfObjectStream& stream);
225
228 void EndAppendStream(PdfObjectStream& stream);
229
236 void PushObject(std::unique_ptr<PdfObject> obj);
237
241 void AddFreeObjectSafe(const PdfReference& reference);
242
245 void AddFreeObjectUnchecked(const PdfReference& reference);
246
247 void AddUnavailableObject(uint32_t objNum);
248
252 void AddCompressedObjectStream(uint32_t objectNum);
253
254 std::unique_ptr<PdfObject> RemoveObject(const PdfReference& ref, bool markAsFree);
255
259 void SetStreamFactory(StreamFactory* factory);
260
262 void ResetFreeObjectsInvalidated();
263
265 bool AreFreeObjectsInvalidated() const { return m_FreeObjectsInvalidated; }
266
267private:
273 void markObjectFree(const PdfReference& reference, bool doConsistencyCheck);
274
275 void pushObject(const ObjectList::const_iterator& hintpos, ObjectList::node_type& node, PdfObject* obj);
276
277 std::unique_ptr<PdfObject> removeObject(const iterator& it, bool markAsFree);
278
279 void addNewObject(std::unique_ptr<PdfObject>&& obj);
280
282 PdfReference getNextFreeObject();
283
284 void visitObject(const PdfObject& obj, std::unordered_set<PdfReference>& referencedObj);
285
290 void tryIncrementLastObjectNumber(uint32_t objNum);
291
292private:
293 PdfDocument* m_Document;
294 ObjectList m_Objects;
295 unsigned m_LastObjectNumber;
296 bool m_FreeObjectsInvalidated;
297 PdfFreeObjectList m_FreeObjects;
298 PdfObjectNumSet m_UnavailableObjects;
299 PdfObjectNumSet m_compressedObjectStreams;
300
301 ObserverList m_observers;
302 StreamFactory* m_StreamFactory;
303};
304
305};
306
307#endif // PDF_INDIRECT_OBJECT_LIST_H
PdfDocument is the core interface for working with PDF documents.
Definition PdfDocument.h:108
A list of PdfObjects that constitutes the indirect object list of the document The PdfParser will rea...
Definition PdfIndirectObjectList.h:28
uint32_t GetLastObjectNumber() const
The highest object number ever used.
Definition PdfIndirectObjectList.h:104
const PdfFreeObjectList & GetFreeObjects() const
Definition PdfIndirectObjectList.h:107
PdfDocument & GetDocument() const
Definition PdfIndirectObjectList.h:112
This class represents a PdfName.
Definition PdfName.h:21
This class represents a PDF indirect Object in memory.
Definition PdfObject.h:31
A reference is a pointer to a object in the PDF file of the form "4 0 R", where 4 is the object numbe...
Definition PdfReference.h:20
Convenient type for char array storage and/or buffer with std::string compatibility.
Definition basetypes.h:30
All classes, functions, types and enums of PoDoFo are members of these namespace.
Definition basetypes.h:13