From 80ed3076a02a40175760f8ddf88bbee2e1604d23 Mon Sep 17 00:00:00 2001 From: Jay Berkenbilt Date: Sat, 16 Apr 2022 13:12:49 -0400 Subject: Remove deprecated name/number tree constructors Remove the name/number tree object helper constructors that don't take a QPDF&. --- TODO | 4 --- include/qpdf/QPDFNameTreeObjectHelper.hh | 9 +----- include/qpdf/QPDFNumberTreeObjectHelper.hh | 9 +----- libqpdf/NNTree.cc | 51 ++++++++++-------------------- libqpdf/QPDFNameTreeObjectHelper.cc | 10 ++---- libqpdf/QPDFNumberTreeObjectHelper.cc | 10 ++---- libqpdf/qpdf/NNTree.hh | 5 ++- manual/release-notes.rst | 4 +++ qpdf/qtest/qpdf/name-tree.out | 2 -- qpdf/qtest/qpdf/number-tree.out | 1 - qpdf/test_driver.cc | 39 ++--------------------- 11 files changed, 31 insertions(+), 113 deletions(-) diff --git a/TODO b/TODO index 6fe07fef..68447795 100644 --- a/TODO +++ b/TODO @@ -481,10 +481,6 @@ Comments appear in the code prefixed by "ABI" * Search for ABI to find items not listed here. * See where anonymous namespaces can be used to keep things private to a source file. Search for `(class|struct)` in **/*.cc. -* After removing legacy QPDFNameTreeObjectHelper and - QPDFNumberTreeObjectHelper constructors, NNTreeImpl can switch to - having a QPDF reference and assume that the reference is always - valid. * Having QPDFObjectHandle setters return Class& to allow for use of fluent interfaces. This includes array and dictionary mutators. diff --git a/include/qpdf/QPDFNameTreeObjectHelper.hh b/include/qpdf/QPDFNameTreeObjectHelper.hh index 194fc926..7093ca2e 100644 --- a/include/qpdf/QPDFNameTreeObjectHelper.hh +++ b/include/qpdf/QPDFNameTreeObjectHelper.hh @@ -50,13 +50,6 @@ class QPDFNameTreeObjectHelper: public QPDFObjectHelper QPDF_DLL QPDFNameTreeObjectHelper(QPDFObjectHandle, QPDF&, bool auto_repair = true); - // ABI: Legacy Constructor will be removed in QPDF 11. A - // QPDFNameTreeObjectHelper constructed in this way can't be - // modified or repaired and will silently ignore problems in the - // structure. - [[deprecated("use constructor that takes QPDF&")]] QPDF_DLL - QPDFNameTreeObjectHelper(QPDFObjectHandle); - // Create an empty name tree QPDF_DLL static QPDFNameTreeObjectHelper newEmpty(QPDF&, bool auto_repair = true); @@ -197,7 +190,7 @@ class QPDFNameTreeObjectHelper: public QPDFObjectHelper ~Members() = default; private: - Members(QPDFObjectHandle& oh, QPDF*, bool auto_repair); + Members(QPDFObjectHandle& oh, QPDF&, bool auto_repair); Members(Members const&) = delete; std::shared_ptr impl; diff --git a/include/qpdf/QPDFNumberTreeObjectHelper.hh b/include/qpdf/QPDFNumberTreeObjectHelper.hh index 4dbef98a..b053b5f4 100644 --- a/include/qpdf/QPDFNumberTreeObjectHelper.hh +++ b/include/qpdf/QPDFNumberTreeObjectHelper.hh @@ -48,13 +48,6 @@ class QPDFNumberTreeObjectHelper: public QPDFObjectHelper QPDFNumberTreeObjectHelper( QPDFObjectHandle, QPDF&, bool auto_repair = true); - // ABI: Legacy Constructor will be removed in QPDF 11. A - // QPDFNumberTreeObjectHelper constructed in this way can't be - // modified or repaired and will silently ignore problems in the - // structure. - [[deprecated("use constructor that takes QPDF&")]] QPDF_DLL - QPDFNumberTreeObjectHelper(QPDFObjectHandle); - QPDF_DLL virtual ~QPDFNumberTreeObjectHelper() = default; @@ -217,7 +210,7 @@ class QPDFNumberTreeObjectHelper: public QPDFObjectHelper ~Members() = default; private: - Members(QPDFObjectHandle& oh, QPDF*, bool auto_repair); + Members(QPDFObjectHandle& oh, QPDF&, bool auto_repair); Members(Members const&) = delete; std::shared_ptr impl; diff --git a/libqpdf/NNTree.cc b/libqpdf/NNTree.cc index 8c6b4bab..985a3cb2 100644 --- a/libqpdf/NNTree.cc +++ b/libqpdf/NNTree.cc @@ -16,37 +16,23 @@ get_description(QPDFObjectHandle& node) } static void -warn(QPDF* qpdf, QPDFObjectHandle& node, std::string const& msg) +warn(QPDF& qpdf, QPDFObjectHandle& node, std::string const& msg) { - // ABI: in qpdf 11, change to a reference. - - if (qpdf) { - qpdf->warn( - // line-break - QPDFExc( - qpdf_e_damaged_pdf, - qpdf->getFilename(), - get_description(node), - 0, - msg)); - } + qpdf.warn( + // line-break + QPDFExc( + qpdf_e_damaged_pdf, + qpdf.getFilename(), + get_description(node), + 0, + msg)); } static void -error(QPDF* qpdf, QPDFObjectHandle& node, std::string const& msg) +error(QPDF& qpdf, QPDFObjectHandle& node, std::string const& msg) { - // ABI: in qpdf 11, change to a reference. - - if (qpdf) { - throw QPDFExc( - qpdf_e_damaged_pdf, - qpdf->getFilename(), - get_description(node), - 0, - msg); - } else { - throw std::runtime_error(get_description(node) + ": " + msg); - } + throw QPDFExc( + qpdf_e_damaged_pdf, qpdf.getFilename(), get_description(node), 0, msg); } NNTreeIterator::NNTreeIterator(NNTreeImpl& impl) : @@ -293,9 +279,6 @@ NNTreeIterator::split( // node: A // item_number: 0 - if (!this->impl.qpdf) { - throw std::logic_error("NNTreeIterator::split called with null qpdf"); - } if (!valid()) { throw std::logic_error( "NNTreeIterator::split called an invalid iterator"); @@ -361,7 +344,7 @@ NNTreeIterator::split( // same way. auto first_node = - impl.qpdf->makeIndirectObject(QPDFObjectHandle::newDictionary()); + impl.qpdf.makeIndirectObject(QPDFObjectHandle::newDictionary()); first_node.replaceKey(key, first_half); QPDFObjectHandle new_kids = QPDFObjectHandle::newArray(); new_kids.appendItem(first_node); @@ -397,7 +380,7 @@ NNTreeIterator::split( // Create a new node to contain the second half QPDFObjectHandle second_node = - impl.qpdf->makeIndirectObject(QPDFObjectHandle::newDictionary()); + impl.qpdf.makeIndirectObject(QPDFObjectHandle::newDictionary()); second_node.replaceKey(key, second_half); resetLimits(second_node, parent); @@ -705,7 +688,7 @@ NNTreeIterator::deepen(QPDFObjectHandle node, bool first, bool allow_empty) addPathElement(node, kid_number); auto next = kids.getArrayItem(kid_number); if (!next.isIndirect()) { - if (impl.qpdf && impl.auto_repair) { + if (impl.auto_repair) { QTC::TC("qpdf", "NNTree fix indirect kid"); warn( impl.qpdf, @@ -713,7 +696,7 @@ NNTreeIterator::deepen(QPDFObjectHandle node, bool first, bool allow_empty) ("converting kid number " + QUtil::int_to_string(kid_number) + " to an indirect object")); - next = impl.qpdf->makeIndirectObject(next); + next = impl.qpdf.makeIndirectObject(next); kids.setArrayItem(kid_number, next); } else { QTC::TC("qpdf", "NNTree warn indirect kid"); @@ -749,7 +732,7 @@ NNTreeIterator::deepen(QPDFObjectHandle node, bool first, bool allow_empty) NNTreeImpl::NNTreeImpl( NNTreeDetails const& details, - QPDF* qpdf, + QPDF& qpdf, QPDFObjectHandle& oh, bool auto_repair) : details(details), diff --git a/libqpdf/QPDFNameTreeObjectHelper.cc b/libqpdf/QPDFNameTreeObjectHelper.cc index 19dac3e4..e079c844 100644 --- a/libqpdf/QPDFNameTreeObjectHelper.cc +++ b/libqpdf/QPDFNameTreeObjectHelper.cc @@ -32,7 +32,7 @@ class NameTreeDetails: public NNTreeDetails static NameTreeDetails name_tree_details; QPDFNameTreeObjectHelper::Members::Members( - QPDFObjectHandle& oh, QPDF* q, bool auto_repair) : + QPDFObjectHandle& oh, QPDF& q, bool auto_repair) : impl(std::make_shared(name_tree_details, q, oh, auto_repair)) { } @@ -40,13 +40,7 @@ QPDFNameTreeObjectHelper::Members::Members( QPDFNameTreeObjectHelper::QPDFNameTreeObjectHelper( QPDFObjectHandle oh, QPDF& q, bool auto_repair) : QPDFObjectHelper(oh), - m(new Members(oh, &q, auto_repair)) -{ -} - -QPDFNameTreeObjectHelper::QPDFNameTreeObjectHelper(QPDFObjectHandle oh) : - QPDFObjectHelper(oh), - m(new Members(oh, nullptr, false)) + m(new Members(oh, q, auto_repair)) { } diff --git a/libqpdf/QPDFNumberTreeObjectHelper.cc b/libqpdf/QPDFNumberTreeObjectHelper.cc index 22b7f903..71cb039e 100644 --- a/libqpdf/QPDFNumberTreeObjectHelper.cc +++ b/libqpdf/QPDFNumberTreeObjectHelper.cc @@ -33,7 +33,7 @@ class NumberTreeDetails: public NNTreeDetails static NumberTreeDetails number_tree_details; QPDFNumberTreeObjectHelper::Members::Members( - QPDFObjectHandle& oh, QPDF* q, bool auto_repair) : + QPDFObjectHandle& oh, QPDF& q, bool auto_repair) : impl(std::make_shared(number_tree_details, q, oh, auto_repair)) { } @@ -41,13 +41,7 @@ QPDFNumberTreeObjectHelper::Members::Members( QPDFNumberTreeObjectHelper::QPDFNumberTreeObjectHelper( QPDFObjectHandle oh, QPDF& q, bool auto_repair) : QPDFObjectHelper(oh), - m(new Members(oh, &q, auto_repair)) -{ -} - -QPDFNumberTreeObjectHelper::QPDFNumberTreeObjectHelper(QPDFObjectHandle oh) : - QPDFObjectHelper(oh), - m(new Members(oh, nullptr, false)) + m(new Members(oh, q, auto_repair)) { } diff --git a/libqpdf/qpdf/NNTree.hh b/libqpdf/qpdf/NNTree.hh index 6ee2ee07..09ce3313 100644 --- a/libqpdf/qpdf/NNTree.hh +++ b/libqpdf/qpdf/NNTree.hh @@ -97,10 +97,9 @@ class NNTreeImpl public: typedef NNTreeIterator iterator; - // ABI: for qpdf 11, make qpdf a reference NNTreeImpl( NNTreeDetails const&, - QPDF*, + QPDF&, QPDFObjectHandle&, bool auto_repair = true); iterator begin(); @@ -132,7 +131,7 @@ class NNTreeImpl int compareKeyKid(QPDFObjectHandle& key, QPDFObjectHandle& items, int idx); NNTreeDetails const& details; - QPDF* qpdf; + QPDF& qpdf; int split_threshold; QPDFObjectHandle oh; bool auto_repair; diff --git a/manual/release-notes.rst b/manual/release-notes.rst index c48fd15a..d6ef1c9b 100644 --- a/manual/release-notes.rst +++ b/manual/release-notes.rst @@ -69,6 +69,10 @@ For a detailed list of changes, please see the file method never worked and only did something in qpdf version 10.2.x. + - Remove ``QPDFNameTreeObjectHelper`` and + ``QPDFNumberTreeObjectHelper`` constructors that don't take a + ``QPDF&`` argument. + - Other changes - A new chapter on contributing to qpdf has been added to the diff --git a/qpdf/qtest/qpdf/name-tree.out b/qpdf/qtest/qpdf/name-tree.out index 377d3ab5..6e1c90d6 100644 --- a/qpdf/qtest/qpdf/name-tree.out +++ b/qpdf/qtest/qpdf/name-tree.out @@ -21,8 +21,6 @@ insertAfter 4 (4!) /Empty1 /Empty2 -/Bad1: deprecated API -Name/Number tree node (object 16): item at index 2 is not the right type /Bad1 -- wrong key type WARNING: name-tree.pdf (Name/Number tree node (object 16)): attempting to repair after error: name-tree.pdf (Name/Number tree node (object 16)): item at index 2 is not the right type WARNING: name-tree.pdf (Name/Number tree node (object 16)): item 2 has the wrong type diff --git a/qpdf/qtest/qpdf/number-tree.out b/qpdf/qtest/qpdf/number-tree.out index d1ad8302..7a333608 100644 --- a/qpdf/qtest/qpdf/number-tree.out +++ b/qpdf/qtest/qpdf/number-tree.out @@ -29,7 +29,6 @@ insertAfter 3 (3!) 4 (4!) -/Bad1: deprecated API /Bad1 WARNING: number-tree.pdf (Name/Number tree node (object 14)): name/number tree node has neither non-empty /Nums nor /Kids WARNING: number-tree.pdf (Name/Number tree node (object 13)): loop detected while traversing name/number tree diff --git a/qpdf/test_driver.cc b/qpdf/test_driver.cc index bacaca74..da2a5e7f 100644 --- a/qpdf/test_driver.cc +++ b/qpdf/test_driver.cc @@ -1733,23 +1733,8 @@ test_46(QPDF& pdf, char const* arg2) std::cout << i.first << " " << i.second.unparse() << std::endl; } - // Exercise deprecated API until qpdf 11 - std::cout << "/Bad1: deprecated API" << std::endl; -#ifdef _MSC_VER -# pragma warning(disable : 4996) -#endif -#if (defined(__GNUC__) || defined(__clang__)) -# pragma GCC diagnostic push -# pragma GCC diagnostic ignored "-Wdeprecated-declarations" -#endif - auto bad1 = QPDFNumberTreeObjectHelper(pdf.getTrailer().getKey("/Bad1")); -#if (defined(__GNUC__) || defined(__clang__)) -# pragma GCC diagnostic pop -#endif - assert(bad1.begin() == bad1.end()); - std::cout << "/Bad1" << std::endl; - bad1 = QPDFNumberTreeObjectHelper(pdf.getTrailer().getKey("/Bad1"), pdf); + auto bad1 = QPDFNumberTreeObjectHelper(pdf.getTrailer().getKey("/Bad1"), pdf); assert(bad1.begin() == bad1.end()); assert(bad1.last() == bad1.end()); @@ -1931,28 +1916,8 @@ test_48(QPDF& pdf, char const* arg2) assert(empty.last()->second.getStringValue() == "6"); } - // Exercise deprecated API until qpdf 11 - std::cout << "/Bad1: deprecated API" << std::endl; -#ifdef _MSC_VER -# pragma warning(disable : 4996) -#endif -#if (defined(__GNUC__) || defined(__clang__)) -# pragma GCC diagnostic push -# pragma GCC diagnostic ignored "-Wdeprecated-declarations" -#endif - auto bad1 = QPDFNameTreeObjectHelper(pdf.getTrailer().getKey("/Bad1")); -#if (defined(__GNUC__) || defined(__clang__)) -# pragma GCC diagnostic pop -#endif - try { - bad1.find("G", true); - assert(false); - } catch (std::runtime_error& e) { - std::cout << e.what() << std::endl; - } - std::cout << "/Bad1 -- wrong key type" << std::endl; - bad1 = QPDFNameTreeObjectHelper(pdf.getTrailer().getKey("/Bad1"), pdf); + auto bad1 = QPDFNameTreeObjectHelper(pdf.getTrailer().getKey("/Bad1"), pdf); assert(bad1.find("G", true)->first == "A"); for (auto const& i : bad1) { std::cout << i.first << std::endl; -- cgit v1.2.3-54-g00ecf