From 6f2bd7eb3a64ae6ffbdf9ae256d822056ddcb7b0 Mon Sep 17 00:00:00 2001 From: Jay Berkenbilt Date: Thu, 5 Aug 2010 20:20:52 +0000 Subject: newStream git-svn-id: svn+q:///qpdf/trunk@991 71b93d88-0707-0410-a8cf-f5a4172ac649 --- libqpdf/QPDF.cc | 6 +++++- libqpdf/QPDFObjectHandle.cc | 26 +++++++++++++++++++++++++- libqpdf/QPDF_Stream.cc | 19 +++++++++++++++++++ libqpdf/qpdf/QPDF_Stream.hh | 5 +++++ 4 files changed, 54 insertions(+), 2 deletions(-) (limited to 'libqpdf') 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 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(result.obj.getPointer()); + stream->setObjGen(result.getObjectID(), result.getGeneration()); + return result; +} + +QPDFObjectHandle +QPDFObjectHandle::newStream(QPDF* qpdf, PointerHolder data) +{ + QTC::TC("qpdf", "QPDFObjectHandle newStream with data"); + QPDFObjectHandle result = newStream(qpdf); + result.replaceStreamData(data, newNull(), newNull()); + return result; +} + void QPDFObjectHandle::makeDirectInternal(std::set& visited) { @@ -649,7 +673,7 @@ QPDFObjectHandle::makeDirectInternal(std::set& 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, -- cgit v1.2.3-54-g00ecf