aboutsummaryrefslogtreecommitdiffstats
path: root/libqpdf
diff options
context:
space:
mode:
authorJay Berkenbilt <ejb@ql.org>2010-08-03 00:17:01 +0200
committerJay Berkenbilt <ejb@ql.org>2010-08-03 00:17:01 +0200
commit9a06fc541ce00361f12f6231b2f7556615cbccb7 (patch)
tree858037640e94c3081e829e21c980b556de744ea5 /libqpdf
parentab5a01c64ec3c8cb4f13b6846ca4ecdc7b888e14 (diff)
downloadqpdf-9a06fc541ce00361f12f6231b2f7556615cbccb7.tar.zst
ready to implement replacement stream data
git-svn-id: svn+q:///qpdf/trunk@987 71b93d88-0707-0410-a8cf-f5a4172ac649
Diffstat (limited to 'libqpdf')
-rw-r--r--libqpdf/QPDFObjectHandle.cc26
-rw-r--r--libqpdf/QPDF_Dictionary.cc14
-rw-r--r--libqpdf/QPDF_Stream.cc21
-rw-r--r--libqpdf/qpdf/QPDF_Dictionary.hh2
-rw-r--r--libqpdf/qpdf/QPDF_Stream.hh12
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__