summaryrefslogtreecommitdiff
path: root/framework/source/services/dispatchhelper.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'framework/source/services/dispatchhelper.cxx')
-rw-r--r--framework/source/services/dispatchhelper.cxx80
1 files changed, 49 insertions, 31 deletions
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.