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