basic/source/inc/dlgcont.hxx                 |    8 ++---
 basic/source/inc/namecont.hxx                |    8 ++---
 basic/source/inc/scriptcont.hxx              |    8 ++---
 basic/source/uno/dlgcont.cxx                 |   24 ++++++++++++---
 basic/source/uno/namecont.cxx                |    8 ++---
 basic/source/uno/scriptcont.cxx              |   24 ++++++++++++---
 comphelper/source/streaming/memorystream.cxx |   43 ++++++++++++++++++++++++++-
 7 files changed, 98 insertions(+), 25 deletions(-)

New commits:
commit d203e3f35dc4547bb46151637ba6054d13025d01
Author:     Noel Grandin <noel.gran...@collabora.co.uk>
AuthorDate: Tue May 24 15:42:04 2022 +0200
Commit:     Noel Grandin <noel.gran...@collabora.co.uk>
CommitDate: Wed May 25 16:01:04 2022 +0200

    use comphelper::ByteWriter in UNOMemoryStream
    
    to avoid a temporary buffer
    
    Change-Id: Ibe1d4ffb240993e14eaaddb219f9cde328f9afbe
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/134919
    Tested-by: Jenkins
    Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk>

diff --git a/comphelper/source/streaming/memorystream.cxx 
b/comphelper/source/streaming/memorystream.cxx
index ea1a955cb4d4..199d6a9a6f77 100644
--- a/comphelper/source/streaming/memorystream.cxx
+++ b/comphelper/source/streaming/memorystream.cxx
@@ -21,11 +21,13 @@
 
 #include <com/sun/star/lang/IllegalArgumentException.hpp>
 #include <com/sun/star/lang/XServiceInfo.hpp>
+#include <com/sun/star/lang/XUnoTunnel.hpp>
 #include <com/sun/star/io/IOException.hpp>
 #include <com/sun/star/io/XStream.hpp>
 #include <com/sun/star/io/XSeekableInputStream.hpp>
 #include <com/sun/star/io/XTruncate.hpp>
 //#include <com/sun/star/uno/XComponentContext.hpp>
+#include <comphelper/bytereader.hxx>
 #include <cppuhelper/implbase.hxx>
 #include <cppuhelper/supportsservice.hxx>
 #include <osl/diagnose.h>
@@ -47,7 +49,9 @@ namespace comphelper
 
 namespace {
 
-class UNOMemoryStream : public WeakImplHelper<XServiceInfo, XStream, 
XSeekableInputStream, XOutputStream, XTruncate>
+class UNOMemoryStream :
+    public WeakImplHelper<XServiceInfo, XStream, XSeekableInputStream, 
XOutputStream, XTruncate, XUnoTunnel>,
+    public comphelper::ByteWriter
 {
 public:
     UNOMemoryStream();
@@ -81,6 +85,12 @@ public:
     // XTruncate
     virtual void SAL_CALL truncate() override;
 
+    // XUnoTunnel
+    virtual sal_Int64 SAL_CALL getSomething( const css::uno::Sequence< 
sal_Int8 >& aIdentifier ) override;
+
+    // comphelper::ByteWriter
+    virtual sal_Int32 writeSomeBytes(const sal_Int8* aData, sal_Int32 
nBytesToWrite) override;
+
 private:
     // prevents std::vector from wasting time doing memset on data we are 
going to overwrite anyway
     struct NoInitInt8
@@ -224,6 +234,30 @@ void SAL_CALL UNOMemoryStream::writeBytes( const Sequence< 
sal_Int8 >& aData )
     mnCursor += nBytesToWrite;
 }
 
+sal_Int32 UNOMemoryStream::writeSomeBytes( const sal_Int8* pInData, sal_Int32 
nBytesToWrite )
+{
+    if( !nBytesToWrite )
+        return 0;
+
+    sal_Int64 nNewSize = static_cast<sal_Int64>(mnCursor) + nBytesToWrite;
+    if( nNewSize > SAL_MAX_INT32 )
+    {
+        OSL_ASSERT(false);
+        throw IOException("this implementation does not support more than 
2GB!", static_cast<OWeakObject*>(this) );
+    }
+
+    if( static_cast< sal_Int32 >( nNewSize ) > static_cast< sal_Int32 >( 
maData.size() ) )
+        maData.resize( nNewSize );
+
+    NoInitInt8* pData = &(*maData.begin());
+    NoInitInt8* pCursor = &(pData[mnCursor]);
+    // cast to avoid -Werror=class-memaccess
+    memcpy(static_cast<void*>(pCursor), pInData, nBytesToWrite);
+
+    mnCursor += nBytesToWrite;
+    return nBytesToWrite;
+}
+
 void SAL_CALL UNOMemoryStream::flush()
 {
 }
@@ -240,6 +274,13 @@ void SAL_CALL UNOMemoryStream::truncate()
     mnCursor = 0;
 }
 
+sal_Int64 SAL_CALL UNOMemoryStream::getSomething( const css::uno::Sequence< 
sal_Int8 >& rIdentifier )
+{
+    if (rIdentifier == comphelper::ByteWriter::getUnoTunnelId())
+        return 
reinterpret_cast<sal_Int64>(static_cast<comphelper::ByteWriter*>(this));
+    return 0;
+}
+
 } // namespace comphelper
 
 extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface *
