From 83710603402229090dd5b1eefdebed044efe8d87 Mon Sep 17 00:00:00 2001 From: m-holger Date: Sun, 6 Feb 2022 02:13:04 +0000 Subject: Add method QPDFObjectHandle::getKeyIfDict --- include/qpdf/QPDFObjectHandle.hh | 2 ++ libqpdf/QPDFObjectHandle.cc | 6 ++++++ qpdf/qtest/qpdf/object-types-os.out | 2 ++ qpdf/qtest/qpdf/object-types.out | 2 ++ qpdf/test_driver.cc | 3 +++ 5 files changed, 15 insertions(+) diff --git a/include/qpdf/QPDFObjectHandle.hh b/include/qpdf/QPDFObjectHandle.hh index 262a84b8..59e58544 100644 --- a/include/qpdf/QPDFObjectHandle.hh +++ b/include/qpdf/QPDFObjectHandle.hh @@ -810,6 +810,8 @@ class QPDFObjectHandle // returned. QPDF_DLL QPDFObjectHandle getKey(std::string const&); + QPDF_DLL + QPDFObjectHandle getKeyIfDict(std::string const&); // Return all keys. Keys with null values are treated as if // they are not present. This is as per the PDF spec. QPDF_DLL diff --git a/libqpdf/QPDFObjectHandle.cc b/libqpdf/QPDFObjectHandle.cc index 2e9bf48b..eeb17fae 100644 --- a/libqpdf/QPDFObjectHandle.cc +++ b/libqpdf/QPDFObjectHandle.cc @@ -1150,6 +1150,12 @@ QPDFObjectHandle::getKey(std::string const& key) return result; } +QPDFObjectHandle +QPDFObjectHandle::getKeyIfDict(std::string const& key) +{ + return isNull() ? newNull() : getKey(key); +} + std::set QPDFObjectHandle::getKeys() { diff --git a/qpdf/qtest/qpdf/object-types-os.out b/qpdf/qtest/qpdf/object-types-os.out index 26fcf369..5aedc1ee 100644 --- a/qpdf/qtest/qpdf/object-types-os.out +++ b/qpdf/qtest/qpdf/object-types-os.out @@ -20,6 +20,7 @@ WARNING: object-types-os.pdf object stream 1, object 7 0 at offset 429: operatio 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 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 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 +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 WARNING: object-types-os.pdf object stream 1, object 7 0 at offset 429: operation for inlineimage attempted on object of type integer: returning empty data WARNING: object-types-os.pdf object stream 1, object 7 0 at offset 362: operation for integer attempted on object of type dictionary: returning 0 WARNING: object-types-os.pdf object stream 1, object 7 0 at offset 429: operation for name attempted on object of type integer: returning dummy name @@ -32,6 +33,7 @@ One error WARNING: object-types-os.pdf object stream 1, object 7 0 at offset 385: operation for string attempted on object of type name: returning empty string One error WARNING: object-types-os.pdf object stream 1, object 7 0 at offset 362 -> dictionary key /Quack: operation for string attempted on object of type null: returning empty string +WARNING: object-types-os.pdf object stream 1, object 7 0 at offset 362 -> dictionary key /Quack: operation for string attempted on object of type null: returning empty string Two errors WARNING: object-types-os.pdf object stream 1, object 7 0 at offset 384: returning null for out of bounds array access WARNING: object-types-os.pdf object stream 1, object 7 0 at offset 384 -> null returned from invalid array access: operation for string attempted on object of type null: returning empty string diff --git a/qpdf/qtest/qpdf/object-types.out b/qpdf/qtest/qpdf/object-types.out index b707a957..01a8e7c7 100644 --- a/qpdf/qtest/qpdf/object-types.out +++ b/qpdf/qtest/qpdf/object-types.out @@ -20,6 +20,7 @@ WARNING: object-types.pdf, object 8 0 at offset 669: operation for dictionary at WARNING: object-types.pdf, object 8 0 at offset 669: operation for dictionary attempted on object of type integer: ignoring key removal/replacement request WARNING: object-types.pdf, object 8 0 at offset 669: operation for dictionary attempted on object of type integer: ignoring key replacement request 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 +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 WARNING: object-types.pdf, object 8 0 at offset 669: operation for inlineimage attempted on object of type integer: returning empty data WARNING: object-types.pdf, object 8 0 at offset 687: operation for integer attempted on object of type dictionary: returning 0 WARNING: object-types.pdf, object 8 0 at offset 669: operation for name attempted on object of type integer: returning dummy name @@ -32,6 +33,7 @@ One error WARNING: object-types.pdf, object 8 0 at offset 724: operation for string attempted on object of type name: returning empty string One error WARNING: object-types.pdf, object 8 0 at offset 687 -> dictionary key /Quack: operation for string attempted on object of type null: returning empty string +WARNING: object-types.pdf, object 8 0 at offset 687 -> dictionary key /Quack: operation for string attempted on object of type null: returning empty string Two errors WARNING: object-types.pdf, object 8 0 at offset 717: returning null for out of bounds array access WARNING: object-types.pdf, object 8 0 at offset 717 -> null returned from invalid array access: operation for string attempted on object of type null: returning empty string diff --git a/qpdf/test_driver.cc b/qpdf/test_driver.cc index 2031313a..75fcb29a 100644 --- a/qpdf/test_driver.cc +++ b/qpdf/test_driver.cc @@ -1568,6 +1568,8 @@ static void test_42(QPDF& pdf, char const* arg2) integer.replaceOrRemoveKey("/Potato", null); integer.replaceOrRemoveKey("/Potato", QPDFObjectHandle::newInteger(1)); integer.replaceKey("/Potato", QPDFObjectHandle::newInteger(1)); + null.getKeyIfDict("/Integer").getKeyIfDict("/Potato").assertNull(); + qtest.getKey("/Integer").getKeyIfDict("/Potato"); qtest.getKey("/Integer").getKey("/Potato"); assert(integer.getInlineImageValue().empty()); assert(0 == dictionary.getIntValue()); @@ -1582,6 +1584,7 @@ static void test_42(QPDF& pdf, char const* arg2) assert(array.getArrayItem(0).getStringValue().empty()); std::cerr << "One error\n"; assert(dictionary.getKey("/Quack").getStringValue().empty()); + assert(dictionary.getKeyIfDict("/Quack").getStringValue().empty()); assert(array.getArrayItem(1).isDictionary()); assert(array.getArrayItem(1).getKey("/K").isArray()); assert(array.getArrayItem(1).getKey("/K").getArrayItem(0).isName()); -- cgit v1.2.3-54-g00ecf