Commit 80ed3076a02a40175760f8ddf88bbee2e1604d23
1 parent
496ca2e4
Remove deprecated name/number tree constructors
Remove the name/number tree object helper constructors that don't take a QPDF&.
Showing
11 changed files
with
31 additions
and
113 deletions
TODO
| ... | ... | @@ -481,10 +481,6 @@ Comments appear in the code prefixed by "ABI" |
| 481 | 481 | * Search for ABI to find items not listed here. |
| 482 | 482 | * See where anonymous namespaces can be used to keep things private to |
| 483 | 483 | a source file. Search for `(class|struct)` in **/*.cc. |
| 484 | -* After removing legacy QPDFNameTreeObjectHelper and | |
| 485 | - QPDFNumberTreeObjectHelper constructors, NNTreeImpl can switch to | |
| 486 | - having a QPDF reference and assume that the reference is always | |
| 487 | - valid. | |
| 488 | 484 | * Having QPDFObjectHandle setters return Class& to allow for |
| 489 | 485 | use of fluent interfaces. This includes array and dictionary |
| 490 | 486 | mutators. | ... | ... |
include/qpdf/QPDFNameTreeObjectHelper.hh
| ... | ... | @@ -50,13 +50,6 @@ class QPDFNameTreeObjectHelper: public QPDFObjectHelper |
| 50 | 50 | QPDF_DLL |
| 51 | 51 | QPDFNameTreeObjectHelper(QPDFObjectHandle, QPDF&, bool auto_repair = true); |
| 52 | 52 | |
| 53 | - // ABI: Legacy Constructor will be removed in QPDF 11. A | |
| 54 | - // QPDFNameTreeObjectHelper constructed in this way can't be | |
| 55 | - // modified or repaired and will silently ignore problems in the | |
| 56 | - // structure. | |
| 57 | - [[deprecated("use constructor that takes QPDF&")]] QPDF_DLL | |
| 58 | - QPDFNameTreeObjectHelper(QPDFObjectHandle); | |
| 59 | - | |
| 60 | 53 | // Create an empty name tree |
| 61 | 54 | QPDF_DLL |
| 62 | 55 | static QPDFNameTreeObjectHelper newEmpty(QPDF&, bool auto_repair = true); |
| ... | ... | @@ -197,7 +190,7 @@ class QPDFNameTreeObjectHelper: public QPDFObjectHelper |
| 197 | 190 | ~Members() = default; |
| 198 | 191 | |
| 199 | 192 | private: |
| 200 | - Members(QPDFObjectHandle& oh, QPDF*, bool auto_repair); | |
| 193 | + Members(QPDFObjectHandle& oh, QPDF&, bool auto_repair); | |
| 201 | 194 | Members(Members const&) = delete; |
| 202 | 195 | |
| 203 | 196 | std::shared_ptr<NNTreeImpl> impl; | ... | ... |
include/qpdf/QPDFNumberTreeObjectHelper.hh
| ... | ... | @@ -48,13 +48,6 @@ class QPDFNumberTreeObjectHelper: public QPDFObjectHelper |
| 48 | 48 | QPDFNumberTreeObjectHelper( |
| 49 | 49 | QPDFObjectHandle, QPDF&, bool auto_repair = true); |
| 50 | 50 | |
| 51 | - // ABI: Legacy Constructor will be removed in QPDF 11. A | |
| 52 | - // QPDFNumberTreeObjectHelper constructed in this way can't be | |
| 53 | - // modified or repaired and will silently ignore problems in the | |
| 54 | - // structure. | |
| 55 | - [[deprecated("use constructor that takes QPDF&")]] QPDF_DLL | |
| 56 | - QPDFNumberTreeObjectHelper(QPDFObjectHandle); | |
| 57 | - | |
| 58 | 51 | QPDF_DLL |
| 59 | 52 | virtual ~QPDFNumberTreeObjectHelper() = default; |
| 60 | 53 | |
| ... | ... | @@ -217,7 +210,7 @@ class QPDFNumberTreeObjectHelper: public QPDFObjectHelper |
| 217 | 210 | ~Members() = default; |
| 218 | 211 | |
| 219 | 212 | private: |
| 220 | - Members(QPDFObjectHandle& oh, QPDF*, bool auto_repair); | |
| 213 | + Members(QPDFObjectHandle& oh, QPDF&, bool auto_repair); | |
| 221 | 214 | Members(Members const&) = delete; |
| 222 | 215 | |
| 223 | 216 | std::shared_ptr<NNTreeImpl> impl; | ... | ... |
libqpdf/NNTree.cc
| ... | ... | @@ -16,37 +16,23 @@ get_description(QPDFObjectHandle& node) |
| 16 | 16 | } |
| 17 | 17 | |
| 18 | 18 | static void |
| 19 | -warn(QPDF* qpdf, QPDFObjectHandle& node, std::string const& msg) | |
| 19 | +warn(QPDF& qpdf, QPDFObjectHandle& node, std::string const& msg) | |
| 20 | 20 | { |
| 21 | - // ABI: in qpdf 11, change to a reference. | |
| 22 | - | |
| 23 | - if (qpdf) { | |
| 24 | - qpdf->warn( | |
| 25 | - // line-break | |
| 26 | - QPDFExc( | |
| 27 | - qpdf_e_damaged_pdf, | |
| 28 | - qpdf->getFilename(), | |
| 29 | - get_description(node), | |
| 30 | - 0, | |
| 31 | - msg)); | |
| 32 | - } | |
| 21 | + qpdf.warn( | |
| 22 | + // line-break | |
| 23 | + QPDFExc( | |
| 24 | + qpdf_e_damaged_pdf, | |
| 25 | + qpdf.getFilename(), | |
| 26 | + get_description(node), | |
| 27 | + 0, | |
| 28 | + msg)); | |
| 33 | 29 | } |
| 34 | 30 | |
| 35 | 31 | static void |
| 36 | -error(QPDF* qpdf, QPDFObjectHandle& node, std::string const& msg) | |
| 32 | +error(QPDF& qpdf, QPDFObjectHandle& node, std::string const& msg) | |
| 37 | 33 | { |
| 38 | - // ABI: in qpdf 11, change to a reference. | |
| 39 | - | |
| 40 | - if (qpdf) { | |
| 41 | - throw QPDFExc( | |
| 42 | - qpdf_e_damaged_pdf, | |
| 43 | - qpdf->getFilename(), | |
| 44 | - get_description(node), | |
| 45 | - 0, | |
| 46 | - msg); | |
| 47 | - } else { | |
| 48 | - throw std::runtime_error(get_description(node) + ": " + msg); | |
| 49 | - } | |
| 34 | + throw QPDFExc( | |
| 35 | + qpdf_e_damaged_pdf, qpdf.getFilename(), get_description(node), 0, msg); | |
| 50 | 36 | } |
| 51 | 37 | |
| 52 | 38 | NNTreeIterator::NNTreeIterator(NNTreeImpl& impl) : |
| ... | ... | @@ -293,9 +279,6 @@ NNTreeIterator::split( |
| 293 | 279 | // node: A |
| 294 | 280 | // item_number: 0 |
| 295 | 281 | |
| 296 | - if (!this->impl.qpdf) { | |
| 297 | - throw std::logic_error("NNTreeIterator::split called with null qpdf"); | |
| 298 | - } | |
| 299 | 282 | if (!valid()) { |
| 300 | 283 | throw std::logic_error( |
| 301 | 284 | "NNTreeIterator::split called an invalid iterator"); |
| ... | ... | @@ -361,7 +344,7 @@ NNTreeIterator::split( |
| 361 | 344 | // same way. |
| 362 | 345 | |
| 363 | 346 | auto first_node = |
| 364 | - impl.qpdf->makeIndirectObject(QPDFObjectHandle::newDictionary()); | |
| 347 | + impl.qpdf.makeIndirectObject(QPDFObjectHandle::newDictionary()); | |
| 365 | 348 | first_node.replaceKey(key, first_half); |
| 366 | 349 | QPDFObjectHandle new_kids = QPDFObjectHandle::newArray(); |
| 367 | 350 | new_kids.appendItem(first_node); |
| ... | ... | @@ -397,7 +380,7 @@ NNTreeIterator::split( |
| 397 | 380 | |
| 398 | 381 | // Create a new node to contain the second half |
| 399 | 382 | QPDFObjectHandle second_node = |
| 400 | - impl.qpdf->makeIndirectObject(QPDFObjectHandle::newDictionary()); | |
| 383 | + impl.qpdf.makeIndirectObject(QPDFObjectHandle::newDictionary()); | |
| 401 | 384 | second_node.replaceKey(key, second_half); |
| 402 | 385 | resetLimits(second_node, parent); |
| 403 | 386 | |
| ... | ... | @@ -705,7 +688,7 @@ NNTreeIterator::deepen(QPDFObjectHandle node, bool first, bool allow_empty) |
| 705 | 688 | addPathElement(node, kid_number); |
| 706 | 689 | auto next = kids.getArrayItem(kid_number); |
| 707 | 690 | if (!next.isIndirect()) { |
| 708 | - if (impl.qpdf && impl.auto_repair) { | |
| 691 | + if (impl.auto_repair) { | |
| 709 | 692 | QTC::TC("qpdf", "NNTree fix indirect kid"); |
| 710 | 693 | warn( |
| 711 | 694 | impl.qpdf, |
| ... | ... | @@ -713,7 +696,7 @@ NNTreeIterator::deepen(QPDFObjectHandle node, bool first, bool allow_empty) |
| 713 | 696 | ("converting kid number " + |
| 714 | 697 | QUtil::int_to_string(kid_number) + |
| 715 | 698 | " to an indirect object")); |
| 716 | - next = impl.qpdf->makeIndirectObject(next); | |
| 699 | + next = impl.qpdf.makeIndirectObject(next); | |
| 717 | 700 | kids.setArrayItem(kid_number, next); |
| 718 | 701 | } else { |
| 719 | 702 | QTC::TC("qpdf", "NNTree warn indirect kid"); |
| ... | ... | @@ -749,7 +732,7 @@ NNTreeIterator::deepen(QPDFObjectHandle node, bool first, bool allow_empty) |
| 749 | 732 | |
| 750 | 733 | NNTreeImpl::NNTreeImpl( |
| 751 | 734 | NNTreeDetails const& details, |
| 752 | - QPDF* qpdf, | |
| 735 | + QPDF& qpdf, | |
| 753 | 736 | QPDFObjectHandle& oh, |
| 754 | 737 | bool auto_repair) : |
| 755 | 738 | details(details), | ... | ... |
libqpdf/QPDFNameTreeObjectHelper.cc
| ... | ... | @@ -32,7 +32,7 @@ class NameTreeDetails: public NNTreeDetails |
| 32 | 32 | static NameTreeDetails name_tree_details; |
| 33 | 33 | |
| 34 | 34 | QPDFNameTreeObjectHelper::Members::Members( |
| 35 | - QPDFObjectHandle& oh, QPDF* q, bool auto_repair) : | |
| 35 | + QPDFObjectHandle& oh, QPDF& q, bool auto_repair) : | |
| 36 | 36 | impl(std::make_shared<NNTreeImpl>(name_tree_details, q, oh, auto_repair)) |
| 37 | 37 | { |
| 38 | 38 | } |
| ... | ... | @@ -40,13 +40,7 @@ QPDFNameTreeObjectHelper::Members::Members( |
| 40 | 40 | QPDFNameTreeObjectHelper::QPDFNameTreeObjectHelper( |
| 41 | 41 | QPDFObjectHandle oh, QPDF& q, bool auto_repair) : |
| 42 | 42 | QPDFObjectHelper(oh), |
| 43 | - m(new Members(oh, &q, auto_repair)) | |
| 44 | -{ | |
| 45 | -} | |
| 46 | - | |
| 47 | -QPDFNameTreeObjectHelper::QPDFNameTreeObjectHelper(QPDFObjectHandle oh) : | |
| 48 | - QPDFObjectHelper(oh), | |
| 49 | - m(new Members(oh, nullptr, false)) | |
| 43 | + m(new Members(oh, q, auto_repair)) | |
| 50 | 44 | { |
| 51 | 45 | } |
| 52 | 46 | ... | ... |
libqpdf/QPDFNumberTreeObjectHelper.cc
| ... | ... | @@ -33,7 +33,7 @@ class NumberTreeDetails: public NNTreeDetails |
| 33 | 33 | static NumberTreeDetails number_tree_details; |
| 34 | 34 | |
| 35 | 35 | QPDFNumberTreeObjectHelper::Members::Members( |
| 36 | - QPDFObjectHandle& oh, QPDF* q, bool auto_repair) : | |
| 36 | + QPDFObjectHandle& oh, QPDF& q, bool auto_repair) : | |
| 37 | 37 | impl(std::make_shared<NNTreeImpl>(number_tree_details, q, oh, auto_repair)) |
| 38 | 38 | { |
| 39 | 39 | } |
| ... | ... | @@ -41,13 +41,7 @@ QPDFNumberTreeObjectHelper::Members::Members( |
| 41 | 41 | QPDFNumberTreeObjectHelper::QPDFNumberTreeObjectHelper( |
| 42 | 42 | QPDFObjectHandle oh, QPDF& q, bool auto_repair) : |
| 43 | 43 | QPDFObjectHelper(oh), |
| 44 | - m(new Members(oh, &q, auto_repair)) | |
| 45 | -{ | |
| 46 | -} | |
| 47 | - | |
| 48 | -QPDFNumberTreeObjectHelper::QPDFNumberTreeObjectHelper(QPDFObjectHandle oh) : | |
| 49 | - QPDFObjectHelper(oh), | |
| 50 | - m(new Members(oh, nullptr, false)) | |
| 44 | + m(new Members(oh, q, auto_repair)) | |
| 51 | 45 | { |
| 52 | 46 | } |
| 53 | 47 | ... | ... |
libqpdf/qpdf/NNTree.hh
| ... | ... | @@ -97,10 +97,9 @@ class NNTreeImpl |
| 97 | 97 | public: |
| 98 | 98 | typedef NNTreeIterator iterator; |
| 99 | 99 | |
| 100 | - // ABI: for qpdf 11, make qpdf a reference | |
| 101 | 100 | NNTreeImpl( |
| 102 | 101 | NNTreeDetails const&, |
| 103 | - QPDF*, | |
| 102 | + QPDF&, | |
| 104 | 103 | QPDFObjectHandle&, |
| 105 | 104 | bool auto_repair = true); |
| 106 | 105 | iterator begin(); |
| ... | ... | @@ -132,7 +131,7 @@ class NNTreeImpl |
| 132 | 131 | int compareKeyKid(QPDFObjectHandle& key, QPDFObjectHandle& items, int idx); |
| 133 | 132 | |
| 134 | 133 | NNTreeDetails const& details; |
| 135 | - QPDF* qpdf; | |
| 134 | + QPDF& qpdf; | |
| 136 | 135 | int split_threshold; |
| 137 | 136 | QPDFObjectHandle oh; |
| 138 | 137 | bool auto_repair; | ... | ... |
manual/release-notes.rst
| ... | ... | @@ -69,6 +69,10 @@ For a detailed list of changes, please see the file |
| 69 | 69 | method never worked and only did something in qpdf version |
| 70 | 70 | 10.2.x. |
| 71 | 71 | |
| 72 | + - Remove ``QPDFNameTreeObjectHelper`` and | |
| 73 | + ``QPDFNumberTreeObjectHelper`` constructors that don't take a | |
| 74 | + ``QPDF&`` argument. | |
| 75 | + | |
| 72 | 76 | - Other changes |
| 73 | 77 | |
| 74 | 78 | - A new chapter on contributing to qpdf has been added to the | ... | ... |
qpdf/qtest/qpdf/name-tree.out
| ... | ... | @@ -21,8 +21,6 @@ insertAfter |
| 21 | 21 | 4 (4!) |
| 22 | 22 | /Empty1 |
| 23 | 23 | /Empty2 |
| 24 | -/Bad1: deprecated API | |
| 25 | -Name/Number tree node (object 16): item at index 2 is not the right type | |
| 26 | 24 | /Bad1 -- wrong key type |
| 27 | 25 | 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 |
| 28 | 26 | WARNING: name-tree.pdf (Name/Number tree node (object 16)): item 2 has the wrong type | ... | ... |
qpdf/qtest/qpdf/number-tree.out
| ... | ... | @@ -29,7 +29,6 @@ |
| 29 | 29 | insertAfter |
| 30 | 30 | 3 (3!) |
| 31 | 31 | 4 (4!) |
| 32 | -/Bad1: deprecated API | |
| 33 | 32 | /Bad1 |
| 34 | 33 | WARNING: number-tree.pdf (Name/Number tree node (object 14)): name/number tree node has neither non-empty /Nums nor /Kids |
| 35 | 34 | WARNING: number-tree.pdf (Name/Number tree node (object 13)): loop detected while traversing name/number tree | ... | ... |
qpdf/test_driver.cc
| ... | ... | @@ -1733,23 +1733,8 @@ test_46(QPDF& pdf, char const* arg2) |
| 1733 | 1733 | std::cout << i.first << " " << i.second.unparse() << std::endl; |
| 1734 | 1734 | } |
| 1735 | 1735 | |
| 1736 | - // Exercise deprecated API until qpdf 11 | |
| 1737 | - std::cout << "/Bad1: deprecated API" << std::endl; | |
| 1738 | -#ifdef _MSC_VER | |
| 1739 | -# pragma warning(disable : 4996) | |
| 1740 | -#endif | |
| 1741 | -#if (defined(__GNUC__) || defined(__clang__)) | |
| 1742 | -# pragma GCC diagnostic push | |
| 1743 | -# pragma GCC diagnostic ignored "-Wdeprecated-declarations" | |
| 1744 | -#endif | |
| 1745 | - auto bad1 = QPDFNumberTreeObjectHelper(pdf.getTrailer().getKey("/Bad1")); | |
| 1746 | -#if (defined(__GNUC__) || defined(__clang__)) | |
| 1747 | -# pragma GCC diagnostic pop | |
| 1748 | -#endif | |
| 1749 | - assert(bad1.begin() == bad1.end()); | |
| 1750 | - | |
| 1751 | 1736 | std::cout << "/Bad1" << std::endl; |
| 1752 | - bad1 = QPDFNumberTreeObjectHelper(pdf.getTrailer().getKey("/Bad1"), pdf); | |
| 1737 | + auto bad1 = QPDFNumberTreeObjectHelper(pdf.getTrailer().getKey("/Bad1"), pdf); | |
| 1753 | 1738 | assert(bad1.begin() == bad1.end()); |
| 1754 | 1739 | assert(bad1.last() == bad1.end()); |
| 1755 | 1740 | |
| ... | ... | @@ -1931,28 +1916,8 @@ test_48(QPDF& pdf, char const* arg2) |
| 1931 | 1916 | assert(empty.last()->second.getStringValue() == "6"); |
| 1932 | 1917 | } |
| 1933 | 1918 | |
| 1934 | - // Exercise deprecated API until qpdf 11 | |
| 1935 | - std::cout << "/Bad1: deprecated API" << std::endl; | |
| 1936 | -#ifdef _MSC_VER | |
| 1937 | -# pragma warning(disable : 4996) | |
| 1938 | -#endif | |
| 1939 | -#if (defined(__GNUC__) || defined(__clang__)) | |
| 1940 | -# pragma GCC diagnostic push | |
| 1941 | -# pragma GCC diagnostic ignored "-Wdeprecated-declarations" | |
| 1942 | -#endif | |
| 1943 | - auto bad1 = QPDFNameTreeObjectHelper(pdf.getTrailer().getKey("/Bad1")); | |
| 1944 | -#if (defined(__GNUC__) || defined(__clang__)) | |
| 1945 | -# pragma GCC diagnostic pop | |
| 1946 | -#endif | |
| 1947 | - try { | |
| 1948 | - bad1.find("G", true); | |
| 1949 | - assert(false); | |
| 1950 | - } catch (std::runtime_error& e) { | |
| 1951 | - std::cout << e.what() << std::endl; | |
| 1952 | - } | |
| 1953 | - | |
| 1954 | 1919 | std::cout << "/Bad1 -- wrong key type" << std::endl; |
| 1955 | - bad1 = QPDFNameTreeObjectHelper(pdf.getTrailer().getKey("/Bad1"), pdf); | |
| 1920 | + auto bad1 = QPDFNameTreeObjectHelper(pdf.getTrailer().getKey("/Bad1"), pdf); | |
| 1956 | 1921 | assert(bad1.find("G", true)->first == "A"); |
| 1957 | 1922 | for (auto const& i : bad1) { |
| 1958 | 1923 | std::cout << i.first << std::endl; | ... | ... |