commit 371886dd1245751edb5ce728d0c764a6bb8e2205
Author:     Noel Grandin <noel.gran...@collabora.co.uk>
AuthorDate: Tue May 24 15:41:40 2022 +0200
Commit:     Noel Grandin <noel.gran...@collabora.co.uk>
CommitDate: Wed May 25 16:00:48 2022 +0200

    elide some OUString allocation
    
    Change-Id: Ia21421731dadc1d0e65da182471eb2b8d799782b
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/134918
    Tested-by: Jenkins
    Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk>

diff --git a/basic/source/inc/dlgcont.hxx b/basic/source/inc/dlgcont.hxx
index 58d1dbeb65f4..60882268e524 100644
--- a/basic/source/inc/dlgcont.hxx
+++ b/basic/source/inc/dlgcont.hxx
@@ -60,10 +60,10 @@ class SfxDialogLibraryContainer final : public 
SfxLibraryContainer
 
     virtual void onNewRootStorage() override;
 
-    virtual const char*    getInfoFileName() const override;
-    virtual const char*    getOldInfoFileName() const override;
-    virtual const char*    getLibElementFileExtension() const override;
-    virtual const char*    getLibrariesDir() const override;
+    virtual OUString getInfoFileName() const override;
+    virtual OUString getOldInfoFileName() const override;
+    virtual OUString getLibElementFileExtension() const override;
+    virtual OUString getLibrariesDir() const override;
 
 public:
     SfxDialogLibraryContainer();
diff --git a/basic/source/inc/namecont.hxx b/basic/source/inc/namecont.hxx
index 56f660e52c30..6c25223da711 100644
--- a/basic/source/inc/namecont.hxx
+++ b/basic/source/inc/namecont.hxx
@@ -297,10 +297,10 @@ protected:
     void init( const OUString& rInitialDocumentURL,
                const css::uno::Reference< css::embed::XStorage >& 
_rxInitialStorage );
 
-    virtual const char*    getInfoFileName() const = 0;
-    virtual const char*    getOldInfoFileName() const = 0;
-    virtual const char*    getLibElementFileExtension() const = 0;
-    virtual const char*    getLibrariesDir() const = 0;
+    virtual OUString getInfoFileName() const = 0;
+    virtual OUString getOldInfoFileName() const = 0;
+    virtual OUString getLibElementFileExtension() const = 0;
+    virtual OUString getLibrariesDir() const = 0;
 
     // Handle maLibInfoFileURL and maStorageURL correctly
     void checkStorageURL
diff --git a/basic/source/inc/scriptcont.hxx b/basic/source/inc/scriptcont.hxx
index 592c3ad9d31b..f80fd81791b0 100644
--- a/basic/source/inc/scriptcont.hxx
+++ b/basic/source/inc/scriptcont.hxx
@@ -78,10 +78,10 @@ class SfxScriptLibraryContainer final : public 
SfxLibraryContainer, public OldBa
     // OldBasicPassword interface
     virtual void setLibraryPassword( const OUString& rLibraryName, const 
OUString& rPassword ) override;
 
-    virtual const char*    getInfoFileName() const override;
-    virtual const char*    getOldInfoFileName() const override;
-    virtual const char*    getLibElementFileExtension() const override;
-    virtual const char*    getLibrariesDir() const override;
+    virtual OUString getInfoFileName() const override;
+    virtual OUString getOldInfoFileName() const override;
+    virtual OUString getLibElementFileExtension() const override;
+    virtual OUString getLibrariesDir() const override;
 
 public:
     SfxScriptLibraryContainer();
