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>;
16using PdfObjectNumSet = std::set<uint32_t>;
17
31{
32 friend class PdfDocument;
33 friend class PdfObject;
34 friend class PdfObjectOutputStream;
35 friend class PdfParser;
36 friend class PdfWriter;
37 PODOFO_PRIVATE_FRIEND(class PdfObjectStreamParser);
38 PODOFO_PRIVATE_FRIEND(class PdfImmediateWriter);
39 PODOFO_PRIVATE_FRIEND(class PdfParser);
40 PODOFO_PRIVATE_FRIEND(class PdfWriter);
41 PODOFO_PRIVATE_FRIEND(class PdfParserTest);
42 PODOFO_PRIVATE_FRIEND(class PdfEncodingTest);
43 PODOFO_PRIVATE_FRIEND(class PdfEncryptTest);
44
45private:
46 // NOTE: For testing only
48
49public:
51
52public:
60 PdfObject& MustGetObject(const PdfReference& ref) const;
61
67 PdfObject* GetObject(const PdfReference& ref) const;
68
76 PdfObject& CreateDictionaryObject(const PdfName& type = PdfName::Null,
77 const PdfName& subtype = PdfName::Null);
78
79 PdfObject& CreateArrayObject();
80
87 PdfObject& CreateObject(const PdfObject& obj);
88 PdfObject& CreateObject(PdfObject&& obj);
89
95 void CollectGarbage();
96
97public:
102 unsigned GetSize() const;
103
111 unsigned GetObjectCount() const;
112
119 inline uint32_t GetLastObjectNumber() const { return m_LastObjectNumber; }
120
123 inline const PdfFreeObjectList& GetFreeObjects() const { return m_FreeObjects; }
124
125 inline const PdfObjectNumSet& GetUnavailableObjects() const { return m_UnavailableObjects; }
126
129 inline PdfDocument& GetDocument() const { return *m_Document; }
130
131private:
134 class PODOFO_API Observer
135 {
136 friend class PdfIndirectObjectList;
137 public:
138 virtual ~Observer() { }
139
143 virtual void BeginAppendStream(PdfObjectStream& stream) = 0;
144
148 virtual void EndAppendStream(PdfObjectStream& stream) = 0;
149 };
150
153 class PODOFO_API StreamFactory
154 {
155 public:
156 virtual ~StreamFactory() { }
157
164 virtual std::unique_ptr<PdfObjectStreamProvider> CreateStream() = 0;
165 };
166
167 using ReferenceSet = std::set<PdfReference>;
168 using ObserverList = std::vector<Observer*>;
169 using ObjectList = std::set<PdfObject*, PdfObjectInequality>;
170
171public:
172
173 // An incomplete set of container typedefs, just enough to handle
174 // the begin() and end() methods we wrap from the internal vector.
175 // TODO: proper wrapper iterator class.
176 using iterator = ObjectList::const_iterator;
177 using reverse_iterator = ObjectList::const_reverse_iterator;
178
182 iterator begin() const;
183
187 iterator end() const;
188
189 reverse_iterator rbegin() const;
190
191 reverse_iterator rend() const;
192
193 size_t size() const;
194
195private:
196 PdfIndirectObjectList(PdfDocument& document);
197 PdfIndirectObjectList(PdfDocument& document, const PdfIndirectObjectList& rhs);
198
199 PdfIndirectObjectList(const PdfIndirectObjectList&) = delete;
200 PdfIndirectObjectList& operator=(const PdfIndirectObjectList&) = delete;
201
202private:
203 void CollectGarbage(PdfObject& trailer);
204
212 std::unique_ptr<PdfObjectStreamProvider> CreateStream();
213
225 std::unique_ptr<PdfObject> RemoveObject(const PdfReference& ref);
226
231 std::unique_ptr<PdfObject> RemoveObject(const iterator& it);
232
242 void Clear();
243
247 void AttachObserver(Observer& observer);
248
253 void DetachObserver(Observer& observer);
254
258 void BeginAppendStream(PdfObjectStream& stream);
259
263 void EndAppendStream(PdfObjectStream& stream);
264
272 void PushObject(PdfObject* obj);
273
278 void AddFreeObjectSafe(const PdfReference& reference);
279
283 void AddFreeObjectUnchecked(const PdfReference& reference);
284
285 void AddUnavailableObject(uint32_t objNum);
286
291 void AddCompressedObjectStream(uint32_t objectNum);
292
293 std::unique_ptr<PdfObject> RemoveObject(const PdfReference& ref, bool markAsFree);
294
299 void SetStreamFactory(StreamFactory* factory);
300
303 void ResetFreeObjectsInvalidated();
304
307 bool AreFreeObjectsInvalidated() const { return m_FreeObjectsInvalidated; }
308
309private:
315 void markObjectFree(const PdfReference& reference);
316
317 void pushObject(const ObjectList::const_iterator& hintpos, ObjectList::node_type& node, PdfObject* obj);
318
319 std::unique_ptr<PdfObject> removeObject(const iterator& it, bool markAsFree);
320
321 void addNewObject(PdfObject* obj);
322
326 PdfReference getNextFreeObject();
327
328 void addFreeObject(uint32_t objnum, uint16_t gennum);
329
330 void visitObject(const PdfObject& obj, std::unordered_set<PdfReference>& referencedObj);
331
338 void tryIncrementLastObjectNumber(uint32_t objNum);
339
340private:
341 PdfDocument* m_Document;
342 ObjectList m_Objects;
343 unsigned m_LastObjectNumber;
344 bool m_FreeObjectsInvalidated;
345 PdfFreeObjectList m_FreeObjects;
346 PdfObjectNumSet m_UnavailableObjects;
347 PdfObjectNumSet m_compressedObjectStreams;
348
349 ObserverList m_observers;
350 StreamFactory* m_StreamFactory;
351};
352
353};
354
355#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:31
uint32_t GetLastObjectNumber() const
The highest object number ever used.
Definition PdfIndirectObjectList.h:119
const PdfFreeObjectList & GetFreeObjects() const
Definition PdfIndirectObjectList.h:123
PdfDocument & GetDocument() const
Definition PdfIndirectObjectList.h:129
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