sw/source/filter/ww8/ww8par.cxx | 73 +++++++++++++++++------------------ sw/source/uibase/dochdl/swdtflvr.cxx | 12 +---- 2 files changed, 40 insertions(+), 45 deletions(-)
New commits: commit ca09f1a350c23f49b90950680fffa687979a8ae2 Author: Noel Grandin <noelgran...@gmail.com> AuthorDate: Mon Sep 19 18:50:52 2022 +0200 Commit: Noel Grandin <noel.gran...@collabora.co.uk> CommitDate: Tue Sep 20 09:54:40 2022 +0200 simplify usage of TempFile in sw TempFile already handles the stream. And not touching the URL means we stay on the fast path for temp files. Change-Id: I7e5f1cb7c83fc78d392c6874154563b64dd4a672 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/140203 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk> diff --git a/sw/source/filter/ww8/ww8par.cxx b/sw/source/filter/ww8/ww8par.cxx index ecb4d0c899a2..77805814fc46 100644 --- a/sw/source/filter/ww8/ww8par.cxx +++ b/sw/source/filter/ww8/ww8par.cxx @@ -5548,12 +5548,11 @@ ErrCode SwWW8ImplReader::SetSubStreams(tools::SvRef<SotStorageStream> &rTableStr namespace { - std::unique_ptr<utl::TempFile> MakeTemp(SvFileStream &rSt) + SvStream* MakeTemp(std::optional<utl::TempFile>& roTempFile) { - std::unique_ptr<utl::TempFile> pT(new utl::TempFile); - pT->EnableKillingFile(); - rSt.Open(pT->GetFileName(), StreamMode::READWRITE | StreamMode::SHARE_DENYWRITE); - return pT; + roTempFile.emplace(); + roTempFile->EnableKillingFile(); + return roTempFile->GetStream(StreamMode::READWRITE | StreamMode::SHARE_DENYWRITE); } #define WW_BLOCKSIZE 0x200 @@ -5781,12 +5780,12 @@ ErrCode SwWW8ImplReader::LoadThroughDecryption(WW8Glossary *pGloss) if (!nErrRet) nErrRet = SetSubStreams(xTableStream, xDataStream); - std::unique_ptr<utl::TempFile> pTempMain; - std::unique_ptr<utl::TempFile> pTempTable; - std::unique_ptr<utl::TempFile> pTempData; - SvFileStream aDecryptMain; - SvFileStream aDecryptTable; - SvFileStream aDecryptData; + std::optional<utl::TempFile> oTempMain; + std::optional<utl::TempFile> oTempTable; + std::optional<utl::TempFile> oTempData; + SvStream* pDecryptMain = nullptr; + SvStream* pDecryptTable = nullptr; + SvStream* pDecryptData = nullptr; bool bDecrypt = false; enum {RC4CryptoAPI, RC4, XOR, Other} eAlgo = Other; @@ -5836,34 +5835,34 @@ ErrCode SwWW8ImplReader::LoadThroughDecryption(WW8Glossary *pGloss) if (aEncryptionData.hasElements() && aCtx.VerifyKey(m_xWwFib->m_nKey, m_xWwFib->m_nHash)) { nErrRet = ERRCODE_NONE; - pTempMain = MakeTemp(aDecryptMain); + pDecryptMain = MakeTemp(oTempMain); m_pStrm->Seek(0); size_t nUnencryptedHdr = (8 == m_xWwFib->m_nVersion) ? 0x44 : 0x34; std::unique_ptr<sal_uInt8[]> pIn(new sal_uInt8[nUnencryptedHdr]); nUnencryptedHdr = m_pStrm->ReadBytes(pIn.get(), nUnencryptedHdr); - aDecryptMain.WriteBytes(pIn.get(), nUnencryptedHdr); + pDecryptMain->WriteBytes(pIn.get(), nUnencryptedHdr); pIn.reset(); - DecryptXOR(aCtx, *m_pStrm, aDecryptMain); + DecryptXOR(aCtx, *m_pStrm, *pDecryptMain); if (!m_pTableStream || m_pTableStream == m_pStrm) - m_pTableStream = &aDecryptMain; + m_pTableStream = pDecryptMain; else { - pTempTable = MakeTemp(aDecryptTable); - DecryptXOR(aCtx, *m_pTableStream, aDecryptTable); - m_pTableStream = &aDecryptTable; + pDecryptTable = MakeTemp(oTempTable); + DecryptXOR(aCtx, *m_pTableStream, *pDecryptTable); + m_pTableStream = pDecryptTable; } if (!m_pDataStream || m_pDataStream == m_pStrm) - m_pDataStream = &aDecryptMain; + m_pDataStream = pDecryptMain; else { - pTempData = MakeTemp(aDecryptData); - DecryptXOR(aCtx, *m_pDataStream, aDecryptData); - m_pDataStream = &aDecryptData; + pDecryptData = MakeTemp(oTempData); + DecryptXOR(aCtx, *m_pDataStream, *pDecryptData); + m_pDataStream = pDecryptData; } pMedium->GetItemSet()->ClearItem( SID_PASSWORD ); @@ -5904,30 +5903,30 @@ ErrCode SwWW8ImplReader::LoadThroughDecryption(WW8Glossary *pGloss) { nErrRet = ERRCODE_NONE; - pTempMain = MakeTemp(aDecryptMain); + pDecryptMain = MakeTemp(oTempMain); m_pStrm->Seek(0); std::size_t nUnencryptedHdr = 0x44; std::unique_ptr<sal_uInt8[]> pIn(new sal_uInt8[nUnencryptedHdr]); nUnencryptedHdr = m_pStrm->ReadBytes(pIn.get(), nUnencryptedHdr); - DecryptRC4(*xCtx, *m_pStrm, aDecryptMain); + DecryptRC4(*xCtx, *m_pStrm, *pDecryptMain); - aDecryptMain.Seek(0); - aDecryptMain.WriteBytes(pIn.get(), nUnencryptedHdr); + pDecryptMain->Seek(0); + pDecryptMain->WriteBytes(pIn.get(), nUnencryptedHdr); pIn.reset(); - pTempTable = MakeTemp(aDecryptTable); - DecryptRC4(*xCtx, *m_pTableStream, aDecryptTable); - m_pTableStream = &aDecryptTable; + pDecryptTable = MakeTemp(oTempTable); + DecryptRC4(*xCtx, *m_pTableStream, *pDecryptTable); + m_pTableStream = pDecryptTable; if (!m_pDataStream || m_pDataStream == m_pStrm) - m_pDataStream = &aDecryptMain; + m_pDataStream = pDecryptMain; else { - pTempData = MakeTemp(aDecryptData); - DecryptRC4(*xCtx, *m_pDataStream, aDecryptData); - m_pDataStream = &aDecryptData; + pDecryptData = MakeTemp(oTempData); + DecryptRC4(*xCtx, *m_pDataStream, *pDecryptData); + m_pDataStream = pDecryptData; } pMedium->GetItemSet()->ClearItem( SID_PASSWORD ); @@ -5940,7 +5939,7 @@ ErrCode SwWW8ImplReader::LoadThroughDecryption(WW8Glossary *pGloss) if (nErrRet == ERRCODE_NONE) { - m_pStrm = &aDecryptMain; + m_pStrm = pDecryptMain; m_xWwFib = std::make_shared<WW8Fib>(*m_pStrm, m_nWantedVersion); if (m_xWwFib->m_nFibError) @@ -5951,9 +5950,9 @@ ErrCode SwWW8ImplReader::LoadThroughDecryption(WW8Glossary *pGloss) if (!nErrRet) nErrRet = CoreLoad(pGloss); - pTempMain.reset(); - pTempTable.reset(); - pTempData.reset(); + oTempMain.reset(); + oTempTable.reset(); + oTempData.reset(); m_xWwFib.reset(); return nErrRet; diff --git a/sw/source/uibase/dochdl/swdtflvr.cxx b/sw/source/uibase/dochdl/swdtflvr.cxx index 0907404dd0bc..cd00b2698032 100644 --- a/sw/source/uibase/dochdl/swdtflvr.cxx +++ b/sw/source/uibase/dochdl/swdtflvr.cxx @@ -740,8 +740,9 @@ bool SwTransferable::WriteObject( tools::SvRef<SotTempStream>& xStream, { ::utl::TempFile aTempFile; aTempFile.EnableKillingFile(); + SvStream* pTempStream = aTempFile.GetStream(StreamMode::READWRITE); uno::Reference< embed::XStorage > xWorkStore = - ::comphelper::OStorageHelper::GetStorageFromURL( aTempFile.GetURL(), embed::ElementModes::READWRITE ); + ::comphelper::OStorageHelper::GetStorageFromStream( new utl::OStreamWrapper(*pTempStream), embed::ElementModes::READWRITE ); // write document storage pEmbObj->SetupStorage( xWorkStore, SOFFICE_FILEFORMAT_CURRENT, false ); @@ -754,13 +755,8 @@ bool SwTransferable::WriteObject( tools::SvRef<SotTempStream>& xStream, if ( xTransact.is() ) xTransact->commit(); - std::unique_ptr<SvStream> pSrcStm(::utl::UcbStreamHelper::CreateStream( aTempFile.GetURL(), StreamMode::READ )); - if( pSrcStm ) - { - xStream->SetBufferSize( 0xff00 ); - xStream->WriteStream( *pSrcStm ); - pSrcStm.reset(); - } + xStream->SetBufferSize( 0xff00 ); + xStream->WriteStream( *pTempStream ); xWorkStore->dispose(); xWorkStore.clear();