diff options
Diffstat (limited to 'include')
-rw-r--r-- | include/qpdf/QPDF.hh | 1 | ||||
-rw-r--r-- | include/qpdf/QPDFObject.hh | 21 | ||||
-rw-r--r-- | include/qpdf/QPDFObjectHandle.hh | 32 |
3 files changed, 49 insertions, 5 deletions
diff --git a/include/qpdf/QPDF.hh b/include/qpdf/QPDF.hh index 70bfac3e..7da150f1 100644 --- a/include/qpdf/QPDF.hh +++ b/include/qpdf/QPDF.hh @@ -703,7 +703,6 @@ class QPDF PointerHolder<InputSource> input, int objid, int generation, qpdf_offset_t stream_offset); QPDFTokenizer::Token readToken(PointerHolder<InputSource>, - bool allow_bad = false, size_t max_len = 0); QPDFObjectHandle readObjectAtOffset( diff --git a/include/qpdf/QPDFObject.hh b/include/qpdf/QPDFObject.hh index 8d479b3c..da54c027 100644 --- a/include/qpdf/QPDFObject.hh +++ b/include/qpdf/QPDFObject.hh @@ -23,6 +23,7 @@ #define __QPDFOBJECT_HH__ #include <qpdf/DLL.h> +#include <qpdf/PointerHolder.hh> #include <string> @@ -32,6 +33,7 @@ class QPDFObjectHandle; class QPDFObject { public: + QPDFObject(); // Objects derived from QPDFObject are accessible through // QPDFObjectHandle. Each object returns a unique type code that @@ -84,8 +86,27 @@ class QPDFObject }; friend class ObjAccessor; + virtual void setDescription(QPDF*, std::string const&); + bool getDescription(QPDF*&, std::string&); + bool hasDescription(); + protected: virtual void releaseResolved() {} + + private: + QPDFObject(QPDFObject const&); + QPDFObject& operator=(QPDFObject const&); + class Members + { + friend class QPDFObject; + public: + ~Members(); + private: + Members(); + QPDF* owning_qpdf; + std::string object_description; + }; + PointerHolder<Members> m; }; #endif // __QPDFOBJECT_HH__ diff --git a/include/qpdf/QPDFObjectHandle.hh b/include/qpdf/QPDFObjectHandle.hh index d12fe87d..53b219ce 100644 --- a/include/qpdf/QPDFObjectHandle.hh +++ b/include/qpdf/QPDFObjectHandle.hh @@ -398,6 +398,21 @@ class QPDFObjectHandle QPDF_DLL static QPDFObjectHandle newReserved(QPDF* qpdf); + // Provide an owning qpdf and object description. The library does + // this automatically with objects that are read from from the + // input PDF and with objects that are created programmatically + // and inserted into the QPDF by adding them to an array or a + // dictionary or creating a new indirect object. Most end user + // code will not need to call this. If an object has an owning + // qpdf and object description, it enables qpdf to give warnings + // with proper context in some cases where it would otherwise + // raise exceptions. + QPDF_DLL + void setObjectDescription(QPDF* owning_qpdf, + std::string const& object_description); + QPDF_DLL + bool hasObjectDescription(); + // Accessor methods. If an accessor method that is valid for only // a particular object type is called on an object of the wrong // type, an exception is thrown. @@ -498,7 +513,7 @@ class QPDFObjectHandle // Replace value of key, adding it if it does not exist QPDF_DLL - void replaceKey(std::string const& key, QPDFObjectHandle const&); + void replaceKey(std::string const& key, QPDFObjectHandle); // Remove key, doing nothing if key does not exist QPDF_DLL void removeKey(std::string const& key); @@ -769,7 +784,10 @@ class QPDFObjectHandle }; friend class ReleaseResolver; - // Convenience routine: Throws if the assumption is violated. + // Convenience routine: Throws if the assumption is violated. Your + // code will be better if you call one of the isType methods and + // handle the case of the type being wrong, but these can be + // convenient if you have already verified the type. QPDF_DLL void assertInitialized() const; @@ -832,10 +850,16 @@ class QPDFObjectHandle QPDF* qpdf, int objid, int generation, QPDFObjectHandle stream_dict, qpdf_offset_t offset, size_t length); - void assertType(char const* type_name, bool istype) const; + void typeWarning(char const* expected_type, + std::string const& warning); + void objectWarning(std::string const& warning); + void assertType(char const* type_name, bool istype); void dereference(); void makeDirectInternal(std::set<int>& visited); void releaseResolved(); + static void setObjectDescriptionFromInput( + QPDFObjectHandle, QPDF*, std::string const&, + PointerHolder<InputSource>, qpdf_offset_t); static QPDFObjectHandle parseInternal( PointerHolder<InputSource> input, std::string const& object_description, @@ -868,7 +892,7 @@ class QPDFObjectHandle bool initialized; - QPDF* qpdf; // 0 for direct object + QPDF* qpdf; int objid; // 0 for direct object int generation; PointerHolder<QPDFObject> obj; |