diff options
Diffstat (limited to 'libqpdf')
-rw-r--r-- | libqpdf/QPDFObjectHandle.cc | 26 | ||||
-rw-r--r-- | libqpdf/QPDF_Dictionary.cc | 14 | ||||
-rw-r--r-- | libqpdf/QPDF_Stream.cc | 21 | ||||
-rw-r--r-- | libqpdf/qpdf/QPDF_Dictionary.hh | 2 | ||||
-rw-r--r-- | libqpdf/qpdf/QPDF_Stream.hh | 12 |
5 files changed, 71 insertions, 4 deletions
diff --git a/libqpdf/QPDFObjectHandle.cc b/libqpdf/QPDFObjectHandle.cc index 677c2347..2fff0e31 100644 --- a/libqpdf/QPDFObjectHandle.cc +++ b/libqpdf/QPDFObjectHandle.cc @@ -319,6 +319,15 @@ QPDFObjectHandle::removeKey(std::string const& key) return dynamic_cast<QPDF_Dictionary*>(obj.getPointer())->removeKey(key); } +void +QPDFObjectHandle::replaceOrRemoveKey(std::string const& key, + QPDFObjectHandle value) +{ + assertType("Dictionary", isDictionary()); + return dynamic_cast<QPDF_Dictionary*>( + obj.getPointer())->replaceOrRemoveKey(key, value); +} + // Stream accessors QPDFObjectHandle QPDFObjectHandle::getDict() @@ -343,6 +352,23 @@ QPDFObjectHandle::pipeStreamData(Pipeline* p, bool filter, p, filter, normalize, compress); } +void +QPDFObjectHandle::replaceStreamData(PointerHolder<Buffer> data, + QPDFObjectHandle filter, + QPDFObjectHandle decode_parms) +{ + assertType("Stream", isStream()); + dynamic_cast<QPDF_Stream*>(obj.getPointer())->replaceStreamData( + data, filter, decode_parms); +} + +void +QPDFObjectHandle::replaceStreamData(PointerHolder<StreamDataHandler> dh) +{ + assertType("Stream", isStream()); + dynamic_cast<QPDF_Stream*>(obj.getPointer())->replaceStreamData(dh); +} + int QPDFObjectHandle::getObjectID() const { diff --git a/libqpdf/QPDF_Dictionary.cc b/libqpdf/QPDF_Dictionary.cc index ccaab4a8..838a37e6 100644 --- a/libqpdf/QPDF_Dictionary.cc +++ b/libqpdf/QPDF_Dictionary.cc @@ -92,3 +92,17 @@ QPDF_Dictionary::removeKey(std::string const& key) // no-op if key does not exist this->items.erase(key); } + +void +QPDF_Dictionary::replaceOrRemoveKey(std::string const& key, + QPDFObjectHandle value) +{ + if (value.isNull()) + { + removeKey(key); + } + else + { + replaceKey(key, value); + } +} diff --git a/libqpdf/QPDF_Stream.cc b/libqpdf/QPDF_Stream.cc index d0dd2e5f..500dfb10 100644 --- a/libqpdf/QPDF_Stream.cc +++ b/libqpdf/QPDF_Stream.cc @@ -319,9 +319,30 @@ QPDF_Stream::pipeStreamData(Pipeline* pipeline, bool filter, } } + // XXX handle stream_data and stream_data_handler QPDF::Pipe::pipeStreamData(this->qpdf, this->objid, this->generation, this->offset, this->length, this->stream_dict, pipeline); return filter; } + +void +QPDF_Stream::replaceStreamData(PointerHolder<Buffer> data, + QPDFObjectHandle filter, + QPDFObjectHandle decode_parms) +{ + this->stream_data = data; + this->stream_dict.replaceOrRemoveKey("/Filter", filter); + this->stream_dict.replaceOrRemoveKey("/DecodeParms", decode_parms); + this->stream_dict.replaceKey("/Length", + QPDFObjectHandle::newInteger( + data.getPointer()->getSize())); +} + +void +QPDF_Stream::replaceStreamData( + PointerHolder<QPDFObjectHandle::StreamDataHandler> dh) +{ + this->stream_data_handler = dh; +} diff --git a/libqpdf/qpdf/QPDF_Dictionary.hh b/libqpdf/qpdf/QPDF_Dictionary.hh index e75de01b..e84b549e 100644 --- a/libqpdf/qpdf/QPDF_Dictionary.hh +++ b/libqpdf/qpdf/QPDF_Dictionary.hh @@ -26,6 +26,8 @@ class QPDF_Dictionary: public QPDFObject void replaceKey(std::string const& key, QPDFObjectHandle const&); // Remove key, doing nothing if key does not exist void removeKey(std::string const& key); + // If object is null, replace key; otherwise, remove key + void replaceOrRemoveKey(std::string const& key, QPDFObjectHandle); protected: virtual void releaseResolved(); diff --git a/libqpdf/qpdf/QPDF_Stream.hh b/libqpdf/qpdf/QPDF_Stream.hh index c969255d..cc7cbf0a 100644 --- a/libqpdf/qpdf/QPDF_Stream.hh +++ b/libqpdf/qpdf/QPDF_Stream.hh @@ -18,24 +18,28 @@ class QPDF_Stream: public QPDFObject virtual std::string unparse(); QPDFObjectHandle getDict() const; - // See comments in QPDFObjectHandle.hh + // See comments in QPDFObjectHandle.hh for these methods. bool pipeStreamData(Pipeline*, bool filter, bool normalize, bool compress); - - // See comments in QPDFObjectHandle.hh PointerHolder<Buffer> getStreamData(); + void replaceStreamData(PointerHolder<Buffer> data, + QPDFObjectHandle filter, + QPDFObjectHandle decode_parms); + void replaceStreamData( + PointerHolder<QPDFObjectHandle::StreamDataHandler> dh); private: bool filterable(std::vector<std::string>& filters, int& predictor, int& columns, bool& early_code_change); - QPDF* qpdf; int objid; int generation; QPDFObjectHandle stream_dict; off_t offset; int length; + PointerHolder<QPDFObjectHandle::StreamDataHandler> stream_data_handler; + PointerHolder<Buffer> stream_data; }; #endif // __QPDF_STREAM_HH__ |