Commit 4be2f3604939de8589dd2206fdf3d1a85033f171

Authored by Jay Berkenbilt
1 parent b8d0b0b6

Deprecate replaceOrRemoveKey -- it's the same as replaceKey

ChangeLog
  1 +2022-04-24 Jay Berkenbilt <ejb@ql.org>
  2 +
  3 + * Deprecate QPDFObjectHandle::replaceOrRemoveKey -- it does and
  4 + always has done the same thing as replaceKey.
  5 +
1 2022-04-23 Jay Berkenbilt <ejb@ql.org> 6 2022-04-23 Jay Berkenbilt <ejb@ql.org>
2 7
3 * Add a new QPDF::warn method that takes the parameters of 8 * Add a new QPDF::warn method that takes the parameters of
include/qpdf/QPDFObjectHandle.hh
@@ -1023,13 +1023,16 @@ class QPDFObjectHandle @@ -1023,13 +1023,16 @@ class QPDFObjectHandle
1023 1023
1024 // Mutator methods for dictionary objects 1024 // Mutator methods for dictionary objects
1025 1025
1026 - // Replace value of key, adding it if it does not exist 1026 + // Replace value of key, adding it if it does not exist. If value
  1027 + // is null, remove the key.
1027 QPDF_DLL 1028 QPDF_DLL
1028 - void replaceKey(std::string const& key, QPDFObjectHandle const&); 1029 + void replaceKey(std::string const& key, QPDFObjectHandle const& value);
1029 // Remove key, doing nothing if key does not exist 1030 // Remove key, doing nothing if key does not exist
1030 QPDF_DLL 1031 QPDF_DLL
1031 void removeKey(std::string const& key); 1032 void removeKey(std::string const& key);
1032 - // If the object is null, remove the key. Otherwise, replace it. 1033 +
  1034 + // ABI: Remove in qpdf 12
  1035 + [[deprecated("use replaceKey -- it does the same thing")]]
1033 QPDF_DLL 1036 QPDF_DLL
1034 void replaceOrRemoveKey(std::string const& key, QPDFObjectHandle const&); 1037 void replaceOrRemoveKey(std::string const& key, QPDFObjectHandle const&);
1035 1038
libqpdf/QPDFObjectHandle.cc
@@ -1295,14 +1295,7 @@ void @@ -1295,14 +1295,7 @@ void
1295 QPDFObjectHandle::replaceOrRemoveKey( 1295 QPDFObjectHandle::replaceOrRemoveKey(
1296 std::string const& key, QPDFObjectHandle const& value) 1296 std::string const& key, QPDFObjectHandle const& value)
1297 { 1297 {
1298 - if (isDictionary()) {  
1299 - checkOwnership(value);  
1300 - dynamic_cast<QPDF_Dictionary*>(obj.get())->replaceOrRemoveKey(  
1301 - key, value);  
1302 - } else {  
1303 - typeWarning("dictionary", "ignoring key removal/replacement request");  
1304 - QTC::TC("qpdf", "QPDFObjectHandle dictionary ignoring removereplace");  
1305 - } 1298 + replaceKey(key, value);
1306 } 1299 }
1307 1300
1308 // Stream accessors 1301 // Stream accessors
libqpdf/QPDFPageLabelDocumentHelper.cc
@@ -44,9 +44,9 @@ QPDFPageLabelDocumentHelper::getLabelForPage(long long page_idx) @@ -44,9 +44,9 @@ QPDFPageLabelDocumentHelper::getLabelForPage(long long page_idx)
44 QIntC::range_check(start, offset); 44 QIntC::range_check(start, offset);
45 start += offset; 45 start += offset;
46 result = QPDFObjectHandle::newDictionary(); 46 result = QPDFObjectHandle::newDictionary();
47 - result.replaceOrRemoveKey("/S", S);  
48 - result.replaceOrRemoveKey("/P", P);  
49 - result.replaceOrRemoveKey("/St", QPDFObjectHandle::newInteger(start)); 47 + result.replaceKey("/S", S);
  48 + result.replaceKey("/P", P);
  49 + result.replaceKey("/St", QPDFObjectHandle::newInteger(start));
