Commit 0ae19c375ebc24c303765953ff127ecb6a4664dc
1 parent
1e0b1025
TODO: Remove fixed item, move item into ABI section
Showing
1 changed file
with
12 additions
and
39 deletions
TODO
| @@ -16,6 +16,18 @@ Comments appear in the code prefixed by "ABI" | @@ -16,6 +16,18 @@ Comments appear in the code prefixed by "ABI" | ||
| 16 | * QPDFPageObjectHelper::placeFormXObject: name should be std::string | 16 | * QPDFPageObjectHelper::placeFormXObject: name should be std::string |
| 17 | const& (issue #374) | 17 | const& (issue #374) |
| 18 | 18 | ||
| 19 | +* (Source compatibiliy) As somewhat discussed in issue 219, the | ||
| 20 | + original pipeStreamData in QPDF_Stream has various logic for | ||
| 21 | + reporting warnings and letting the caller retry. This logic is not | ||
| 22 | + implemented for stream data providers. When copying foreign streams, | ||
| 23 | + qpdf uses a stream data provider (QPDF::CopiedStreamDataProvider) to | ||
| 24 | + read the stream data from the original file. While a warning is | ||
| 25 | + issued for that case, there is no way to actually propagate failure | ||
| 26 | + information back through because | ||
| 27 | + StreamDataProvider::provideStreamData doesn't take the | ||
| 28 | + suppress_warnings or will_retry options, and adding them would break | ||
| 29 | + source compatibility. | ||
| 30 | + | ||
| 19 | C++-11 | 31 | C++-11 |
| 20 | ====== | 32 | ====== |
| 21 | 33 | ||
| @@ -392,45 +404,6 @@ I find it useful to make reference to them in this list | @@ -392,45 +404,6 @@ I find it useful to make reference to them in this list | ||
| 392 | logic error and what could happen because of malformed user input. | 404 | logic error and what could happen because of malformed user input. |
| 393 | See also ../misc/linearization-errors. | 405 | See also ../misc/linearization-errors. |
| 394 | 406 | ||
| 395 | - * There are a few known limitations of copying foreign streams. These | ||
| 396 | - are somewhat discussed in github issue 219. They are most likely | ||
| 397 | - not worth fixing. | ||
| 398 | - | ||
| 399 | - * The original pipeStreamData in QPDF_Stream has various logic for | ||
| 400 | - reporting warnings and letting the caller retry. This logic is | ||
| 401 | - not implemented for stream data providers. When copying foreign | ||
| 402 | - streams, qpdf uses a stream data provider | ||
| 403 | - (QPDF::CopiedStreamDataProvider) to read the stream data from the | ||
| 404 | - original file. While a warning is issued for that case, there is | ||
| 405 | - no way to actually propagate failure information back through | ||
| 406 | - because StreamDataProvider::provideStreamData doesn't take the | ||
| 407 | - suppress_warnings or will_retry options, and adding them would | ||
| 408 | - break source compatibility. | ||
| 409 | - | ||
| 410 | - * When copying streams that use StreamDataProvider provider, the | ||
| 411 | - original QPDF object must still be kept around. This is the case | ||
| 412 | - of where QPDF q1 has a stream for which replaceStreamData was | ||
| 413 | - called to provide a StreamDataProvider, and then that stream from | ||
| 414 | - q1 was subsequently copied to q2. In that case, q1 must be kept | ||
| 415 | - around until q2 is written. That is a pretty unusual case as, | ||
| 416 | - most of the time, people could just attach the stream data | ||
| 417 | - provider directly to the q2. That said, it actually appears in | ||
| 418 | - qpdf itself. qpdf allows you to combine the --pages and --split | ||
| 419 | - options. In that case, a merged file, which uses | ||
| 420 | - StreamDataProvider to access the original stream, is subsequently | ||
| 421 | - copied to the final split output files. Solving this restriction | ||
| 422 | - is difficult and would probably require breaking source | ||
| 423 | - compatibility because QPDF_Stream doesn't have enough information | ||
| 424 | - to know whether the original QPDF object is needed by the | ||
| 425 | - stream's data provider. Also, the interface is designed to pass | ||
| 426 | - the object ID and generation of the object whose data is being | ||
| 427 | - provided so the provider can use it for lookup or any other | ||
| 428 | - purpose. As such, copying a stream data provider to a new stream | ||
| 429 | - potentially changes the meaning of the parameters passed to the | ||
| 430 | - provider. This happens with CopiedStreamDataProvider, which uses | ||
| 431 | - the object ID and generation of the new stream to locate the | ||
| 432 | - parameters of the old stream. | ||
| 433 | - | ||
| 434 | * If I ever decide to make appearance stream-generation aware of | 407 | * If I ever decide to make appearance stream-generation aware of |
| 435 | fonts or font metrics, see email from Tobias with Message-ID | 408 | fonts or font metrics, see email from Tobias with Message-ID |
| 436 | <5C3C9C6C.8000102@thax.hardliners.org> dated 2019-01-14. | 409 | <5C3C9C6C.8000102@thax.hardliners.org> dated 2019-01-14. |