/src/qpdf/libqpdf/qpdf/QPDFObjectHandle_private.hh
Line | Count | Source (jump to first uncovered line) |
1 | | #ifndef OBJECTHANDLE_PRIVATE_HH |
2 | | #define OBJECTHANDLE_PRIVATE_HH |
3 | | |
4 | | #include <qpdf/QPDFObjectHandle.hh> |
5 | | |
6 | | #include <qpdf/QPDFObject_private.hh> |
7 | | #include <qpdf/QPDF_private.hh> |
8 | | #include <qpdf/QUtil.hh> |
9 | | |
10 | | namespace qpdf |
11 | | { |
12 | | class Array final: public BaseHandle |
13 | | { |
14 | | public: |
15 | | // Create an empty Array. If 'empty' is false, create a null Array. |
16 | | Array(bool empty = true); |
17 | | |
18 | | Array(std::vector<QPDFObjectHandle> const& items); |
19 | | |
20 | | Array(std::vector<QPDFObjectHandle>&& items); |
21 | | |
22 | | Array(Array const& other) : |
23 | | BaseHandle(other.obj) |
24 | 0 | { |
25 | 0 | } |
26 | | |
27 | | Array& |
28 | | operator=(Array const& other) |
29 | 0 | { |
30 | 0 | if (obj != other.obj) { |
31 | 0 | obj = other.obj; |
32 | 0 | } |
33 | 0 | return *this; |
34 | 0 | } |
35 | | |
36 | | Array(Array&&) = default; |
37 | | Array& operator=(Array&&) = default; |
38 | | |
39 | | explicit Array(std::shared_ptr<QPDFObject> const& obj) : |
40 | 7.82M | BaseHandle(obj) |
41 | 7.82M | { |
42 | 7.82M | } |
43 | | |
44 | | explicit Array(std::shared_ptr<QPDFObject>&& obj) : |
45 | 33.4k | BaseHandle(std::move(obj)) |
46 | 33.4k | { |
47 | 33.4k | } |
48 | | |
49 | | Array(QPDFObjectHandle const& oh) : |
50 | 126k | BaseHandle(oh.resolved_type_code() == ::ot_array ? oh : QPDFObjectHandle()) |
51 | 126k | { |
52 | 126k | } |
53 | | |
54 | | Array& |
55 | | operator=(QPDFObjectHandle const& oh) |
56 | 0 | { |
57 | 0 | assign(::ot_array, oh); |
58 | 0 | return *this; |
59 | 0 | } |
60 | | |
61 | | Array(QPDFObjectHandle&& oh) : |
62 | | BaseHandle(oh.resolved_type_code() == ::ot_array ? std::move(oh) : QPDFObjectHandle()) |
63 | 0 | { |
64 | 0 | } |
65 | | |
66 | | Array& |
67 | | operator=(QPDFObjectHandle&& oh) |
68 | 0 | { |
69 | 0 | assign(::ot_array, std::move(oh)); |
70 | 0 | return *this; |
71 | 0 | } |
72 | | |
73 | | QPDFObjectHandle const& operator[](size_t n) const; |
74 | | |
75 | | QPDFObjectHandle const& operator[](int n) const; |
76 | | |
77 | | using iterator = std::vector<QPDFObjectHandle>::iterator; |
78 | | using const_iterator = std::vector<QPDFObjectHandle>::const_iterator; |
79 | | using const_reverse_iterator = std::vector<QPDFObjectHandle>::const_reverse_iterator; |
80 | | |
81 | | iterator begin(); |
82 | | |
83 | | iterator end(); |
84 | | |
85 | | const_iterator cbegin(); |
86 | | |
87 | | const_iterator cend(); |
88 | | |
89 | | const_reverse_iterator crbegin(); |
90 | | |
91 | | const_reverse_iterator crend(); |
92 | | |
93 | | // Return the number of elements in the array. Return 0 if the object is not an array. |
94 | | size_t size() const; |
95 | | QPDFObjectHandle get(size_t n) const; |
96 | | QPDFObjectHandle get(int n) const; |
97 | | bool set(size_t at, QPDFObjectHandle const& oh); |
98 | | bool set(int at, QPDFObjectHandle const& oh); |
99 | | bool insert(size_t at, QPDFObjectHandle const& item); |
100 | | bool insert(int at, QPDFObjectHandle const& item); |
101 | | void push_back(QPDFObjectHandle const& item); |
102 | | bool erase(size_t at); |
103 | | bool erase(int at); |
104 | | |
105 | | std::vector<QPDFObjectHandle> getAsVector() const; |
106 | | void setFromVector(std::vector<QPDFObjectHandle> const& items); |
107 | | |
108 | | private: |
109 | | QPDF_Array* array() const; |
110 | | void checkOwnership(QPDFObjectHandle const& item) const; |
111 | | QPDFObjectHandle null() const; |
112 | | |
113 | | std::unique_ptr<std::vector<QPDFObjectHandle>> sp_elements{}; |
114 | | }; |
115 | | |
116 | | // BaseDictionary is only used as a base class. It does not contain any methods exposed in the |
117 | | // public API. |
118 | | class BaseDictionary: public BaseHandle |
119 | | { |
120 | | public: |
121 | | using iterator = std::map<std::string, QPDFObjectHandle>::iterator; |
122 | | using const_iterator = std::map<std::string, QPDFObjectHandle>::const_iterator; |
123 | | using reverse_iterator = std::map<std::string, QPDFObjectHandle>::reverse_iterator; |
124 | | using const_reverse_iterator = |
125 | | std::map<std::string, QPDFObjectHandle>::const_reverse_iterator; |
126 | | |
127 | | iterator |
128 | | begin() |
129 | 17.8M | { |
130 | 17.8M | if (auto d = as<QPDF_Dictionary>()) { |
131 | 758k | return d->items.begin(); |
132 | 758k | } |
133 | 17.0M | return {}; |
134 | 17.8M | } |
135 | | |
136 | | iterator |
137 | | end() |
138 | 17.8M | { |
139 | 17.8M | if (auto d = as<QPDF_Dictionary>()) { |
140 | 758k | return d->items.end(); |
141 | 758k | } |
142 | 17.0M | return {}; |
143 | 17.8M | } |
144 | | |
145 | | const_iterator |
146 | | cbegin() |
147 | 0 | { |
148 | 0 | if (auto d = as<QPDF_Dictionary>()) { |
149 | 0 | return d->items.cbegin(); |
150 | 0 | } |
151 | 0 | return {}; |
152 | 0 | } |
153 | | |
154 | | const_iterator |
155 | | cend() |
156 | 0 | { |
157 | 0 | if (auto d = as<QPDF_Dictionary>()) { |
158 | 0 | return d->items.cend(); |
159 | 0 | } |
160 | 0 | return {}; |
161 | 0 | } |
162 | | |
163 | | reverse_iterator |
164 | | rbegin() |
165 | 0 | { |
166 | 0 | if (auto d = as<QPDF_Dictionary>()) { |
167 | 0 | return d->items.rbegin(); |
168 | 0 | } |
169 | 0 | return {}; |
170 | 0 | } |
171 | | |
172 | | reverse_iterator |
173 | | rend() |
174 | 0 | { |
175 | 0 | if (auto d = as<QPDF_Dictionary>()) { |
176 | 0 | return d->items.rend(); |
177 | 0 | } |
178 | 0 | return {}; |
179 | 0 | } |
180 | | |
181 | | const_reverse_iterator |
182 | | crbegin() |
183 | 36.0k | { |
184 | 36.0k | if (auto d = as<QPDF_Dictionary>()) { |
185 | 36.0k | return d->items.crbegin(); |
186 | 36.0k | } |
187 | 0 | return {}; |
188 | 36.0k | } |
189 | | |
190 | | const_reverse_iterator |
191 | | crend() |
192 | 36.0k | { |
193 | 36.0k | if (auto d = as<QPDF_Dictionary>()) { |
194 | 36.0k | return d->items.crend(); |
195 | 36.0k | } |
196 | 0 | return {}; |
197 | 36.0k | } |
198 | | |
199 | | // The following methods are not part of the public API. |
200 | | bool hasKey(std::string const& key) const; |
201 | | QPDFObjectHandle getKey(std::string const& key) const; |
202 | | std::set<std::string> getKeys(); |
203 | | std::map<std::string, QPDFObjectHandle> const& getAsMap() const; |
204 | | void removeKey(std::string const& key); |
205 | | void replaceKey(std::string const& key, QPDFObjectHandle value); |
206 | | |
207 | | protected: |
208 | | BaseDictionary() = default; |
209 | | BaseDictionary(std::shared_ptr<QPDFObject> const& obj) : |
210 | 19.0M | BaseHandle(obj) {}; |
211 | | BaseDictionary(std::shared_ptr<QPDFObject>&& obj) : |
212 | 5.96k | BaseHandle(std::move(obj)) {}; |
213 | | BaseDictionary(BaseDictionary const&) = default; |
214 | | BaseDictionary& operator=(BaseDictionary const&) = default; |
215 | | BaseDictionary(BaseDictionary&&) = default; |
216 | | BaseDictionary& operator=(BaseDictionary&&) = default; |
217 | | ~BaseDictionary() = default; |
218 | | |
219 | | QPDF_Dictionary* dict() const; |
220 | | }; |
221 | | |
222 | | class Dictionary final: public BaseDictionary |
223 | | { |
224 | | public: |
225 | | explicit Dictionary(std::shared_ptr<QPDFObject> const& obj) : |
226 | 19.0M | BaseDictionary(obj) |
227 | 19.0M | { |
228 | 19.0M | } |
229 | | |
230 | | explicit Dictionary(std::shared_ptr<QPDFObject>&& obj) : |
231 | 5.96k | BaseDictionary(std::move(obj)) |
232 | 5.96k | { |
233 | 5.96k | } |
234 | | }; |
235 | | |
236 | | class Name final: public BaseHandle |
237 | | { |
238 | | public: |
239 | | // Put # into strings with characters unsuitable for name token |
240 | | static std::string normalize(std::string const& name); |
241 | | |
242 | | // Check whether name is valid utf-8 and whether it contains characters that require |
243 | | // escaping. Return {false, false} if the name is not valid utf-8, otherwise return {true, |
244 | | // true} if no characters require or {true, false} if escaping is required. |
245 | | static std::pair<bool, bool> analyzeJSONEncoding(std::string const& name); |
246 | | }; |
247 | | |
248 | | class Stream final: public BaseHandle |
249 | | { |
250 | | public: |
251 | | explicit Stream(std::shared_ptr<QPDFObject> const& obj) : |
252 | 289k | BaseHandle(obj) |
253 | 289k | { |
254 | 289k | } |
255 | | |
256 | | explicit Stream(std::shared_ptr<QPDFObject>&& obj) : |
257 | 24.0k | BaseHandle(std::move(obj)) |
258 | 24.0k | { |
259 | 24.0k | } |
260 | | |
261 | | Stream( |
262 | | QPDF& qpdf, |
263 | | QPDFObjGen og, |
264 | | QPDFObjectHandle stream_dict, |
265 | | qpdf_offset_t offset, |
266 | | size_t length); |
267 | | |
268 | | QPDFObjectHandle |
269 | | getDict() const |
270 | 227k | { |
271 | 227k | return stream()->stream_dict; |
272 | 227k | } |
273 | | bool |
274 | | isDataModified() const |
275 | 26.0k | { |
276 | 26.0k | return !stream()->token_filters.empty(); |
277 | 26.0k | } |
278 | | void |
279 | | setFilterOnWrite(bool val) |
280 | 10.9k | { |
281 | 10.9k | stream()->filter_on_write = val; |
282 | 10.9k | } |
283 | | bool |
284 | | getFilterOnWrite() const |
285 | 26.0k | { |
286 | 26.0k | return stream()->filter_on_write; |
287 | 26.0k | } |
288 | | |
289 | | // Methods to help QPDF copy foreign streams |
290 | | size_t |
291 | | getLength() const |
292 | 0 | { |
293 | 0 | return stream()->length; |
294 | 0 | } |
295 | | std::shared_ptr<Buffer> |
296 | | getStreamDataBuffer() const |
297 | 0 | { |
298 | 0 | return stream()->stream_data; |
299 | 0 | } |
300 | | std::shared_ptr<QPDFObjectHandle::StreamDataProvider> |
301 | | getStreamDataProvider() const |
302 | 0 | { |
303 | 0 | return stream()->stream_provider; |
304 | 0 | } |
305 | | |
306 | | // See comments in QPDFObjectHandle.hh for these methods. |
307 | | bool pipeStreamData( |
308 | | Pipeline* p, |
309 | | bool* tried_filtering, |
310 | | int encode_flags, |
311 | | qpdf_stream_decode_level_e decode_level, |
312 | | bool suppress_warnings, |
313 | | bool will_retry); |
314 | | std::string getStreamData(qpdf_stream_decode_level_e level); |
315 | | std::string getRawStreamData(); |
316 | | void replaceStreamData( |
317 | | std::shared_ptr<Buffer> data, |
318 | | QPDFObjectHandle const& filter, |
319 | | QPDFObjectHandle const& decode_parms); |
320 | | void replaceStreamData( |
321 | | std::shared_ptr<QPDFObjectHandle::StreamDataProvider> provider, |
322 | | QPDFObjectHandle const& filter, |
323 | | QPDFObjectHandle const& decode_parms); |
324 | | void |
325 | | addTokenFilter(std::shared_ptr<QPDFObjectHandle::TokenFilter> token_filter) |
326 | 0 | { |
327 | 0 | stream()->token_filters.emplace_back(token_filter); |
328 | 0 | } |
329 | | JSON getStreamJSON( |
330 | | int json_version, |
331 | | qpdf_json_stream_data_e json_data, |
332 | | qpdf_stream_decode_level_e decode_level, |
333 | | Pipeline* p, |
334 | | std::string const& data_filename); |
335 | | qpdf_stream_decode_level_e writeStreamJSON( |
336 | | int json_version, |
337 | | JSON::Writer& jw, |
338 | | qpdf_json_stream_data_e json_data, |
339 | | qpdf_stream_decode_level_e decode_level, |
340 | | Pipeline* p, |
341 | | std::string const& data_filename, |
342 | | bool no_data_key = false); |
343 | | void |
344 | | replaceDict(QPDFObjectHandle const& new_dict) |
345 | 0 | { |
346 | 0 | auto s = stream(); |
347 | 0 | s->stream_dict = new_dict; |
348 | 0 | setDictDescription(); |
349 | 0 | } |
350 | | bool isRootMetadata() const; |
351 | | |
352 | | void setDictDescription(); |
353 | | |
354 | | static void registerStreamFilter( |
355 | | std::string const& filter_name, |
356 | | std::function<std::shared_ptr<QPDFStreamFilter>()> factory); |
357 | | |
358 | | private: |
359 | | QPDF_Stream::Members* |
360 | | stream() const |
361 | 417k | { |
362 | 417k | if (auto s = as<QPDF_Stream>()) { |
363 | 417k | if (auto ptr = s->m.get()) { |
364 | 417k | return ptr; |
365 | 417k | } |
366 | 3 | throw std::logic_error("QPDF_Stream: unexpected nullptr"); |
367 | 417k | } |
368 | 0 | throw std::runtime_error("operation for stream attempted on non-stream object"); |
369 | 0 | return nullptr; // unreachable |
370 | 417k | } |
371 | | bool filterable( |
372 | | qpdf_stream_decode_level_e decode_level, |
373 | | std::vector<std::shared_ptr<QPDFStreamFilter>>& filters); |
374 | | void replaceFilterData( |
375 | | QPDFObjectHandle const& filter, QPDFObjectHandle const& decode_parms, size_t length); |
376 | | |
377 | | void warn(std::string const& message); |
378 | | |
379 | | static std::map<std::string, std::string> filter_abbreviations; |
380 | | }; |
381 | | |
382 | | template <typename T> |
383 | | T* |
384 | | BaseHandle::as() const |
385 | 53.3M | { |
386 | 53.3M | if (!obj) { |
387 | 48.7k | return nullptr; |
388 | 48.7k | } |
389 | 53.3M | if (std::holds_alternative<T>(obj->value)) { |
390 | 3.98M | return &std::get<T>(obj->value); |
391 | 3.98M | } |
392 | 49.3M | if (std::holds_alternative<QPDF_Unresolved>(obj->value)) { |
393 | 84 | return BaseHandle(QPDF::Resolver::resolved(obj->qpdf, obj->og)).as<T>(); |
394 | 84 | } |
395 | 49.3M | if (std::holds_alternative<QPDF_Reference>(obj->value)) { |
396 | | // see comment in QPDF_Reference. |
397 | 0 | return BaseHandle(std::get<QPDF_Reference>(obj->value).obj).as<T>(); |
398 | 0 | } |
399 | 49.3M | return nullptr; |
400 | 49.3M | } QPDF_Dictionary* qpdf::BaseHandle::as<QPDF_Dictionary>() const Line | Count | Source | 385 | 36.9M | { | 386 | 36.9M | if (!obj) { | 387 | 0 | return nullptr; | 388 | 0 | } | 389 | 36.9M | if (std::holds_alternative<T>(obj->value)) { | 390 | 2.76M | return &std::get<T>(obj->value); | 391 | 2.76M | } | 392 | 34.1M | if (std::holds_alternative<QPDF_Unresolved>(obj->value)) { | 393 | 80 | return BaseHandle(QPDF::Resolver::resolved(obj->qpdf, obj->og)).as<T>(); | 394 | 80 | } | 395 | 34.1M | if (std::holds_alternative<QPDF_Reference>(obj->value)) { | 396 | | // see comment in QPDF_Reference. | 397 | 0 | return BaseHandle(std::get<QPDF_Reference>(obj->value).obj).as<T>(); | 398 | 0 | } | 399 | 34.1M | return nullptr; | 400 | 34.1M | } |
QPDF_Stream* qpdf::BaseHandle::as<QPDF_Stream>() const Line | Count | Source | 385 | 417k | { | 386 | 417k | if (!obj) { | 387 | 0 | return nullptr; | 388 | 0 | } | 389 | 417k | if (std::holds_alternative<T>(obj->value)) { | 390 | 417k | return &std::get<T>(obj->value); | 391 | 417k | } | 392 | 0 | if (std::holds_alternative<QPDF_Unresolved>(obj->value)) { | 393 | 0 | return BaseHandle(QPDF::Resolver::resolved(obj->qpdf, obj->og)).as<T>(); | 394 | 0 | } | 395 | 0 | if (std::holds_alternative<QPDF_Reference>(obj->value)) { | 396 | | // see comment in QPDF_Reference. | 397 | 0 | return BaseHandle(std::get<QPDF_Reference>(obj->value).obj).as<T>(); | 398 | 0 | } | 399 | 0 | return nullptr; | 400 | 0 | } |
QPDF_Bool* qpdf::BaseHandle::as<QPDF_Bool>() const Line | Count | Source | 385 | 2 | { | 386 | 2 | if (!obj) { | 387 | 0 | return nullptr; | 388 | 0 | } | 389 | 2 | if (std::holds_alternative<T>(obj->value)) { | 390 | 2 | return &std::get<T>(obj->value); | 391 | 2 | } | 392 | 0 | if (std::holds_alternative<QPDF_Unresolved>(obj->value)) { | 393 | 0 | return BaseHandle(QPDF::Resolver::resolved(obj->qpdf, obj->og)).as<T>(); | 394 | 0 | } | 395 | 0 | if (std::holds_alternative<QPDF_Reference>(obj->value)) { | 396 | | // see comment in QPDF_Reference. | 397 | 0 | return BaseHandle(std::get<QPDF_Reference>(obj->value).obj).as<T>(); | 398 | 0 | } | 399 | 0 | return nullptr; | 400 | 0 | } |
QPDF_Integer* qpdf::BaseHandle::as<QPDF_Integer>() const Line | Count | Source | 385 | 111k | { | 386 | 111k | if (!obj) { | 387 | 0 | return nullptr; | 388 | 0 | } | 389 | 111k | if (std::holds_alternative<T>(obj->value)) { | 390 | 110k | return &std::get<T>(obj->value); | 391 | 110k | } | 392 | 1.34k | if (std::holds_alternative<QPDF_Unresolved>(obj->value)) { | 393 | 4 | return BaseHandle(QPDF::Resolver::resolved(obj->qpdf, obj->og)).as<T>(); | 394 | 4 | } | 395 | 1.34k | if (std::holds_alternative<QPDF_Reference>(obj->value)) { | 396 | | // see comment in QPDF_Reference. | 397 | 0 | return BaseHandle(std::get<QPDF_Reference>(obj->value).obj).as<T>(); | 398 | 0 | } | 399 | 1.34k | return nullptr; | 400 | 1.34k | } |
Unexecuted instantiation: QPDF_String* qpdf::BaseHandle::as<QPDF_String>() const QPDF_Array* qpdf::BaseHandle::as<QPDF_Array>() const Line | Count | Source | 385 | 15.9M | { | 386 | 15.9M | if (!obj) { | 387 | 48.7k | return nullptr; | 388 | 48.7k | } | 389 | 15.8M | if (std::holds_alternative<T>(obj->value)) { | 390 | 695k | return &std::get<T>(obj->value); | 391 | 695k | } | 392 | 15.1M | if (std::holds_alternative<QPDF_Unresolved>(obj->value)) { | 393 | 0 | return BaseHandle(QPDF::Resolver::resolved(obj->qpdf, obj->og)).as<T>(); | 394 | 0 | } | 395 | 15.1M | if (std::holds_alternative<QPDF_Reference>(obj->value)) { | 396 | | // see comment in QPDF_Reference. | 397 | 0 | return BaseHandle(std::get<QPDF_Reference>(obj->value).obj).as<T>(); | 398 | 0 | } | 399 | 15.1M | return nullptr; | 400 | 15.1M | } |
|
401 | | |
402 | | inline BaseHandle::BaseHandle(QPDFObjectHandle const& oh) : |
403 | 126k | obj(oh.obj) |
404 | 126k | { |
405 | 126k | } |
406 | | |
407 | | inline BaseHandle::BaseHandle(QPDFObjectHandle&& oh) : |
408 | | obj(std::move(oh.obj)) |
409 | | { |
410 | | } |
411 | | |
412 | | inline void |
413 | | BaseHandle::assign(qpdf_object_type_e required, BaseHandle const& other) |
414 | 0 | { |
415 | 0 | if (obj != other.obj) { |
416 | 0 | obj = other.resolved_type_code() == required ? other.obj : nullptr; |
417 | 0 | } |
418 | 0 | } |
419 | | |
420 | | inline void |
421 | | BaseHandle::assign(qpdf_object_type_e required, BaseHandle&& other) |
422 | 0 | { |
423 | 0 | if (obj != other.obj) { |
424 | 0 | obj = other.resolved_type_code() == required ? std::move(other.obj) : nullptr; |
425 | 0 | } |
426 | 0 | } |
427 | | |
428 | | inline QPDFObjGen |
429 | | BaseHandle::id_gen() const |
430 | 669 | { |
431 | 669 | return obj ? obj->og : QPDFObjGen(); |
432 | 669 | } |
433 | | |
434 | | inline bool |
435 | | BaseHandle::indirect() const |
436 | 8.70M | { |
437 | 8.70M | return obj ? obj->og.isIndirect() : false; |
438 | 8.70M | } |
439 | | |
440 | | inline bool |
441 | | BaseHandle::null() const |
442 | 3.03M | { |
443 | 3.03M | return !obj || type_code() == ::ot_null; |
444 | 3.03M | } |
445 | | |
446 | | inline QPDF* |
447 | | BaseHandle::qpdf() const |
448 | 179k | { |
449 | 179k | return obj ? obj->qpdf : nullptr; |
450 | 179k | } |
451 | | |
452 | | inline qpdf_object_type_e |
453 | | BaseHandle::raw_type_code() const |
454 | 180M | { |
455 | 180M | return obj ? static_cast<qpdf_object_type_e>(obj->value.index()) : ::ot_uninitialized; |
456 | 180M | } |
457 | | |
458 | | inline qpdf_object_type_e |
459 | | BaseHandle::resolved_type_code() const |
460 | 8.47M | { |
461 | 8.47M | if (!obj) { |
462 | 0 | return ::ot_uninitialized; |
463 | 0 | } |
464 | 8.47M | if (raw_type_code() == ::ot_unresolved) { |
465 | 4 | return QPDF::Resolver::resolved(obj->qpdf, obj->og)->getTypeCode(); |
466 | 4 | } |
467 | 8.47M | return raw_type_code(); |
468 | 8.47M | } |
469 | | |
470 | | inline qpdf_object_type_e |
471 | | BaseHandle::type_code() const |
472 | 49.2M | { |
473 | 49.2M | if (!obj) { |
474 | 1.54k | return ::ot_uninitialized; |
475 | 1.54k | } |
476 | 49.2M | if (raw_type_code() == ::ot_unresolved) { |
477 | 199k | return QPDF::Resolver::resolved(obj->qpdf, obj->og)->getTypeCode(); |
478 | 199k | } |
479 | 49.0M | if (raw_type_code() == ::ot_reference) { |
480 | 0 | return std::get<QPDF_Reference>(obj->value).obj->getTypeCode(); |
481 | 0 | } |
482 | 49.0M | return raw_type_code(); |
483 | 49.0M | } |
484 | | |
485 | | } // namespace qpdf |
486 | | |
487 | | inline QPDF_Dictionary::QPDF_Dictionary(std::map<std::string, QPDFObjectHandle>&& items) : |
488 | 193k | items(std::move(items)) |
489 | 193k | { |
490 | 193k | } |
491 | | |
492 | | inline std::shared_ptr<QPDFObject> |
493 | | QPDF_Null::create( |
494 | | std::shared_ptr<QPDFObject> parent, std::string_view const& static_descr, std::string var_descr) |
495 | 323k | { |
496 | 323k | auto n = QPDFObject::create<QPDF_Null>(); |
497 | 323k | n->setChildDescription(parent->getQPDF(), parent, static_descr, var_descr); |
498 | 323k | return n; |
499 | 323k | } |
500 | | |
501 | | inline QPDF_Real::QPDF_Real(double value, int decimal_places, bool trim_trailing_zeroes) : |
502 | 26.6k | val(QUtil::double_to_string(value, decimal_places, trim_trailing_zeroes)) |
503 | 26.6k | { |
504 | 26.6k | } |
505 | | |
506 | | template <typename T, typename... Args> |
507 | | inline std::shared_ptr<QPDFObject> |
508 | | QPDFObject::create(Args&&... args) |
509 | 11.5M | { |
510 | 11.5M | return std::make_shared<QPDFObject>(std::forward<T>(T(std::forward<Args>(args)...))); |
511 | 11.5M | } std::__1::shared_ptr<QPDFObject> QPDFObject::create<QPDF_Null>() Line | Count | Source | 509 | 701k | { | 510 | 701k | return std::make_shared<QPDFObject>(std::forward<T>(T(std::forward<Args>(args)...))); | 511 | 701k | } |
Unexecuted instantiation: std::__1::shared_ptr<QPDFObject> QPDFObject::create<QPDF_Reserved>() std::__1::shared_ptr<QPDFObject> QPDFObject::create<QPDF_Bool, bool&>(bool&) Line | Count | Source | 509 | 199 | { | 510 | 199 | return std::make_shared<QPDFObject>(std::forward<T>(T(std::forward<Args>(args)...))); | 511 | 199 | } |
std::__1::shared_ptr<QPDFObject> QPDFObject::create<QPDF_Integer, long long&>(long long&) Line | Count | Source | 509 | 564k | { | 510 | 564k | return std::make_shared<QPDFObject>(std::forward<T>(T(std::forward<Args>(args)...))); | 511 | 564k | } |
std::__1::shared_ptr<QPDFObject> QPDFObject::create<QPDF_Real, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&) Line | Count | Source | 509 | 4.68k | { | 510 | 4.68k | return std::make_shared<QPDFObject>(std::forward<T>(T(std::forward<Args>(args)...))); | 511 | 4.68k | } |
std::__1::shared_ptr<QPDFObject> QPDFObject::create<QPDF_String, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&) Line | Count | Source | 509 | 17.9k | { | 510 | 17.9k | return std::make_shared<QPDFObject>(std::forward<T>(T(std::forward<Args>(args)...))); | 511 | 17.9k | } |
std::__1::shared_ptr<QPDFObject> QPDFObject::create<QPDF_Name, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&) Line | Count | Source | 509 | 19.1k | { | 510 | 19.1k | return std::make_shared<QPDFObject>(std::forward<T>(T(std::forward<Args>(args)...))); | 511 | 19.1k | } |
Unexecuted instantiation: std::__1::shared_ptr<QPDFObject> QPDFObject::create<QPDF_Array, QPDF_Array const&>(QPDF_Array const&) std::__1::shared_ptr<QPDFObject> QPDFObject::create<QPDF_Array, QPDF_Array>(QPDF_Array&&) Line | Count | Source | 509 | 32 | { | 510 | 32 | return std::make_shared<QPDFObject>(std::forward<T>(T(std::forward<Args>(args)...))); | 511 | 32 | } |
std::__1::shared_ptr<QPDFObject> QPDFObject::create<QPDF_Array, std::__1::vector<QPDFObjectHandle, std::__1::allocator<QPDFObjectHandle> >, bool>(std::__1::vector<QPDFObjectHandle, std::__1::allocator<QPDFObjectHandle> >&&, bool&&) Line | Count | Source | 509 | 698 | { | 510 | 698 | return std::make_shared<QPDFObject>(std::forward<T>(T(std::forward<Args>(args)...))); | 511 | 698 | } |
std::__1::shared_ptr<QPDFObject> QPDFObject::create<QPDF_Dictionary, std::__1::map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, QPDFObjectHandle, std::__1::less<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, QPDFObjectHandle> > > const&>(std::__1::map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, QPDFObjectHandle, std::__1::less<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, QPDFObjectHandle> > > const&) Line | Count | Source | 509 | 58.0k | { | 510 | 58.0k | return std::make_shared<QPDFObject>(std::forward<T>(T(std::forward<Args>(args)...))); | 511 | 58.0k | } |
std::__1::shared_ptr<QPDFObject> QPDFObject::create<QPDF_Dictionary, std::__1::map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, QPDFObjectHandle, std::__1::less<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, QPDFObjectHandle> > >&>(std::__1::map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, QPDFObjectHandle, std::__1::less<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, QPDFObjectHandle> > >&) Line | Count | Source | 509 | 5.77k | { | 510 | 5.77k | return std::make_shared<QPDFObject>(std::forward<T>(T(std::forward<Args>(args)...))); | 511 | 5.77k | } |
Unexecuted instantiation: std::__1::shared_ptr<QPDFObject> QPDFObject::create<QPDF_Operator, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&) Unexecuted instantiation: std::__1::shared_ptr<QPDFObject> QPDFObject::create<QPDF_InlineImage, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&) std::__1::shared_ptr<QPDFObject> QPDFObject::create<QPDF_Real, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) Line | Count | Source | 509 | 81.9k | { | 510 | 81.9k | return std::make_shared<QPDFObject>(std::forward<T>(T(std::forward<Args>(args)...))); | 511 | 81.9k | } |
std::__1::shared_ptr<QPDFObject> QPDFObject::create<QPDF_Real, double&, int&, bool&>(double&, int&, bool&) Line | Count | Source | 509 | 26.6k | { | 510 | 26.6k | return std::make_shared<QPDFObject>(std::forward<T>(T(std::forward<Args>(args)...))); | 511 | 26.6k | } |
std::__1::shared_ptr<QPDFObject> QPDFObject::create<QPDF_Name, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) Line | Count | Source | 509 | 9.38M | { | 510 | 9.38M | return std::make_shared<QPDFObject>(std::forward<T>(T(std::forward<Args>(args)...))); | 511 | 9.38M | } |
std::__1::shared_ptr<QPDFObject> QPDFObject::create<QPDF_String, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) Line | Count | Source | 509 | 380k | { | 510 | 380k | return std::make_shared<QPDFObject>(std::forward<T>(T(std::forward<Args>(args)...))); | 511 | 380k | } |
Unexecuted instantiation: std::__1::shared_ptr<QPDFObject> QPDFObject::create<QPDF_Operator, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) Unexecuted instantiation: std::__1::shared_ptr<QPDFObject> QPDFObject::create<QPDF_InlineImage, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) std::__1::shared_ptr<QPDFObject> QPDFObject::create<QPDF_Array, std::__1::vector<QPDFObjectHandle, std::__1::allocator<QPDFObjectHandle> > const&>(std::__1::vector<QPDFObjectHandle, std::__1::allocator<QPDFObjectHandle> > const&) Line | Count | Source | 509 | 8.86k | { | 510 | 8.86k | return std::make_shared<QPDFObject>(std::forward<T>(T(std::forward<Args>(args)...))); | 511 | 8.86k | } |
std::__1::shared_ptr<QPDFObject> QPDFObject::create<QPDF_Array, std::__1::vector<QPDFObjectHandle, std::__1::allocator<QPDFObjectHandle> >&>(std::__1::vector<QPDFObjectHandle, std::__1::allocator<QPDFObjectHandle> >&) Line | Count | Source | 509 | 3.87k | { | 510 | 3.87k | return std::make_shared<QPDFObject>(std::forward<T>(T(std::forward<Args>(args)...))); | 511 | 3.87k | } |
std::__1::shared_ptr<QPDFObject> QPDFObject::create<QPDF_Bool, bool>(bool&&) Line | Count | Source | 509 | 11.0k | { | 510 | 11.0k | return std::make_shared<QPDFObject>(std::forward<T>(T(std::forward<Args>(args)...))); | 511 | 11.0k | } |
std::__1::shared_ptr<QPDFObject> QPDFObject::create<QPDF_Integer, long long>(long long&&) Line | Count | Source | 509 | 10.5k | { | 510 | 10.5k | return std::make_shared<QPDFObject>(std::forward<T>(T(std::forward<Args>(args)...))); | 511 | 10.5k | } |
std::__1::shared_ptr<QPDFObject> QPDFObject::create<QPDF_Array, std::__1::vector<QPDFObjectHandle, std::__1::allocator<QPDFObjectHandle> > >(std::__1::vector<QPDFObjectHandle, std::__1::allocator<QPDFObjectHandle> >&&) Line | Count | Source | 509 | 104k | { | 510 | 104k | return std::make_shared<QPDFObject>(std::forward<T>(T(std::forward<Args>(args)...))); | 511 | 104k | } |
std::__1::shared_ptr<QPDFObject> QPDFObject::create<QPDF_Dictionary, std::__1::map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, QPDFObjectHandle, std::__1::less<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, QPDFObjectHandle> > > >(std::__1::map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, QPDFObjectHandle, std::__1::less<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, QPDFObjectHandle> > >&&) Line | Count | Source | 509 | 193k | { | 510 | 193k | return std::make_shared<QPDFObject>(std::forward<T>(T(std::forward<Args>(args)...))); | 511 | 193k | } |
Unexecuted instantiation: std::__1::shared_ptr<QPDFObject> QPDFObject::create<QPDF_Array>() |
512 | | |
513 | | inline qpdf_object_type_e |
514 | | QPDFObject::getResolvedTypeCode() const |
515 | 184k | { |
516 | 184k | if (getTypeCode() == ::ot_unresolved) { |
517 | 0 | return QPDF::Resolver::resolved(qpdf, og)->getTypeCode(); |
518 | 0 | } |
519 | 184k | if (getTypeCode() == ::ot_reference) { |
520 | 0 | return std::get<QPDF_Reference>(value).obj->getTypeCode(); |
521 | 0 | } |
522 | 184k | return getTypeCode(); |
523 | 184k | } |
524 | | |
525 | | inline qpdf::Array |
526 | | QPDFObjectHandle::as_array(qpdf::typed options) const |
527 | 7.85M | { |
528 | 7.85M | if (options & qpdf::error) { |
529 | 0 | assertType("array", false); |
530 | 0 | } |
531 | 7.85M | if (options & qpdf::any_flag || type_code() == ::ot_array || |
532 | 7.85M | (options & qpdf::optional && type_code() == ::ot_null)) { |
533 | 7.82M | return qpdf::Array(obj); |
534 | 7.82M | } |
535 | 33.4k | return qpdf::Array(std::shared_ptr<QPDFObject>()); |
536 | 7.85M | } |
537 | | |
538 | | inline qpdf::Dictionary |
539 | | QPDFObjectHandle::as_dictionary(qpdf::typed options) const |
540 | 19.0M | { |
541 | 19.0M | if (options & qpdf::any_flag || type_code() == ::ot_dictionary || |
542 | 19.0M | (options & qpdf::optional && type_code() == ::ot_null)) { |
543 | 19.0M | return qpdf::Dictionary(obj); |
544 | 19.0M | } |
545 | 5.96k | if (options & qpdf::error) { |
546 | 0 | assertType("dictionary", false); |
547 | 0 | } |
548 | 5.96k | return qpdf::Dictionary(std::shared_ptr<QPDFObject>()); |
549 | 19.0M | } |
550 | | |
551 | | inline qpdf::Stream |
552 | | QPDFObjectHandle::as_stream(qpdf::typed options) const |
553 | 315k | { |
554 | 315k | if (options & qpdf::any_flag || type_code() == ::ot_stream || |
555 | 315k | (options & qpdf::optional && type_code() == ::ot_null)) { |
556 | 289k | return qpdf::Stream(obj); |
557 | 289k | } |
558 | 26.8k | if (options & qpdf::error) { |
559 | 36 | assertType("stream", false); |
560 | 36 | } |
561 | 26.8k | return qpdf::Stream(std::shared_ptr<QPDFObject>()); |
562 | 315k | } |
563 | | |
564 | | #endif // OBJECTHANDLE_PRIVATE_HH |