aboutsummaryrefslogtreecommitdiffstats
path: root/libqpdf/qpdf-c.cc
diff options
context:
space:
mode:
Diffstat (limited to 'libqpdf/qpdf-c.cc')
-rw-r--r--libqpdf/qpdf-c.cc69
1 files changed, 65 insertions, 4 deletions
diff --git a/libqpdf/qpdf-c.cc b/libqpdf/qpdf-c.cc
index 62dba270..784351bc 100644
--- a/libqpdf/qpdf-c.cc
+++ b/libqpdf/qpdf-c.cc
@@ -33,11 +33,15 @@ struct _qpdf_data
char const* buffer;
unsigned long size;
char const* password;
+ bool write_memory;
+ Buffer* output_buffer;
};
_qpdf_data::_qpdf_data() :
qpdf(0),
- qpdf_writer(0)
+ qpdf_writer(0),
+ write_memory(false),
+ output_buffer(0)
{
}
@@ -45,6 +49,7 @@ _qpdf_data::~_qpdf_data()
{
delete qpdf_writer;
delete qpdf;
+ delete output_buffer;
}
// must set qpdf->filename and qpdf->password
@@ -66,6 +71,12 @@ static void call_init_write(qpdf_data qpdf)
qpdf->qpdf_writer = new QPDFWriter(*(qpdf->qpdf), qpdf->filename);
}
+static void call_init_write_memory(qpdf_data qpdf)
+{
+ qpdf->qpdf_writer = new QPDFWriter(*(qpdf->qpdf));
+ qpdf->qpdf_writer->setOutputMemory();
+}
+
static void call_write(qpdf_data qpdf)
{
qpdf->qpdf_writer->write();
@@ -408,21 +419,71 @@ QPDF_BOOL qpdf_allow_modify_all(qpdf_data qpdf)
return qpdf->qpdf->allowModifyAll();
}
-QPDF_ERROR_CODE qpdf_init_write(qpdf_data qpdf, char const* filename)
+static void qpdf_init_write_internal(qpdf_data qpdf)
{
- QPDF_ERROR_CODE status = QPDF_SUCCESS;
if (qpdf->qpdf_writer)
{
QTC::TC("qpdf", "qpdf-c called qpdf_init_write multiple times");
delete qpdf->qpdf_writer;
qpdf->qpdf_writer = 0;
+ if (qpdf->output_buffer)
+ {
+ delete qpdf->output_buffer;
+ qpdf->output_buffer = 0;
+ qpdf->write_memory = false;
+ qpdf->filename = 0;
+ }
}
+}
+
+QPDF_ERROR_CODE qpdf_init_write(qpdf_data qpdf, char const* filename)
+{
+ qpdf_init_write_internal(qpdf);
qpdf->filename = filename;
- status = trap_errors(qpdf, &call_init_write);
+ QPDF_ERROR_CODE status = trap_errors(qpdf, &call_init_write);
QTC::TC("qpdf", "qpdf-c called qpdf_init_write", status);
return status;
}
+QPDF_ERROR_CODE qpdf_init_write_memory(qpdf_data qpdf)
+{
+ qpdf_init_write_internal(qpdf);
+ QPDF_ERROR_CODE status = trap_errors(qpdf, &call_init_write_memory);
+ QTC::TC("qpdf", "qpdf-c called qpdf_init_write_memory");
+ qpdf->write_memory = true;
+ return status;
+}
+
+static void qpdf_get_buffer_internal(qpdf_data qpdf)
+{
+ if (qpdf->write_memory && (qpdf->output_buffer == 0))
+ {
+ qpdf->output_buffer = qpdf->qpdf_writer->getBuffer();
+ }
+}
+
+unsigned long qpdf_get_buffer_length(qpdf_data qpdf)
+{
+ qpdf_get_buffer_internal(qpdf);
+ unsigned long result = 0L;
+ if (qpdf->output_buffer)
+ {
+ result = qpdf->output_buffer->getSize();
+ }
+ return result;
+}
+
+unsigned char const* qpdf_get_buffer(qpdf_data qpdf)
+{
+ unsigned char const* result = 0;
+ qpdf_get_buffer_internal(qpdf);
+ if (qpdf->output_buffer)
+ {
+ result = qpdf->output_buffer->getBuffer();
+ }
+ return result;
+}
+
void qpdf_set_object_stream_mode(qpdf_data qpdf, qpdf_object_stream_e mode)
{
QTC::TC("qpdf", "qpdf-c called qpdf_set_object_stream_mode");