Commit 3f8dd2b3384c96cff7bf2f05ab545d57e899651b

Authored by m-holger
1 parent f6d8da10

Add `no_ci_stop_if`, `no_ci_stop_damaged_if`, and `no_ci_warn_if` methods to enh…

…ance error and warning handling within `BaseHandle` and `QPDF`, highlighting that the error condition is not covered in CI testing without generating codecov noise.
include/qpdf/ObjectHandle.hh
@@ -127,6 +127,10 @@ namespace qpdf @@ -127,6 +127,10 @@ namespace qpdf
127 inline void assign(qpdf_object_type_e required, BaseHandle&& other); 127 inline void assign(qpdf_object_type_e required, BaseHandle&& other);
128 128
129 std::string description() const; 129 std::string description() const;
  130 +
  131 + void no_ci_warn_if(bool condition, std::string const& warning) const;
  132 + void no_ci_stop_if(bool condition, std::string const& warning) const;
  133 + void no_ci_stop_damaged_if(bool condition, std::string const& warning) const;
130 std::invalid_argument invalid_error(std::string const& method) const; 134 std::invalid_argument invalid_error(std::string const& method) const;
131 std::runtime_error type_error(char const* expected_type) const; 135 std::runtime_error type_error(char const* expected_type) const;
132 QPDFExc type_error(char const* expected_type, std::string const& message) const; 136 QPDFExc type_error(char const* expected_type, std::string const& message) const;
include/qpdf/QPDF.hh
@@ -874,6 +874,8 @@ class QPDF @@ -874,6 +874,8 @@ class QPDF
874 std::shared_ptr<QPDFObject> const& resolve(QPDFObjGen og); 874 std::shared_ptr<QPDFObject> const& resolve(QPDFObjGen og);
875 void resolveObjectsInStream(int obj_stream_number); 875 void resolveObjectsInStream(int obj_stream_number);
876 void stopOnError(std::string const& message); 876 void stopOnError(std::string const& message);
  877 + inline void
  878 + no_ci_stop_if(bool condition, std::string const& message, std::string const& context = {});
877 QPDFObjGen nextObjGen(); 879 QPDFObjGen nextObjGen();
878 QPDFObjectHandle newIndirect(QPDFObjGen, std::shared_ptr<QPDFObject> const&); 880 QPDFObjectHandle newIndirect(QPDFObjGen, std::shared_ptr<QPDFObject> const&);
879 QPDFObjectHandle makeIndirectFromQPDFObject(std::shared_ptr<QPDFObject> const& obj); 881 QPDFObjectHandle makeIndirectFromQPDFObject(std::shared_ptr<QPDFObject> const& obj);
libqpdf/QPDF.cc
@@ -946,7 +946,7 @@ QPDF::pipeForeignStreamData( @@ -946,7 +946,7 @@ QPDF::pipeForeignStreamData(
946 } 946 }
947 947
948 // Throw a generic exception when we lack context for something more specific. New code should not 948 // Throw a generic exception when we lack context for something more specific. New code should not
949 -// use this. This method exists to improve somewhat from calling assert in very old code. 949 +// use this.
950 void 950 void
951 QPDF::stopOnError(std::string const& message) 951 QPDF::stopOnError(std::string const& message)
952 { 952 {
libqpdf/qpdf/QPDFObjectHandle_private.hh
@@ -624,6 +624,33 @@ namespace qpdf @@ -624,6 +624,33 @@ namespace qpdf
624 return obj ? obj->og.isIndirect() : false; 624 return obj ? obj->og.isIndirect() : false;
625 } 625 }
626 626
  627 + inline void
  628 + BaseHandle::no_ci_stop_if(bool condition, std::string const& message) const
  629 + {
  630 + if (condition) {
  631 + if (qpdf()) {
  632 + throw QPDFExc(qpdf_e_damaged_pdf, "", description(), 0, message);
  633 + }
  634 + throw std::runtime_error(message);
  635 + }
  636 + }
  637 +
  638 + inline void
  639 + BaseHandle::no_ci_stop_damaged_if(bool condition, std::string const& message) const
  640 + {
  641 + if (condition) {
  642 + throw std::runtime_error(message);
  643 + }
  644 + }
  645 +
  646 + inline void
  647 + BaseHandle::no_ci_warn_if(bool condition, std::string const& warning) const
  648 + {
  649 + if (condition) {
  650 + warn(warning);
  651 + }
  652 + }
  653 +
627 inline bool 654 inline bool
628 BaseHandle::null() const 655 BaseHandle::null() const
629 { 656 {
libqpdf/qpdf/QPDF_private.hh
@@ -628,4 +628,13 @@ QPDF::page_labels() @@ -628,4 +628,13 @@ QPDF::page_labels()
628 return *m->page_labels; 628 return *m->page_labels;
629 } 629 }
630 630
  631 +// Throw a generic exception for unusual error conditions that do not be covered during CI testing.
  632 +inline void
  633 +QPDF::no_ci_stop_if(bool condition, std::string const& message, std::string const& context)
  634 +{
  635 + if (condition) {
  636 + throw damagedPDF(context, message);
  637 + }
  638 +}
  639 +
631 #endif // QPDF_PRIVATE_HH 640 #endif // QPDF_PRIVATE_HH