diff options
-rw-r--r-- | package/source/zipapi/ZipFile.cxx | 17 | ||||
-rw-r--r-- | package/source/zippackage/ZipPackageStream.cxx | 6 |
2 files changed, 21 insertions, 2 deletions
diff --git a/package/source/zipapi/ZipFile.cxx b/package/source/zipapi/ZipFile.cxx index af90d6b1ef1a..7de1da7f2963 100644 --- a/package/source/zipapi/ZipFile.cxx +++ b/package/source/zipapi/ZipFile.cxx @@ -524,7 +524,7 @@ bool ZipFile::hasValidPassword ( ZipEntry const & rEntry, const ::rtl::Reference namespace { -class XBufferedStream : public cppu::WeakImplHelper<css::io::XInputStream> +class XBufferedStream : public cppu::WeakImplHelper<css::io::XInputStream, css::io::XSeekable> { std::vector<sal_Int8> maBytes; size_t mnPos; @@ -613,6 +613,21 @@ public: virtual void SAL_CALL closeInput() override { } + // XSeekable + virtual void SAL_CALL seek( sal_Int64 location ) override + { + if ( location > sal_Int64(maBytes.size()) || location < 0 ) + throw IllegalArgumentException(THROW_WHERE, uno::Reference< uno::XInterface >(), 1 ); + mnPos = location; + } + virtual sal_Int64 SAL_CALL getPosition() override + { + return mnPos; + } + virtual sal_Int64 SAL_CALL getLength() override + { + return maBytes.size(); + } }; } diff --git a/package/source/zippackage/ZipPackageStream.cxx b/package/source/zippackage/ZipPackageStream.cxx index 1d6cd237c8e1..569368160f7f 100644 --- a/package/source/zippackage/ZipPackageStream.cxx +++ b/package/source/zippackage/ZipPackageStream.cxx @@ -820,9 +820,13 @@ bool ZipPackageStream::saveChild( { // tdf#89236 Encrypting in parallel does not work bParallelDeflate = !bToBeEncrypted; - // Do not deflate small streams in a thread + // Do not deflate small streams in a thread. XSeekable's getLength() + // gives the full size, XInputStream's available() may not be + // the full size, but it appears that at this point it usually is. if (xSeek.is() && xSeek->getLength() < 100000) bParallelDeflate = false; + else if (xStream->available() < 100000) + bParallelDeflate = false; if (bParallelDeflate) { |