summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--package/source/zipapi/ZipFile.cxx17
-rw-r--r--package/source/zippackage/ZipPackageStream.cxx6
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)
{