From 9a06fc541ce00361f12f6231b2f7556615cbccb7 Mon Sep 17 00:00:00 2001 From: Jay Berkenbilt Date: Mon, 2 Aug 2010 22:17:01 +0000 Subject: ready to implement replacement stream data git-svn-id: svn+q:///qpdf/trunk@987 71b93d88-0707-0410-a8cf-f5a4172ac649 --- libqpdf/QPDFObjectHandle.cc | 26 ++++++++++++++++++++++++++ libqpdf/QPDF_Dictionary.cc | 14 ++++++++++++++ libqpdf/QPDF_Stream.cc | 21 +++++++++++++++++++++ libqpdf/qpdf/QPDF_Dictionary.hh | 2 ++ libqpdf/qpdf/QPDF_Stream.hh | 12 ++++++++---- 5 files changed, 71 insertions(+), 4 deletions(-) (limited to 'libqpdf') 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(obj.getPointer())->removeKey(key); } +void +QPDFObjectHandle::replaceOrRemoveKey(std::string const& key, + QPDFObjectHandle value) +{ + assertType("Dictionary", isDictionary()); + return dynamic_cast( + 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 data, + QPDFObjectHandle filter, + QPDFObjectHandle decode_parms) +{ + assertType("Stream", isStream()); + dynamic_cast(obj.getPointer())->replaceStreamData( + data, filter, decode_parms); +} + +void +QPDFObjectHandle::replaceStreamData(PointerHolder dh) +{ + assertType("Stream", isStream()); + dynamic_cast(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 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 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 getStreamData(); + void replaceStreamData(PointerHolder data, + QPDFObjectHandle filter, + QPDFObjectHandle decode_parms); + void replaceStreamData( + PointerHolder dh); private: bool filterable(std::vector& filters, int& predictor, int& columns, bool& early_code_change); - QPDF* qpdf; int objid; int generation; QPDFObjectHandle stream_dict; off_t offset; int length; + PointerHolder stream_data_handler; + PointerHolder stream_data; }; #endif // __QPDF_STREAM_HH__ -- cgit v1.2.3-54-g00ecf