50 return result; 50 return result;
51 } 51 }
52 52
libqpdf/QPDF_Dictionary.cc
@@ -115,11 +115,16 @@ QPDF_Dictionary::getAsMap() const @@ -115,11 +115,16 @@ QPDF_Dictionary::getAsMap() const
115 } 115 }
116 116
117 void 117 void
118 -QPDF_Dictionary::replaceKey(  
119 - std::string const& key, QPDFObjectHandle const& value) 118 +QPDF_Dictionary::replaceKey(std::string const& key, QPDFObjectHandle value)
120 { 119 {
121 - // add or replace value  
122 - this->items[key] = value; 120 + if (value.isNull()) {
  121 + // The PDF spec doesn't distinguish between keys with null
  122 + // values and missing keys.
  123 + removeKey(key);
  124 + } else {
  125 + // add or replace value
  126 + this->items[key] = value;
  127 + }
123 } 128 }
124 129
125 void 130 void
@@ -128,14 +133,3 @@ QPDF_Dictionary::removeKey(std::string const&amp; key) @@ -128,14 +133,3 @@ QPDF_Dictionary::removeKey(std::string const&amp; key)
128 // no-op if key does not exist 133 // no-op if key does not exist
129 this->items.erase(key); 134 this->items.erase(key);
130 } 135 }
131 -  
132 -void  
133 -QPDF_Dictionary::replaceOrRemoveKey(  
134 - std::string const& key, QPDFObjectHandle value)  
135 -{  
136 - if (value.isNull()) {  
137 - removeKey(key);  
138 - } else {  
139 - replaceKey(key, value);  
140 - }  
141 -}  
libqpdf/QPDF_Stream.cc
@@ -604,8 +604,8 @@ QPDF_Stream::replaceFilterData( @@ -604,8 +604,8 @@ QPDF_Stream::replaceFilterData(
604 QPDFObjectHandle const& decode_parms, 604 QPDFObjectHandle const& decode_parms,
605 size_t length) 605 size_t length)
606 { 606 {
607 - this->stream_dict.replaceOrRemoveKey("/Filter", filter);  
608 - this->stream_dict.replaceOrRemoveKey("/DecodeParms", decode_parms); 607 + this->stream_dict.replaceKey("/Filter", filter);
  608 + this->stream_dict.replaceKey("/DecodeParms", decode_parms);
609 if (length == 0) { 609 if (length == 0) {
610 QTC::TC("qpdf", "QPDF_Stream unknown stream length"); 610 QTC::TC("qpdf", "QPDF_Stream unknown stream length");
611 this->stream_dict.removeKey("/Length"); 611 this->stream_dict.removeKey("/Length");
libqpdf/qpdf-c.cc
@@ -438,7 +438,7 @@ qpdf_set_info_key(qpdf_data qpdf, char const* key, char const* value) @@ -438,7 +438,7 @@ qpdf_set_info_key(qpdf_data qpdf, char const* key, char const* value)
438 } 438 }
439 439
440 QPDFObjectHandle info = trailer.getKey("/Info"); 440 QPDFObjectHandle info = trailer.getKey("/Info");
441 - info.replaceOrRemoveKey(key, value_object); 441 + info.replaceKey(key, value_object);
442 } 442 }
443 443
444 QPDF_BOOL 444 QPDF_BOOL
@@ -1919,7 +1919,7 @@ qpdf_oh_replace_or_remove_key( @@ -1919,7 +1919,7 @@ qpdf_oh_replace_or_remove_key(
1919 { 1919 {
1920 do_with_oh_void(qpdf, oh, [qpdf, key, item](QPDFObjectHandle& o) { 1920 do_with_oh_void(qpdf, oh, [qpdf, key, item](QPDFObjectHandle& o) {
1921 QTC::TC("qpdf", "qpdf-c called qpdf_oh_replace_or_remove_key"); 1921 QTC::TC("qpdf", "qpdf-c called qpdf_oh_replace_or_remove_key");
1922 - o.replaceOrRemoveKey(key, qpdf_oh_item_internal(qpdf, item)); 1922 + o.replaceKey(key, qpdf_oh_item_internal(qpdf, item));
1923 }); 1923 });
1924 } 1924 }
1925 1925
libqpdf/qpdf/QPDF_Dictionary.hh
@@ -27,12 +27,11 @@ class QPDF_Dictionary: public QPDFObject @@ -27,12 +27,11 @@ class QPDF_Dictionary: public QPDFObject
27 std::set<std::string> getKeys(); 27 std::set<std::string> getKeys();
28 std::map<std::string, QPDFObjectHandle> const& getAsMap() const; 28 std::map<std::string, QPDFObjectHandle> const& getAsMap() const;
29 29
30 - // Replace value of key, adding it if it does not exist  
31 - void replaceKey(std::string const& key, QPDFObjectHandle const&); 30 + // If value is null, remove key; otherwise, replace the value of
  31 + // key, adding it if it does not exist.
  32 + void replaceKey(std::string const& key, QPDFObjectHandle value);
32 // Remove key, doing nothing if key does not exist 33 // Remove key, doing nothing if key does not exist
33 void removeKey(std::string const& key); 34 void removeKey(std::string const& key);
34 - // If object is null, remove key; otherwise, replace key  
35 - void replaceOrRemoveKey(std::string const& key, QPDFObjectHandle);  
36 35
37 protected: 36 protected:
38 virtual void releaseResolved(); 37 virtual void releaseResolved();
qpdf/qpdf.testcov
@@ -322,7 +322,6 @@ QPDFObjectHandle dictionary empty set for getKeys 0 @@ -322,7 +322,6 @@ QPDFObjectHandle dictionary empty set for getKeys 0
322 QPDFObjectHandle dictionary empty map for asMap 0 322 QPDFObjectHandle dictionary empty map for asMap 0
323 QPDFObjectHandle dictionary ignoring replaceKey 0 323 QPDFObjectHandle dictionary ignoring replaceKey 0
324 QPDFObjectHandle dictionary ignoring removeKey 0 324 QPDFObjectHandle dictionary ignoring removeKey 0
325 -QPDFObjectHandle dictionary ignoring removereplace 0  
326 QPDFObjectHandle numeric non-numeric 0 325 QPDFObjectHandle numeric non-numeric 0
327 QPDFObjectHandle erase array bounds 0 326 QPDFObjectHandle erase array bounds 0
328 qpdf-c called qpdf_check_pdf 0 327 qpdf-c called qpdf_check_pdf 0
qpdf/qtest/qpdf/object-types-os.out
@@ -16,8 +16,7 @@ WARNING: object-types-os.pdf object stream 1, object 7 0 at offset 429: operatio @@ -16,8 +16,7 @@ WARNING: object-types-os.pdf object stream 1, object 7 0 at offset 429: operatio
16 WARNING: object-types-os.pdf object stream 1, object 7 0 at offset 429: operation for dictionary attempted on object of type integer: treating as empty 16 WARNING: object-types-os.pdf object stream 1, object 7 0 at offset 429: operation for dictionary attempted on object of type integer: treating as empty
17 WARNING: object-types-os.pdf object stream 1, object 7 0 at offset 429: operation for dictionary attempted on object of type integer: returning false for a key containment request 17 WARNING: object-types-os.pdf object stream 1, object 7 0 at offset 429: operation for dictionary attempted on object of type integer: returning false for a key containment request
18 WARNING: object-types-os.pdf object stream 1, object 7 0 at offset 429: operation for dictionary attempted on object of type integer: ignoring key removal request 18 WARNING: object-types-os.pdf object stream 1, object 7 0 at offset 429: operation for dictionary attempted on object of type integer: ignoring key removal request
19 -WARNING: object-types-os.pdf object stream 1, object 7 0 at offset 429: operation for dictionary attempted on object of type integer: ignoring key removal/replacement request  
20 -WARNING: object-types-os.pdf object stream 1, object 7 0 at offset 429: operation for dictionary attempted on object of type integer: ignoring key removal/replacement request 19 +WARNING: object-types-os.pdf object stream 1, object 7 0 at offset 429: operation for dictionary attempted on object of type integer: ignoring key replacement request
21 WARNING: object-types-os.pdf object stream 1, object 7 0 at offset 429: operation for dictionary attempted on object of type integer: ignoring key replacement request 20 WARNING: object-types-os.pdf object stream 1, object 7 0 at offset 429: operation for dictionary attempted on object of type integer: ignoring key replacement request
22 WARNING: object-types-os.pdf object stream 1, object 7 0 at offset 429: operation for dictionary attempted on object of type integer: returning null for attempted key retrieval 21 WARNING: object-types-os.pdf object stream 1, object 7 0 at offset 429: operation for dictionary attempted on object of type integer: returning null for attempted key retrieval
23 WARNING: object-types-os.pdf object stream 1, object 7 0 at offset 429: operation for dictionary attempted on object of type integer: returning null for attempted key retrieval 22 WARNING: object-types-os.pdf object stream 1, object 7 0 at offset 429: operation for dictionary attempted on object of type integer: returning null for attempted key retrieval
qpdf/qtest/qpdf/object-types.out
@@ -16,8 +16,7 @@ WARNING: object-types.pdf, object 8 0 at offset 669: operation for dictionary at @@ -16,8 +16,7 @@ WARNING: object-types.pdf, object 8 0 at offset 669: operation for dictionary at
16 WARNING: object-types.pdf, object 8 0 at offset 669: operation for dictionary attempted on object of type integer: treating as empty 16 WARNING: object-types.pdf, object 8 0 at offset 669: operation for dictionary attempted on object of type integer: treating as empty
17 WARNING: object-types.pdf, object 8 0 at offset 669: operation for dictionary attempted on object of type integer: returning false for a key containment request 17 WARNING: object-types.pdf, object 8 0 at offset 669: operation for dictionary attempted on object of type integer: returning false for a key containment request
18 WARNING: object-types.pdf, object 8 0 at offset 669: operation for dictionary attempted on object of type integer: ignoring key removal request 18 WARNING: object-types.pdf, object 8 0 at offset 669: operation for dictionary attempted on object of type integer: ignoring key removal request
19 -WARNING: object-types.pdf, object 8 0 at offset 669: operation for dictionary attempted on object of type integer: ignoring key removal/replacement request  
20 -WARNING: object-types.pdf, object 8 0 at offset 669: operation for dictionary attempted on object of type integer: ignoring key removal/replacement request 19 +WARNING: object-types.pdf, object 8 0 at offset 669: operation for dictionary attempted on object of type integer: ignoring key replacement request
21 WARNING: object-types.pdf, object 8 0 at offset 669: operation for dictionary attempted on object of type integer: ignoring key replacement request 20 WARNING: object-types.pdf, object 8 0 at offset 669: operation for dictionary attempted on object of type integer: ignoring key replacement request
22 WARNING: object-types.pdf, object 8 0 at offset 669: operation for dictionary attempted on object of type integer: returning null for attempted key retrieval 21 WARNING: object-types.pdf, object 8 0 at offset 669: operation for dictionary attempted on object of type integer: returning null for attempted key retrieval
23 WARNING: object-types.pdf, object 8 0 at offset 669: operation for dictionary attempted on object of type integer: returning null for attempted key retrieval 22 WARNING: object-types.pdf, object 8 0 at offset 669: operation for dictionary attempted on object of type integer: returning null for attempted key retrieval
qpdf/test_driver.cc
@@ -1481,8 +1481,7 @@ test_42(QPDF&amp; pdf, char const* arg2) @@ -1481,8 +1481,7 @@ test_42(QPDF&amp; pdf, char const* arg2)
1481 assert(integer.getKeys().empty()); 1481 assert(integer.getKeys().empty());
1482 assert(false == integer.hasKey("/Potato")); 1482 assert(false == integer.hasKey("/Potato"));
1483 integer.removeKey("/Potato"); 1483 integer.removeKey("/Potato");
1484 - integer.replaceOrRemoveKey("/Potato", null);  
1485 - integer.replaceOrRemoveKey("/Potato", QPDFObjectHandle::newInteger(1)); 1484 + integer.replaceKey("/Potato", null);
1486 integer.replaceKey("/Potato", QPDFObjectHandle::newInteger(1)); 1485 integer.replaceKey("/Potato", QPDFObjectHandle::newInteger(1));
1487 null.getKeyIfDict("/Integer").getKeyIfDict("/Potato").assertNull(); 1486 null.getKeyIfDict("/Integer").getKeyIfDict("/Potato").assertNull();
1488 qtest.getKey("/Integer").getKeyIfDict("/Potato"); 1487 qtest.getKey("/Integer").getKeyIfDict("/Potato");