2010-10-14 08:30:07 +02:00
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2000-09-18 15:18:56 +00:00
/*************************************************************************
*
2008-04-11 10:50:01 +00:00
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER .
2000-09-18 15:18:56 +00:00
*
2010-02-12 15:01:35 +01:00
* Copyright 2000 , 2010 Oracle and / or its affiliates .
2000-09-18 15:18:56 +00:00
*
2008-04-11 10:50:01 +00:00
* OpenOffice . org - a multi - platform office productivity suite
2000-09-18 15:18:56 +00:00
*
2008-04-11 10:50:01 +00:00
* This file is part of OpenOffice . org .
2000-09-18 15:18:56 +00:00
*
2008-04-11 10:50:01 +00:00
* OpenOffice . org is free software : you can redistribute it and / or modify
* it under the terms of the GNU Lesser General Public License version 3
* only , as published by the Free Software Foundation .
2000-09-18 15:18:56 +00:00
*
2008-04-11 10:50:01 +00:00
* OpenOffice . org 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 version 3 for more details
* ( a copy is included in the LICENSE file that accompanied this code ) .
2000-09-18 15:18:56 +00:00
*
2008-04-11 10:50:01 +00:00
* You should have received a copy of the GNU Lesser General Public License
* version 3 along with OpenOffice . org . If not , see
* < http : //www.openoffice.org/license.html>
* for a copy of the LGPLv3 License .
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
# include <osl/process.h>
# include <osl/thread.h>
# include <osl/file.hxx>
# ifdef SAL_UNX
# define SEPARATOR ' / '
# else
# define SEPARATOR '\\'
# endif
2000-09-18 15:18:56 +00:00
using namespace std ;
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 ;
2011-03-02 21:53:12 +01:00
using : : rtl : : OUString ;
using : : rtl : : OString ;
using : : rtl : : OUStringToOString ;
using : : rtl : : OUStringBuffer ;
2000-09-18 15:18:56 +00:00
namespace unoexe
{
2001-08-17 12:09:50 +00:00
static sal_Bool isFileUrl ( const OUString & fileName )
{
2010-10-25 12:43:57 +01:00
if ( fileName . indexOf ( OUString ( RTL_CONSTASCII_USTRINGPARAM ( " file:// " ) ) ) = = 0 )
2001-08-17 12:09:50 +00:00
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 ;
2006-06-19 20:56:15 +00:00
if ( osl_getProcessWorkingDir ( & uWorkingDir . pData ) ! = osl_Process_E_None ) {
OSL_ASSERT ( false ) ;
}
if ( FileBase : : getAbsoluteFileURL ( uWorkingDir , fileName , uUrlFileName )
! = FileBase : : E_None )
{
OSL_ASSERT ( false ) ;
}
2001-08-17 12:09:50 +00:00
} else
{
2006-06-19 20:56:15 +00:00
if ( FileBase : : getFileURLFromSystemPath ( fileName , uUrlFileName )
! = FileBase : : E_None )
{
OSL_ASSERT ( false ) ;
}
2001-08-17 12:09:50 +00:00
}
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 )
2010-11-03 15:41:00 +00:00
fprintf ( stderr , " %s " , 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 ) ) ;
2010-11-03 15:41:00 +00:00
fprintf ( stderr , " %s " , aText . getStr ( ) ) ;
2004-06-11 11:33:40 +00:00
}
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 ,
2012-01-20 11:49:53 +01:00
sal_uInt32 * pnIndex , const OUString & aArg )
2000-09-18 15:18:56 +00:00
throw ( RuntimeException )
{
2010-10-25 12:43:57 +01:00
const OUString dash ( RTL_CONSTASCII_USTRINGPARAM ( " - " ) ) ;
2001-05-28 14:31:06 +00:00
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 ) ;
2012-01-20 11:49:53 +01:00
if ( * pnIndex > = 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 ,
2012-01-20 11:49:53 +01:00
sal_uInt32 * 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
// 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 (
2011-01-26 09:26:59 +01:00
" binaryurp.uno " SAL_DLLEXTENSION ) ) ,
2003-04-23 15:19:30 +00:00
OUString ( ) ,
2011-01-26 09:26:59 +01:00
OUString (
RTL_CONSTASCII_USTRINGPARAM (
" com.sun.star.comp.bridge.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 ;
2011-12-15 17:29:53 -02:00
if ( ! _aImplName . isEmpty ( ) ) // 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 ;
2011-12-15 17:29:53 -02:00
if ( _aImplName . isEmpty ( ) & & _aServiceName . isEmpty ( ) )
2004-06-11 11:33:40 +00:00
{
2012-04-06 19:49:53 +02:00
OSL_ASSERT ( rName = = " uno.ComponentContext " ) ;
2004-06-11 11:33:40 +00:00
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 ) ;
} ;
//__________________________________________________________________________________________________
2006-06-19 20:56:15 +00:00
void ODisposingListener : : disposing ( const EventObject & )
2000-09-18 15:18:56 +00:00
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 ;
2012-01-20 11:49:53 +01:00
SAL_IMPLEMENT_MAIN ( )
2000-09-18 15:18:56 +00:00
{
2012-01-20 11:49:53 +01:00
sal_uInt32 nCount = rtl_getAppCommandArgCount ( ) ;
if ( nCount = = 0 )
2000-09-18 15:18:56 +00:00
{
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 ;
2012-01-20 11:49:53 +01:00
sal_uInt32 nPos = 0 ;
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 ) ;
2010-10-25 12:43:57 +01:00
const OUString dashdash ( RTL_CONSTASCII_USTRINGPARAM ( " -- " ) ) ;
2001-05-28 14:31:06 +00:00
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 > ( ) ) ;
}
}
2011-12-15 17:29:53 -02:00
if ( ! ( aImplName . isEmpty ( ) | | aServiceName . isEmpty ( ) ) )
2000-09-18 15:18:56 +00:00
throw RuntimeException ( OUString ( RTL_CONSTASCII_USTRINGPARAM ( " give component exOR service name! " ) ) , Reference < XInterface > ( ) ) ;
2011-12-15 17:29:53 -02:00
if ( aImplName . isEmpty ( ) & & aServiceName . isEmpty ( ) )
2004-06-11 11:33:40 +00:00
{
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 > ( ) ) ;
}
2011-12-15 17:29:53 -02:00
if ( ! aImplName . isEmpty ( ) & & aLocation . isEmpty ( ) )
2000-09-18 15:18:56 +00:00
throw RuntimeException ( OUString ( RTL_CONSTASCII_USTRINGPARAM ( " give component location! " ) ) , Reference < XInterface > ( ) ) ;
2011-12-15 17:29:53 -02:00
if ( ! aServiceName . isEmpty ( ) & & ! aLocation . isEmpty ( ) )
2000-09-18 15:18:56 +00:00
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 ( ) ;
2012-01-20 11:49:53 +01:00
sal_uInt32 nOffset = nPos ;
2001-06-29 07:59:01 +00:00
for ( ; nPos < nCount ; + + nPos )
2000-09-18 15:18:56 +00:00
{
2006-06-19 20:56:15 +00:00
if ( rtl_getAppCommandArg ( nPos , & pParams [ nPos - nOffset ] . pData )
! = osl_Process_E_None )
{
OSL_ASSERT ( false ) ;
}
2000-09-18 15:18:56 +00:00
}
2011-05-17 12:44:26 +02:00
if ( ( ! aReadOnlyRegistries . empty ( ) ) | |
2004-06-11 11:33:40 +00:00
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 ) ;
}
2011-12-15 17:29:53 -02:00
if ( ! aReadWriteRegistry . isEmpty ( ) )
2004-06-11 11:33:40 +00:00
{
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. ###########################################################
2011-12-15 17:29:53 -02:00
if ( ! aUnoUrl . isEmpty ( ) ) // accepting connections
2000-09-18 15:18:56 +00:00
{
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 ( ) ) ;
2006-06-19 20:56:15 +00:00
const OUString * p = aParams . getConstArray ( ) ;
2000-09-18 15:18:56 +00:00
Any * pInitParams = aInitParams . getArray ( ) ;
2006-06-19 20:56:15 +00:00
for ( sal_Int32 i = aParams . getLength ( ) ; i - - ; )
2000-09-18 15:18:56 +00:00
{
2006-06-19 20:56:15 +00:00
pInitParams [ i ] = makeAny ( p [ i ] ) ;
2000-09-18 15:18:56 +00:00
}
// 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 ;
2011-12-15 17:29:53 -02:00
if ( ! aImplName . isEmpty ( ) ) // 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 ;
}
2010-10-14 08:30:07 +02:00
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */