summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2015-07-26 20:07:14 +0100
committerAndras Timar <andras.timar@collabora.com>2015-09-19 21:32:17 +0200
commit8069a168e767f06448665f3d8f325735e24ba896 (patch)
tree3d1aa3d1aa2222d3976dee1c0cb79d768f9c7fc9
parent43dd2902bc8ce244ee62a7783342398362bd30cc (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> (cherry picked from commit 458bf0812570f517dd4b80efbcfb7e0fca9479f7) Related: tdf#88314 delete temp files clear to close the inputstream before attempting to delete the temp file, which is plausible as the windows-specific failure in earlier attempts at this Change-Id: I751aa3a098dd960f56b77a5f5fc93783c1060556 Reviewed-on: https://gerrit.libreoffice.org/17531 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Caolán McNamara <caolanm@redhat.com> Tested-by: Caolán McNamara <caolanm@redhat.com> (cherry picked from commit ef698035aa2aa64fc4c4455b394e6782772fef4f) Signed-off-by: Michael Stahl <mstahl@redhat.com>
-rw-r--r--package/inc/ZipOutputEntry.hxx19
-rw-r--r--package/source/zipapi/ZipOutputEntry.cxx70
-rw-r--r--package/source/zipapi/ZipOutputStream.cxx2
-rw-r--r--package/source/zippackage/ZipPackageStream.cxx3
4 files changed, 75 insertions, 19 deletions
diff --git a/package/inc/ZipOutputEntry.hxx b/package/inc/ZipOutputEntry.hxx
index 2a5aa0483ce8..3a6447cc9007 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,22 @@ 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();
+ void deleteBufferFile();
+
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..47ecbb4622af 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,39 @@ 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();
+}
+
+void ZipOutputEntry::deleteBufferFile()
+{
+ assert(!m_xOutStream.is() && !m_aTempURL.isEmpty());
+ uno::Reference < ucb::XSimpleFileAccess3 > xAccess(ucb::SimpleFileAccess::create(m_xContext));
+ xAccess->kill(m_aTempURL);
+}
+
+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/zipapi/ZipOutputStream.cxx b/package/source/zipapi/ZipOutputStream.cxx
index 4acfa77f0124..be261cd5bef9 100644
--- a/package/source/zipapi/ZipOutputStream.cxx
+++ b/package/source/zipapi/ZipOutputStream.cxx
@@ -121,10 +121,12 @@ void ZipOutputStream::finish()
rawWrite(aSequence);
}
while (nRead == n_ConstBufferSize);
+ xInput.clear();
rawCloseEntry(m_aEntries[i]->isEncrypt());
m_aEntries[i]->getZipPackageStream()->successfullyWritten(m_aEntries[i]->getZipEntry());
+ m_aEntries[i]->deleteBufferFile();
delete m_aEntries[i];
}
diff --git a/package/source/zippackage/ZipPackageStream.cxx b/package/source/zippackage/ZipPackageStream.cxx
index 6260045b2b6f..76d8efc18d89 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) );
}