2000-09-18 15:18:56 +00:00
/*************************************************************************
*
2005-09-08 08:39:56 +00:00
* OpenOffice . org - a multi - platform office productivity suite
2000-09-18 15:18:56 +00:00
*
2005-09-08 08:39:56 +00:00
* $ RCSfile : unoexe . cxx , v $
2000-09-18 15:18:56 +00:00
*
2005-09-08 08:39:56 +00:00
* $ Revision : 1.20 $
2000-09-18 15:18:56 +00:00
*
2005-09-08 08:39:56 +00:00
* last change : $ Author : rt $ $ Date : 2005 - 09 - 08 09 : 39 : 56 $
2000-09-18 15:18:56 +00:00
*
2005-09-08 08:39:56 +00:00
* The Contents of this file are made available subject to
* the terms of GNU Lesser General Public License Version 2.1 .
2000-09-18 15:18:56 +00:00
*
*
2005-09-08 08:39:56 +00:00
* GNU Lesser General Public License Version 2.1
* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
* Copyright 2005 by Sun Microsystems , Inc .
* 901 San Antonio Road , Palo Alto , CA 94303 , USA
2000-09-18 15:18:56 +00:00
*
2005-09-08 08:39:56 +00:00
* This library is free software ; you can redistribute it and / or
* modify it under the terms of the GNU Lesser General Public
* License version 2.1 , as published by the Free Software Foundation .
2000-09-18 15:18:56 +00:00
*
2005-09-08 08:39:56 +00:00
* This library is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the GNU
* Lesser General Public License for more details .
2000-09-18 15:18:56 +00:00
*
2005-09-08 08:39:56 +00:00
* You should have received a copy of the GNU Lesser General Public
* License along with this library ; if not , write to the Free Software
* Foundation , Inc . , 59 Temple Place , Suite 330 , Boston ,
* MA 02111 - 1307 USA
2000-09-18 15:18:56 +00:00
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
# include <stdio.h>
2000-11-22 22:17:29 +00:00
# include <vector>
2000-09-18 15:18:56 +00:00
2004-10-28 15:22:40 +00:00
# include "sal/main.h"
2000-09-18 15:18:56 +00:00
# include <osl/diagnose.h>
# include <osl/mutex.hxx>
# include <osl/conditn.hxx>
# include <osl/module.h>
2001-05-28 14:31:06 +00:00
# include <rtl/process.h>
2000-09-18 15:18:56 +00:00
# include <rtl/string.h>
# include <rtl/strbuf.hxx>
# include <rtl/ustrbuf.hxx>
# include <uno/environment.h>
# include <uno/mapping.hxx>
# include <cppuhelper/factory.hxx>
2001-05-10 12:05:49 +00:00
# include <cppuhelper/bootstrap.hxx>
2000-09-18 15:18:56 +00:00
# include <cppuhelper/servicefactory.hxx>
2001-03-12 17:57:50 +00:00
# include <cppuhelper/shlib.hxx>
2000-09-18 15:18:56 +00:00
# include <cppuhelper/implbase1.hxx>
# include <com/sun/star/lang/XMain.hpp>
# include <com/sun/star/lang/XInitialization.hpp>
# include <com/sun/star/lang/XComponent.hpp>
# include <com/sun/star/lang/XSingleServiceFactory.hpp>
# include <com/sun/star/lang/XMultiServiceFactory.hpp>
# include <com/sun/star/lang/XEventListener.hpp>
# include <com/sun/star/container/XSet.hpp>
# include <com/sun/star/loader/XImplementationLoader.hpp>
# include <com/sun/star/registry/XSimpleRegistry.hpp>
# include <com/sun/star/registry/XRegistryKey.hpp>
# include <com/sun/star/connection/XAcceptor.hpp>
# include <com/sun/star/connection/XConnection.hpp>
# include <com/sun/star/bridge/XBridgeFactory.hpp>
# include <com/sun/star/bridge/XBridge.hpp>
2001-08-17 12:09:50 +00:00
# ifndef _OSL_PROCESS_H_
# include <osl/process.h>
# endif
# ifndef _OSL_THREAD_H_
# include <osl/thread.h>
# endif
# ifndef _OSL_FILE_HXX_
# include <osl/file.hxx>
# endif
# ifdef SAL_UNX
# define SEPARATOR ' / '
# else
# define SEPARATOR '\\'
# endif
2000-09-18 15:18:56 +00:00
using namespace std ;
using namespace rtl ;
using namespace osl ;
using namespace cppu ;
using namespace com : : sun : : star : : uno ;
using namespace com : : sun : : star : : lang ;
using namespace com : : sun : : star : : loader ;
using namespace com : : sun : : star : : registry ;
using namespace com : : sun : : star : : connection ;
using namespace com : : sun : : star : : bridge ;
using namespace com : : sun : : star : : container ;
namespace unoexe
{
2001-08-17 12:09:50 +00:00
static sal_Bool isFileUrl ( const OUString & fileName )
{
if ( fileName . indexOf ( OUString : : createFromAscii ( " file:// " ) ) = = 0 )
return sal_True ;
return sal_False ;
}
static OUString convertToFileUrl ( const OUString & fileName )
{
if ( isFileUrl ( fileName ) )
{
return fileName ;
}
OUString uUrlFileName ;
if ( fileName . indexOf ( ' . ' ) = = 0 | | fileName . indexOf ( SEPARATOR ) < 0 )
{
OUString uWorkingDir ;
OSL_VERIFY ( osl_getProcessWorkingDir ( & uWorkingDir . pData ) = = osl_Process_E_None ) ;
OSL_VERIFY ( FileBase : : getAbsoluteFileURL ( uWorkingDir , fileName , uUrlFileName ) = = FileBase : : E_None ) ;
} else
{
OSL_VERIFY ( FileBase : : getFileURLFromSystemPath ( fileName , uUrlFileName ) = = FileBase : : E_None ) ;
}
return uUrlFileName ;
}
2004-06-11 11:33:40 +00:00
static sal_Bool s_quiet = false ;
2000-09-18 15:18:56 +00:00
//--------------------------------------------------------------------------------------------------
static inline void out ( const sal_Char * pText )
{
2004-06-11 11:33:40 +00:00
if ( ! s_quiet )
fprintf ( stderr , pText ) ;
2000-09-18 15:18:56 +00:00
}
//--------------------------------------------------------------------------------------------------
static inline void out ( const OUString & rText )
{
2004-06-11 11:33:40 +00:00
if ( ! s_quiet )
{
OString aText ( OUStringToOString ( rText , RTL_TEXTENCODING_ASCII_US ) ) ;
fprintf ( stderr , aText . getStr ( ) ) ;
}
2000-09-18 15:18:56 +00:00
}
//--------------------------------------------------------------------------------------------------
static const char arUsingText [ ] =
" \n using: \n \n "
2004-06-11 11:33:40 +00:00
" uno [-c ComponentImplementationName -l LocationUrl | -s ServiceName] \n "
2001-02-07 12:18:11 +00:00
" [-ro ReadOnlyRegistry1] [-ro ReadOnlyRegistry2] ... [-rw ReadWriteRegistry] \n "
2004-06-11 11:33:40 +00:00
" [-u uno:(socket[,host=HostName][,port=nnn]|pipe[,name=PipeName]);<protocol>;Name \n "
2000-09-18 15:18:56 +00:00
" [--singleaccept] [--singleinstance]] \n "
2004-06-11 11:33:40 +00:00
" [--quiet] \n "
2000-09-18 15:18:56 +00:00
" [-- Argument1 Argument2 ...] \n " ;
//--------------------------------------------------------------------------------------------------
2001-05-28 14:31:06 +00:00
static sal_Bool readOption ( OUString * pValue , const sal_Char * pOpt ,
sal_Int32 * pnIndex , const OUString & aArg )
2000-09-18 15:18:56 +00:00
throw ( RuntimeException )
{
2001-05-28 14:31:06 +00:00
const OUString dash = OUString ( RTL_CONSTASCII_USTRINGPARAM ( " - " ) ) ;
if ( aArg . indexOf ( dash ) ! = 0 )
2001-02-07 12:18:11 +00:00
return sal_False ;
2000-09-18 15:18:56 +00:00
2001-05-28 14:31:06 +00:00
OUString aOpt = OUString : : createFromAscii ( pOpt ) ;
2001-02-07 12:18:11 +00:00
if ( aArg . getLength ( ) < aOpt . getLength ( ) )
return sal_False ;
2001-05-28 14:31:06 +00:00
if ( aOpt . equalsIgnoreAsciiCase ( aArg . copy ( 1 ) ) )
2000-09-18 15:18:56 +00:00
{
2001-02-07 12:18:11 +00:00
// take next argument
+ + ( * pnIndex ) ;
2001-05-28 14:31:06 +00:00
rtl_getAppCommandArg ( * pnIndex , & pValue - > pData ) ;
2001-06-29 07:59:01 +00:00
if ( * pnIndex > = ( sal_Int32 ) rtl_getAppCommandArgCount ( ) | | pValue - > copy ( 1 ) . equals ( dash ) )
2000-09-18 15:18:56 +00:00
{
2001-02-07 12:18:11 +00:00
OUStringBuffer buf ( 32 ) ;
buf . appendAscii ( RTL_CONSTASCII_STRINGPARAM ( " incomplete option \" - " ) ) ;
buf . appendAscii ( pOpt ) ;
buf . appendAscii ( RTL_CONSTASCII_STRINGPARAM ( " \" given! " ) ) ;
throw RuntimeException ( buf . makeStringAndClear ( ) , Reference < XInterface > ( ) ) ;
2000-09-18 15:18:56 +00:00
}
2001-02-07 12:18:11 +00:00
else
2000-09-18 15:18:56 +00:00
{
2003-04-15 15:44:12 +00:00
# if OSL_DEBUG_LEVEL > 1
2001-02-07 12:18:11 +00:00
out ( " \n > identified option - " ) ;
out ( pOpt ) ;
out ( " = " ) ;
2001-05-28 14:31:06 +00:00
OString tmp = OUStringToOString ( aArg , RTL_TEXTENCODING_ASCII_US ) ;
out ( tmp . getStr ( ) ) ;
2001-02-07 12:18:11 +00:00
# endif
+ + ( * pnIndex ) ;
return sal_True ;
2000-09-18 15:18:56 +00:00
}
2001-02-07 12:18:11 +00:00
}
2001-05-28 14:31:06 +00:00
else if ( aArg . indexOf ( aOpt ) = = 1 )
2001-02-07 12:18:11 +00:00
{
2001-05-28 14:31:06 +00:00
* pValue = aArg . copy ( 1 + aOpt . getLength ( ) ) ;
2003-04-15 15:44:12 +00:00
# if OSL_DEBUG_LEVEL > 1
2001-02-07 12:18:11 +00:00
out ( " \n > identified option - " ) ;
out ( pOpt ) ;
out ( " = " ) ;
2001-05-28 14:31:06 +00:00
OString tmp = OUStringToOString ( aArg . copy ( aOpt . getLength ( ) ) , RTL_TEXTENCODING_ASCII_US ) ;
out ( tmp . getStr ( ) ) ;
2001-02-07 12:18:11 +00:00
# endif
2000-09-18 15:18:56 +00:00
+ + ( * pnIndex ) ;
2001-05-28 14:31:06 +00:00
2000-09-18 15:18:56 +00:00
return sal_True ;
}
return sal_False ;
}
//--------------------------------------------------------------------------------------------------
static sal_Bool readOption ( sal_Bool * pbOpt , const sal_Char * pOpt ,
2001-05-28 14:31:06 +00:00
sal_Int32 * pnIndex , const OUString & aArg )
2000-09-18 15:18:56 +00:00
{
2001-05-28 14:31:06 +00:00
const OUString dashdash ( RTL_CONSTASCII_USTRINGPARAM ( " -- " ) ) ;
OUString aOpt = OUString : : createFromAscii ( pOpt ) ;
if ( aArg . indexOf ( dashdash ) = = 0 & & aOpt . equals ( aArg . copy ( 2 ) ) )
2000-09-18 15:18:56 +00:00
{
+ + ( * pnIndex ) ;
* pbOpt = sal_True ;
2003-04-15 15:44:12 +00:00
# if OSL_DEBUG_LEVEL > 1
2001-02-07 12:18:11 +00:00
out ( " \n > identified option -- " ) ;
out ( pOpt ) ;
# endif
2000-09-18 15:18:56 +00:00
return sal_True ;
}
return sal_False ;
}
//##################################################################################################
//##################################################################################################
//##################################################################################################
//--------------------------------------------------------------------------------------------------
template < class T >
2001-03-12 17:57:50 +00:00
void createInstance (
Reference < T > & rxOut ,
2001-05-10 12:05:49 +00:00
const Reference < XComponentContext > & xContext ,
2001-03-12 17:57:50 +00:00
const OUString & rServiceName )
2000-09-18 15:18:56 +00:00
throw ( Exception )
{
2001-05-10 12:05:49 +00:00
Reference < XMultiComponentFactory > xMgr ( xContext - > getServiceManager ( ) ) ;
Reference < XInterface > x ( xMgr - > createInstanceWithContext ( rServiceName , xContext ) ) ;
2000-09-18 15:18:56 +00:00
if ( ! x . is ( ) )
{
static sal_Bool s_bSet = sal_False ;
if ( ! s_bSet )
{
MutexGuard aGuard ( Mutex : : getGlobalMutex ( ) ) ;
if ( ! s_bSet )
{
Reference < XSet > xSet ( xMgr , UNO_QUERY ) ;
if ( xSet . is ( ) )
{
2001-05-10 12:05:49 +00:00
Reference < XMultiServiceFactory > xSF ( xMgr , UNO_QUERY ) ;
2000-09-18 15:18:56 +00:00
// acceptor
2001-03-12 17:57:50 +00:00
xSet - > insert ( makeAny ( loadSharedLibComponentFactory (
2003-04-23 15:19:30 +00:00
OUString ( RTL_CONSTASCII_USTRINGPARAM (
" acceptor.uno " SAL_DLLEXTENSION ) ) ,
OUString ( ) ,
OUString ( RTL_CONSTASCII_USTRINGPARAM (
" com.sun.star.comp.io.Acceptor " ) ) ,
2001-05-10 12:05:49 +00:00
xSF , Reference < XRegistryKey > ( ) ) ) ) ;
2000-09-18 15:18:56 +00:00
// connector
2001-03-12 17:57:50 +00:00
xSet - > insert ( makeAny ( loadSharedLibComponentFactory (
2003-04-23 15:19:30 +00:00
OUString ( RTL_CONSTASCII_USTRINGPARAM (
" connector.uno " SAL_DLLEXTENSION ) ) ,
OUString ( ) ,
OUString ( RTL_CONSTASCII_USTRINGPARAM (
" com.sun.star.comp.io.Connector " ) ) ,
2001-05-10 12:05:49 +00:00
xSF , Reference < XRegistryKey > ( ) ) ) ) ;
2000-09-18 15:18:56 +00:00
// iiop bridge
2001-03-12 17:57:50 +00:00
xSet - > insert ( makeAny ( loadSharedLibComponentFactory (
2003-04-23 15:19:30 +00:00
OUString ( RTL_CONSTASCII_USTRINGPARAM (
" remotebridge.uno " SAL_DLLEXTENSION ) ) ,
OUString ( ) ,
OUString ( RTL_CONSTASCII_USTRINGPARAM (
" com.sun.star.comp.remotebridges. "
" Bridge.various " ) ) ,
2001-05-10 12:05:49 +00:00
xSF , Reference < XRegistryKey > ( ) ) ) ) ;
2000-09-18 15:18:56 +00:00
// bridge factory
2001-03-12 17:57:50 +00:00
xSet - > insert ( makeAny ( loadSharedLibComponentFactory (
2003-04-23 15:19:30 +00:00
OUString ( RTL_CONSTASCII_USTRINGPARAM (
" bridgefac.uno " SAL_DLLEXTENSION ) ) ,
OUString ( ) ,
OUString ( RTL_CONSTASCII_USTRINGPARAM (
" com.sun.star.comp.remotebridges. "
" BridgeFactory " ) ) ,
2001-05-10 12:05:49 +00:00
xSF , Reference < XRegistryKey > ( ) ) ) ) ;
2000-09-18 15:18:56 +00:00
}
s_bSet = sal_True ;
}
}
2001-05-10 12:05:49 +00:00
x = xMgr - > createInstanceWithContext ( rServiceName , xContext ) ;
2000-09-18 15:18:56 +00:00
}
if ( ! x . is ( ) )
{
OUStringBuffer buf ( 64 ) ;
buf . appendAscii ( RTL_CONSTASCII_STRINGPARAM ( " cannot get service instance \" " ) ) ;
buf . append ( rServiceName ) ;
buf . appendAscii ( RTL_CONSTASCII_STRINGPARAM ( " \" ! " ) ) ;
throw RuntimeException ( buf . makeStringAndClear ( ) , Reference < XInterface > ( ) ) ;
}
rxOut = Reference < T > : : query ( x ) ;
if ( ! rxOut . is ( ) )
{
OUStringBuffer buf ( 64 ) ;
buf . appendAscii ( RTL_CONSTASCII_STRINGPARAM ( " service instance \" " ) ) ;
buf . append ( rServiceName ) ;
buf . appendAscii ( RTL_CONSTASCII_STRINGPARAM ( " \" does not support demanded interface \" " ) ) ;
const Type & rType = : : getCppuType ( ( const Reference < T > * ) 0 ) ;
buf . append ( rType . getTypeName ( ) ) ;
buf . appendAscii ( RTL_CONSTASCII_STRINGPARAM ( " \" ! " ) ) ;
throw RuntimeException ( buf . makeStringAndClear ( ) , Reference < XInterface > ( ) ) ;
}
}
//--------------------------------------------------------------------------------------------------
static Reference < XSimpleRegistry > nestRegistries (
const Reference < XSimpleRegistry > & xReadWrite ,
const Reference < XSimpleRegistry > & xReadOnly )
throw ( Exception )
{
2001-05-10 12:05:49 +00:00
Reference < XSimpleRegistry > xReg ( createNestedRegistry ( ) ) ;
if ( ! xReg . is ( ) )
{
throw RuntimeException (
OUString ( RTL_CONSTASCII_USTRINGPARAM ( " no nested registry service! " ) ) ,
Reference < XInterface > ( ) ) ;
}
2000-09-18 15:18:56 +00:00
Reference < XInitialization > xInit ( xReg , UNO_QUERY ) ;
if ( ! xInit . is ( ) )
throw RuntimeException ( OUString ( RTL_CONSTASCII_USTRINGPARAM ( " nested registry does not export interface \" com.sun.star.lang.XInitialization \" ! " ) ) , Reference < XInterface > ( ) ) ;
Sequence < Any > aArgs ( 2 ) ;
2001-05-10 12:05:49 +00:00
aArgs [ 0 ] < < = xReadWrite ;
aArgs [ 1 ] < < = xReadOnly ;
2000-09-18 15:18:56 +00:00
xInit - > initialize ( aArgs ) ;
return xReg ;
}
//--------------------------------------------------------------------------------------------------
static Reference < XSimpleRegistry > openRegistry (
const OUString & rURL ,
sal_Bool bReadOnly , sal_Bool bCreate )
throw ( Exception )
{
2001-05-10 12:05:49 +00:00
Reference < XSimpleRegistry > xNewReg ( createSimpleRegistry ( ) ) ;
if ( ! xNewReg . is ( ) )
{
throw RuntimeException (
OUString ( RTL_CONSTASCII_USTRINGPARAM ( " no simple registry service! " ) ) ,
Reference < XInterface > ( ) ) ;
}
2000-09-18 15:18:56 +00:00
try
{
2001-08-17 12:09:50 +00:00
xNewReg - > open ( convertToFileUrl ( rURL ) , bReadOnly , bCreate ) ;
2000-09-18 15:18:56 +00:00
if ( xNewReg - > isValid ( ) )
return xNewReg ;
else
xNewReg - > close ( ) ;
}
catch ( Exception & )
{
}
2001-05-10 12:05:49 +00:00
2000-09-18 15:18:56 +00:00
out ( " \n > warning: cannot open registry \" " ) ;
out ( rURL ) ;
if ( bReadOnly )
out ( " \" for reading, ignoring! " ) ;
else
out ( " \" for reading and writing, ignoring! " ) ;
return Reference < XSimpleRegistry > ( ) ;
}
//--------------------------------------------------------------------------------------------------
static Reference < XInterface > loadComponent (
2001-05-10 12:05:49 +00:00
const Reference < XComponentContext > & xContext ,
2000-09-18 15:18:56 +00:00
const OUString & rImplName , const OUString & rLocation )
throw ( Exception )
{
// determine loader to be used
sal_Int32 nDot = rLocation . lastIndexOf ( ' . ' ) ;
if ( nDot > 0 & & nDot < rLocation . getLength ( ) )
{
Reference < XImplementationLoader > xLoader ;
OUString aExt ( rLocation . copy ( nDot + 1 ) ) ;
if ( aExt . compareToAscii ( " dll " ) = = 0 | |
aExt . compareToAscii ( " exe " ) = = 0 | |
2003-08-18 14:11:28 +00:00
aExt . compareToAscii ( " dylib " ) = = 0 | |
2000-09-18 15:18:56 +00:00
aExt . compareToAscii ( " so " ) = = 0 )
{
createInstance (
2001-05-10 12:05:49 +00:00
xLoader , xContext , OUString ( RTL_CONSTASCII_USTRINGPARAM ( " com.sun.star.loader.SharedLibrary " ) ) ) ;
2000-09-18 15:18:56 +00:00
}
else if ( aExt . compareToAscii ( " jar " ) = = 0 | |
aExt . compareToAscii ( " class " ) = = 0 )
{
createInstance (
2001-05-10 12:05:49 +00:00
xLoader , xContext , OUString ( RTL_CONSTASCII_USTRINGPARAM ( " com.sun.star.loader.Java " ) ) ) ;
2000-09-18 15:18:56 +00:00
}
else
{
OUStringBuffer buf ( 64 ) ;
buf . appendAscii ( RTL_CONSTASCII_STRINGPARAM ( " unknown extension of \" " ) ) ;
buf . append ( rLocation ) ;
buf . appendAscii ( RTL_CONSTASCII_STRINGPARAM ( " \" ! No loader available! " ) ) ;
throw RuntimeException ( buf . makeStringAndClear ( ) , Reference < XInterface > ( ) ) ;
}
Reference < XInterface > xInstance ;
// activate
2001-05-10 12:05:49 +00:00
Reference < XInterface > xFactory ( xLoader - > activate (
rImplName , OUString ( ) , rLocation , Reference < XRegistryKey > ( ) ) ) ;
2000-09-18 15:18:56 +00:00
if ( xFactory . is ( ) )
2001-05-10 12:05:49 +00:00
{
Reference < XSingleComponentFactory > xCFac ( xFactory , UNO_QUERY ) ;
if ( xCFac . is ( ) )
{
xInstance = xCFac - > createInstanceWithContext ( xContext ) ;
}
else
{
Reference < XSingleServiceFactory > xSFac ( xFactory , UNO_QUERY ) ;
if ( xSFac . is ( ) )
{
out ( " \n > warning: ignroing context for implementation \" " ) ;
out ( rImplName ) ;
out ( " \" ! " ) ;
xInstance = xSFac - > createInstance ( ) ;
}
}
}
2000-09-18 15:18:56 +00:00
if ( ! xInstance . is ( ) )
{
OUStringBuffer buf ( 64 ) ;
buf . appendAscii ( RTL_CONSTASCII_STRINGPARAM ( " activating component \" " ) ) ;
buf . append ( rImplName ) ;
buf . appendAscii ( RTL_CONSTASCII_STRINGPARAM ( " \" from location \" " ) ) ;
buf . append ( rLocation ) ;
buf . appendAscii ( RTL_CONSTASCII_STRINGPARAM ( " \" failed! " ) ) ;
throw RuntimeException ( buf . makeStringAndClear ( ) , Reference < XInterface > ( ) ) ;
}
return xInstance ;
}
else
{
OUStringBuffer buf ( 64 ) ;
buf . appendAscii ( RTL_CONSTASCII_STRINGPARAM ( " location \" " ) ) ;
buf . append ( rLocation ) ;
buf . appendAscii ( RTL_CONSTASCII_STRINGPARAM ( " \" has no extension! Cannot determine loader to be used! " ) ) ;
throw RuntimeException ( buf . makeStringAndClear ( ) , Reference < XInterface > ( ) ) ;
}
}
//##################################################################################################
//##################################################################################################
//##################################################################################################
//==================================================================================================
class OInstanceProvider
: public WeakImplHelper1 < XInstanceProvider >
{
2001-05-10 12:05:49 +00:00
Reference < XComponentContext > _xContext ;
2000-09-18 15:18:56 +00:00
Mutex _aSingleInstanceMutex ;
Reference < XInterface > _xSingleInstance ;
sal_Bool _bSingleInstance ;
OUString _aImplName ;
OUString _aLocation ;
OUString _aServiceName ;
Sequence < Any > _aInitParams ;
OUString _aInstanceName ;
inline Reference < XInterface > createInstance ( ) throw ( Exception ) ;
public :
2001-05-10 12:05:49 +00:00
OInstanceProvider ( const Reference < XComponentContext > & xContext ,
2000-09-18 15:18:56 +00:00
const OUString & rImplName , const OUString & rLocation ,
const OUString & rServiceName , const Sequence < Any > & rInitParams ,
sal_Bool bSingleInstance , const OUString & rInstanceName )
2001-05-10 12:05:49 +00:00
: _xContext ( xContext )
2000-09-18 15:18:56 +00:00
, _bSingleInstance ( bSingleInstance )
, _aImplName ( rImplName )
, _aLocation ( rLocation )
, _aServiceName ( rServiceName )
2000-11-02 12:58:02 +00:00
, _aInitParams ( rInitParams )
2000-09-18 15:18:56 +00:00
, _aInstanceName ( rInstanceName )
{ }
// XInstanceProvider
virtual Reference < XInterface > SAL_CALL getInstance ( const OUString & rName )
throw ( NoSuchElementException , RuntimeException ) ;
} ;
//__________________________________________________________________________________________________
inline Reference < XInterface > OInstanceProvider : : createInstance ( )
throw ( Exception )
{
Reference < XInterface > xRet ;
if ( _aImplName . getLength ( ) ) // manually via loader
2001-05-10 12:05:49 +00:00
xRet = loadComponent ( _xContext , _aImplName , _aLocation ) ;
2000-09-18 15:18:56 +00:00
else // via service manager
2001-05-10 12:05:49 +00:00
unoexe : : createInstance ( xRet , _xContext , _aServiceName ) ;
2000-09-18 15:18:56 +00:00
// opt XInit
Reference < XInitialization > xInit ( xRet , UNO_QUERY ) ;
if ( xInit . is ( ) )
xInit - > initialize ( _aInitParams ) ;
return xRet ;
}
//__________________________________________________________________________________________________
Reference < XInterface > OInstanceProvider : : getInstance ( const OUString & rName )
throw ( NoSuchElementException , RuntimeException )
{
try
{
if ( _aInstanceName = = rName )
{
Reference < XInterface > xRet ;
2004-06-11 11:33:40 +00:00
if ( _aImplName . getLength ( ) = = 0 & & _aServiceName . getLength ( ) = = 0 )
{
OSL_ASSERT (
rName . equalsAsciiL (
RTL_CONSTASCII_STRINGPARAM ( " uno.ComponentContext " ) ) ) ;
xRet = _xContext ;
}
else if ( _bSingleInstance )
2000-09-18 15:18:56 +00:00
{
if ( ! _xSingleInstance . is ( ) )
{
MutexGuard aGuard ( _aSingleInstanceMutex ) ;
if ( ! _xSingleInstance . is ( ) )
{
_xSingleInstance = createInstance ( ) ;
}
}
xRet = _xSingleInstance ;
}
else
{
xRet = createInstance ( ) ;
}
return xRet ;
}
}
catch ( Exception & rExc )
{
out ( " \n > error: " ) ;
out ( rExc . Message ) ;
}
OUStringBuffer buf ( 64 ) ;
buf . appendAscii ( RTL_CONSTASCII_STRINGPARAM ( " no such element \" " ) ) ;
buf . append ( rName ) ;
buf . appendAscii ( RTL_CONSTASCII_STRINGPARAM ( " \" ! " ) ) ;
throw NoSuchElementException ( buf . makeStringAndClear ( ) , Reference < XInterface > ( ) ) ;
}
//==================================================================================================
struct ODisposingListener : public WeakImplHelper1 < XEventListener >
{
Condition cDisposed ;
// XEventListener
virtual void SAL_CALL disposing ( const EventObject & rEvt )
throw ( RuntimeException ) ;
//----------------------------------------------------------------------------------------------
static void waitFor ( const Reference < XComponent > & xComp ) ;
} ;
//__________________________________________________________________________________________________
void ODisposingListener : : disposing ( const EventObject & rEvt )
throw ( RuntimeException )
{
cDisposed . set ( ) ;
}
//--------------------------------------------------------------------------------------------------
void ODisposingListener : : waitFor ( const Reference < XComponent > & xComp )
{
ODisposingListener * pListener = new ODisposingListener ( ) ;
Reference < XEventListener > xListener ( pListener ) ;
xComp - > addEventListener ( xListener ) ;
pListener - > cDisposed . wait ( ) ;
}
//##################################################################################################
//##################################################################################################
//##################################################################################################
//##################################################################################################
2004-10-28 15:22:40 +00:00
} // namespace unoexe
2000-09-18 15:18:56 +00:00
2004-10-28 15:22:40 +00:00
using namespace unoexe ;
SAL_IMPLEMENT_MAIN_WITH_ARGS ( argc , argv )
2000-09-18 15:18:56 +00:00
{
if ( argc < = 1 )
{
out ( arUsingText ) ;
return 0 ;
}
sal_Int32 nRet = 0 ;
2001-05-10 12:05:49 +00:00
Reference < XComponentContext > xContext ;
2000-09-18 15:18:56 +00:00
2001-05-28 14:31:06 +00:00
2000-09-18 15:18:56 +00:00
try
{
OUString aImplName , aLocation , aServiceName , aUnoUrl ;
2001-02-07 12:18:11 +00:00
vector < OUString > aReadOnlyRegistries ;
2000-09-18 15:18:56 +00:00
Sequence < OUString > aParams ;
sal_Bool bSingleAccept = sal_False ;
sal_Bool bSingleInstance = sal_False ;
//#### read command line arguments #########################################################
2001-02-07 12:18:11 +00:00
bool bOldRegistryMimic = false ;
bool bNewRegistryMimic = false ;
OUString aReadWriteRegistry ;
2001-05-28 14:31:06 +00:00
sal_Int32 nPos = 0 ;
2001-06-29 07:59:01 +00:00
sal_Int32 nCount = ( sal_Int32 ) rtl_getAppCommandArgCount ( ) ;
2000-09-18 15:18:56 +00:00
// read up to arguments
2001-06-29 07:59:01 +00:00
while ( nPos < nCount )
2000-09-18 15:18:56 +00:00
{
2001-05-28 14:31:06 +00:00
OUString arg ;
rtl_getAppCommandArg ( nPos , & arg . pData ) ;
const OUString dashdash = OUString ( RTL_CONSTASCII_USTRINGPARAM ( " -- " ) ) ;
if ( dashdash = = arg )
2000-09-18 15:18:56 +00:00
{
+ + nPos ;
break ;
}
2001-05-28 14:31:06 +00:00
if ( readOption ( & aImplName , " c " , & nPos , arg ) | |
readOption ( & aLocation , " l " , & nPos , arg ) | |
readOption ( & aServiceName , " s " , & nPos , arg ) | |
readOption ( & aUnoUrl , " u " , & nPos , arg ) | |
2004-06-11 11:33:40 +00:00
readOption ( & s_quiet , " quiet " , & nPos , arg ) | |
2001-05-28 14:31:06 +00:00
readOption ( & bSingleAccept , " singleaccept " , & nPos , arg ) | |
readOption ( & bSingleInstance , " singleinstance " , & nPos , arg ) )
2000-09-18 15:18:56 +00:00
{
continue ;
}
OUString aRegistry ;
2001-05-28 14:31:06 +00:00
if ( readOption ( & aRegistry , " ro " , & nPos , arg ) )
2001-02-07 12:18:11 +00:00
{
aReadOnlyRegistries . push_back ( aRegistry ) ;
bNewRegistryMimic = true ;
continue ;
}
2001-05-28 14:31:06 +00:00
if ( readOption ( & aReadWriteRegistry , " rw " , & nPos , arg ) )
2000-09-18 15:18:56 +00:00
{
2001-02-07 12:18:11 +00:00
bNewRegistryMimic = true ;
continue ;
}
2001-05-28 14:31:06 +00:00
if ( readOption ( & aRegistry , " r " , & nPos , arg ) )
2001-02-07 12:18:11 +00:00
{
aReadOnlyRegistries . push_back ( aRegistry ) ;
aReadWriteRegistry = aRegistry ;
out ( " \n > warning: DEPRECATED use of option -r, use -ro or -rw! " ) ;
bOldRegistryMimic = true ;
2000-09-18 15:18:56 +00:00
continue ;
}
// else illegal argument
OUStringBuffer buf ( 64 ) ;
buf . appendAscii ( RTL_CONSTASCII_STRINGPARAM ( " unexpected parameter \" " ) ) ;
2001-05-28 14:31:06 +00:00
buf . append ( arg ) ;
2000-09-18 15:18:56 +00:00
buf . appendAscii ( RTL_CONSTASCII_STRINGPARAM ( " \" ! " ) ) ;
throw RuntimeException ( buf . makeStringAndClear ( ) , Reference < XInterface > ( ) ) ;
}
2001-02-07 12:18:11 +00:00
if ( bOldRegistryMimic ) // last one was set to be read-write
{
aReadOnlyRegistries . pop_back ( ) ;
if ( bOldRegistryMimic & & bNewRegistryMimic )
{
throw RuntimeException (
OUString ( RTL_CONSTASCII_USTRINGPARAM ( " mixing with DEPRECATED registry options! " ) ) ,
Reference < XInterface > ( ) ) ;
}
}
2004-06-11 11:33:40 +00:00
if ( ( aImplName . getLength ( ) ! = 0 ) & & ( aServiceName . getLength ( ) ! = 0 ) )
2000-09-18 15:18:56 +00:00
throw RuntimeException ( OUString ( RTL_CONSTASCII_USTRINGPARAM ( " give component exOR service name! " ) ) , Reference < XInterface > ( ) ) ;
2004-06-11 11:33:40 +00:00
if ( aImplName . getLength ( ) = = 0 & & aServiceName . getLength ( ) = = 0 )
{
if ( ! aUnoUrl . endsWithIgnoreAsciiCaseAsciiL (
RTL_CONSTASCII_STRINGPARAM ( " ;uno.ComponentContext " ) ) )
throw RuntimeException (
OUString ( RTL_CONSTASCII_USTRINGPARAM (
" expected UNO-URL with instance name "
" uno.ComponentContext! " ) ) ,
Reference < XInterface > ( ) ) ;
if ( bSingleInstance )
throw RuntimeException (
OUString ( RTL_CONSTASCII_USTRINGPARAM (
" unexpected option --singleinstance! " ) ) ,
Reference < XInterface > ( ) ) ;
}
2000-09-18 15:18:56 +00:00
if ( aImplName . getLength ( ) & & ! aLocation . getLength ( ) )
throw RuntimeException ( OUString ( RTL_CONSTASCII_USTRINGPARAM ( " give component location! " ) ) , Reference < XInterface > ( ) ) ;
if ( aServiceName . getLength ( ) & & aLocation . getLength ( ) )
out ( " \n > warning: service name given, will ignore location! " ) ;
// read component params
2001-06-29 07:59:01 +00:00
aParams . realloc ( nCount - nPos ) ;
2000-09-18 15:18:56 +00:00
OUString * pParams = aParams . getArray ( ) ;
sal_Int32 nOffset = nPos ;
2001-06-29 07:59:01 +00:00
for ( ; nPos < nCount ; + + nPos )
2000-09-18 15:18:56 +00:00
{
2001-06-29 07:59:01 +00:00
OSL_VERIFY ( rtl_getAppCommandArg ( nPos , & pParams [ nPos - nOffset ] . pData ) = = osl_Process_E_None ) ;
2000-09-18 15:18:56 +00:00
}
2004-06-11 11:33:40 +00:00
if ( aReadOnlyRegistries . size ( ) > 0 | |
aReadWriteRegistry . getLength ( ) > 0 )
2000-09-18 15:18:56 +00:00
{
2004-06-11 11:33:40 +00:00
//#### create registry #############################################
Reference < XSimpleRegistry > xRegistry ;
// ReadOnly registries
for ( size_t nReg = 0 ; nReg < aReadOnlyRegistries . size ( ) ; + + nReg )
{
2003-04-15 15:44:12 +00:00
# if OSL_DEBUG_LEVEL > 1
2004-06-11 11:33:40 +00:00
out ( " \n > trying to open ro registry: " ) ;
out ( OUStringToOString (
aReadOnlyRegistries [ nReg ] ,
RTL_TEXTENCODING_ASCII_US ) . getStr ( ) ) ;
2001-02-07 12:18:11 +00:00
# endif
2004-06-11 11:33:40 +00:00
Reference < XSimpleRegistry > xNewReg (
openRegistry (
aReadOnlyRegistries [ nReg ] , sal_True , sal_False ) ) ;
if ( xNewReg . is ( ) )
xRegistry = ( xRegistry . is ( ) ? nestRegistries (
xNewReg , xRegistry ) : xNewReg ) ;
}
if ( aReadWriteRegistry . getLength ( ) )
{
2003-04-15 15:44:12 +00:00
# if OSL_DEBUG_LEVEL > 1
2004-06-11 11:33:40 +00:00
out ( " \n > trying to open rw registry: " ) ;
out ( OUStringToOString (
aReadWriteRegistry ,
RTL_TEXTENCODING_ASCII_US ) . getStr ( ) ) ;
2001-02-07 12:18:11 +00:00
# endif
2004-06-11 11:33:40 +00:00
// ReadWrite registry
Reference < XSimpleRegistry > xNewReg (
openRegistry ( aReadWriteRegistry , sal_False , sal_True ) ) ;
if ( xNewReg . is ( ) )
xRegistry = ( xRegistry . is ( )
? nestRegistries ( xNewReg , xRegistry )
: xNewReg ) ;
}
2000-09-18 15:18:56 +00:00
2004-06-11 11:33:40 +00:00
OSL_ASSERT ( xRegistry . is ( ) ) ;
xContext = bootstrap_InitialComponentContext ( xRegistry ) ;
}
else // defaulting
2000-09-18 15:18:56 +00:00
{
2004-06-11 11:33:40 +00:00
xContext = defaultBootstrap_InitialComponentContext ( ) ;
2000-09-18 15:18:56 +00:00
}
//#### accept, instanciate, etc. ###########################################################
if ( aUnoUrl . getLength ( ) ) // accepting connections
{
2001-05-11 07:30:13 +00:00
sal_Int32 nIndex = 0 , nTokens = 0 ;
do { aUnoUrl . getToken ( 0 , ' ; ' , nIndex ) ; nTokens + + ; } while ( nIndex ! = - 1 ) ;
if ( nTokens ! = 3 | | aUnoUrl . getLength ( ) < 10 | |
! aUnoUrl . copy ( 0 , 4 ) . equalsIgnoreAsciiCase ( OUString ( RTL_CONSTASCII_USTRINGPARAM ( " uno: " ) ) ) )
2000-09-18 15:18:56 +00:00
{
throw RuntimeException ( OUString ( RTL_CONSTASCII_USTRINGPARAM ( " illegal uno url given! " ) ) , Reference < XInterface > ( ) ) ;
}
2001-05-11 07:30:13 +00:00
nIndex = 0 ;
OUString aConnectDescr ( aUnoUrl . getToken ( 0 , ' ; ' , nIndex ) . copy ( 4 ) ) ; // uno:CONNECTDESCR;iiop;InstanceName
OUString aInstanceName ( aUnoUrl . getToken ( 1 , ' ; ' , nIndex ) ) ;
2000-09-18 15:18:56 +00:00
Reference < XAcceptor > xAcceptor ;
createInstance (
2001-05-10 12:05:49 +00:00
xAcceptor , xContext ,
2000-09-18 15:18:56 +00:00
OUString ( RTL_CONSTASCII_USTRINGPARAM ( " com.sun.star.connection.Acceptor " ) ) ) ;
// init params
Sequence < Any > aInitParams ( aParams . getLength ( ) ) ;
const OUString * pParams = aParams . getConstArray ( ) ;
Any * pInitParams = aInitParams . getArray ( ) ;
for ( sal_Int32 nPos = aParams . getLength ( ) ; nPos - - ; )
{
pInitParams [ nPos ] = makeAny ( pParams [ nPos ] ) ;
}
// instance provider
Reference < XInstanceProvider > xInstanceProvider ( new OInstanceProvider (
2001-05-10 12:05:49 +00:00
xContext , aImplName , aLocation , aServiceName , aInitParams ,
2000-09-18 15:18:56 +00:00
bSingleInstance , aInstanceName ) ) ;
2001-05-11 07:30:13 +00:00
nIndex = 0 ;
OUString aUnoUrlToken ( aUnoUrl . getToken ( 1 , ' ; ' , nIndex ) ) ;
2000-09-18 15:18:56 +00:00
for ( ; ; )
{
// accepting
out ( " \n > accepting " ) ;
out ( aConnectDescr ) ;
out ( " ... " ) ;
Reference < XConnection > xConnection ( xAcceptor - > accept ( aConnectDescr ) ) ;
out ( " connection established. " ) ;
Reference < XBridgeFactory > xBridgeFactory ;
createInstance (
2001-05-10 12:05:49 +00:00
xBridgeFactory , xContext ,
2000-09-18 15:18:56 +00:00
OUString ( RTL_CONSTASCII_USTRINGPARAM ( " com.sun.star.bridge.BridgeFactory " ) ) ) ;
// bridge
Reference < XBridge > xBridge ( xBridgeFactory - > createBridge (
2001-05-11 07:30:13 +00:00
OUString ( ) , aUnoUrlToken ,
2000-09-18 15:18:56 +00:00
xConnection , xInstanceProvider ) ) ;
if ( bSingleAccept )
{
Reference < XComponent > xComp ( xBridge , UNO_QUERY ) ;
if ( ! xComp . is ( ) )
throw RuntimeException ( OUString ( RTL_CONSTASCII_USTRINGPARAM ( " bridge factory does not export interface \" com.sun.star.lang.XComponent \" ! " ) ) , Reference < XInterface > ( ) ) ;
ODisposingListener : : waitFor ( xComp ) ;
break ;
}
}
}
else // no uno url
{
Reference < XInterface > xInstance ;
if ( aImplName . getLength ( ) ) // manually via loader
2001-05-10 12:05:49 +00:00
xInstance = loadComponent ( xContext , aImplName , aLocation ) ;
2000-09-18 15:18:56 +00:00
else // via service manager
2001-05-10 12:05:49 +00:00
createInstance ( xInstance , xContext , aServiceName ) ;
2000-09-18 15:18:56 +00:00
// execution
Reference < XMain > xMain ( xInstance , UNO_QUERY ) ;
if ( xMain . is ( ) )
{
nRet = xMain - > run ( aParams ) ;
}
else
{
Reference < XComponent > xComp ( xInstance , UNO_QUERY ) ;
if ( xComp . is ( ) )
xComp - > dispose ( ) ;
throw RuntimeException ( OUString ( RTL_CONSTASCII_USTRINGPARAM ( " component does not export interface interface \" com.sun.star.lang.XMain \" ! " ) ) , Reference < XInterface > ( ) ) ;
}
}
}
catch ( Exception & rExc )
{
out ( " \n > error: " ) ;
out ( rExc . Message ) ;
out ( " \n > dying... " ) ;
nRet = 1 ;
}
// cleanup
2001-05-10 12:05:49 +00:00
Reference < XComponent > xComp ( xContext , UNO_QUERY ) ;
if ( xComp . is ( ) )
xComp - > dispose ( ) ;
2000-09-18 15:18:56 +00:00
out ( " \n " ) ;
return nRet ;
}