Commit e4fa5a3c2a90be455e04a8e4d5b9257a1ba92883
1 parent
e87d1499
Refactor qpdf processing
Push calls to processFile and processInputSource into separate functions in preparation for password recovery changes
Showing
1 changed file
with
43 additions
and
20 deletions
qpdf/qpdf.cc
| @@ -3670,6 +3670,39 @@ ImageOptimizer::provideStreamData(int, int, Pipeline* pipeline) | @@ -3670,6 +3670,39 @@ ImageOptimizer::provideStreamData(int, int, Pipeline* pipeline) | ||
| 3670 | false, false); | 3670 | false, false); |
| 3671 | } | 3671 | } |
| 3672 | 3672 | ||
| 3673 | +template <typename T> | ||
| 3674 | +static PointerHolder<QPDF> do_process( | ||
| 3675 | + void (QPDF::*fn)(T, char const*), | ||
| 3676 | + T item, char const* password, | ||
| 3677 | + Options& o, bool empty) | ||
| 3678 | +{ | ||
| 3679 | + PointerHolder<QPDF> pdf = new QPDF; | ||
| 3680 | + set_qpdf_options(*pdf, o); | ||
| 3681 | + if (empty) | ||
| 3682 | + { | ||
| 3683 | + pdf->emptyPDF(); | ||
| 3684 | + } | ||
| 3685 | + else | ||
| 3686 | + { | ||
| 3687 | + ((*pdf).*fn)(item, password); | ||
| 3688 | + } | ||
| 3689 | + return pdf; | ||
| 3690 | +} | ||
| 3691 | + | ||
| 3692 | +static PointerHolder<QPDF> process_file(char const* filename, | ||
| 3693 | + char const* password, | ||
| 3694 | + Options& o) | ||
| 3695 | +{ | ||
| 3696 | + return do_process(&QPDF::processFile, filename, password, o, | ||
| 3697 | + strcmp(filename, "") == 0); | ||
| 3698 | +} | ||
| 3699 | + | ||
| 3700 | +static PointerHolder<QPDF> process_input_source( | ||
| 3701 | + PointerHolder<InputSource> is, char const* password, Options& o) | ||
| 3702 | +{ | ||
| 3703 | + return do_process(&QPDF::processInputSource, is, password, o, false); | ||
| 3704 | +} | ||
| 3705 | + | ||
| 3673 | static void handle_transformations(QPDF& pdf, Options& o) | 3706 | static void handle_transformations(QPDF& pdf, Options& o) |
| 3674 | { | 3707 | { |
| 3675 | QPDFPageDocumentHelper dh(pdf); | 3708 | QPDFPageDocumentHelper dh(pdf); |
| @@ -3807,9 +3840,6 @@ static void handle_page_specs(QPDF& pdf, Options& o) | @@ -3807,9 +3840,6 @@ static void handle_page_specs(QPDF& pdf, Options& o) | ||
| 3807 | // the API, you can just create two different QPDF objects | 3840 | // the API, you can just create two different QPDF objects |
| 3808 | // to the same underlying file with the same path to | 3841 | // to the same underlying file with the same path to |
| 3809 | // achieve the same affect. | 3842 | // achieve the same affect. |
| 3810 | - PointerHolder<QPDF> qpdf_ph = new QPDF(); | ||
| 3811 | - page_heap.push_back(qpdf_ph); | ||
| 3812 | - QPDF* qpdf = qpdf_ph.getPointer(); | ||
| 3813 | char const* password = page_spec.password; | 3843 | char const* password = page_spec.password; |
| 3814 | if (o.encryption_file && (password == 0) && | 3844 | if (o.encryption_file && (password == 0) && |
| 3815 | (page_spec.filename == o.encryption_file)) | 3845 | (page_spec.filename == o.encryption_file)) |
| @@ -3838,8 +3868,9 @@ static void handle_page_specs(QPDF& pdf, Options& o) | @@ -3838,8 +3868,9 @@ static void handle_page_specs(QPDF& pdf, Options& o) | ||
| 3838 | is = fis; | 3868 | is = fis; |
| 3839 | fis->setFilename(page_spec.filename.c_str()); | 3869 | fis->setFilename(page_spec.filename.c_str()); |
| 3840 | } | 3870 | } |
| 3841 | - qpdf->processInputSource(is, password); | ||
| 3842 | - page_spec_qpdfs[page_spec.filename] = qpdf; | 3871 | + PointerHolder<QPDF> qpdf_ph = process_input_source(is, password, o); |
| 3872 | + page_heap.push_back(qpdf_ph); | ||
| 3873 | + page_spec_qpdfs[page_spec.filename] = qpdf_ph.getPointer(); | ||
| 3843 | if (cis) | 3874 | if (cis) |
| 3844 | { | 3875 | { |
| 3845 | cis->stayOpen(false); | 3876 | cis->stayOpen(false); |
| @@ -4176,10 +4207,10 @@ static void set_writer_options(QPDF& pdf, Options& o, QPDFWriter& w) | @@ -4176,10 +4207,10 @@ static void set_writer_options(QPDF& pdf, Options& o, QPDFWriter& w) | ||
| 4176 | } | 4207 | } |
| 4177 | if (o.copy_encryption) | 4208 | if (o.copy_encryption) |
| 4178 | { | 4209 | { |
| 4179 | - QPDF encryption_pdf; | ||
| 4180 | - encryption_pdf.processFile( | ||
| 4181 | - o.encryption_file, o.encryption_file_password); | ||
| 4182 | - w.copyEncryptionParameters(encryption_pdf); | 4210 | + PointerHolder<QPDF> encryption_pdf = |
| 4211 | + process_file( | ||
| 4212 | + o.encryption_file, o.encryption_file_password, o); | ||
| 4213 | + w.copyEncryptionParameters(*encryption_pdf); | ||
| 4183 | } | 4214 | } |
| 4184 | if (o.encrypt) | 4215 | if (o.encrypt) |
| 4185 | { | 4216 | { |
| @@ -4355,17 +4386,9 @@ int realmain(int argc, char* argv[]) | @@ -4355,17 +4386,9 @@ int realmain(int argc, char* argv[]) | ||
| 4355 | 4386 | ||
| 4356 | try | 4387 | try |
| 4357 | { | 4388 | { |
| 4358 | - QPDF pdf; | ||
| 4359 | - set_qpdf_options(pdf, o); | ||
| 4360 | - if (strcmp(o.infilename, "") == 0) | ||
| 4361 | - { | ||
| 4362 | - pdf.emptyPDF(); | ||
| 4363 | - } | ||
| 4364 | - else | ||
| 4365 | - { | ||
| 4366 | - pdf.processFile(o.infilename, o.password); | ||
| 4367 | - } | ||
| 4368 | - | 4389 | + PointerHolder<QPDF> pdf_ph = |
| 4390 | + process_file(o.infilename, o.password, o); | ||
| 4391 | + QPDF& pdf = *pdf_ph; | ||
| 4369 | handle_transformations(pdf, o); | 4392 | handle_transformations(pdf, o); |
| 4370 | if (! o.page_specs.empty()) | 4393 | if (! o.page_specs.empty()) |
| 4371 | { | 4394 | { |