PoDoFo 1.1.0
Loading...
Searching...
No Matches
PdfIndirectObjectList.h
1
7#ifndef PDF_INDIRECT_OBJECT_LIST_H
8#define PDF_INDIRECT_OBJECT_LIST_H
9
10#include "PdfObject.h"
11
12namespace PoDoFo {
13
14class PdfObjectStreamProvider;
15using PdfFreeObjectList = std::deque<PdfReference>;
16
30{
31 friend class PdfDocument;
32 friend class PdfObject;
33 friend class PdfObjectOutputStream;
34 friend class PdfParser;
35 PODOFO_PRIVATE_FRIEND(class PdfObjectStreamParser);
36 PODOFO_PRIVATE_FRIEND(class PdfImmediateWriter);
37 PODOFO_PRIVATE_FRIEND(class PdfParser);
38 PODOFO_PRIVATE_FRIEND(class PdfWriter);
39 PODOFO_PRIVATE_FRIEND(class PdfParserTest);
40 PODOFO_PRIVATE_FRIEND(class PdfEncodingTest);
41 PODOFO_PRIVATE_FRIEND(class PdfEncryptTest);
42
43private:
44 // NOTE: For testing only
46
47public:
49
50public:
58 PdfObject& MustGetObject(const PdfReference& ref) const;
59
65 PdfObject* GetObject(const PdfReference& ref) const;
66
74 PdfObject& CreateDictionaryObject(const PdfName& type = PdfName::Null,
75 const PdfName& subtype = PdfName::Null);
76
77 PdfObject& CreateArrayObject();
78
85 PdfObject& CreateObject(const PdfObject& obj);
86 PdfObject& CreateObject(PdfObject&& obj);
87
93 void CollectGarbage();
94
95public:
100 unsigned GetSize() const;
101
109 inline unsigned GetObjectCount() const { return m_ObjectCount; }
110
113 inline const PdfFreeObjectList& GetFreeObjects() const { return m_FreeObjects; }
114
117 inline PdfDocument& GetDocument() const { return *m_Document; }
118
119private:
122 class PODOFO_API Observer
123 {
124 friend class PdfIndirectObjectList;
125 public:
126 virtual ~Observer() { }
127
131 virtual void BeginAppendStream(PdfObjectStream& stream) = 0;
132
136 virtual void EndAppendStream(PdfObjectStream& stream) = 0;
137 };
138
141 class PODOFO_API StreamFactory
142 {
143 public:
144 virtual ~StreamFactory() { }
145
152 virtual std::unique_ptr<PdfObjectStreamProvider> CreateStream() = 0;
153 };
154
155 using ObjectNumSet = std::set<uint32_t>;
156 using ReferenceSet = std::set<PdfReference>;
157 using ObserverList = std::vector<Observer*>;
158 using ObjectList = std::set<PdfObject*, PdfObjectInequality>;
159
160public:
161
162 // An incomplete set of container typedefs, just enough to handle
163 // the begin() and end() methods we wrap from the internal vector.
164 // TODO: proper wrapper iterator class.
165 using iterator = ObjectList::const_iterator;
166 using reverse_iterator = ObjectList::const_reverse_iterator;
167
171 iterator begin() const;
172
176 iterator end() const;
177
178 reverse_iterator rbegin() const;
179
180 reverse_iterator rend() const;
181
182 size_t size() const;
183
184private:
185 PdfIndirectObjectList(PdfDocument& document);
186 PdfIndirectObjectList(PdfDocument& document, const PdfIndirectObjectList& rhs);
187
188 PdfIndirectObjectList(const PdfIndirectObjectList&) = delete;
189 PdfIndirectObjectList& operator=(const PdfIndirectObjectList&) = delete;
190
191private:
192 void CollectGarbage(PdfObject& trailer);
193
201 std::unique_ptr<PdfObjectStreamProvider> CreateStream();
202
214 std::unique_ptr<PdfObject> RemoveObject(const PdfReference& ref);
215
220 std::unique_ptr<PdfObject> RemoveObject(const iterator& it);
221
231 void Clear();
232
236 void AttachObserver(Observer& observer);
237
242 void DetachObserver(Observer& observer);
243
247 void BeginAppendStream(PdfObjectStream& stream);
248
252 void EndAppendStream(PdfObjectStream& stream);
253
261 void PushObject(PdfObject* obj);
262
272 bool TryAddFreeObject(const PdfReference& reference);
273
284 int32_t SafeAddFreeObject(const PdfReference& reference);
285
291 void AddFreeObject(const PdfReference& reference);
292
297 void AddCompressedObjectStream(uint32_t objectNum);
298
299 std::unique_ptr<PdfObject> RemoveObject(const PdfReference& ref, bool markAsFree);
300
305 void SetStreamFactory(StreamFactory* factory);
306
307private:
308 void pushObject(const ObjectList::const_iterator& hintpos, ObjectList::node_type& node, PdfObject* obj);
309
310 std::unique_ptr<PdfObject> removeObject(const iterator& it, bool markAsFree);
311
312 void addNewObject(PdfObject* obj);
313
317 PdfReference getNextFreeObject();
318
319 int32_t tryAddFreeObject(uint32_t objnum, uint32_t gennum);
320
321 void visitObject(const PdfObject& obj, std::unordered_set<PdfReference>& referencedObj);
322
329 void tryIncrementObjectCount(const PdfReference& ref);
330
331private:
332 PdfDocument* m_Document;
333 ObjectList m_Objects;
334 unsigned m_ObjectCount;
335 PdfFreeObjectList m_FreeObjects;
336 ObjectNumSet m_unavailableObjects;
337 ObjectNumSet m_compressedObjectStreams;
338
339 ObserverList m_observers;
340 StreamFactory* m_StreamFactory;
341};
342
343};
344
345#endif // PDF_INDIRECT_OBJECT_LIST_H
PdfDocument is the core interface for working with PDF documents.
Definition PdfDocument.h:111
A list of PdfObjects that constitutes the indirect object list of the document The PdfParser will rea...
Definition PdfIndirectObjectList.h:30
unsigned GetObjectCount() const
Definition PdfIndirectObjectList.h:109
const PdfFreeObjectList & GetFreeObjects() const
Definition PdfIndirectObjectList.h:113
PdfDocument & GetDocument() const
Definition PdfIndirectObjectList.h:117
This class represents a PdfName.
Definition PdfName.h:24
This class represents a PDF indirect Object in memory.
Definition PdfObject.h:35
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:24
Convenient type for char array storage and/or buffer with std::string compatibility.
Definition basetypes.h:38
SPDX-FileCopyrightText: (C) 2022 Francesco Pretto ceztko@gmail.com SPDX-License-Identifier: LGPL-2....
Definition basetypes.h:16