2010-10-12 15:53:47 +02:00
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2012-11-12 17:21:24 +00:00
/*
* This file is part of the LibreOffice project .
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License , v . 2.0 . If a copy of the MPL was not distributed with this
* file , You can obtain one at http : //mozilla.org/MPL/2.0/.
*
* This file incorporates work covered by the following license notice :
*
* Licensed to the Apache Software Foundation ( ASF ) under one or more
* contributor license agreements . See the NOTICE file distributed
* with this work for additional information regarding copyright
* ownership . The ASF licenses this file to you under the Apache
* License , Version 2.0 ( the " License " ) ; you may not use this file
* except in compliance with the License . You may obtain a copy of
* the License at http : //www.apache.org/licenses/LICENSE-2.0 .
*/
2005-11-11 13:13:34 +00:00
# include <dispatch/systemexec.hxx>
# include <threadhelp/readguard.hxx>
# include <general.h>
# include <services.h>
2012-10-17 13:54:31 +02:00
# include <com/sun/star/system/SystemShellExecute.hpp>
2012-05-30 16:45:36 +02:00
# include <com/sun/star/util/PathSubstitution.hpp>
2005-11-11 13:13:34 +00:00
# include <com/sun/star/util/XStringSubstitution.hpp>
# include <com/sun/star/system/SystemShellExecuteFlags.hpp>
# include <com/sun/star/frame/DispatchResultState.hpp>
# include <vcl/svapp.hxx>
2012-09-19 13:15:15 +02:00
# include <comphelper/processfactory.hxx>
2005-11-11 13:13:34 +00:00
namespace framework {
# define PROTOCOL_VALUE "systemexecute:"
# define PROTOCOL_LENGTH 14
//_________________________________________________________________________________________________________________
// XInterface, XTypeProvider, XServiceInfo
DEFINE_XINTERFACE_5 ( SystemExec ,
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 ) )
DEFINE_XTYPEPROVIDER_5 ( SystemExec ,
css : : lang : : XTypeProvider ,
css : : lang : : XServiceInfo ,
css : : frame : : XDispatchProvider ,
css : : frame : : XNotifyingDispatch ,
css : : frame : : XDispatch )
2012-10-17 13:54:31 +02:00
DEFINE_XSERVICEINFO_MULTISERVICE_2 ( SystemExec ,
2005-11-11 13:13:34 +00:00
: : cppu : : OWeakObject ,
SERVICENAME_PROTOCOLHANDLER ,
IMPLEMENTATIONNAME_SYSTEMEXEC )
DEFINE_INIT_SERVICE ( SystemExec ,
{
/*Attention
I think we don ' t need any mutex or lock here . . . because we are called by our own static method impl_createInstance ( )
to create a new instance of this class by our own supported service factory .
see macro DEFINE_XSERVICEINFO_MULTISERVICE and " impl_initService() " for further informations !
*/
}
)
//_________________________________________________________________________________________________________________
2012-10-17 13:54:31 +02:00
SystemExec : : SystemExec ( const css : : uno : : Reference < css : : uno : : XComponentContext > & rxContext )
2005-11-11 13:13:34 +00:00
// Init baseclasses first
: ThreadHelpBase ( & Application : : GetSolarMutex ( ) )
, OWeakObject ( )
// Init member
2012-10-17 13:54:31 +02:00
, m_xContext ( rxContext )
2005-11-11 13:13:34 +00:00
{
}
//_________________________________________________________________________________________________________________
SystemExec : : ~ SystemExec ( )
{
2012-10-17 13:54:31 +02:00
m_xContext = NULL ;
2005-11-11 13:13:34 +00:00
}
//_________________________________________________________________________________________________________________
css : : uno : : Reference < css : : frame : : XDispatch > SAL_CALL SystemExec : : queryDispatch ( const css : : util : : URL & aURL ,
2006-06-19 10:17:32 +00:00
const : : rtl : : OUString & ,
sal_Int32 ) throw ( css : : uno : : RuntimeException )
2005-11-11 13:13:34 +00:00
{
css : : uno : : Reference < css : : frame : : XDispatch > xDispatcher ;
if ( aURL . Complete . compareToAscii ( PROTOCOL_VALUE , PROTOCOL_LENGTH ) = = 0 )
xDispatcher = this ;
return xDispatcher ;
}
//_________________________________________________________________________________________________________________
css : : uno : : Sequence < css : : uno : : Reference < css : : frame : : XDispatch > > SAL_CALL SystemExec : : queryDispatches ( const css : : uno : : Sequence < css : : frame : : DispatchDescriptor > & lDescriptor ) throw ( css : : uno : : RuntimeException )
{
sal_Int32 nCount = lDescriptor . getLength ( ) ;
css : : uno : : Sequence < css : : uno : : Reference < css : : frame : : XDispatch > > lDispatcher ( nCount ) ;
for ( sal_Int32 i = 0 ; i < nCount ; + + i )
{
lDispatcher [ i ] = this - > queryDispatch (
lDescriptor [ i ] . FeatureURL ,
lDescriptor [ i ] . FrameName ,
lDescriptor [ i ] . SearchFlags ) ;
}
return lDispatcher ;
}
//_________________________________________________________________________________________________________________
void SAL_CALL SystemExec : : dispatch ( const css : : util : : URL & aURL ,
const css : : uno : : Sequence < css : : beans : : PropertyValue > & lArguments ) throw ( css : : uno : : RuntimeException )
{
dispatchWithNotification ( aURL , lArguments , css : : uno : : Reference < css : : frame : : XDispatchResultListener > ( ) ) ;
}
//_________________________________________________________________________________________________________________
void SAL_CALL SystemExec : : dispatchWithNotification ( const css : : util : : URL & aURL ,
2006-06-19 10:17:32 +00:00
const css : : uno : : Sequence < css : : beans : : PropertyValue > & ,
2005-11-11 13:13:34 +00:00
const css : : uno : : Reference < css : : frame : : XDispatchResultListener > & xListener ) throw ( css : : uno : : RuntimeException )
{
// convert "systemexec:file:///c:/temp/test.html" => "file:///c:/temp/test.html"
sal_Int32 c = aURL . Complete . getLength ( ) - PROTOCOL_LENGTH ;
if ( c < 1 ) // we dont check for valid URLs here! The system will show an error message ...
{
impl_notifyResultListener ( xListener , css : : frame : : DispatchResultState : : FAILURE ) ;
return ;
}
: : rtl : : OUString sSystemURLWithVariables = aURL . Complete . copy ( PROTOCOL_LENGTH , c ) ;
// SAFE ->
ReadGuard aReadLock ( m_aLock ) ;
2012-10-17 13:54:31 +02:00
css : : uno : : Reference < css : : uno : : XComponentContext > xContext = m_xContext ;
2005-11-11 13:13:34 +00:00
aReadLock . unlock ( ) ;
// <- SAFE
// TODO check security settings ...
try
{
2012-05-30 16:45:36 +02:00
css : : uno : : Reference < css : : util : : XStringSubstitution > xPathSubst ( css : : util : : PathSubstitution : : create ( xContext ) ) ;
2005-11-11 13:13:34 +00:00
: : rtl : : OUString sSystemURL = xPathSubst - > substituteVariables ( sSystemURLWithVariables , sal_True ) ; // sal_True force an exception if unknown variables exists !
2012-10-17 13:54:31 +02:00
css : : uno : : Reference < css : : system : : XSystemShellExecute > xShell = css : : system : : SystemShellExecute : : create ( xContext ) ;
2005-11-11 13:13:34 +00:00
2012-03-16 11:16:14 +01:00
xShell - > execute ( sSystemURL , : : rtl : : OUString ( ) , css : : system : : SystemShellExecuteFlags : : URIS_ONLY ) ;
2005-11-11 13:13:34 +00:00
impl_notifyResultListener ( xListener , css : : frame : : DispatchResultState : : SUCCESS ) ;
}
catch ( const css : : uno : : Exception & )
{
impl_notifyResultListener ( xListener , css : : frame : : DispatchResultState : : FAILURE ) ;
}
}
//_________________________________________________________________________________________________________________
2006-06-19 10:17:32 +00:00
void SAL_CALL SystemExec : : addStatusListener ( const css : : uno : : Reference < css : : frame : : XStatusListener > & ,
const css : : util : : URL & ) throw ( css : : uno : : RuntimeException )
2005-11-11 13:13:34 +00:00
{
// not suported yet
}
//_________________________________________________________________________________________________________________
2006-06-19 10:17:32 +00:00
void SAL_CALL SystemExec : : removeStatusListener ( const css : : uno : : Reference < css : : frame : : XStatusListener > & ,
const css : : util : : URL & ) throw ( css : : uno : : RuntimeException )
2005-11-11 13:13:34 +00:00
{
// not suported yet
}
//_________________________________________________________________________________________________________________
void SystemExec : : impl_notifyResultListener ( const css : : uno : : Reference < css : : frame : : XDispatchResultListener > & xListener ,
const sal_Int16 nState )
{
if ( xListener . is ( ) )
{
css : : frame : : DispatchResultEvent aEvent ;
aEvent . State = nState ;
xListener - > dispatchFinished ( aEvent ) ;
}
}
} // namespace framework
2010-10-12 15:53:47 +02:00
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */