diff options
author | Jay Berkenbilt <ejb@ql.org> | 2010-08-05 22:20:52 +0200 |
---|---|---|
committer | Jay Berkenbilt <ejb@ql.org> | 2010-08-05 22:20:52 +0200 |
commit | 6f2bd7eb3a64ae6ffbdf9ae256d822056ddcb7b0 (patch) | |
tree | b2853762f4a564e1110ddf37f4821ea02d40a367 /libqpdf | |
parent | 11df7809af7131af139be2e76f2db87128700939 (diff) | |
download | qpdf-6f2bd7eb3a64ae6ffbdf9ae256d822056ddcb7b0.tar.zst |
newStream
git-svn-id: svn+q:///qpdf/trunk@991 71b93d88-0707-0410-a8cf-f5a4172ac649
Diffstat (limited to 'libqpdf')
-rw-r--r-- | libqpdf/QPDF.cc | 6 | ||||
-rw-r--r-- | libqpdf/QPDFObjectHandle.cc | 26 | ||||
-rw-r--r-- | libqpdf/QPDF_Stream.cc | 19 | ||||
-rw-r--r-- | libqpdf/qpdf/QPDF_Stream.hh | 5 |
4 files changed, 54 insertions, 2 deletions
diff --git a/libqpdf/QPDF.cc b/libqpdf/QPDF.cc index cbc2450c..3869e00c 100644 --- a/libqpdf/QPDF.cc +++ b/libqpdf/QPDF.cc @@ -1779,7 +1779,11 @@ QPDF::resolveObjectsInStream(int obj_stream_number) QPDFObjectHandle QPDF::makeIndirectObject(QPDFObjectHandle oh) { - ObjGen o1 = (*(this->obj_cache.rbegin())).first; + ObjGen o1(0, 0); + if (! this->obj_cache.empty()) + { + o1 = (*(this->obj_cache.rbegin())).first; + } ObjGen o2 = (*(this->xref_table.rbegin())).first; QTC::TC("qpdf", "QPDF indirect last obj from xref", (o2.obj > o1.obj) ? 1 : 0); diff --git a/libqpdf/QPDFObjectHandle.cc b/libqpdf/QPDFObjectHandle.cc index 649ce3f0..19b4f94e 100644 --- a/libqpdf/QPDFObjectHandle.cc +++ b/libqpdf/QPDFObjectHandle.cc @@ -561,6 +561,30 @@ QPDFObjectHandle::newStream(QPDF* qpdf, int objid, int generation, stream_dict, offset, length)); } +QPDFObjectHandle +QPDFObjectHandle::newStream(QPDF* qpdf) +{ + QTC::TC("qpdf", "QPDFObjectHandle newStream"); + std::map<std::string, QPDFObjectHandle> keys; + QPDFObjectHandle stream_dict = newDictionary(keys); + QPDFObjectHandle result = qpdf->makeIndirectObject( + QPDFObjectHandle( + new QPDF_Stream(qpdf, 0, 0, stream_dict, 0, 0))); + result.dereference(); + QPDF_Stream* stream = dynamic_cast<QPDF_Stream*>(result.obj.getPointer()); + stream->setObjGen(result.getObjectID(), result.getGeneration()); + return result; +} + +QPDFObjectHandle +QPDFObjectHandle::newStream(QPDF* qpdf, PointerHolder<Buffer> data) +{ + QTC::TC("qpdf", "QPDFObjectHandle newStream with data"); + QPDFObjectHandle result = newStream(qpdf); + result.replaceStreamData(data, newNull(), newNull()); + return result; +} + void QPDFObjectHandle::makeDirectInternal(std::set<int>& visited) { @@ -649,7 +673,7 @@ QPDFObjectHandle::makeDirectInternal(std::set<int>& visited) } else { - throw std::logic_error("QPDFObjectHandle::makeIndirect: " + throw std::logic_error("QPDFObjectHandle::makeDirectInternal: " "unknown object type"); } diff --git a/libqpdf/QPDF_Stream.cc b/libqpdf/QPDF_Stream.cc index 1f48b2c1..87c2daa9 100644 --- a/libqpdf/QPDF_Stream.cc +++ b/libqpdf/QPDF_Stream.cc @@ -40,6 +40,19 @@ QPDF_Stream::~QPDF_Stream() { } +void +QPDF_Stream::setObjGen(int objid, int generation) +{ + if (! ((this->objid == 0) && (this->generation == 0))) + { + throw std::logic_error( + "attempt to set object ID and generation of a stream" + " that already has them"); + } + this->objid = objid; + this->generation = generation; +} + std::string QPDF_Stream::unparse() { @@ -353,6 +366,12 @@ QPDF_Stream::pipeStreamData(Pipeline* pipeline, bool filter, QUtil::int_to_string(desired_length) + " bytes"); } } + else if (this->offset == 0) + { + QTC::TC("qpdf", "QPDF_Stream pipe no stream data"); + throw std::logic_error( + "pipeStreamData called for stream with no data"); + } else { QTC::TC("qpdf", "QPDF_Stream pipe original stream data"); diff --git a/libqpdf/qpdf/QPDF_Stream.hh b/libqpdf/qpdf/QPDF_Stream.hh index 1790121e..73261f39 100644 --- a/libqpdf/qpdf/QPDF_Stream.hh +++ b/libqpdf/qpdf/QPDF_Stream.hh @@ -31,6 +31,11 @@ class QPDF_Stream: public QPDFObject QPDFObjectHandle const& decode_parms, size_t length); + // Replace object ID and generation. This may only be called if + // object ID and generation are 0. It is used by QPDFObjectHandle + // when adding streams to files. + void setObjGen(int objid, int generation); + private: void replaceFilterData(QPDFObjectHandle const& filter, QPDFObjectHandle const& decode_parms, |