aboutsummaryrefslogtreecommitdiffstats
path: root/libqpdf
diff options
context:
space:
mode:
authorJay Berkenbilt <ejb@ql.org>2010-08-05 22:20:52 +0200
committerJay Berkenbilt <ejb@ql.org>2010-08-05 22:20:52 +0200
commit6f2bd7eb3a64ae6ffbdf9ae256d822056ddcb7b0 (patch)
treeb2853762f4a564e1110ddf37f4821ea02d40a367 /libqpdf
parent11df7809af7131af139be2e76f2db87128700939 (diff)
downloadqpdf-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.cc6
-rw-r--r--libqpdf/QPDFObjectHandle.cc26
-rw-r--r--libqpdf/QPDF_Stream.cc19
-rw-r--r--libqpdf/qpdf/QPDF_Stream.hh5
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,