Commit 80ed3076a02a40175760f8ddf88bbee2e1604d23

Authored by Jay Berkenbilt
1 parent 496ca2e4

Remove deprecated name/number tree constructors

Remove the name/number tree object helper constructors that don't take
a QPDF&.
... ... @@ -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&amp; 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&amp; 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&amp; 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;
... ...