1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski *
3*b1cdbd2cSJim Jagielski * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski * or more contributor license agreements. See the NOTICE file
5*b1cdbd2cSJim Jagielski * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski * regarding copyright ownership. The ASF licenses this file
7*b1cdbd2cSJim Jagielski * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski * with the License. You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski *
11*b1cdbd2cSJim Jagielski * http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski *
13*b1cdbd2cSJim Jagielski * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski * KIND, either express or implied. See the License for the
17*b1cdbd2cSJim Jagielski * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski * under the License.
19*b1cdbd2cSJim Jagielski *
20*b1cdbd2cSJim Jagielski *************************************************************/
21*b1cdbd2cSJim Jagielski
22*b1cdbd2cSJim Jagielski
23*b1cdbd2cSJim Jagielski
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_framework.hxx"
26*b1cdbd2cSJim Jagielski
27*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
28*b1cdbd2cSJim Jagielski // my own includes
29*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
30*b1cdbd2cSJim Jagielski #include <dispatch/servicehandler.hxx>
31*b1cdbd2cSJim Jagielski #include <threadhelp/readguard.hxx>
32*b1cdbd2cSJim Jagielski #include <general.h>
33*b1cdbd2cSJim Jagielski #include <services.h>
34*b1cdbd2cSJim Jagielski
35*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
36*b1cdbd2cSJim Jagielski // interface includes
37*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
38*b1cdbd2cSJim Jagielski #include <com/sun/star/frame/DispatchResultState.hpp>
39*b1cdbd2cSJim Jagielski #include <com/sun/star/task/XJobExecutor.hpp>
40*b1cdbd2cSJim Jagielski
41*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
42*b1cdbd2cSJim Jagielski // includes of other projects
43*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
44*b1cdbd2cSJim Jagielski
45*b1cdbd2cSJim Jagielski #include <vcl/svapp.hxx>
46*b1cdbd2cSJim Jagielski
47*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
48*b1cdbd2cSJim Jagielski // namespace
49*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
50*b1cdbd2cSJim Jagielski
51*b1cdbd2cSJim Jagielski namespace framework{
52*b1cdbd2cSJim Jagielski
53*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
54*b1cdbd2cSJim Jagielski // non exported const
55*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
56*b1cdbd2cSJim Jagielski
57*b1cdbd2cSJim Jagielski #define PROTOCOL_VALUE "service:"
58*b1cdbd2cSJim Jagielski #define PROTOCOL_LENGTH 8
59*b1cdbd2cSJim Jagielski
60*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
61*b1cdbd2cSJim Jagielski // non exported definitions
62*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
63*b1cdbd2cSJim Jagielski
64*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
65*b1cdbd2cSJim Jagielski // declarations
66*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
67*b1cdbd2cSJim Jagielski
68*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
69*b1cdbd2cSJim Jagielski // XInterface, XTypeProvider, XServiceInfo
70*b1cdbd2cSJim Jagielski
DEFINE_XINTERFACE_5(ServiceHandler,OWeakObject,DIRECT_INTERFACE (css::lang::XTypeProvider),DIRECT_INTERFACE (css::lang::XServiceInfo),DIRECT_INTERFACE (css::frame::XDispatchProvider),DIRECT_INTERFACE (css::frame::XNotifyingDispatch),DIRECT_INTERFACE (css::frame::XDispatch))71*b1cdbd2cSJim Jagielski DEFINE_XINTERFACE_5(ServiceHandler ,
72*b1cdbd2cSJim Jagielski OWeakObject ,
73*b1cdbd2cSJim Jagielski DIRECT_INTERFACE(css::lang::XTypeProvider ),
74*b1cdbd2cSJim Jagielski DIRECT_INTERFACE(css::lang::XServiceInfo ),
75*b1cdbd2cSJim Jagielski DIRECT_INTERFACE(css::frame::XDispatchProvider ),
76*b1cdbd2cSJim Jagielski DIRECT_INTERFACE(css::frame::XNotifyingDispatch),
77*b1cdbd2cSJim Jagielski DIRECT_INTERFACE(css::frame::XDispatch ))
78*b1cdbd2cSJim Jagielski
79*b1cdbd2cSJim Jagielski DEFINE_XTYPEPROVIDER_5(ServiceHandler ,
80*b1cdbd2cSJim Jagielski css::lang::XTypeProvider ,
81*b1cdbd2cSJim Jagielski css::lang::XServiceInfo ,
82*b1cdbd2cSJim Jagielski css::frame::XDispatchProvider ,
83*b1cdbd2cSJim Jagielski css::frame::XNotifyingDispatch,
84*b1cdbd2cSJim Jagielski css::frame::XDispatch )
85*b1cdbd2cSJim Jagielski
86*b1cdbd2cSJim Jagielski DEFINE_XSERVICEINFO_MULTISERVICE(ServiceHandler ,
87*b1cdbd2cSJim Jagielski ::cppu::OWeakObject ,
88*b1cdbd2cSJim Jagielski SERVICENAME_PROTOCOLHANDLER ,
89*b1cdbd2cSJim Jagielski IMPLEMENTATIONNAME_SERVICEHANDLER)
90*b1cdbd2cSJim Jagielski
91*b1cdbd2cSJim Jagielski DEFINE_INIT_SERVICE(ServiceHandler,
92*b1cdbd2cSJim Jagielski {
93*b1cdbd2cSJim Jagielski /*Attention
94*b1cdbd2cSJim Jagielski I think we don't need any mutex or lock here ... because we are called by our own static method impl_createInstance()
95*b1cdbd2cSJim Jagielski to create a new instance of this class by our own supported service factory.
96*b1cdbd2cSJim Jagielski see macro DEFINE_XSERVICEINFO_MULTISERVICE and "impl_initService()" for further informations!
97*b1cdbd2cSJim Jagielski */
98*b1cdbd2cSJim Jagielski }
99*b1cdbd2cSJim Jagielski )
100*b1cdbd2cSJim Jagielski
101*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
102*b1cdbd2cSJim Jagielski
103*b1cdbd2cSJim Jagielski /**
104*b1cdbd2cSJim Jagielski @short standard ctor
105*b1cdbd2cSJim Jagielski @descr These initialize a new instance of ths class with needed informations for work.
106*b1cdbd2cSJim Jagielski
107*b1cdbd2cSJim Jagielski @param xFactory
108*b1cdbd2cSJim Jagielski reference to uno servicemanager for creation of new services
109*b1cdbd2cSJim Jagielski
110*b1cdbd2cSJim Jagielski @modified 02.05.2002 08:16, as96863
111*b1cdbd2cSJim Jagielski */
112*b1cdbd2cSJim Jagielski ServiceHandler::ServiceHandler( const css::uno::Reference< css::lang::XMultiServiceFactory >& xFactory )
113*b1cdbd2cSJim Jagielski // Init baseclasses first
114*b1cdbd2cSJim Jagielski : ThreadHelpBase( &Application::GetSolarMutex() )
115*b1cdbd2cSJim Jagielski , OWeakObject ( )
116*b1cdbd2cSJim Jagielski // Init member
117*b1cdbd2cSJim Jagielski , m_xFactory ( xFactory )
118*b1cdbd2cSJim Jagielski {
119*b1cdbd2cSJim Jagielski }
120*b1cdbd2cSJim Jagielski
121*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
122*b1cdbd2cSJim Jagielski
123*b1cdbd2cSJim Jagielski /**
124*b1cdbd2cSJim Jagielski @short standard dtor
125*b1cdbd2cSJim Jagielski @descr -
126*b1cdbd2cSJim Jagielski
127*b1cdbd2cSJim Jagielski @modified 02.05.2002 08:16, as96863
128*b1cdbd2cSJim Jagielski */
~ServiceHandler()129*b1cdbd2cSJim Jagielski ServiceHandler::~ServiceHandler()
130*b1cdbd2cSJim Jagielski {
131*b1cdbd2cSJim Jagielski m_xFactory = NULL;
132*b1cdbd2cSJim Jagielski }
133*b1cdbd2cSJim Jagielski
134*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
135*b1cdbd2cSJim Jagielski
136*b1cdbd2cSJim Jagielski /**
137*b1cdbd2cSJim Jagielski @short decide if this dispatch implementation can be used for requested URL or not
138*b1cdbd2cSJim Jagielski @descr A protocol handler is registerd for an URL pattern inside configuration and will
139*b1cdbd2cSJim Jagielski be asked by the generic dispatch mechanism inside framework, if he can handle this
140*b1cdbd2cSJim Jagielski special URL wich match his registration. He can agree by returning of a valid dispatch
141*b1cdbd2cSJim Jagielski instance or disagree by returning <NULL/>.
142*b1cdbd2cSJim Jagielski We don't create new dispatch instances here realy - we return THIS as result to handle it
143*b1cdbd2cSJim Jagielski at the same implementation.
144*b1cdbd2cSJim Jagielski
145*b1cdbd2cSJim Jagielski @modified 02.05.2002 15:25, as96863
146*b1cdbd2cSJim Jagielski */
queryDispatch(const css::util::URL & aURL,const::rtl::OUString &,sal_Int32)147*b1cdbd2cSJim Jagielski css::uno::Reference< css::frame::XDispatch > SAL_CALL ServiceHandler::queryDispatch( const css::util::URL& aURL ,
148*b1cdbd2cSJim Jagielski const ::rtl::OUString& /*sTarget*/ ,
149*b1cdbd2cSJim Jagielski sal_Int32 /*nFlags*/ ) throw( css::uno::RuntimeException )
150*b1cdbd2cSJim Jagielski {
151*b1cdbd2cSJim Jagielski css::uno::Reference< css::frame::XDispatch > xDispatcher;
152*b1cdbd2cSJim Jagielski if (aURL.Complete.compareToAscii(PROTOCOL_VALUE,PROTOCOL_LENGTH)==0)
153*b1cdbd2cSJim Jagielski xDispatcher = this;
154*b1cdbd2cSJim Jagielski return xDispatcher;
155*b1cdbd2cSJim Jagielski }
156*b1cdbd2cSJim Jagielski
157*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
158*b1cdbd2cSJim Jagielski
159*b1cdbd2cSJim Jagielski /**
160*b1cdbd2cSJim Jagielski @short do the same like dispatch() but for multiple requests at the same time
161*b1cdbd2cSJim Jagielski @descr -
162*b1cdbd2cSJim Jagielski
163*b1cdbd2cSJim Jagielski @modified 02.05.2002 15:27, as96863
164*b1cdbd2cSJim Jagielski */
queryDispatches(const css::uno::Sequence<css::frame::DispatchDescriptor> & lDescriptor)165*b1cdbd2cSJim Jagielski css::uno::Sequence< css::uno::Reference< css::frame::XDispatch > > SAL_CALL ServiceHandler::queryDispatches( const css::uno::Sequence< css::frame::DispatchDescriptor >& lDescriptor ) throw( css::uno::RuntimeException )
166*b1cdbd2cSJim Jagielski {
167*b1cdbd2cSJim Jagielski sal_Int32 nCount = lDescriptor.getLength();
168*b1cdbd2cSJim Jagielski css::uno::Sequence< css::uno::Reference< css::frame::XDispatch > > lDispatcher( nCount );
169*b1cdbd2cSJim Jagielski for( sal_Int32 i=0; i<nCount; ++i )
170*b1cdbd2cSJim Jagielski {
171*b1cdbd2cSJim Jagielski lDispatcher[i] = this->queryDispatch(
172*b1cdbd2cSJim Jagielski lDescriptor[i].FeatureURL,
173*b1cdbd2cSJim Jagielski lDescriptor[i].FrameName,
174*b1cdbd2cSJim Jagielski lDescriptor[i].SearchFlags);
175*b1cdbd2cSJim Jagielski }
176*b1cdbd2cSJim Jagielski return lDispatcher;
177*b1cdbd2cSJim Jagielski }
178*b1cdbd2cSJim Jagielski
179*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
180*b1cdbd2cSJim Jagielski
181*b1cdbd2cSJim Jagielski /**
182*b1cdbd2cSJim Jagielski @short dispatch URL with arguments
183*b1cdbd2cSJim Jagielski @descr We use threadsafe internal method to do so. It returns a state value - but we ignore it.
184*b1cdbd2cSJim Jagielski Because we doesn't support status listener notifications here.
185*b1cdbd2cSJim Jagielski
186*b1cdbd2cSJim Jagielski @param aURL
187*b1cdbd2cSJim Jagielski uno URL which should be executed
188*b1cdbd2cSJim Jagielski @param lArguments
189*b1cdbd2cSJim Jagielski list of optional arguments for this request
190*b1cdbd2cSJim Jagielski
191*b1cdbd2cSJim Jagielski @modified 02.05.2002 08:19, as96863
192*b1cdbd2cSJim Jagielski */
dispatch(const css::util::URL & aURL,const css::uno::Sequence<css::beans::PropertyValue> & lArguments)193*b1cdbd2cSJim Jagielski void SAL_CALL ServiceHandler::dispatch( const css::util::URL& aURL ,
194*b1cdbd2cSJim Jagielski const css::uno::Sequence< css::beans::PropertyValue >& lArguments ) throw( css::uno::RuntimeException )
195*b1cdbd2cSJim Jagielski {
196*b1cdbd2cSJim Jagielski // dispatch() is an [oneway] call ... and may our user release his reference to us immediatly.
197*b1cdbd2cSJim Jagielski // So we should hold us self alive till this call ends.
198*b1cdbd2cSJim Jagielski css::uno::Reference< css::frame::XNotifyingDispatch > xSelfHold(static_cast< ::cppu::OWeakObject* >(this), css::uno::UNO_QUERY);
199*b1cdbd2cSJim Jagielski implts_dispatch(aURL,lArguments);
200*b1cdbd2cSJim Jagielski // No notification for status listener!
201*b1cdbd2cSJim Jagielski }
202*b1cdbd2cSJim Jagielski
203*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
204*b1cdbd2cSJim Jagielski
205*b1cdbd2cSJim Jagielski /**
206*b1cdbd2cSJim Jagielski @short dispatch with guaranteed notifications about success
207*b1cdbd2cSJim Jagielski @descr We use threadsafe internal method to do so. Return state of this function will be used
208*b1cdbd2cSJim Jagielski for notification if an optional listener is given.
209*b1cdbd2cSJim Jagielski
210*b1cdbd2cSJim Jagielski @param aURL
211*b1cdbd2cSJim Jagielski uno URL which should be executed
212*b1cdbd2cSJim Jagielski @param lArguments
213*b1cdbd2cSJim Jagielski list of optional arguments for this request
214*b1cdbd2cSJim Jagielski @param xListener
215*b1cdbd2cSJim Jagielski optional listener for state events
216*b1cdbd2cSJim Jagielski
217*b1cdbd2cSJim Jagielski @modified 30.04.2002 14:49, as96863
218*b1cdbd2cSJim Jagielski */
dispatchWithNotification(const css::util::URL & aURL,const css::uno::Sequence<css::beans::PropertyValue> & lArguments,const css::uno::Reference<css::frame::XDispatchResultListener> & xListener)219*b1cdbd2cSJim Jagielski void SAL_CALL ServiceHandler::dispatchWithNotification( const css::util::URL& aURL ,
220*b1cdbd2cSJim Jagielski const css::uno::Sequence< css::beans::PropertyValue >& lArguments,
221*b1cdbd2cSJim Jagielski const css::uno::Reference< css::frame::XDispatchResultListener >& xListener ) throw( css::uno::RuntimeException )
222*b1cdbd2cSJim Jagielski {
223*b1cdbd2cSJim Jagielski // This class was designed to die by reference. And if user release his reference to us immediatly after calling this method
224*b1cdbd2cSJim Jagielski // we can run into some problems. So we hold us self alive till this method ends.
225*b1cdbd2cSJim Jagielski // Another reason: We can use this reference as source of sending event at the end too.
226*b1cdbd2cSJim Jagielski css::uno::Reference< css::frame::XNotifyingDispatch > xThis(static_cast< ::cppu::OWeakObject* >(this), css::uno::UNO_QUERY);
227*b1cdbd2cSJim Jagielski
228*b1cdbd2cSJim Jagielski css::uno::Reference< css::uno::XInterface > xService = implts_dispatch(aURL,lArguments);
229*b1cdbd2cSJim Jagielski if (xListener.is())
230*b1cdbd2cSJim Jagielski {
231*b1cdbd2cSJim Jagielski css::frame::DispatchResultEvent aEvent;
232*b1cdbd2cSJim Jagielski if (xService.is())
233*b1cdbd2cSJim Jagielski aEvent.State = css::frame::DispatchResultState::SUCCESS;
234*b1cdbd2cSJim Jagielski else
235*b1cdbd2cSJim Jagielski aEvent.State = css::frame::DispatchResultState::FAILURE;
236*b1cdbd2cSJim Jagielski aEvent.Result <<= xService; // may NULL for state=FAILED!
237*b1cdbd2cSJim Jagielski aEvent.Source = xThis;
238*b1cdbd2cSJim Jagielski
239*b1cdbd2cSJim Jagielski xListener->dispatchFinished( aEvent );
240*b1cdbd2cSJim Jagielski }
241*b1cdbd2cSJim Jagielski }
242*b1cdbd2cSJim Jagielski
243*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
244*b1cdbd2cSJim Jagielski
245*b1cdbd2cSJim Jagielski /**
246*b1cdbd2cSJim Jagielski @short threadsafe helper for dispatch calls
247*b1cdbd2cSJim Jagielski @descr We support two interfaces for the same process - dispatch URLs. That the reason for this internal
248*b1cdbd2cSJim Jagielski function. It implements the real dispatch operation and returns a state value which inform caller
249*b1cdbd2cSJim Jagielski about success. He can notify listener then by using this return value.
250*b1cdbd2cSJim Jagielski
251*b1cdbd2cSJim Jagielski @param aURL
252*b1cdbd2cSJim Jagielski uno URL which should be executed
253*b1cdbd2cSJim Jagielski @param lArguments
254*b1cdbd2cSJim Jagielski list of optional arguments for this request
255*b1cdbd2cSJim Jagielski
256*b1cdbd2cSJim Jagielski @return <NULL/> if requested service couldn't be created successullfy;
257*b1cdbd2cSJim Jagielski a valid reference otherwise. This return value can be used to indicate,
258*b1cdbd2cSJim Jagielski if dispatch was successfully or not.
259*b1cdbd2cSJim Jagielski
260*b1cdbd2cSJim Jagielski @modified 02.05.2002 10:51, as96863
261*b1cdbd2cSJim Jagielski */
implts_dispatch(const css::util::URL & aURL,const css::uno::Sequence<css::beans::PropertyValue> &)262*b1cdbd2cSJim Jagielski css::uno::Reference< css::uno::XInterface > ServiceHandler::implts_dispatch( const css::util::URL& aURL ,
263*b1cdbd2cSJim Jagielski const css::uno::Sequence< css::beans::PropertyValue >& /*lArguments*/ ) throw( css::uno::RuntimeException )
264*b1cdbd2cSJim Jagielski {
265*b1cdbd2cSJim Jagielski /* SAFE */
266*b1cdbd2cSJim Jagielski ReadGuard aReadLock( m_aLock );
267*b1cdbd2cSJim Jagielski css::uno::Reference< css::lang::XMultiServiceFactory > xFactory = m_xFactory;
268*b1cdbd2cSJim Jagielski aReadLock.unlock();
269*b1cdbd2cSJim Jagielski /* SAFE */
270*b1cdbd2cSJim Jagielski
271*b1cdbd2cSJim Jagielski if (!xFactory.is())
272*b1cdbd2cSJim Jagielski return css::uno::Reference< css::uno::XInterface >();
273*b1cdbd2cSJim Jagielski
274*b1cdbd2cSJim Jagielski // extract service name and may optional given parameters from given URL
275*b1cdbd2cSJim Jagielski // and use it to create and start the component
276*b1cdbd2cSJim Jagielski ::rtl::OUString sServiceAndArguments = aURL.Complete.copy(PROTOCOL_LENGTH);
277*b1cdbd2cSJim Jagielski ::rtl::OUString sServiceName;
278*b1cdbd2cSJim Jagielski ::rtl::OUString sArguments ;
279*b1cdbd2cSJim Jagielski
280*b1cdbd2cSJim Jagielski sal_Int32 nArgStart = sServiceAndArguments.indexOf('?',0);
281*b1cdbd2cSJim Jagielski if (nArgStart!=-1)
282*b1cdbd2cSJim Jagielski {
283*b1cdbd2cSJim Jagielski sServiceName = sServiceAndArguments.copy(0,nArgStart);
284*b1cdbd2cSJim Jagielski ++nArgStart; // ignore '?'!
285*b1cdbd2cSJim Jagielski sArguments = sServiceAndArguments.copy(nArgStart);
286*b1cdbd2cSJim Jagielski }
287*b1cdbd2cSJim Jagielski else
288*b1cdbd2cSJim Jagielski {
289*b1cdbd2cSJim Jagielski sServiceName = sServiceAndArguments;
290*b1cdbd2cSJim Jagielski }
291*b1cdbd2cSJim Jagielski
292*b1cdbd2cSJim Jagielski if (!sServiceName.getLength())
293*b1cdbd2cSJim Jagielski return css::uno::Reference< css::uno::XInterface >();
294*b1cdbd2cSJim Jagielski
295*b1cdbd2cSJim Jagielski // If a service doesnt support an optional job executor interface - he can't get
296*b1cdbd2cSJim Jagielski // any given parameters!
297*b1cdbd2cSJim Jagielski // Because we can't know if we must call createInstanceWithArguments() or XJobExecutor::trigger() ...
298*b1cdbd2cSJim Jagielski
299*b1cdbd2cSJim Jagielski css::uno::Reference< css::uno::XInterface > xService;
300*b1cdbd2cSJim Jagielski try
301*b1cdbd2cSJim Jagielski {
302*b1cdbd2cSJim Jagielski // => a) a service starts running inside his own ctor and we create it only
303*b1cdbd2cSJim Jagielski xService = xFactory->createInstance(sServiceName);
304*b1cdbd2cSJim Jagielski // or b) he implements the right interface and starts there (may with optional parameters)
305*b1cdbd2cSJim Jagielski css::uno::Reference< css::task::XJobExecutor > xExecuteable(xService, css::uno::UNO_QUERY);
306*b1cdbd2cSJim Jagielski if (xExecuteable.is())
307*b1cdbd2cSJim Jagielski xExecuteable->trigger(sArguments);
308*b1cdbd2cSJim Jagielski }
309*b1cdbd2cSJim Jagielski // ignore all errors - inclusive runtime errors!
310*b1cdbd2cSJim Jagielski // E.g. a script based service (written in phyton) could not be executed
311*b1cdbd2cSJim Jagielski // because it contains syntax errors, which was detected at runtime ...
312*b1cdbd2cSJim Jagielski catch(const css::uno::Exception&)
313*b1cdbd2cSJim Jagielski { xService.clear(); }
314*b1cdbd2cSJim Jagielski
315*b1cdbd2cSJim Jagielski return xService;
316*b1cdbd2cSJim Jagielski }
317*b1cdbd2cSJim Jagielski
318*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
319*b1cdbd2cSJim Jagielski
320*b1cdbd2cSJim Jagielski /**
321*b1cdbd2cSJim Jagielski @short add/remove listener for state events
322*b1cdbd2cSJim Jagielski @descr We use an internal container to hold such registered listener. This container lives if we live.
323*b1cdbd2cSJim Jagielski And if call pas registration as non breakable transaction - we can accept the request without
324*b1cdbd2cSJim Jagielski any explicit lock. Because we share our mutex with this container.
325*b1cdbd2cSJim Jagielski
326*b1cdbd2cSJim Jagielski @param xListener
327*b1cdbd2cSJim Jagielski reference to a valid listener for state events
328*b1cdbd2cSJim Jagielski @param aURL
329*b1cdbd2cSJim Jagielski URL about listener will be informed, if something occured
330*b1cdbd2cSJim Jagielski
331*b1cdbd2cSJim Jagielski @modified 30.04.2002 14:49, as96863
332*b1cdbd2cSJim Jagielski */
addStatusListener(const css::uno::Reference<css::frame::XStatusListener> &,const css::util::URL &)333*b1cdbd2cSJim Jagielski void SAL_CALL ServiceHandler::addStatusListener( const css::uno::Reference< css::frame::XStatusListener >& /*xListener*/ ,
334*b1cdbd2cSJim Jagielski const css::util::URL& /*aURL*/ ) throw( css::uno::RuntimeException )
335*b1cdbd2cSJim Jagielski {
336*b1cdbd2cSJim Jagielski // not suported yet
337*b1cdbd2cSJim Jagielski }
338*b1cdbd2cSJim Jagielski
339*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
340*b1cdbd2cSJim Jagielski
removeStatusListener(const css::uno::Reference<css::frame::XStatusListener> &,const css::util::URL &)341*b1cdbd2cSJim Jagielski void SAL_CALL ServiceHandler::removeStatusListener( const css::uno::Reference< css::frame::XStatusListener >& /*xListener*/ ,
342*b1cdbd2cSJim Jagielski const css::util::URL& /*aURL*/ ) throw( css::uno::RuntimeException )
343*b1cdbd2cSJim Jagielski {
344*b1cdbd2cSJim Jagielski // not suported yet
345*b1cdbd2cSJim Jagielski }
346*b1cdbd2cSJim Jagielski
347*b1cdbd2cSJim Jagielski } // namespace framework
348