summaryrefslogtreecommitdiff
path: root/framework/source
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/source
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/source')
-rw-r--r--framework/source/register/registertemp.cxx2
-rw-r--r--framework/source/services/dispatchhelper.cxx80
2 files changed, 50 insertions, 32 deletions
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.