Commit 573b6eb8b1801b40a4b6eb32cfd159f532876510

Authored by Jay Berkenbilt
1 parent 20509770

Provide qpdf write progress reporting from C API (fixes #487)

ChangeLog
  1 +2020-12-20 Jay Berkenbilt <ejb@ql.org>
  2 +
  3 + * Add qpdf_register_progress_reporter method to C API,
  4 + corresponding to QPDFWriter::registerProgressReporter. Fixes #487.
  5 +
1 6 2020-11-28 Jay Berkenbilt <ejb@ql.org>
2 7  
3 8 * Add new functions to the C API for manipulating
... ...
examples/pdf-linearize.c
... ... @@ -15,6 +15,11 @@ static void usage()
15 15 exit(2);
16 16 }
17 17  
  18 +static void write_progress(int percent, void* data)
  19 +{
  20 + printf("%s progress: %d%%\n", (char const*)(data), percent);
  21 +}
  22 +
18 23 int main(int argc, char* argv[])
19 24 {
20 25 char* infile = NULL;
... ... @@ -55,6 +60,7 @@ int main(int argc, char* argv[])
55 60 * qpdf_set_deterministic_ID. */
56 61 qpdf_set_static_ID(qpdf, QPDF_TRUE); /* for testing only */
57 62 qpdf_set_linearization(qpdf, QPDF_TRUE);
  63 + qpdf_register_progress_reporter(qpdf, write_progress, infile);
58 64 qpdf_write(qpdf);
59 65 }
60 66 while (qpdf_more_warnings(qpdf))
... ...
examples/qtest/linearize.test
... ... @@ -15,7 +15,8 @@ my $qpdf = $ENV{&#39;QPDF_BIN&#39;} or die;
15 15  
16 16 $td->runtest("linearize",
17 17 {$td->COMMAND => "pdf-linearize input.pdf '' a.pdf"},
18   - {$td->STRING => "", $td->EXIT_STATUS => 0});
  18 + {$td->REGEXP => '(?s).*input\.pdf progress: \d+\%.*',
  19 + $td->EXIT_STATUS => 0});
19 20  
20 21 $td->runtest("check",
21 22 {$td->COMMAND => "$qpdf --check a.pdf"},
... ...
include/qpdf/qpdf-c.h
... ... @@ -467,6 +467,18 @@ extern &quot;C&quot; {
467 467 void qpdf_force_pdf_version_and_extension(
468 468 qpdf_data qpdf, char const* version, int extension_level);
469 469  
  470 + /* During write, your report_progress function will be called with
  471 + * a value between 0 and 100 representing the approximate write
  472 + * progress. The data object you pass to
  473 + * qpdf_register_progress_reporter will be handed back to your
  474 + * function.
  475 + */
  476 + QPDF_DLL
  477 + void qpdf_register_progress_reporter(
  478 + qpdf_data qpdf,
  479 + void (*report_progress)(int percent, void* data),
  480 + void* data);
  481 +
470 482 /* Do actual write operation. */
471 483 QPDF_DLL
472 484 QPDF_ERROR_CODE qpdf_write(qpdf_data qpdf);
... ...
libqpdf/qpdf-c.cc
... ... @@ -57,6 +57,30 @@ _qpdf_data::~_qpdf_data()
57 57 {
58 58 }
59 59  
  60 +class ProgressReporter: public QPDFWriter::ProgressReporter
  61 +{
  62 + public:
  63 + ProgressReporter(void (*handler)(int, void*), void* data);
  64 + virtual ~ProgressReporter() = default;
  65 + virtual void reportProgress(int);
  66 +
  67 + private:
  68 + void (*handler)(int, void*);
  69 + void* data;
  70 +};
  71 +
  72 +ProgressReporter::ProgressReporter(void (*handler)(int, void*), void* data) :
  73 + handler(handler),
  74 + data(data)
  75 +{
  76 +}
  77 +
  78 +void
  79 +ProgressReporter::reportProgress(int progress)
  80 +{
  81 + this->handler(progress, this->data);
  82 +}
  83 +
60 84 // must set qpdf->filename and qpdf->password
61 85 static void call_read(qpdf_data qpdf)
62 86 {
... ... @@ -752,6 +776,15 @@ void qpdf_force_pdf_version_and_extension(
752 776 qpdf->qpdf_writer->forcePDFVersion(version, extension_level);
753 777 }
754 778  
  779 +void qpdf_register_progress_reporter(
  780 + qpdf_data qpdf,
  781 + void (*report_progress)(int percent, void* data),
  782 + void* data)
  783 +{
  784 + qpdf->qpdf_writer->registerProgressReporter(
  785 + new ProgressReporter(report_progress, data));
  786 +}
  787 +
755 788 QPDF_ERROR_CODE qpdf_write(qpdf_data qpdf)
756 789 {
757 790 QPDF_ERROR_CODE status = QPDF_SUCCESS;
... ...