Kaydet (Commit) 738cf411 authored tarafından Caolán McNamara's avatar Caolán McNamara

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

and reopen them when we need their data.

That way we don't have as many open files as substreams in the
package, so we don't run out of file handles

Change-Id: Ic124e275abf15f4578c77ee271d185f40cb844b1
Reviewed-on: https://gerrit.libreoffice.org/17289Reviewed-by: 's avatarCaolán McNamara <caolanm@redhat.com>
Tested-by: 's avatarCaolán McNamara <caolanm@redhat.com>
üst eb751606
...@@ -37,7 +37,8 @@ class ZipOutputEntry ...@@ -37,7 +37,8 @@ class ZipOutputEntry
{ {
::com::sun::star::uno::Sequence< sal_Int8 > m_aDeflateBuffer; ::com::sun::star::uno::Sequence< sal_Int8 > m_aDeflateBuffer;
ZipUtils::Deflater m_aDeflater; 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; css::uno::Reference< css::io::XOutputStream > m_xOutStream;
::com::sun::star::uno::Reference< ::com::sun::star::xml::crypto::XCipherContext > m_xCipherContext; ::com::sun::star::uno::Reference< ::com::sun::star::xml::crypto::XCipherContext > m_xCipherContext;
...@@ -58,14 +59,18 @@ public: ...@@ -58,14 +59,18 @@ public:
~ZipOutputEntry(); ~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 */
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; } ZipEntry* getZipEntry() { return m_pCurrentEntry; }
ZipPackageStream* getZipPackageStream() { return m_pCurrentStream; } ZipPackageStream* getZipPackageStream() { return m_pCurrentStream; }
bool isEncrypt() { return m_bEncryptCurrentEntry; } 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 closeEntry();
void write(const css::uno::Sequence< sal_Int8 >& rBuffer); void write(const css::uno::Sequence< sal_Int8 >& rBuffer);
......
...@@ -21,6 +21,8 @@ ...@@ -21,6 +21,8 @@
#include <com/sun/star/io/TempFile.hpp> #include <com/sun/star/io/TempFile.hpp>
#include <com/sun/star/packages/zip/ZipConstants.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 <comphelper/storagehelper.hxx>
#include <osl/time.h> #include <osl/time.h>
...@@ -49,38 +51,56 @@ ZipOutputEntry::ZipOutputEntry( ...@@ -49,38 +51,56 @@ ZipOutputEntry::ZipOutputEntry(
bool bEncrypt) bool bEncrypt)
: m_aDeflateBuffer(n_ConstBufferSize) : m_aDeflateBuffer(n_ConstBufferSize)
, m_aDeflater(DEFAULT_COMPRESSION, true) , m_aDeflater(DEFAULT_COMPRESSION, true)
, m_xContext(rxContext)
, m_xOutStream(rxOutput)
, m_pCurrentEntry(&rEntry) , m_pCurrentEntry(&rEntry)
, m_nDigested(0) , m_nDigested(0)
, m_bEncryptCurrentEntry(bEncrypt) , m_bEncryptCurrentEntry(bEncrypt)
, m_pCurrentStream(pStream) , m_pCurrentStream(pStream)
{ {
if (rxOutput.is())
{
m_xOutStream = rxOutput;
}
else
{
m_xTempFile = io::TempFile::create(rxContext);
m_xOutStream = m_xTempFile->getOutputStream();
}
assert(m_pCurrentEntry->nMethod == DEFLATED && "Use ZipPackageStream::rawWrite() for STORED entries"); assert(m_pCurrentEntry->nMethod == DEFLATED && "Use ZipPackageStream::rawWrite() for STORED entries");
if (m_bEncryptCurrentEntry) if (m_bEncryptCurrentEntry)
{ {
m_xCipherContext = ZipFile::StaticGetCipher( rxContext, pStream->GetEncryptionData(), true ); m_xCipherContext = ZipFile::StaticGetCipher( m_xContext, pStream->GetEncryptionData(), true );
m_xDigestContext = ZipFile::StaticGetDigestContextForChecksum( rxContext, pStream->GetEncryptionData() ); m_xDigestContext = ZipFile::StaticGetDigestContextForChecksum( m_xContext, pStream->GetEncryptionData() );
} }
} }
ZipOutputEntry::~ZipOutputEntry() ZipOutputEntry::~ZipOutputEntry()
{ {
if (!m_aTempURL.isEmpty())
{
uno::Reference < ucb::XSimpleFileAccess3 > xAccess(ucb::SimpleFileAccess::create(m_xContext));
xAccess->kill(m_aTempURL);
}
} }
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(); m_xOutStream->closeOutput();
uno::Reference< io::XSeekable > xTempSeek(m_xOutStream, UNO_QUERY_THROW); m_xOutStream.clear();
xTempSeek->seek(0); }
return m_xTempFile->getInputStream();
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() void ZipOutputEntry::closeEntry()
......
...@@ -472,6 +472,7 @@ public: ...@@ -472,6 +472,7 @@ public:
private: private:
virtual void doWork() SAL_OVERRIDE virtual void doWork() SAL_OVERRIDE
{ {
mpEntry->createBufferFile();
try try
{ {
deflateZipEntry(mpEntry, mxInStream); deflateZipEntry(mpEntry, mxInStream);
...@@ -481,6 +482,7 @@ private: ...@@ -481,6 +482,7 @@ private:
{ {
mpEntry->setParallelDeflateException(::cppu::getCaughtException()); mpEntry->setParallelDeflateException(::cppu::getCaughtException());
} }
mpEntry->closeBufferFile();
} }
}; };
......
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