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
17{
18 None = 0,
20};
21
34{
35 friend class PdfDocument;
36 friend class PdfMemDocument;
37 friend class PdfObject;
38 friend class PdfObjectOutputStream;
39 PODOFO_PRIVATE_FRIEND(class PdfObjectStreamParser);
40 PODOFO_PRIVATE_FRIEND(class PdfImmediateWriter);
41 PODOFO_PRIVATE_FRIEND(class PdfParser);
42 PODOFO_PRIVATE_FRIEND(class PdfWriter);
43 PODOFO_PRIVATE_FRIEND(class PdfParserTest);
44 PODOFO_PRIVATE_FRIEND(class PdfEncodingTest);
45 PODOFO_PRIVATE_FRIEND(class PdfEncryptTest);
46
47private:
48 // NOTE: For testing only
50
51public:
53
54public:
61 PdfObject& MustGetObject(const PdfReference& ref) const;
62
67 PdfObject* GetObject(const PdfReference& ref) const;
68
75 PdfObject& CreateDictionaryObject(const PdfName& type = PdfName::Null,
76 const PdfName& subtype = PdfName::Null);
77
78 PdfObject& CreateArrayObject();
79
85 PdfObject& CreateObject(const PdfObject& obj);
86 PdfObject& CreateObject(PdfObject&& obj);
87
91 void CollectGarbage(PdfGarbageCollectionFlags flags = PdfGarbageCollectionFlags::None);
92
93public:
96 unsigned GetSize() const;
97
103 unsigned GetObjectCount() const;
104
109 inline uint32_t GetLastObjectNumber() const { return m_LastObjectNumber; }
110
112 inline const PdfFreeObjectList& GetFreeObjects() const { return m_FreeObjects; }
113
114 inline const PdfObjectNumSet& GetUnavailableObjects() const { return m_UnavailableObjects; }
115
117 inline PdfDocument& GetDocument() const { return *m_Document; }
118
119private:
121 class PODOFO_API Observer
122 {
123 friend class PdfIndirectObjectList;
124 public:
125 virtual ~Observer() { }
126
129 virtual void BeginAppendStream(PdfObjectStream& stream) = 0;
130
133 virtual void EndAppendStream(PdfObjectStream& stream) = 0;
134 };
135
137 class PODOFO_API StreamFactory
138 {
139 public:
140 virtual ~StreamFactory() { }
141
147 virtual std::unique_ptr<PdfObjectStreamProvider> CreateStream() = 0;
148 };
149
150 using ReferenceSet = std::set<PdfReference>;
151 using ObjectList = std::set<PdfObject*, PdfObjectInequality>;
152
153public:
154
155 // An incomplete set of container typedefs, just enough to handle
156 // the begin() and end() methods we wrap from the internal vector.
157 // TODO: proper wrapper iterator class.
158 using iterator = ObjectList::const_iterator;
159 using reverse_iterator = ObjectList::const_reverse_iterator;
160
163 iterator begin() const;
164
167 iterator end() const;
168
169 reverse_iterator rbegin() const;
170
171 reverse_iterator rend() const;
172
173 size_t size() const;
174
175private:
176 PdfIndirectObjectList(PdfDocument& document);
177 PdfIndirectObjectList(PdfDocument& document, const PdfIndirectObjectList& rhs);
178
179 PdfIndirectObjectList(const PdfIndirectObjectList&) = delete;
180 PdfIndirectObjectList& operator=(const PdfIndirectObjectList&) = delete;
181
182private:
183 void CollectGarbage(PdfObject& trailer, bool fixInvalidReference);
184
191 std::unique_ptr<PdfObjectStreamProvider> CreateStream();
192
200 std::unique_ptr<PdfObject> RemoveObject(const PdfReference& ref);
201
205 std::unique_ptr<PdfObject> RemoveObject(const iterator& it);
206
210 void Clear();
211
214 void AttachObserver(Observer& observer);
215
219 void DetachObserver();
220
223 void BeginAppendStream(PdfObjectStream& stream);
224
227 void EndAppendStream(PdfObjectStream& stream);
228
235 void PushObject(std::unique_ptr<PdfObject> obj);
236
240 void AddFreeObjectSafe(const PdfReference& reference);
241
244 void AddFreeObjectUnchecked(const PdfReference& reference);
245
246 void AddUnavailableObject(uint32_t objNum);
247
251 void AddCompressedObjectStream(uint32_t objectNum);
252
258 void ClearCompressedObjectStreams();
259
262 void RemoveCompressedObjectStream(uint32_t objectNum);
263
265 bool IsCompressedObjectStream(uint32_t objectNum) const;
266
267 inline const PdfObjectNumSet& GetCompressedObjectStreams() const { return m_compressedObjectStreams; }
268
269 std::unique_ptr<PdfObject> RemoveObject(const PdfReference& ref, bool markAsFree);
270
274 void SetStreamFactory(StreamFactory* factory);
275
278 void ClearFreeObjectsDelta();
279
282 inline const PdfObjectNumSet& GetFreeObjectsDelta() const { return m_freeObjectsDelta; }
283
285 bool TryFindFreeObject(uint32_t objNum, PdfReference& ref) const;
286
287private:
293 void markObjectFree(const PdfReference& reference, bool doConsistencyCheck);
294
295 void pushObject(const ObjectList::const_iterator& hintpos, ObjectList::node_type& node, PdfObject* obj);
296
297 std::unique_ptr<PdfObject> removeObject(const iterator& it, bool markAsFree);
298
299 void addNewObject(std::unique_ptr<PdfObject>&& obj);
300
302 PdfReference getNextFreeObject();
303
304 void visitObject(PdfObject& obj, std::unordered_set<PdfReference>& referencedObj, bool fixInvalidReference);
305
310 void tryIncrementLastObjectNumber(uint32_t objNum);
311
312private:
313 PdfDocument* m_Document;
314 ObjectList m_Objects;
315 unsigned m_LastObjectNumber;
316 PdfFreeObjectList m_FreeObjects;
317 PdfObjectNumSet m_UnavailableObjects;
318 PdfObjectNumSet m_freeObjectsDelta;
319 PdfObjectNumSet m_compressedObjectStreams;
320
321 Observer* m_observer;
322 StreamFactory* m_StreamFactory;
323};
324
325};
326
327ENABLE_BITMASK_OPERATORS(PoDoFo::PdfGarbageCollectionFlags);
328
329#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:34
uint32_t GetLastObjectNumber() const
The highest object number ever used.
Definition PdfIndirectObjectList.h:109
const PdfFreeObjectList & GetFreeObjects() const
Definition PdfIndirectObjectList.h:112
PdfDocument & GetDocument() const
Definition PdfIndirectObjectList.h:117
PdfMemDocument is the core class for reading and manipulating PDF files and writing them back to disk...
Definition PdfMemDocument.h:35
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
PdfGarbageCollectionFlags
Definition PdfIndirectObjectList.h:17
@ SkipFixInvalidRefs
Do not fix references pointing to missing objects by forcing them to 0 0 R.
@ None
Do not add a default appearance.