Kaydet (Commit) 458bf081 authored tarafından Caolán McNamara's avatar Caolán McNamara

Resolves: tdf#88314 close temp file after each thread completed

Change-Id: Ic2eec30cfb5f61c53777eefeeb8bad6f552da2fc
Reviewed-on: https://gerrit.libreoffice.org/17355Tested-by: 's avatarJenkins <ci@libreoffice.org>
Reviewed-by: 's avatarCaolán McNamara <caolanm@redhat.com>
Tested-by: 's avatarCaolán McNamara <caolanm@redhat.com>
üst 5a2a266d
......@@ -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);
......
......@@ -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()
......
......@@ -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) );
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment