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