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();

Reply via email to