reduce allocations in InterceptedInteraction
the list of intercepted interactions is static per sub-class, so just
pass up a o3tl::span at constructor time.
Change-Id: Ib45c5a3338e0eb3848486dfc707052f07492eb61
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/157480
Tested-by: Jenkins
Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
diff --git a/comphelper/source/misc/simplefileaccessinteraction.cxx b/comphelper/source/misc/simplefileaccessinteraction.cxx
index 8cd77af..f7a4f0e 100644
--- a/comphelper/source/misc/simplefileaccessinteraction.cxx
+++ b/comphelper/source/misc/simplefileaccessinteraction.cxx
@@ -29,10 +29,9 @@ const sal_Int32 HANDLE_CERTIFICATEREQUEST = 3;
/// Will handle com::sun::star::ucb::AuthenticationRequest
const sal_Int32 HANDLE_AUTHENTICATIONREQUEST = 4;
SimpleFileAccessInteraction::SimpleFileAccessInteraction(
const css::uno::Reference<css::task::XInteractionHandler>& xHandler)
static o3tl::span<const ::ucbhelper::InterceptedInteraction::InterceptedRequest> getInterceptions()
{
std::vector<::ucbhelper::InterceptedInteraction::InterceptedRequest> lInterceptions{
static const ::ucbhelper::InterceptedInteraction::InterceptedRequest lInterceptions[]{
{ //intercept standard IO error exception (local file and WebDAV)
css::uno::Any(css::ucb::InteractiveIOException()),
cppu::UnoType<css::task::XInteractionAbort>::get(), HANDLE_INTERACTIVEIOEXCEPTION },
@@ -52,9 +51,14 @@ SimpleFileAccessInteraction::SimpleFileAccessInteraction(
css::uno::Any(css::ucb::AuthenticationRequest()),
cppu::UnoType<css::task::XInteractionApprove>::get(), HANDLE_AUTHENTICATIONREQUEST }
};
return lInterceptions;
}
SimpleFileAccessInteraction::SimpleFileAccessInteraction(
const css::uno::Reference<css::task::XInteractionHandler>& xHandler)
: InterceptedInteraction(getInterceptions())
{
setInterceptedHandler(xHandler);
setInterceptions(std::move(lInterceptions));
}
SimpleFileAccessInteraction::~SimpleFileAccessInteraction() {}
diff --git a/comphelper/source/misc/stillreadwriteinteraction.cxx b/comphelper/source/misc/stillreadwriteinteraction.cxx
index 88bc25b..a6d1db0 100644
--- a/comphelper/source/misc/stillreadwriteinteraction.cxx
+++ b/comphelper/source/misc/stillreadwriteinteraction.cxx
@@ -34,43 +34,42 @@
namespace comphelper{
const sal_Int32 HANDLE_INTERACTIVEIOEXCEPTION = 0;
const sal_Int32 HANDLE_UNSUPPORTEDDATASINKEXCEPTION = 1;
const sal_Int32 HANDLE_AUTHENTICATIONREQUESTEXCEPTION = 2;
const sal_Int32 HANDLE_CERTIFICATEVALIDATIONREQUESTEXCEPTION = 3;
static o3tl::span<const ::ucbhelper::InterceptedInteraction::InterceptedRequest> getInterceptions()
{
static const ::ucbhelper::InterceptedInteraction::InterceptedRequest lInterceptions[] {
{
css::uno::Any(css::ucb::InteractiveIOException()),
cppu::UnoType<css::task::XInteractionAbort>::get(), HANDLE_INTERACTIVEIOEXCEPTION
},
{
css::uno::Any(css::ucb::UnsupportedDataSinkException()),
cppu::UnoType<css::task::XInteractionAbort>::get(), HANDLE_UNSUPPORTEDDATASINKEXCEPTION
},
{
css::uno::Any(css::ucb::AuthenticationRequest()),
cppu::UnoType<css::task::XInteractionApprove>::get(), HANDLE_AUTHENTICATIONREQUESTEXCEPTION
},
{
css::uno::Any(css::ucb::CertificateValidationRequest()),
cppu::UnoType<css::task::XInteractionApprove>::get(), HANDLE_CERTIFICATEVALIDATIONREQUESTEXCEPTION
},
};
return lInterceptions;
}
StillReadWriteInteraction::StillReadWriteInteraction(const css::uno::Reference< css::task::XInteractionHandler >& xHandler,
css::uno::Reference< css::task::XInteractionHandler > xAuxiliaryHandler)
: m_bUsed (false)
: InterceptedInteraction(getInterceptions())
, m_bUsed (false)
, m_bHandledByMySelf (false)
, m_xAuxiliaryHandler(std::move(xAuxiliaryHandler))
{
std::vector< ::ucbhelper::InterceptedInteraction::InterceptedRequest > lInterceptions;
lInterceptions.reserve(4);
::ucbhelper::InterceptedInteraction::InterceptedRequest aInterceptedRequest;
aInterceptedRequest.Handle = HANDLE_INTERACTIVEIOEXCEPTION;
aInterceptedRequest.Request <<= css::ucb::InteractiveIOException();
aInterceptedRequest.Continuation = cppu::UnoType<css::task::XInteractionAbort>::get();
lInterceptions.push_back(aInterceptedRequest);
aInterceptedRequest.Handle = HANDLE_UNSUPPORTEDDATASINKEXCEPTION;
aInterceptedRequest.Request <<= css::ucb::UnsupportedDataSinkException();
aInterceptedRequest.Continuation = cppu::UnoType<css::task::XInteractionAbort>::get();
lInterceptions.push_back(aInterceptedRequest);
aInterceptedRequest.Handle = HANDLE_AUTHENTICATIONREQUESTEXCEPTION;
aInterceptedRequest.Request <<= css::ucb::AuthenticationRequest();
aInterceptedRequest.Continuation = cppu::UnoType<css::task::XInteractionApprove>::get();
lInterceptions.push_back(aInterceptedRequest);
aInterceptedRequest.Handle = HANDLE_CERTIFICATEVALIDATIONREQUESTEXCEPTION;
aInterceptedRequest.Request <<= css::ucb::CertificateValidationRequest();
aInterceptedRequest.Continuation = cppu::UnoType<css::task::XInteractionApprove>::get();
lInterceptions.push_back(aInterceptedRequest);
setInterceptedHandler(xHandler);
setInterceptions(std::move(lInterceptions));
}
void StillReadWriteInteraction::resetInterceptions()
{
setInterceptions(std::vector< ::ucbhelper::InterceptedInteraction::InterceptedRequest >());
}
void StillReadWriteInteraction::resetErrorStates()
diff --git a/include/comphelper/stillreadwriteinteraction.hxx b/include/comphelper/stillreadwriteinteraction.hxx
index fb03a7a..6347e03 100644
--- a/include/comphelper/stillreadwriteinteraction.hxx
+++ b/include/comphelper/stillreadwriteinteraction.hxx
@@ -33,11 +33,6 @@ namespace comphelper{
class UNLESS_MERGELIBS(COMPHELPER_DLLPUBLIC) StillReadWriteInteraction final : public ::ucbhelper::InterceptedInteraction
{
private:
static const sal_Int32 HANDLE_INTERACTIVEIOEXCEPTION = 0;
static const sal_Int32 HANDLE_UNSUPPORTEDDATASINKEXCEPTION = 1;
static const sal_Int32 HANDLE_AUTHENTICATIONREQUESTEXCEPTION = 2;
static const sal_Int32 HANDLE_CERTIFICATEVALIDATIONREQUESTEXCEPTION = 3;
bool m_bUsed;
bool m_bHandledByMySelf;
@@ -45,7 +40,6 @@ public:
StillReadWriteInteraction(const css::uno::Reference< css::task::XInteractionHandler >& xHandler,
css::uno::Reference< css::task::XInteractionHandler > xAuxiliaryHandler);
void resetInterceptions();
void resetErrorStates();
bool wasWriteError() const { return (m_bUsed && m_bHandledByMySelf);}
diff --git a/include/ucbhelper/interceptedinteraction.hxx b/include/ucbhelper/interceptedinteraction.hxx
index 78344c3..15000de 100644
--- a/include/ucbhelper/interceptedinteraction.hxx
+++ b/include/ucbhelper/interceptedinteraction.hxx
@@ -26,6 +26,7 @@
#include <cppuhelper/implbase.hxx>
#include <ucbhelper/ucbhelperdllapi.h>
#include <o3tl/span.hxx>
namespace com::sun::star::task { class XInteractionRequest; }
@@ -129,7 +130,7 @@ class UCBHELPER_DLLPUBLIC InterceptedInteraction : public InterceptedInteraction
/** @short these list contains the requests, which should be intercepted.
*/
::std::vector< InterceptedRequest > m_lInterceptions;
o3tl::span< const InterceptedRequest > m_lInterceptions;
// native interface
@@ -140,6 +141,17 @@ class UCBHELPER_DLLPUBLIC InterceptedInteraction : public InterceptedInteraction
*/
InterceptedInteraction();
/** @short initialise with a list of intercepted interactions.
@attention If the interface method handle() will be overwritten by
a derived class, the functionality behind these static list
can't be used.
@param lInterceptions
the list of intercepted requests.
*/
InterceptedInteraction(o3tl::span< const InterceptedRequest > m_lInterceptions);
/** @short initialize a new instance with the interaction handler,
which should be intercepted.
@@ -155,18 +167,6 @@ class UCBHELPER_DLLPUBLIC InterceptedInteraction : public InterceptedInteraction
void setInterceptedHandler(const css::uno::Reference< css::task::XInteractionHandler >& xInterceptedHandler);
/** @short set a new list of intercepted interactions.
@attention If the interface method handle() will be overwritten by
a derived class, the functionality behind these static list
can't be used.
@param lInterceptions
the list of intercepted requests.
*/
void setInterceptions(::std::vector< InterceptedRequest >&& lInterceptions);
/** @short extract a requested continuation from the list of available ones.
@param lContinuations
diff --git a/ucbhelper/source/client/interceptedinteraction.cxx b/ucbhelper/source/client/interceptedinteraction.cxx
index 96b3fd3..a6a7fe1 100644
--- a/ucbhelper/source/client/interceptedinteraction.cxx
+++ b/ucbhelper/source/client/interceptedinteraction.cxx
@@ -27,16 +27,16 @@ InterceptedInteraction::InterceptedInteraction()
{
}
InterceptedInteraction::InterceptedInteraction(o3tl::span< const InterceptedRequest > lInterceptions)
: m_lInterceptions(lInterceptions)
{
}
void InterceptedInteraction::setInterceptedHandler(const css::uno::Reference< css::task::XInteractionHandler >& xInterceptedHandler)
{
m_xInterceptedHandler = xInterceptedHandler;
}
void InterceptedInteraction::setInterceptions(::std::vector< InterceptedRequest >&& lInterceptions)
{
m_lInterceptions = std::move(lInterceptions);
}
InterceptedInteraction::EInterceptionState InterceptedInteraction::intercepted(
const InterceptedRequest&,
const css::uno::Reference< css::task::XInteractionRequest >&)
diff --git a/unotools/source/misc/mediadescriptor.cxx b/unotools/source/misc/mediadescriptor.cxx
index b8bb7f1..d4567c4 100644
--- a/unotools/source/misc/mediadescriptor.cxx
+++ b/unotools/source/misc/mediadescriptor.cxx
@@ -459,7 +459,6 @@ bool MediaDescriptor::impl_openStreamWithURL( const OUString& sURL, bool bLockFi
if ( bReadOnly )
(*this)[MediaDescriptor::PROP_READONLY] <<= bReadOnly;
xInteraction->resetInterceptions();
xInteraction->resetErrorStates();
try
{