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 //	my own includes
28cdf0e10cSrcweir //_________________________________________________________________________________________________________________
29cdf0e10cSrcweir 
30cdf0e10cSrcweir #ifndef __FRAMEWORK_DISPATCH_OXT_HANDLER_HXX_
31cdf0e10cSrcweir #include <dispatch/oxt_handler.hxx>
32cdf0e10cSrcweir #endif
33cdf0e10cSrcweir 
34cdf0e10cSrcweir #ifndef __FRAMEWORK_THREADHELP_TRANSACTIONGUARD_HXX_
35cdf0e10cSrcweir #include <threadhelp/transactionguard.hxx>
36cdf0e10cSrcweir #endif
37cdf0e10cSrcweir 
38cdf0e10cSrcweir #ifndef __FRAMEWORK_THREADHELP_WRITEGUARD_HXX_
39cdf0e10cSrcweir #include <threadhelp/writeguard.hxx>
40cdf0e10cSrcweir #endif
41cdf0e10cSrcweir 
42cdf0e10cSrcweir #ifndef __FRAMEWORK_THREADHELP_READGUARD_HXX_
43cdf0e10cSrcweir #include <threadhelp/readguard.hxx>
44cdf0e10cSrcweir #endif
45cdf0e10cSrcweir 
46cdf0e10cSrcweir #ifndef __FRAMEWORK_MACROS_DEBUG_HXX_
47cdf0e10cSrcweir #include <macros/debug.hxx>
48cdf0e10cSrcweir #endif
49cdf0e10cSrcweir 
50cdf0e10cSrcweir #ifndef __FRAMEWORK_SERVICES_H_
51cdf0e10cSrcweir #include <services.h>
52cdf0e10cSrcweir #endif
53cdf0e10cSrcweir 
54cdf0e10cSrcweir #ifndef __COMPHELPER_MEDIADESCRIPTOR_HXX_
55cdf0e10cSrcweir #include <comphelper/mediadescriptor.hxx>
56cdf0e10cSrcweir #endif
57cdf0e10cSrcweir 
58cdf0e10cSrcweir //_________________________________________________________________________________________________________________
59cdf0e10cSrcweir //	interface includes
60cdf0e10cSrcweir //_________________________________________________________________________________________________________________
61cdf0e10cSrcweir 
62cdf0e10cSrcweir #include <com/sun/star/io/XInputStream.hpp>
63cdf0e10cSrcweir #include <com/sun/star/frame/DispatchResultState.hpp>
64cdf0e10cSrcweir #include <com/sun/star/task/XJobExecutor.hpp>
65cdf0e10cSrcweir 
66cdf0e10cSrcweir //_________________________________________________________________________________________________________________
67cdf0e10cSrcweir //	includes of other projects
68cdf0e10cSrcweir //_________________________________________________________________________________________________________________
69cdf0e10cSrcweir 
70cdf0e10cSrcweir #ifndef _COMPHELPER_SEQUENCEASHASHMAP_HXX_
71cdf0e10cSrcweir #include <comphelper/sequenceashashmap.hxx>
72cdf0e10cSrcweir #endif
73cdf0e10cSrcweir 
74cdf0e10cSrcweir #ifndef _RTL_USTRBUF_HXX_
75cdf0e10cSrcweir #include <rtl/ustrbuf.hxx>
76cdf0e10cSrcweir #endif
77cdf0e10cSrcweir 
78cdf0e10cSrcweir //_________________________________________________________________________________________________________________
79cdf0e10cSrcweir //	namespace
80cdf0e10cSrcweir //_________________________________________________________________________________________________________________
81cdf0e10cSrcweir 
82cdf0e10cSrcweir namespace framework{
83cdf0e10cSrcweir 
84cdf0e10cSrcweir //_________________________________________________________________________________________________________________
85cdf0e10cSrcweir //	non exported const
86cdf0e10cSrcweir //_________________________________________________________________________________________________________________
87cdf0e10cSrcweir 
88cdf0e10cSrcweir //_________________________________________________________________________________________________________________
89cdf0e10cSrcweir //	non exported definitions
90cdf0e10cSrcweir //_________________________________________________________________________________________________________________
91cdf0e10cSrcweir 
92cdf0e10cSrcweir #define UNISTRING(s) rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(s))
93cdf0e10cSrcweir 
94cdf0e10cSrcweir //_________________________________________________________________________________________________________________
95cdf0e10cSrcweir //	declarations
96cdf0e10cSrcweir //_________________________________________________________________________________________________________________
97cdf0e10cSrcweir 
98cdf0e10cSrcweir //*****************************************************************************************************************
99cdf0e10cSrcweir //  XInterface, XTypeProvider, XServiceInfo
100cdf0e10cSrcweir //*****************************************************************************************************************
DEFINE_XINTERFACE_5(Oxt_Handler,OWeakObject,DIRECT_INTERFACE (css::lang::XTypeProvider),DIRECT_INTERFACE (css::lang::XServiceInfo),DIRECT_INTERFACE (css::frame::XNotifyingDispatch),DIRECT_INTERFACE (css::frame::XDispatch),DIRECT_INTERFACE (css::document::XExtendedFilterDetection))101cdf0e10cSrcweir DEFINE_XINTERFACE_5                 (   Oxt_Handler                                                ,
102cdf0e10cSrcweir                                         OWeakObject                                                ,
103cdf0e10cSrcweir                                         DIRECT_INTERFACE( css::lang::XTypeProvider                ),
104cdf0e10cSrcweir                                         DIRECT_INTERFACE( css::lang::XServiceInfo                 ),
105cdf0e10cSrcweir                                         DIRECT_INTERFACE( css::frame::XNotifyingDispatch          ),
106cdf0e10cSrcweir                                         DIRECT_INTERFACE( css::frame::XDispatch                   ),
107cdf0e10cSrcweir                                         DIRECT_INTERFACE( css::document::XExtendedFilterDetection )
108cdf0e10cSrcweir                                     )
109cdf0e10cSrcweir 
110cdf0e10cSrcweir DEFINE_XTYPEPROVIDER_5              (   Oxt_Handler                                                ,
111cdf0e10cSrcweir                                         css::lang::XTypeProvider                                   ,
112cdf0e10cSrcweir                                         css::lang::XServiceInfo                                    ,
113cdf0e10cSrcweir                                         css::frame::XNotifyingDispatch                             ,
114cdf0e10cSrcweir                                         css::frame::XDispatch                                      ,
115cdf0e10cSrcweir                                         css::document::XExtendedFilterDetection
116cdf0e10cSrcweir                                     )
117cdf0e10cSrcweir 
118cdf0e10cSrcweir DEFINE_XSERVICEINFO_MULTISERVICE    (   Oxt_Handler                                                ,
119cdf0e10cSrcweir                                         ::cppu::OWeakObject                                        ,
120cdf0e10cSrcweir                                         SERVICENAME_CONTENTHANDLER                                 ,
121cdf0e10cSrcweir                                         IMPLEMENTATIONNAME_OXT_HANDLER
122cdf0e10cSrcweir 									)
123cdf0e10cSrcweir 
124cdf0e10cSrcweir DEFINE_INIT_SERVICE                 (   Oxt_Handler,
125cdf0e10cSrcweir                                         {
126cdf0e10cSrcweir                                         }
127cdf0e10cSrcweir                                     )
128cdf0e10cSrcweir 
129cdf0e10cSrcweir /*-************************************************************************************************************//**
130cdf0e10cSrcweir     @short      standard ctor
131cdf0e10cSrcweir     @descr      These initialize a new instance of this class with needed informations for work.
132cdf0e10cSrcweir 
133cdf0e10cSrcweir     @seealso    using at owner
134cdf0e10cSrcweir 
135cdf0e10cSrcweir     @param      "xFactory", reference to service manager for creation of new services
136cdf0e10cSrcweir     @return     -
137cdf0e10cSrcweir 
138cdf0e10cSrcweir     @onerror    Show an assertion and do nothing else.
139cdf0e10cSrcweir     @threadsafe yes
140cdf0e10cSrcweir *//*-*************************************************************************************************************/
141cdf0e10cSrcweir Oxt_Handler::Oxt_Handler( const css::uno::Reference< css::lang::XMultiServiceFactory >& xFactory )
142cdf0e10cSrcweir 		//	Init baseclasses first
143cdf0e10cSrcweir         :   ThreadHelpBase      (          )
144cdf0e10cSrcweir         ,   ::cppu::OWeakObject (          )
145cdf0e10cSrcweir         // Init member
146cdf0e10cSrcweir         ,   m_xFactory          ( xFactory )
147cdf0e10cSrcweir {
148cdf0e10cSrcweir }
149cdf0e10cSrcweir 
150cdf0e10cSrcweir /*-************************************************************************************************************//**
151cdf0e10cSrcweir     @short      standard dtor
152cdf0e10cSrcweir     @descr      -
153cdf0e10cSrcweir 
154cdf0e10cSrcweir     @seealso    -
155cdf0e10cSrcweir 
156cdf0e10cSrcweir     @param      -
157cdf0e10cSrcweir     @return     -
158cdf0e10cSrcweir 
159cdf0e10cSrcweir     @onerror    -
160cdf0e10cSrcweir     @threadsafe -
161cdf0e10cSrcweir *//*-*************************************************************************************************************/
~Oxt_Handler()162cdf0e10cSrcweir Oxt_Handler::~Oxt_Handler()
163cdf0e10cSrcweir {
164cdf0e10cSrcweir     if ( m_xListener.is() )
165cdf0e10cSrcweir     {
166cdf0e10cSrcweir         css::frame::DispatchResultEvent aEvent;
167cdf0e10cSrcweir         aEvent.State = css::frame::DispatchResultState::FAILURE;
168cdf0e10cSrcweir         m_xListener->dispatchFinished( aEvent );
169cdf0e10cSrcweir         m_xListener = css::uno::Reference< css::frame::XDispatchResultListener >();
170cdf0e10cSrcweir     }
171cdf0e10cSrcweir }
172cdf0e10cSrcweir 
173cdf0e10cSrcweir /*-************************************************************************************************************//**
174cdf0e10cSrcweir     @interface  ::com::sun::star::frame::XDispatch
175cdf0e10cSrcweir 
176cdf0e10cSrcweir     @short      try to load audio file
177cdf0e10cSrcweir     @descr      This method try to load given audio file by URL and play it. We use vcl/Sound class to do that.
178cdf0e10cSrcweir                 Playing of sound is asynchron everytime.
179cdf0e10cSrcweir 
180cdf0e10cSrcweir     @attention  We must hold us alive by ourself ... because we use async. vcl sound player ... but playing is started
181cdf0e10cSrcweir                 in async interface call "dispatch()" too. And caller forget us imediatly. But then our uno ref count
182cdf0e10cSrcweir                 will decreased to 0 and will die. The only solution is to use own reference to our implementation.
183cdf0e10cSrcweir                 But we do it for realy started jobs only and release it during call back of vcl.
184cdf0e10cSrcweir 
185cdf0e10cSrcweir     @seealso    class vcl/Sound
186cdf0e10cSrcweir     @seealso    method implts_PlayerNotify()
187cdf0e10cSrcweir 
188cdf0e10cSrcweir     @param      "aURL"      , URL to dispatch.
189cdf0e10cSrcweir     @param      "lArguments", list of optional arguments.
190cdf0e10cSrcweir     @return     -
191cdf0e10cSrcweir 
192cdf0e10cSrcweir     @onerror    We do nothing.
193cdf0e10cSrcweir     @threadsafe yes
194cdf0e10cSrcweir *//*-*************************************************************************************************************/
dispatchWithNotification(const css::util::URL & aURL,const css::uno::Sequence<css::beans::PropertyValue> &,const css::uno::Reference<css::frame::XDispatchResultListener> & xListener)195cdf0e10cSrcweir void SAL_CALL Oxt_Handler::dispatchWithNotification( const css::util::URL& aURL,
196cdf0e10cSrcweir                                                      const css::uno::Sequence< css::beans::PropertyValue >&            /*lArguments*/,
197cdf0e10cSrcweir                                                      const css::uno::Reference< css::frame::XDispatchResultListener >& xListener )
198cdf0e10cSrcweir     throw( css::uno::RuntimeException )
199cdf0e10cSrcweir {
200cdf0e10cSrcweir     // SAFE {
201cdf0e10cSrcweir     ResetableGuard aLock( m_aLock );
202cdf0e10cSrcweir 
203cdf0e10cSrcweir     rtl::OUString sServiceName = UNISTRING( "com.sun.star.deployment.ui.PackageManagerDialog" );
204cdf0e10cSrcweir     css::uno::Sequence< css::uno::Any > lParams(1);
205cdf0e10cSrcweir     lParams[0] <<= aURL.Main;
206cdf0e10cSrcweir 
207cdf0e10cSrcweir     css::uno::Reference< css::uno::XInterface > xService;
208cdf0e10cSrcweir 
209cdf0e10cSrcweir     xService = m_xFactory->createInstanceWithArguments( sServiceName, lParams );
210cdf0e10cSrcweir     css::uno::Reference< css::task::XJobExecutor > xExecuteable( xService, css::uno::UNO_QUERY );
211cdf0e10cSrcweir     if ( xExecuteable.is() )
212cdf0e10cSrcweir         xExecuteable->trigger( rtl::OUString() );
213cdf0e10cSrcweir 
214cdf0e10cSrcweir     if ( xListener.is() )
215cdf0e10cSrcweir     {
216cdf0e10cSrcweir         css::frame::DispatchResultEvent aEvent;
217cdf0e10cSrcweir         aEvent.State = css::frame::DispatchResultState::SUCCESS;
218cdf0e10cSrcweir         xListener->dispatchFinished( aEvent );
219cdf0e10cSrcweir     }
220cdf0e10cSrcweir 
221cdf0e10cSrcweir /*
222cdf0e10cSrcweir     // Try to initialize player.
223cdf0e10cSrcweir     m_xListener = xListener;
224cdf0e10cSrcweir     if (m_aPlayer.SetSoundName(aURL.Complete))
225cdf0e10cSrcweir     {
226cdf0e10cSrcweir         // OK- we can start async playing ...
227cdf0e10cSrcweir         // Count this request and initialize self-holder against dieing by uno ref count ...
228cdf0e10cSrcweir         m_xSelfHold = css::uno::Reference< css::uno::XInterface >(static_cast< ::cppu::OWeakObject* >(this), css::uno::UNO_QUERY);
229cdf0e10cSrcweir         m_aPlayer.Play();
230cdf0e10cSrcweir     }
231cdf0e10cSrcweir */
232cdf0e10cSrcweir     // } SAFE
233cdf0e10cSrcweir     aLock.unlock();
234cdf0e10cSrcweir }
235cdf0e10cSrcweir 
dispatch(const css::util::URL & aURL,const css::uno::Sequence<css::beans::PropertyValue> & lArguments)236cdf0e10cSrcweir void SAL_CALL Oxt_Handler::dispatch( const css::util::URL&                                  aURL       ,
237cdf0e10cSrcweir                                      const css::uno::Sequence< css::beans::PropertyValue >& lArguments )
238cdf0e10cSrcweir     throw( css::uno::RuntimeException )
239cdf0e10cSrcweir {
240cdf0e10cSrcweir     dispatchWithNotification( aURL, lArguments, css::uno::Reference< css::frame::XDispatchResultListener >() );
241cdf0e10cSrcweir }
242cdf0e10cSrcweir 
243cdf0e10cSrcweir /*-************************************************************************************************************//**
244cdf0e10cSrcweir     @interface  ::com::sun::star::document::XExtendedFilterDetection
245cdf0e10cSrcweir 
246cdf0e10cSrcweir     @short      try to detect file (given as argument included in "lDescriptor")
247cdf0e10cSrcweir     @descr      We try to detect, if given file could be handled by this class and is a well known one.
248cdf0e10cSrcweir                 If it is - we return right internal type name - otherwise we return nothing!
249cdf0e10cSrcweir                 So call can search for another detect service and ask him too.
250cdf0e10cSrcweir 
251cdf0e10cSrcweir     @attention  a) We don't need any mutex here ... because we don't use any member!
252cdf0e10cSrcweir                 b) Dont' use internal player instance "m_pPlayer" to detect given sound file!
253cdf0e10cSrcweir                    It's not neccessary to do that ... and we can use temp. variable to do the same.
254cdf0e10cSrcweir                    This way is easy - we don't must synchronize it with currently played sounds!
255cdf0e10cSrcweir                    Another reason to do so ... We are a listener on our internal ma_Player object.
256cdf0e10cSrcweir                    If you would call "IsSoundFile()" on this instance, he would call us back and
257cdf0e10cSrcweir                    we make some uneccssary things ...
258cdf0e10cSrcweir 
259cdf0e10cSrcweir     @seealso    -
260cdf0e10cSrcweir 
261cdf0e10cSrcweir     @param      "lDescriptor", description of file to detect
262cdf0e10cSrcweir     @return     Internal type name which match this file ... or nothing if it is unknown.
263cdf0e10cSrcweir 
264cdf0e10cSrcweir     @onerror    We return nothing.
265cdf0e10cSrcweir     @threadsafe yes
266cdf0e10cSrcweir *//*-*************************************************************************************************************/
detect(css::uno::Sequence<css::beans::PropertyValue> & lDescriptor)267cdf0e10cSrcweir ::rtl::OUString SAL_CALL Oxt_Handler::detect( css::uno::Sequence< css::beans::PropertyValue >& lDescriptor )
268cdf0e10cSrcweir     throw( css::uno::RuntimeException )
269cdf0e10cSrcweir {
270cdf0e10cSrcweir     // Our default is "nothing". So we can return it, if detection failed or fily type is realy unknown.
271cdf0e10cSrcweir     ::rtl::OUString sTypeName;
272cdf0e10cSrcweir 
273cdf0e10cSrcweir     // Analyze given descriptor to find filename or input stream or ...
274cdf0e10cSrcweir     ::comphelper::MediaDescriptor aDescriptor( lDescriptor );
275cdf0e10cSrcweir     ::rtl::OUString               sURL       = aDescriptor.getUnpackedValueOrDefault( ::comphelper::MediaDescriptor::PROP_URL(), ::rtl::OUString() );
276cdf0e10cSrcweir 
277cdf0e10cSrcweir     long nLength = sURL.getLength();
278cdf0e10cSrcweir     if ( ( nLength > 4 ) && sURL.matchIgnoreAsciiCase( UNISTRING(".oxt"), nLength-4 ) )
279cdf0e10cSrcweir     {
280cdf0e10cSrcweir         // "IsSoundFile" idffer between different "wav" and "au" file versions ...
281cdf0e10cSrcweir         // couldn't return this information ... because: He use the OS to detect it!
282cdf0e10cSrcweir         // I think we can the following ones:
283cdf0e10cSrcweir         //  a) look for given extension of url to map our type decision HARD CODED!!!
284cdf0e10cSrcweir         //  b) return preferred type every time... it's easy :-)
285cdf0e10cSrcweir         sTypeName = ::rtl::OUString::createFromAscii("oxt_OpenOffice_Extension");
286cdf0e10cSrcweir         aDescriptor[::comphelper::MediaDescriptor::PROP_TYPENAME()] <<= sTypeName;
287cdf0e10cSrcweir         aDescriptor >> lDescriptor;
288cdf0e10cSrcweir     }
289cdf0e10cSrcweir 
290cdf0e10cSrcweir     // Return our decision.
291cdf0e10cSrcweir     return sTypeName;
292cdf0e10cSrcweir }
293cdf0e10cSrcweir 
294cdf0e10cSrcweir } // namespace framework
295