package/inc/ZipOutputEntry.hxx | 18 +++++-- package/source/zipapi/ZipOutputEntry.cxx | 63 +++++++++++++++++++------ package/source/zippackage/ZipPackageStream.cxx | 3 - 3 files changed, 65 insertions(+), 19 deletions(-)
New commits: commit 458bf0812570f517dd4b80efbcfb7e0fca9479f7 Author: Caolán McNamara <caol...@redhat.com> Date: Sun Jul 26 20:07:14 2015 +0100 Resolves: tdf#88314 close temp file after each thread completed Change-Id: Ic2eec30cfb5f61c53777eefeeb8bad6f552da2fc Reviewed-on: https://gerrit.libreoffice.org/17355 Tested-by: Jenkins <c...@libreoffice.org> Reviewed-by: Caolán McNamara <caol...@redhat.com> Tested-by: Caolán McNamara <caol...@redhat.com> diff --git a/package/inc/ZipOutputEntry.hxx b/package/inc/ZipOutputEntry.hxx index 2a5aa04..d431a07 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 de44ae4..e307003 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 f3c5361..4473bac 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) ); }
_______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits