[Libreoffice-commits] core.git: package/inc package/source

Caolán McNamara caolanm at redhat.com
Wed Aug 5 15:16:15 PDT 2015


 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 <caolanm at 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 <ci at libreoffice.org>
    Reviewed-by: Caolán McNamara <caolanm at redhat.com>
    Tested-by: Caolán McNamara <caolanm at 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) );
                 }


More information about the Libreoffice-commits mailing list