Commit 277779a363bf452557aa9b8b1a2d1aed8c1c1bee
Committed by
GitHub
Merge pull request #1582 from m-holger/null
Add private-API Null class
Showing
7 changed files
with
45 additions
and
19 deletions
libqpdf/QPDFAcroFormDocumentHelper.cc
| ... | ... | @@ -252,16 +252,15 @@ QPDFFormFieldObjectHelper |
| 252 | 252 | QPDFAcroFormDocumentHelper::getFieldForAnnotation(QPDFAnnotationObjectHelper h) |
| 253 | 253 | { |
| 254 | 254 | QPDFObjectHandle oh = h.getObjectHandle(); |
| 255 | - QPDFFormFieldObjectHelper result(QPDFObjectHandle::newNull()); | |
| 256 | 255 | if (!oh.isDictionaryOfType("", "/Widget")) { |
| 257 | - return result; | |
| 256 | + return Null::temp(); | |
| 258 | 257 | } |
| 259 | 258 | analyze(); |
| 260 | 259 | QPDFObjGen og(oh.getObjGen()); |
| 261 | 260 | if (m->annotation_to_field.contains(og)) { |
| 262 | - result = m->annotation_to_field[og]; | |
| 261 | + return m->annotation_to_field[og]; | |
| 263 | 262 | } |
| 264 | - return result; | |
| 263 | + return Null::temp(); | |
| 265 | 264 | } |
| 266 | 265 | |
| 267 | 266 | void | ... | ... |
libqpdf/QPDFAnnotationObjectHelper.cc
| ... | ... | @@ -56,20 +56,16 @@ QPDFAnnotationObjectHelper::getAppearanceStream(std::string const& which, std::s |
| 56 | 56 | // appearance stream when /AP is a dictionary, but files have been seen in the wild |
| 57 | 57 | // where Appearance State is `/N` and `/AP` is a stream. Therefore, if `which` points to |
| 58 | 58 | // a stream, disregard state and just use the stream. See qpdf issue #949 for details. |
| 59 | - QTC::TC("qpdf", "QPDFAnnotationObjectHelper AP stream"); | |
| 60 | 59 | return ap_sub; |
| 61 | 60 | } |
| 62 | - if (ap_sub.isDictionary() && (!desired_state.empty())) { | |
| 63 | - QTC::TC("qpdf", "QPDFAnnotationObjectHelper AP dictionary"); | |
| 61 | + if (ap_sub.isDictionary() && !desired_state.empty()) { | |
| 64 | 62 | QPDFObjectHandle ap_sub_val = ap_sub.getKey(desired_state); |
| 65 | 63 | if (ap_sub_val.isStream()) { |
| 66 | - QTC::TC("qpdf", "QPDFAnnotationObjectHelper AP sub stream"); | |
| 67 | 64 | return ap_sub_val; |
| 68 | 65 | } |
| 69 | 66 | } |
| 70 | 67 | } |
| 71 | - QTC::TC("qpdf", "QPDFAnnotationObjectHelper AP null"); | |
| 72 | - return QPDFObjectHandle::newNull(); | |
| 68 | + return Null::temp(); | |
| 73 | 69 | } |
| 74 | 70 | |
| 75 | 71 | std::string | ... | ... |
libqpdf/QPDFEmbeddedFileDocumentHelper.cc
| 1 | 1 | #include <qpdf/QPDFEmbeddedFileDocumentHelper.hh> |
| 2 | 2 | |
| 3 | 3 | #include <qpdf/QPDFNameTreeObjectHelper.hh> |
| 4 | +#include <qpdf/QPDFObjectHandle_private.hh> | |
| 4 | 5 | #include <qpdf/QPDF_private.hh> |
| 5 | 6 | |
| 6 | 7 | // File attachments are stored in the /EmbeddedFiles (name tree) key of the /Names dictionary from |
| ... | ... | @@ -143,11 +144,10 @@ QPDFEmbeddedFileDocumentHelper::removeEmbeddedFile(std::string const& name) |
| 143 | 144 | if (iter == m->embedded_files->end()) { |
| 144 | 145 | return false; |
| 145 | 146 | } |
| 146 | - auto oh = iter->second; | |
| 147 | - iter.remove(); | |
| 148 | - if (oh.isIndirect()) { | |
| 149 | - qpdf.replaceObject(oh.getObjGen(), QPDFObjectHandle::newNull()); | |
| 147 | + if (iter->second.indirect()) { | |
| 148 | + qpdf.replaceObject(iter->second, Null()); | |
| 150 | 149 | } |
| 150 | + iter.remove(); | |
| 151 | 151 | |
| 152 | 152 | return true; |
| 153 | 153 | } | ... | ... |
libqpdf/QPDFFileSpecObjectHelper.cc
libqpdf/QPDFObjectHandle.cc
libqpdf/qpdf/QPDFObjectHandle_private.hh
| ... | ... | @@ -468,6 +468,39 @@ namespace qpdf |
| 468 | 468 | } |
| 469 | 469 | }; |
| 470 | 470 | |
| 471 | + class Null final: public BaseHandle | |
| 472 | + { | |
| 473 | + public: | |
| 474 | + // Unlike other types, the Null default constructor creates a valid null object. | |
| 475 | + Null() : | |
| 476 | + BaseHandle(QPDFObject::create<QPDF_Null>()) | |
| 477 | + { | |
| 478 | + } | |
| 479 | + | |
| 480 | + Null(Null const&) = default; | |
| 481 | + Null(Null&&) = default; | |
| 482 | + Null& operator=(Null const&) = default; | |
| 483 | + Null& operator=(Null&&) = default; | |
| 484 | + ~Null() = default; | |
| 485 | + | |
| 486 | + // For legacy support, return a Null object to be used as a temporary return value. | |
| 487 | + static QPDFObjectHandle | |
| 488 | + temp() | |
| 489 | + { | |
| 490 | + return temp_.oh(); | |
| 491 | + } | |
| 492 | + | |
| 493 | + // For legacy support, return an explicit temporary Null object if oh is null. | |
| 494 | + static QPDFObjectHandle | |
| 495 | + if_null(QPDFObjectHandle oh) | |
| 496 | + { | |
| 497 | + return oh ? std::move(oh) : Null::temp(); | |
| 498 | + } | |
| 499 | + | |
| 500 | + private: | |
| 501 | + static const Null temp_; | |
| 502 | + }; // class Null | |
| 503 | + | |
| 471 | 504 | class Stream final: public BaseHandle |
| 472 | 505 | { |
| 473 | 506 | public: | ... | ... |
qpdf/qpdf.testcov
| ... | ... | @@ -181,10 +181,6 @@ QPDFFormFieldObjectHelper TU absent 0 |
| 181 | 181 | QPDFFormFieldObjectHelper TM absent 0 |
| 182 | 182 | QPDFFormFieldObjectHelper Q present 1 |
| 183 | 183 | QPDFFormFieldObjectHelper DA present 1 |
| 184 | -QPDFAnnotationObjectHelper AP stream 0 | |
| 185 | -QPDFAnnotationObjectHelper AP dictionary 0 | |
| 186 | -QPDFAnnotationObjectHelper AP sub stream 0 | |
| 187 | -QPDFAnnotationObjectHelper AP null 0 | |
| 188 | 184 | QPDFAcroFormDocumentHelper field found 1 |
| 189 | 185 | QPDFAcroFormDocumentHelper annotation found 1 |
| 190 | 186 | QPDFJob automatically set keep files open 1 | ... | ... |