summaryrefslogtreecommitdiff
path: root/framework
diff options
context:
space:
mode:
authorJuergen Funk <juergen.funk_ml@cib.de>2016-05-13 10:42:17 +0200
committerThorsten Behrens <Thorsten.Behrens@CIB.de>2016-06-08 02:16:54 +0000
commitf9bb13419549d621ffd55d9d81e0732a89560e2e (patch)
treef3f8a64fd254c5e466b466c12d0e627472ce7868 /framework
parent439b47e84bb12ec1c5cc2332b4c6a9ea59f462ad (diff)
tdf#99815 use XNotifyingDispatch in sfx2
- move DispatchHelper somewhere public - use it from generic dispatcher call sites in sfx2 - return result of dispatcher calls (conveyed via XDispatchResultListener) to calling code, instead of faking it Change-Id: Ie8041133e99dd99e45819f98798829b96532b9e6 Reviewed-on: https://gerrit.libreoffice.org/24953 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Thorsten Behrens <Thorsten.Behrens@CIB.de>
Diffstat (limited to 'framework')
-rw-r--r--framework/Library_fwe.mk1
-rw-r--r--framework/Library_fwl.mk1
-rw-r--r--framework/inc/services/dispatchhelper.hxx104
-rw-r--r--framework/source/register/registertemp.cxx2
-rw-r--r--framework/source/services/dispatchhelper.cxx80
5 files changed, 51 insertions, 137 deletions
diff --git a/framework/Library_fwe.mk b/framework/Library_fwe.mk
index 9b10e161299d..0559236b2bad 100644
--- a/framework/Library_fwe.mk
+++ b/framework/Library_fwe.mk
@@ -79,6 +79,7 @@ $(eval $(call gb_Library_add_exception_objects,fwe,\
framework/source/fwe/xml/toolboxconfiguration \
framework/source/fwe/xml/toolboxdocumenthandler \
framework/source/fwe/xml/xmlnamespaces \
+ framework/source/services/dispatchhelper \
))
# Runtime dependency for unit-tests
diff --git a/framework/Library_fwl.mk b/framework/Library_fwl.mk
index ea325e0cf537..f3729c4ea112 100644
--- a/framework/Library_fwl.mk
+++ b/framework/Library_fwl.mk
@@ -60,7 +60,6 @@ $(eval $(call gb_Library_add_exception_objects,fwl,\
framework/source/recording/dispatchrecordersupplier \
framework/source/register/registertemp \
framework/source/dispatch/dispatchdisabler \
- framework/source/services/dispatchhelper \
framework/source/services/mediatypedetectionhelper \
framework/source/services/uriabbreviation \
framework/source/uielement/fontmenucontroller \
diff --git a/framework/inc/services/dispatchhelper.hxx b/framework/inc/services/dispatchhelper.hxx
deleted file mode 100644
index de8e9721889f..000000000000
--- a/framework/inc/services/dispatchhelper.hxx
+++ /dev/null
@@ -1,104 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*
- * This file is part of the LibreOffice project.
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * This file incorporates work covered by the following license notice:
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed
- * with this work for additional information regarding copyright
- * ownership. The ASF licenses this file to you under the Apache
- * License, Version 2.0 (the "License"); you may not use this file
- * except in compliance with the License. You may obtain a copy of
- * the License at http://www.apache.org/licenses/LICENSE-2.0 .
- */
-
-#ifndef INCLUDED_FRAMEWORK_INC_SERVICES_DISPATCHHELPER_HXX
-#define INCLUDED_FRAMEWORK_INC_SERVICES_DISPATCHHELPER_HXX
-
-#include <macros/xinterface.hxx>
-#include <macros/xtypeprovider.hxx>
-#include <macros/xserviceinfo.hxx>
-#include <general.h>
-
-#include <com/sun/star/lang/XMultiServiceFactory.hpp>
-#include <com/sun/star/frame/XDispatchHelper.hpp>
-#include <com/sun/star/frame/XDispatchResultListener.hpp>
-#include <com/sun/star/frame/DispatchResultEvent.hpp>
-
-#include <cppuhelper/implbase.hxx>
-#include <osl/conditn.hxx>
-
-namespace framework{
-
-/**
- @short implements an easy way for dispatches
- @descr Dispatches are splitted into different parts:
- - parsing of the URL
- - searching for a dispatch object
- - dispatching of the URL
- All these steps are done inside one method call here.
-*/
-
-class DispatchHelper : public ::cppu::WeakImplHelper< css::lang::XServiceInfo,css::frame::XDispatchHelper,css::frame::XDispatchResultListener >
-{
-
- // member
-
- private:
-
- osl::Mutex m_mutex;
-
- /** global uno service manager.
- Can be used to create own needed services. */
- css::uno::Reference< css::uno::XComponentContext > m_xContext;
-
- /** used to wait for asynchronous listener callbacks. */
- ::osl::Condition m_aBlock;
-
- css::uno::Any m_aResult;
-
- css::uno::Reference< css::uno::XInterface > m_xBroadcaster;
-
- // interface
-
- public:
-
- // ctor/dtor
-
- DispatchHelper( const css::uno::Reference< css::uno::XComponentContext >& xContext );
- virtual ~DispatchHelper( );
-
- // XInterface, XTypeProvider, XServiceInfo
-
- DECLARE_XSERVICEINFO
-
- // XDispatchHelper
- virtual css::uno::Any SAL_CALL executeDispatch(
- const css::uno::Reference< css::frame::XDispatchProvider >& xDispatchProvider ,
- const OUString& sURL ,
- const OUString& sTargetFrameName ,
- sal_Int32 nSearchFlags ,
- const css::uno::Sequence< css::beans::PropertyValue >& lArguments )
- throw(css::uno::RuntimeException, std::exception) override;
-
- // XDispatchResultListener
- virtual void SAL_CALL dispatchFinished(
- const css::frame::DispatchResultEvent& aResult )
- throw(css::uno::RuntimeException, std::exception) override;
-
- // XEventListener
- virtual void SAL_CALL disposing(
- const css::lang::EventObject& aEvent )
- throw(css::uno::RuntimeException, std::exception) override;
-};
-
-}
-
-#endif
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/framework/source/register/registertemp.cxx b/framework/source/register/registertemp.cxx
index 393c5bd42a34..f6c28ef7dbab 100644
--- a/framework/source/register/registertemp.cxx
+++ b/framework/source/register/registertemp.cxx
@@ -38,7 +38,7 @@
#include <dispatch/popupmenudispatcher.hxx>
#include <dispatch/servicehandler.hxx>
#include <dispatch/dispatchdisabler.hxx>
-#include <services/dispatchhelper.hxx>
+#include <framework/dispatchhelper.hxx>
#include <recording/dispatchrecorder.hxx>
#include <recording/dispatchrecordersupplier.hxx>
#include <services/uriabbreviation.hxx>
diff --git a/framework/source/services/dispatchhelper.cxx b/framework/source/services/dispatchhelper.cxx
index 5700e2cf5eb5..9cb6166ee241 100644
--- a/framework/source/services/dispatchhelper.cxx
+++ b/framework/source/services/dispatchhelper.cxx
@@ -17,7 +17,8 @@
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
-#include <services/dispatchhelper.hxx>
+#include <framework/dispatchhelper.hxx>
+#include <macros/xserviceinfo.hxx>
#include <services.h>
#include <com/sun/star/util/URLTransformer.hpp>
@@ -103,41 +104,58 @@ css::uno::Any SAL_CALL DispatchHelper::executeDispatch(
// search dispatcher
css::uno::Reference< css::frame::XDispatch > xDispatch = xDispatchProvider->queryDispatch(aURL, sTargetFrameName, nSearchFlags);
- css::uno::Reference< css::frame::XNotifyingDispatch > xNotifyDispatch (xDispatch, css::uno::UNO_QUERY);
- // make sure that synchronous execution is used (if possible)
- css::uno::Sequence< css::beans::PropertyValue > aArguments( lArguments );
- sal_Int32 nLength = lArguments.getLength();
- aArguments.realloc( nLength + 1 );
- aArguments[ nLength ].Name = "SynchronMode";
- aArguments[ nLength ].Value <<= true;
+ return executeDispatch(xDispatch, aURL, true, lArguments);
+}
- css::uno::Any aResult;
- if (xNotifyDispatch.is())
- {
- // dispatch it with guaranteed notification
- // Here we can hope for a result ... instead of the normal dispatch.
- css::uno::Reference< css::frame::XDispatchResultListener > xListener(xTHIS, css::uno::UNO_QUERY);
- /* SAFE { */
- osl::ClearableMutexGuard aWriteLock(m_mutex);
- m_xBroadcaster.set(xNotifyDispatch, css::uno::UNO_QUERY);
- m_aResult = css::uno::Any();
- m_aBlock.reset();
- aWriteLock.clear();
- /* } SAFE */
-
- // dispatch it and wait for a notification
- // TODO/MBA: waiting in main thread?!
- xNotifyDispatch->dispatchWithNotification(aURL, aArguments, xListener);
- aResult = m_aResult;
- }
- else if (xDispatch.is())
+
+css::uno::Any SAL_CALL DispatchHelper::executeDispatch(
+ const css::uno::Reference< css::frame::XDispatch >& xDispatch ,
+ const css::util::URL& aURL ,
+ bool SyncronFlag ,
+ const css::uno::Sequence< css::beans::PropertyValue >& lArguments )
+ throw(css::uno::RuntimeException)
+{
+ css::uno::Reference< css::uno::XInterface > xTHIS(static_cast< ::cppu::OWeakObject* >(this), css::uno::UNO_QUERY);
+ m_aResult.clear();
+
+ // check for valid parameters
+ if (xDispatch.is() )
{
- // dispatch it without any chance to get a result
- xDispatch->dispatch( aURL, aArguments );
+ css::uno::Reference< css::frame::XNotifyingDispatch > xNotifyDispatch (xDispatch, css::uno::UNO_QUERY);
+
+ // make sure that synchronous execution is used (if possible)
+ css::uno::Sequence< css::beans::PropertyValue > aArguments( lArguments );
+ sal_Int32 nLength = lArguments.getLength();
+ aArguments.realloc( nLength + 1 );
+ aArguments[ nLength ].Name = "SynchronMode";
+ aArguments[ nLength ].Value <<= SyncronFlag;
+
+ if (xNotifyDispatch.is())
+ {
+ // dispatch it with guaranteed notification
+ // Here we can hope for a result ... instead of the normal dispatch.
+ css::uno::Reference< css::frame::XDispatchResultListener > xListener(xTHIS, css::uno::UNO_QUERY);
+ /* SAFE { */
+ osl::ClearableMutexGuard aWriteLock(m_mutex);
+ m_xBroadcaster.set(xNotifyDispatch, css::uno::UNO_QUERY);
+ m_aBlock.reset();
+ aWriteLock.clear();
+ /* } SAFE */
+
+ // dispatch it and wait for a notification
+ // TODO/MBA: waiting in main thread?!
+ xNotifyDispatch->dispatchWithNotification(aURL, aArguments, xListener);
+ m_aBlock.wait(); // wait for result
+ }
+ else
+ {
+ // dispatch it without any chance to get a result
+ xDispatch->dispatch( aURL, aArguments );
+ }
}
- return aResult;
+ return m_aResult;
}
/** callback for started dispatch with guaranteed notifications.