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 )