diff --git a/basic/source/uno/dlgcont.cxx b/basic/source/uno/dlgcont.cxx
index 31c64aef95f5..86cedbb47446 100644
--- a/basic/source/uno/dlgcont.cxx
+++ b/basic/source/uno/dlgcont.cxx
@@ -62,10 +62,26 @@ using com::sun::star::uno::Reference;
 
 // Implementation class SfxDialogLibraryContainer
 
-const char* SfxDialogLibraryContainer::getInfoFileName() const { return 
"dialog"; }
-const char* SfxDialogLibraryContainer::getOldInfoFileName() const { return 
"dialogs"; }
-const char* SfxDialogLibraryContainer::getLibElementFileExtension() const { 
return "xdl"; }
-const char* SfxDialogLibraryContainer::getLibrariesDir() const { return 
"Dialogs"; }
+OUString SfxDialogLibraryContainer::getInfoFileName() const
+{
+    static constexpr OUStringLiteral dialog = u"dialog";
+    return dialog;
+}
+OUString SfxDialogLibraryContainer::getOldInfoFileName() const
+{
+    static constexpr OUStringLiteral dialogs = u"dialogs";
+    return dialogs;
+}
+OUString SfxDialogLibraryContainer::getLibElementFileExtension() const
+{
+    static constexpr OUStringLiteral xdl = u"xdl";
+    return xdl;
+}
+OUString SfxDialogLibraryContainer::getLibrariesDir() const
+{
+    static constexpr OUStringLiteral Dialogs = u"Dialogs";
+    return Dialogs;
+}
 
 // Ctor for service
 SfxDialogLibraryContainer::SfxDialogLibraryContainer()
diff --git a/basic/source/uno/namecont.cxx b/basic/source/uno/namecont.cxx
index 2f7d76d2251e..55058556bcfc 100644
--- a/basic/source/uno/namecont.cxx
+++ b/basic/source/uno/namecont.cxx
@@ -588,10 +588,10 @@ void SfxLibraryContainer::init_Impl( const OUString& 
rInitialDocumentURL,
     uno::Reference< embed::XStorage > xStorage = rxInitialStorage;
 
     maInitialDocumentURL = rInitialDocumentURL;
-    maInfoFileName = OUString::createFromAscii( getInfoFileName() );
-    maOldInfoFileName = OUString::createFromAscii( getOldInfoFileName() );
-    maLibElementFileExtension = OUString::createFromAscii( 
getLibElementFileExtension() );
-    maLibrariesDir = OUString::createFromAscii( getLibrariesDir() );
+    maInfoFileName = getInfoFileName();
+    maOldInfoFileName = getOldInfoFileName();
+    maLibElementFileExtension = getLibElementFileExtension();
+    maLibrariesDir = getLibrariesDir();
 
     meInitMode = DEFAULT;
     INetURLObject aInitUrlInetObj( maInitialDocumentURL );
diff --git a/basic/source/uno/scriptcont.cxx b/basic/source/uno/scriptcont.cxx
index 5ccf6cc0ddfb..52413b759d15 100644
--- a/basic/source/uno/scriptcont.cxx
+++ b/basic/source/uno/scriptcont.cxx
@@ -66,10 +66,26 @@ using namespace osl;
 
 // Implementation class SfxScriptLibraryContainer
 
-const char* SfxScriptLibraryContainer::getInfoFileName() const { return 
"script"; }
-const char* SfxScriptLibraryContainer::getOldInfoFileName() const { return 
"script"; }
-const char* SfxScriptLibraryContainer::getLibElementFileExtension() const { 
return "xba"; }
-const char* SfxScriptLibraryContainer::getLibrariesDir() const { return 
"Basic"; }
+OUString SfxScriptLibraryContainer::getInfoFileName() const
+{
+    static constexpr OUStringLiteral script = u"script";
+    return script;
+}
+OUString SfxScriptLibraryContainer::getOldInfoFileName() const
+{
+    static constexpr OUStringLiteral script = u"script";
+    return script;
+}
+OUString SfxScriptLibraryContainer::getLibElementFileExtension() const
+{
+    static constexpr OUStringLiteral xba = u"xba";
+    return xba;
+}
+OUString SfxScriptLibraryContainer::getLibrariesDir() const
+{
+    static constexpr OUStringLiteral sBasic = u"Basic";
+    return sBasic;
+}
 
 // OldBasicPassword interface
 void SfxScriptLibraryContainer::setLibraryPassword( const OUString& 
rLibraryName, const OUString& rPassword )

Reply via email to