diff options
author | Caolán McNamara <caolanm@redhat.com> | 2015-07-26 20:07:14 +0100 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2015-08-05 22:15:54 +0000 |
commit | 458bf0812570f517dd4b80efbcfb7e0fca9479f7 (patch) | |
tree | 20a84c003004b38810cbd97459a2f6b2018024f6 /package | |
parent | 5a2a266d4bb493a7e9e71616d567cb4ccdf82269 (diff) |
Resolves: tdf#88314 close temp file after each thread completed
Change-Id: Ic2eec30cfb5f61c53777eefeeb8bad6f552da2fc
Reviewed-on: https://gerrit.libreoffice.org/17355
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Tested-by: Caolán McNamara <caolanm@redhat.com>
Diffstat (limited to 'package')
-rw-r--r-- | package/inc/ZipOutputEntry.hxx | 18 | ||||
-rw-r--r-- | package/source/zipapi/ZipOutputEntry.cxx | 63 | ||||
-rw-r--r-- | package/source/zippackage/ZipPackageStream.cxx | 3 |
3 files changed, 65 insertions, 19 deletions
diff --git a/package/inc/ZipOutputEntry.hxx b/package/inc/ZipOutputEntry.hxx index 2a5aa0483ce8..d431a0746ea7 100644 --- a/package/inc/ZipOutputEntry.hxx +++ b/package/inc/ZipOutputEntry.hxx @@ -37,7 +37,8 @@ class ZipOutputEntry { ::com::sun::star::uno::Sequence< sal_Int8 > m_aDeflateBuffer; ZipUtils::Deflater m_aDeflater; - css::uno::Reference< css::io::XTempFile > m_xTempFile; + css::uno::Reference< css::uno::XComponentContext > m_xContext; + OUString m_aTempURL; css::uno::Reference< css::io::XOutputStream > m_xOutStream; ::com::sun::star::uno::Reference< ::com::sun::star::xml::crypto::XCipherContext > m_xCipherContext; @@ -58,14 +59,21 @@ public: ~ZipOutputEntry(); - css::uno::Reference< css::io::XInputStream > getData(); + /* This block of methods is for threaded zipping, where we compress to a temp stream, whose + data is retrieved via getData */ + ZipOutputEntry( + const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext >& rxContext, + ZipEntry& rEntry, ZipPackageStream* pStream, bool bEncrypt = false); + void createBufferFile(); + void setParallelDeflateException(const ::css::uno::Any &rAny) { m_aParallelDeflateException = rAny; } + css::uno::Reference< css::io::XInputStream > getData() const; + ::css::uno::Any getParallelDeflateException() const { return m_aParallelDeflateException; } + void closeBufferFile(); + ZipEntry* getZipEntry() { return m_pCurrentEntry; } ZipPackageStream* getZipPackageStream() { return m_pCurrentStream; } bool isEncrypt() { return m_bEncryptCurrentEntry; } - void setParallelDeflateException(const ::css::uno::Any &rAny) { m_aParallelDeflateException = rAny; } - ::css::uno::Any getParallelDeflateException() const { return m_aParallelDeflateException; } - void closeEntry(); void write(const css::uno::Sequence< sal_Int8 >& rBuffer); diff --git a/package/source/zipapi/ZipOutputEntry.cxx b/package/source/zipapi/ZipOutputEntry.cxx index de44ae46f6b4..e3070036fa31 100644 --- a/package/source/zipapi/ZipOutputEntry.cxx +++ b/package/source/zipapi/ZipOutputEntry.cxx @@ -21,6 +21,8 @@ #include <com/sun/star/io/TempFile.hpp> #include <com/sun/star/packages/zip/ZipConstants.hpp> +#include <com/sun/star/ucb/SimpleFileAccess.hpp> +#include <com/sun/star/ucb/XSimpleFileAccess3.hpp> #include <comphelper/storagehelper.hxx> #include <osl/time.h> @@ -49,25 +51,40 @@ ZipOutputEntry::ZipOutputEntry( bool bEncrypt) : m_aDeflateBuffer(n_ConstBufferSize) , m_aDeflater(DEFAULT_COMPRESSION, true) +, m_xContext(rxContext) +, m_xOutStream(rxOutput) , m_pCurrentEntry(&rEntry) , m_nDigested(0) , m_bEncryptCurrentEntry(bEncrypt) , m_pCurrentStream(pStream) { - if (rxOutput.is()) - { - m_xOutStream = rxOutput; - } - else + assert(m_pCurrentEntry->nMethod == DEFLATED && "Use ZipPackageStream::rawWrite() for STORED entries"); + assert(m_xOutStream.is()); + if (m_bEncryptCurrentEntry) { - m_xTempFile = io::TempFile::create(rxContext); - m_xOutStream = m_xTempFile->getOutputStream(); + m_xCipherContext = ZipFile::StaticGetCipher( m_xContext, pStream->GetEncryptionData(), true ); + m_xDigestContext = ZipFile::StaticGetDigestContextForChecksum( m_xContext, pStream->GetEncryptionData() ); } +} + +ZipOutputEntry::ZipOutputEntry( + const uno::Reference< uno::XComponentContext >& rxContext, + ZipEntry& rEntry, + ZipPackageStream* pStream, + bool bEncrypt) +: m_aDeflateBuffer(n_ConstBufferSize) +, m_aDeflater(DEFAULT_COMPRESSION, true) +, m_xContext(rxContext) +, m_pCurrentEntry(&rEntry) +, m_nDigested(0) +, m_bEncryptCurrentEntry(bEncrypt) +, m_pCurrentStream(pStream) +{ assert(m_pCurrentEntry->nMethod == DEFLATED && "Use ZipPackageStream::rawWrite() for STORED entries"); if (m_bEncryptCurrentEntry) { - m_xCipherContext = ZipFile::StaticGetCipher( rxContext, pStream->GetEncryptionData(), true ); - m_xDigestContext = ZipFile::StaticGetDigestContextForChecksum( rxContext, pStream->GetEncryptionData() ); + m_xCipherContext = ZipFile::StaticGetCipher( m_xContext, pStream->GetEncryptionData(), true ); + m_xDigestContext = ZipFile::StaticGetDigestContextForChecksum( m_xContext, pStream->GetEncryptionData() ); } } @@ -75,12 +92,32 @@ ZipOutputEntry::~ZipOutputEntry() { } -uno::Reference< io::XInputStream > ZipOutputEntry::getData() +void ZipOutputEntry::createBufferFile() +{ + assert(!m_xOutStream.is() && m_aTempURL.isEmpty() && + "should only be called in the threaded mode where there is no existing stream yet"); + uno::Reference < beans::XPropertySet > xTempFileProps( + io::TempFile::create(m_xContext), + uno::UNO_QUERY_THROW ); + xTempFileProps->setPropertyValue("RemoveFile", uno::makeAny(sal_False)); + uno::Any aUrl = xTempFileProps->getPropertyValue( "Uri" ); + aUrl >>= m_aTempURL; + assert(!m_aTempURL.isEmpty()); + + uno::Reference < ucb::XSimpleFileAccess3 > xTempAccess(ucb::SimpleFileAccess::create(m_xContext)); + m_xOutStream = xTempAccess->openFileWrite(m_aTempURL); +} + +void ZipOutputEntry::closeBufferFile() { m_xOutStream->closeOutput(); - uno::Reference< io::XSeekable > xTempSeek(m_xOutStream, UNO_QUERY_THROW); - xTempSeek->seek(0); - return m_xTempFile->getInputStream(); + m_xOutStream.clear(); +} + +uno::Reference< io::XInputStream > ZipOutputEntry::getData() const +{ + uno::Reference < ucb::XSimpleFileAccess3 > xTempAccess(ucb::SimpleFileAccess::create(m_xContext)); + return xTempAccess->openFileRead(m_aTempURL); } void ZipOutputEntry::closeEntry() diff --git a/package/source/zippackage/ZipPackageStream.cxx b/package/source/zippackage/ZipPackageStream.cxx index f3c5361c57e5..4473bac4576d 100644 --- a/package/source/zippackage/ZipPackageStream.cxx +++ b/package/source/zippackage/ZipPackageStream.cxx @@ -474,8 +474,10 @@ private: { try { + mpEntry->createBufferFile(); deflateZipEntry(mpEntry, mxInStream); mxInStream.clear(); + mpEntry->closeBufferFile(); } catch (const uno::Exception&) { @@ -823,7 +825,6 @@ bool ZipPackageStream::saveChild( { // Start a new thread deflating this zip entry ZipOutputEntry *pZipEntry = new ZipOutputEntry( - css::uno::Reference<css::io::XOutputStream>(), m_xContext, *pTempEntry, this, bToBeEncrypted); rZipOut.addDeflatingThread( pZipEntry, new DeflateThread(pZipEntry, xStream) ); } |