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,10 +481,6 @@ Comments appear in the code prefixed by "ABI"
481 * Search for ABI to find items not listed here. 481 * Search for ABI to find items not listed here.
482 * See where anonymous namespaces can be used to keep things private to 482 * See where anonymous namespaces can be used to keep things private to
483 a source file. Search for `(class|struct)` in **/*.cc. 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 * Having QPDFObjectHandle setters return Class& to allow for 484 * Having QPDFObjectHandle setters return Class& to allow for
489 use of fluent interfaces. This includes array and dictionary 485 use of fluent interfaces. This includes array and dictionary
490 mutators. 486 mutators.
include/qpdf/QPDFNameTreeObjectHelper.hh
@@ -50,13 +50,6 @@ class QPDFNameTreeObjectHelper: public QPDFObjectHelper @@ -50,13 +50,6 @@ class QPDFNameTreeObjectHelper: public QPDFObjectHelper
50 QPDF_DLL 50 QPDF_DLL
51 QPDFNameTreeObjectHelper(QPDFObjectHandle, QPDF&, bool auto_repair = true); 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 // Create an empty name tree 53 // Create an empty name tree
61 QPDF_DLL 54 QPDF_DLL
62 static QPDFNameTreeObjectHelper newEmpty(QPDF&, bool auto_repair = true); 55 static QPDFNameTreeObjectHelper newEmpty(QPDF&, bool auto_repair = true);
@@ -197,7 +190,7 @@ class QPDFNameTreeObjectHelper: public QPDFObjectHelper @@ -197,7 +190,7 @@ class QPDFNameTreeObjectHelper: public QPDFObjectHelper
197 ~Members() = default; 190 ~Members() = default;
198 191
199 private: 192 private:
200 - Members(QPDFObjectHandle& oh, QPDF*, bool auto_repair); 193 + Members(QPDFObjectHandle& oh, QPDF&, bool auto_repair);
201 Members(Members const&) = delete; 194 Members(Members const&) = delete;
202 195
203 std::shared_ptr<NNTreeImpl> impl; 196 std::shared_ptr<NNTreeImpl> impl;
include/qpdf/QPDFNumberTreeObjectHelper.hh
@@ -48,13 +48,6 @@ class QPDFNumberTreeObjectHelper: public QPDFObjectHelper @@ -48,13 +48,6 @@ class QPDFNumberTreeObjectHelper: public QPDFObjectHelper
48 QPDFNumberTreeObjectHelper( 48 QPDFNumberTreeObjectHelper(
49 QPDFObjectHandle, QPDF&, bool auto_repair = true); 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 QPDF_DLL 51 QPDF_DLL
59 virtual ~QPDFNumberTreeObjectHelper() = default; 52 virtual ~QPDFNumberTreeObjectHelper() = default;
60 53
@@ -217,7 +210,7 @@ class QPDFNumberTreeObjectHelper: public QPDFObjectHelper @@ -217,7 +210,7 @@ class QPDFNumberTreeObjectHelper: public QPDFObjectHelper
217 ~Members() = default; 210 ~Members() = default;
218 211
219 private: 212 private:
220 - Members(QPDFObjectHandle& oh, QPDF*, bool auto_repair); 213 + Members(QPDFObjectHandle& oh, QPDF&, bool auto_repair);
221 Members(Members const&) = delete; 214 Members(Members const&) = delete;
222 215
223 std::shared_ptr<NNTreeImpl> impl; 216 std::shared_ptr<NNTreeImpl> impl;
libqpdf/NNTree.cc
@@ -16,37 +16,23 @@ get_description(QPDFObjectHandle&amp; node) @@ -16,37 +16,23 @@ get_description(QPDFObjectHandle&amp; node)
16 } 16 }
17 17
18 static void 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 static void 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 NNTreeIterator::NNTreeIterator(NNTreeImpl& impl) : 38 NNTreeIterator::NNTreeIterator(NNTreeImpl& impl) :
@@ -293,9 +279,6 @@ NNTreeIterator::split( @@ -293,9 +279,6 @@ NNTreeIterator::split(
293 // node: A 279 // node: A
294 // item_number: 0 280 // item_number: 0
295 281
296 - if (!this->impl.qpdf) {  
297 - throw std::logic_error("NNTreeIterator::split called with null qpdf");  
298 - }  
299 if (!valid()) { 282 if (!valid()) {
300 throw std::logic_error( 283 throw std::logic_error(
301 "NNTreeIterator::split called an invalid iterator"); 284 "NNTreeIterator::split called an invalid iterator");
@@ -361,7 +344,7 @@ NNTreeIterator::split( @@ -361,7 +344,7 @@ NNTreeIterator::split(
361 // same way. 344 // same way.
362 345
363 auto first_node = 346 auto first_node =
364 - impl.qpdf->makeIndirectObject(QPDFObjectHandle::newDictionary()); 347 + impl.qpdf.makeIndirectObject(QPDFObjectHandle::newDictionary());
365 first_node.replaceKey(key, first_half); 348 first_node.replaceKey(key, first_half);
366 QPDFObjectHandle new_kids = QPDFObjectHandle::newArray(); 349 QPDFObjectHandle new_kids = QPDFObjectHandle::newArray();
367 new_kids.appendItem(first_node); 350 new_kids.appendItem(first_node);
@@ -397,7 +380,7 @@ NNTreeIterator::split( @@ -397,7 +380,7 @@ NNTreeIterator::split(
397 380
398 // Create a new node to contain the second half 381 // Create a new node to contain the second half
399 QPDFObjectHandle second_node = 382 QPDFObjectHandle second_node =
400 - impl.qpdf->makeIndirectObject(QPDFObjectHandle::newDictionary()); 383 + impl.qpdf.makeIndirectObject(QPDFObjectHandle::newDictionary());
401 second_node.replaceKey(key, second_half); 384 second_node.replaceKey(key, second_half);
402 resetLimits(second_node, parent); 385 resetLimits(second_node, parent);
403 386
@@ -705,7 +688,7 @@ NNTreeIterator::deepen(QPDFObjectHandle node, bool first, bool allow_empty) @@ -705,7 +688,7 @@ NNTreeIterator::deepen(QPDFObjectHandle node, bool first, bool allow_empty)
705 addPathElement(node, kid_number); 688 addPathElement(node, kid_number);
706 auto next = kids.getArrayItem(kid_number); 689 auto next = kids.getArrayItem(kid_number);
707 if (!next.isIndirect()) { 690 if (!next.isIndirect()) {
708 - if (impl.qpdf && impl.auto_repair) { 691 + if (impl.auto_repair) {
709 QTC::TC("qpdf", "NNTree fix indirect kid"); 692 QTC::TC("qpdf", "NNTree fix indirect kid");
710 warn( 693 warn(
711 impl.qpdf, 694 impl.qpdf,
@@ -713,7 +696,7 @@ NNTreeIterator::deepen(QPDFObjectHandle node, bool first, bool allow_empty) @@ -713,7 +696,7 @@ NNTreeIterator::deepen(QPDFObjectHandle node, bool first, bool allow_empty)
713 ("converting kid number " + 696 ("converting kid number " +
714 QUtil::int_to_string(kid_number) + 697 QUtil::int_to_string(kid_number) +
715 " to an indirect object")); 698 " to an indirect object"));
716 - next = impl.qpdf->makeIndirectObject(next); 699 + next = impl.qpdf.makeIndirectObject(next);
717 kids.setArrayItem(kid_number, next); 700 kids.setArrayItem(kid_number, next);
718 } else { 701 } else {
719 QTC::TC("qpdf", "NNTree warn indirect kid"); 702 QTC::TC("qpdf", "NNTree warn indirect kid");
@@ -749,7 +732,7 @@ NNTreeIterator::deepen(QPDFObjectHandle node, bool first, bool allow_empty) @@ -749,7 +732,7 @@ NNTreeIterator::deepen(QPDFObjectHandle node, bool first, bool allow_empty)
749 732
750 NNTreeImpl::NNTreeImpl( 733 NNTreeImpl::NNTreeImpl(
751 NNTreeDetails const& details, 734 NNTreeDetails const& details,
752 - QPDF* qpdf, 735 + QPDF& qpdf,
753 QPDFObjectHandle& oh, 736 QPDFObjectHandle& oh,
754 bool auto_repair) : 737 bool auto_repair) :
755 details(details), 738 details(details),
libqpdf/QPDFNameTreeObjectHelper.cc
@@ -32,7 +32,7 @@ class NameTreeDetails: public NNTreeDetails @@ -32,7 +32,7 @@ class NameTreeDetails: public NNTreeDetails
32 static NameTreeDetails name_tree_details; 32 static NameTreeDetails name_tree_details;
33 33
34 QPDFNameTreeObjectHelper::Members::Members( 34 QPDFNameTreeObjectHelper::Members::Members(
35 - QPDFObjectHandle& oh, QPDF* q, bool auto_repair) : 35 + QPDFObjectHandle& oh, QPDF& q, bool auto_repair) :
36 impl(std::make_shared<NNTreeImpl>(name_tree_details, q, oh, auto_repair)) 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,13 +40,7 @@ QPDFNameTreeObjectHelper::Members::Members(
40 QPDFNameTreeObjectHelper::QPDFNameTreeObjectHelper( 40 QPDFNameTreeObjectHelper::QPDFNameTreeObjectHelper(
41 QPDFObjectHandle oh, QPDF& q, bool auto_repair) : 41 QPDFObjectHandle oh, QPDF& q, bool auto_repair) :
42 QPDFObjectHelper(oh), 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,7 +33,7 @@ class NumberTreeDetails: public NNTreeDetails
33 static NumberTreeDetails number_tree_details; 33 static NumberTreeDetails number_tree_details;
34 34
35 QPDFNumberTreeObjectHelper::Members::Members( 35 QPDFNumberTreeObjectHelper::Members::Members(
36 - QPDFObjectHandle& oh, QPDF* q, bool auto_repair) : 36 + QPDFObjectHandle& oh, QPDF& q, bool auto_repair) :
37 impl(std::make_shared<NNTreeImpl>(number_tree_details, q, oh, auto_repair)) 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,13 +41,7 @@ QPDFNumberTreeObjectHelper::Members::Members(
41 QPDFNumberTreeObjectHelper::QPDFNumberTreeObjectHelper( 41 QPDFNumberTreeObjectHelper::QPDFNumberTreeObjectHelper(
42 QPDFObjectHandle oh, QPDF& q, bool auto_repair) : 42 QPDFObjectHandle oh, QPDF& q, bool auto_repair) :
43 QPDFObjectHelper(oh), 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,10 +97,9 @@ class NNTreeImpl
97 public: 97 public:
98 typedef NNTreeIterator iterator; 98 typedef NNTreeIterator iterator;
99 99
100 - // ABI: for qpdf 11, make qpdf a reference  
101 NNTreeImpl( 100 NNTreeImpl(
102 NNTreeDetails const&, 101 NNTreeDetails const&,
103 - QPDF*, 102 + QPDF&,
104 QPDFObjectHandle&, 103 QPDFObjectHandle&,
105 bool auto_repair = true); 104 bool auto_repair = true);
106 iterator begin(); 105 iterator begin();
@@ -132,7 +131,7 @@ class NNTreeImpl @@ -132,7 +131,7 @@ class NNTreeImpl
132 int compareKeyKid(QPDFObjectHandle& key, QPDFObjectHandle& items, int idx); 131 int compareKeyKid(QPDFObjectHandle& key, QPDFObjectHandle& items, int idx);
133 132
134 NNTreeDetails const& details; 133 NNTreeDetails const& details;
135 - QPDF* qpdf; 134 + QPDF& qpdf;
136 int split_threshold; 135 int split_threshold;
137 QPDFObjectHandle oh; 136 QPDFObjectHandle oh;
138 bool auto_repair; 137 bool auto_repair;
manual/release-notes.rst
@@ -69,6 +69,10 @@ For a detailed list of changes, please see the file @@ -69,6 +69,10 @@ For a detailed list of changes, please see the file
69 method never worked and only did something in qpdf version 69 method never worked and only did something in qpdf version
70 10.2.x. 70 10.2.x.
71 71
  72 + - Remove ``QPDFNameTreeObjectHelper`` and
  73 + ``QPDFNumberTreeObjectHelper`` constructors that don't take a
  74 + ``QPDF&`` argument.
  75 +
72 - Other changes 76 - Other changes
73 77
74 - A new chapter on contributing to qpdf has been added to the 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,8 +21,6 @@ insertAfter
21 4 (4!) 21 4 (4!)
22 /Empty1 22 /Empty1
23 /Empty2 23 /Empty2
24 -/Bad1: deprecated API  
25 -Name/Number tree node (object 16): item at index 2 is not the right type  
26 /Bad1 -- wrong key type 24 /Bad1 -- wrong key type
27 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 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 WARNING: name-tree.pdf (Name/Number tree node (object 16)): item 2 has the wrong type 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,7 +29,6 @@
29 insertAfter 29 insertAfter
30 3 (3!) 30 3 (3!)
31 4 (4!) 31 4 (4!)
32 -/Bad1: deprecated API  
33 /Bad1 32 /Bad1
34 WARNING: number-tree.pdf (Name/Number tree node (object 14)): name/number tree node has neither non-empty /Nums nor /Kids 33 WARNING: number-tree.pdf (Name/Number tree node (object 14)): name/number tree node has neither non-empty /Nums nor /Kids
35 WARNING: number-tree.pdf (Name/Number tree node (object 13)): loop detected while traversing name/number tree 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,23 +1733,8 @@ test_46(QPDF&amp; pdf, char const* arg2)
1733 std::cout << i.first << " " << i.second.unparse() << std::endl; 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 std::cout << "/Bad1" << std::endl; 1736 std::cout << "/Bad1" << std::endl;
1752 - bad1 = QPDFNumberTreeObjectHelper(pdf.getTrailer().getKey("/Bad1"), pdf); 1737 + auto bad1 = QPDFNumberTreeObjectHelper(pdf.getTrailer().getKey("/Bad1"), pdf);
1753 assert(bad1.begin() == bad1.end()); 1738 assert(bad1.begin() == bad1.end());
1754 assert(bad1.last() == bad1.end()); 1739 assert(bad1.last() == bad1.end());
1755 1740
@@ -1931,28 +1916,8 @@ test_48(QPDF&amp; pdf, char const* arg2) @@ -1931,28 +1916,8 @@ test_48(QPDF&amp; pdf, char const* arg2)
1931 assert(empty.last()->second.getStringValue() == "6"); 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 std::cout << "/Bad1 -- wrong key type" << std::endl; 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 assert(bad1.find("G", true)->first == "A"); 1921 assert(bad1.find("G", true)->first == "A");
1957 for (auto const& i : bad1) { 1922 for (auto const& i : bad1) {
1958 std::cout << i.first << std::endl; 1923 std::cout << i.first << std::endl;