summaryrefslogtreecommitdiff
path: root/package/source
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2015-07-26 20:07:14 +0100
committerCaolán McNamara <caolanm@redhat.com>2015-08-05 22:15:54 +0000
commit458bf0812570f517dd4b80efbcfb7e0fca9479f7 (patch)
tree20a84c003004b38810cbd97459a2f6b2018024f6 /package/source
parent5a2a266d4bb493a7e9e71616d567cb4ccdf82269 (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/source')
-rw-r--r--package/source/zipapi/ZipOutputEntry.cxx63
-rw-r--r--package/source/zippackage/ZipPackageStream.cxx3
2 files changed, 52 insertions, 14 deletions
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) );
}