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