101797804SAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 301797804SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 401797804SAndrew Rist * or more contributor license agreements. See the NOTICE file 501797804SAndrew Rist * distributed with this work for additional information 601797804SAndrew Rist * regarding copyright ownership. The ASF licenses this file 701797804SAndrew Rist * to you under the Apache License, Version 2.0 (the 801797804SAndrew Rist * "License"); you may not use this file except in compliance 901797804SAndrew Rist * with the License. You may obtain a copy of the License at 10cdf0e10cSrcweir * 1101797804SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12cdf0e10cSrcweir * 1301797804SAndrew Rist * Unless required by applicable law or agreed to in writing, 1401797804SAndrew Rist * software distributed under the License is distributed on an 1501797804SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 1601797804SAndrew Rist * KIND, either express or implied. See the License for the 1701797804SAndrew Rist * specific language governing permissions and limitations 1801797804SAndrew Rist * under the License. 19cdf0e10cSrcweir * 2001797804SAndrew Rist *************************************************************/ 2101797804SAndrew Rist 2201797804SAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir #include <stdio.h> 25cdf0e10cSrcweir #include <vector> 26cdf0e10cSrcweir 27cdf0e10cSrcweir #include "sal/main.h" 28cdf0e10cSrcweir #include <osl/diagnose.h> 29cdf0e10cSrcweir #include <osl/mutex.hxx> 30cdf0e10cSrcweir #include <osl/conditn.hxx> 31cdf0e10cSrcweir #include <osl/module.h> 32cdf0e10cSrcweir 33cdf0e10cSrcweir #include <rtl/process.h> 34cdf0e10cSrcweir #include <rtl/string.h> 35cdf0e10cSrcweir #include <rtl/strbuf.hxx> 36cdf0e10cSrcweir #include <rtl/ustrbuf.hxx> 37cdf0e10cSrcweir 38cdf0e10cSrcweir #include <uno/environment.h> 39cdf0e10cSrcweir #include <uno/mapping.hxx> 40cdf0e10cSrcweir 41cdf0e10cSrcweir #include <cppuhelper/factory.hxx> 42cdf0e10cSrcweir #include <cppuhelper/bootstrap.hxx> 43cdf0e10cSrcweir #include <cppuhelper/servicefactory.hxx> 44cdf0e10cSrcweir #include <cppuhelper/shlib.hxx> 45cdf0e10cSrcweir #include <cppuhelper/implbase1.hxx> 46cdf0e10cSrcweir 47cdf0e10cSrcweir #include <com/sun/star/lang/XMain.hpp> 48cdf0e10cSrcweir #include <com/sun/star/lang/XInitialization.hpp> 49cdf0e10cSrcweir #include <com/sun/star/lang/XComponent.hpp> 50cdf0e10cSrcweir #include <com/sun/star/lang/XSingleServiceFactory.hpp> 51cdf0e10cSrcweir #include <com/sun/star/lang/XMultiServiceFactory.hpp> 52cdf0e10cSrcweir #include <com/sun/star/lang/XEventListener.hpp> 53cdf0e10cSrcweir #include <com/sun/star/container/XSet.hpp> 54cdf0e10cSrcweir #include <com/sun/star/loader/XImplementationLoader.hpp> 55cdf0e10cSrcweir #include <com/sun/star/registry/XSimpleRegistry.hpp> 56cdf0e10cSrcweir #include <com/sun/star/registry/XRegistryKey.hpp> 57cdf0e10cSrcweir #include <com/sun/star/connection/XAcceptor.hpp> 58cdf0e10cSrcweir #include <com/sun/star/connection/XConnection.hpp> 59cdf0e10cSrcweir #include <com/sun/star/bridge/XBridgeFactory.hpp> 60cdf0e10cSrcweir #include <com/sun/star/bridge/XBridge.hpp> 61cdf0e10cSrcweir #include <osl/process.h> 62cdf0e10cSrcweir #include <osl/thread.h> 63cdf0e10cSrcweir #include <osl/file.hxx> 64cdf0e10cSrcweir 65cdf0e10cSrcweir #ifdef SAL_UNX 66cdf0e10cSrcweir #define SEPARATOR '/' 67cdf0e10cSrcweir #else 68cdf0e10cSrcweir #define SEPARATOR '\\' 69cdf0e10cSrcweir #endif 70cdf0e10cSrcweir 71cdf0e10cSrcweir using namespace std; 72cdf0e10cSrcweir using namespace rtl; 73cdf0e10cSrcweir using namespace osl; 74cdf0e10cSrcweir using namespace cppu; 75cdf0e10cSrcweir using namespace com::sun::star::uno; 76cdf0e10cSrcweir using namespace com::sun::star::lang; 77cdf0e10cSrcweir using namespace com::sun::star::loader; 78cdf0e10cSrcweir using namespace com::sun::star::registry; 79cdf0e10cSrcweir using namespace com::sun::star::connection; 80cdf0e10cSrcweir using namespace com::sun::star::bridge; 81cdf0e10cSrcweir using namespace com::sun::star::container; 82cdf0e10cSrcweir 83cdf0e10cSrcweir namespace unoexe 84cdf0e10cSrcweir { 85cdf0e10cSrcweir 86cdf0e10cSrcweir static sal_Bool isFileUrl(const OUString& fileName) 87cdf0e10cSrcweir { 88cdf0e10cSrcweir if (fileName.indexOf(OUString::createFromAscii("file://")) == 0 ) 89cdf0e10cSrcweir return sal_True; 90cdf0e10cSrcweir return sal_False; 91cdf0e10cSrcweir } 92cdf0e10cSrcweir 93cdf0e10cSrcweir static OUString convertToFileUrl(const OUString& fileName) 94cdf0e10cSrcweir { 95cdf0e10cSrcweir if ( isFileUrl(fileName) ) 96cdf0e10cSrcweir { 97cdf0e10cSrcweir return fileName; 98cdf0e10cSrcweir } 99cdf0e10cSrcweir 100cdf0e10cSrcweir OUString uUrlFileName; 101cdf0e10cSrcweir if ( fileName.indexOf('.') == 0 || fileName.indexOf(SEPARATOR) < 0 ) 102cdf0e10cSrcweir { 103cdf0e10cSrcweir OUString uWorkingDir; 104cdf0e10cSrcweir if (osl_getProcessWorkingDir(&uWorkingDir.pData) != osl_Process_E_None) { 105cdf0e10cSrcweir OSL_ASSERT(false); 106cdf0e10cSrcweir } 107cdf0e10cSrcweir if (FileBase::getAbsoluteFileURL(uWorkingDir, fileName, uUrlFileName) 108cdf0e10cSrcweir != FileBase::E_None) 109cdf0e10cSrcweir { 110cdf0e10cSrcweir OSL_ASSERT(false); 111cdf0e10cSrcweir } 112cdf0e10cSrcweir } else 113cdf0e10cSrcweir { 114cdf0e10cSrcweir if (FileBase::getFileURLFromSystemPath(fileName, uUrlFileName) 115cdf0e10cSrcweir != FileBase::E_None) 116cdf0e10cSrcweir { 117cdf0e10cSrcweir OSL_ASSERT(false); 118cdf0e10cSrcweir } 119cdf0e10cSrcweir } 120cdf0e10cSrcweir 121cdf0e10cSrcweir return uUrlFileName; 122cdf0e10cSrcweir } 123cdf0e10cSrcweir 124cdf0e10cSrcweir static sal_Bool s_quiet = false; 125cdf0e10cSrcweir 126cdf0e10cSrcweir //-------------------------------------------------------------------------------------------------- 127cdf0e10cSrcweir static inline void out( const sal_Char * pText ) 128cdf0e10cSrcweir { 129cdf0e10cSrcweir if (! s_quiet) 130851abcd9Struckman fprintf( stderr, "%s", pText ); 131cdf0e10cSrcweir } 132cdf0e10cSrcweir //-------------------------------------------------------------------------------------------------- 133cdf0e10cSrcweir static inline void out( const OUString & rText ) 134cdf0e10cSrcweir { 135cdf0e10cSrcweir if (! s_quiet) 136cdf0e10cSrcweir { 137cdf0e10cSrcweir OString aText( OUStringToOString( rText, RTL_TEXTENCODING_ASCII_US ) ); 138851abcd9Struckman fprintf( stderr, "%s", aText.getStr() ); 139cdf0e10cSrcweir } 140cdf0e10cSrcweir } 141cdf0e10cSrcweir 142cdf0e10cSrcweir //-------------------------------------------------------------------------------------------------- 143cdf0e10cSrcweir static const char arUsingText[] = 144cdf0e10cSrcweir "\nusing:\n\n" 145cdf0e10cSrcweir "uno [-c ComponentImplementationName -l LocationUrl | -s ServiceName]\n" 146cdf0e10cSrcweir " [-ro ReadOnlyRegistry1] [-ro ReadOnlyRegistry2] ... [-rw ReadWriteRegistry]\n" 147cdf0e10cSrcweir " [-u uno:(socket[,host=HostName][,port=nnn]|pipe[,name=PipeName]);<protocol>;Name\n" 148cdf0e10cSrcweir " [--singleaccept] [--singleinstance]]\n" 149cdf0e10cSrcweir " [--quiet]\n" 150cdf0e10cSrcweir " [-- Argument1 Argument2 ...]\n"; 151cdf0e10cSrcweir 152cdf0e10cSrcweir //-------------------------------------------------------------------------------------------------- 153cdf0e10cSrcweir static sal_Bool readOption( OUString * pValue, const sal_Char * pOpt, 154cdf0e10cSrcweir sal_Int32 * pnIndex, const OUString & aArg) 155cdf0e10cSrcweir throw (RuntimeException) 156cdf0e10cSrcweir { 157cdf0e10cSrcweir const OUString dash = OUString(RTL_CONSTASCII_USTRINGPARAM("-")); 158cdf0e10cSrcweir if(aArg.indexOf(dash) != 0) 159cdf0e10cSrcweir return sal_False; 160cdf0e10cSrcweir 161cdf0e10cSrcweir OUString aOpt = OUString::createFromAscii( pOpt ); 162cdf0e10cSrcweir 163cdf0e10cSrcweir if (aArg.getLength() < aOpt.getLength()) 164cdf0e10cSrcweir return sal_False; 165cdf0e10cSrcweir 166cdf0e10cSrcweir if (aOpt.equalsIgnoreAsciiCase( aArg.copy(1) )) 167cdf0e10cSrcweir { 168cdf0e10cSrcweir // take next argument 169cdf0e10cSrcweir ++(*pnIndex); 170cdf0e10cSrcweir 171cdf0e10cSrcweir rtl_getAppCommandArg(*pnIndex, &pValue->pData); 172cdf0e10cSrcweir if (*pnIndex >= (sal_Int32)rtl_getAppCommandArgCount() || pValue->copy(1).equals(dash)) 173cdf0e10cSrcweir { 174cdf0e10cSrcweir OUStringBuffer buf( 32 ); 175cdf0e10cSrcweir buf.appendAscii( RTL_CONSTASCII_STRINGPARAM("incomplete option \"-") ); 176cdf0e10cSrcweir buf.appendAscii( pOpt ); 177cdf0e10cSrcweir buf.appendAscii( RTL_CONSTASCII_STRINGPARAM("\" given!") ); 178cdf0e10cSrcweir throw RuntimeException( buf.makeStringAndClear(), Reference< XInterface >() ); 179cdf0e10cSrcweir } 180cdf0e10cSrcweir else 181cdf0e10cSrcweir { 182cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 1 183cdf0e10cSrcweir out( "\n> identified option -" ); 184cdf0e10cSrcweir out( pOpt ); 185cdf0e10cSrcweir out( " = " ); 186cdf0e10cSrcweir OString tmp = OUStringToOString(aArg, RTL_TEXTENCODING_ASCII_US); 187cdf0e10cSrcweir out( tmp.getStr() ); 188cdf0e10cSrcweir #endif 189cdf0e10cSrcweir ++(*pnIndex); 190cdf0e10cSrcweir return sal_True; 191cdf0e10cSrcweir } 192cdf0e10cSrcweir } 193cdf0e10cSrcweir else if (aArg.indexOf(aOpt) == 1) 194cdf0e10cSrcweir { 195cdf0e10cSrcweir *pValue = aArg.copy(1 + aOpt.getLength()); 196cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 1 197cdf0e10cSrcweir out( "\n> identified option -" ); 198cdf0e10cSrcweir out( pOpt ); 199cdf0e10cSrcweir out( " = " ); 200cdf0e10cSrcweir OString tmp = OUStringToOString(aArg.copy(aOpt.getLength()), RTL_TEXTENCODING_ASCII_US); 201cdf0e10cSrcweir out( tmp.getStr() ); 202cdf0e10cSrcweir #endif 203cdf0e10cSrcweir ++(*pnIndex); 204cdf0e10cSrcweir 205cdf0e10cSrcweir return sal_True; 206cdf0e10cSrcweir } 207cdf0e10cSrcweir return sal_False; 208cdf0e10cSrcweir } 209cdf0e10cSrcweir //-------------------------------------------------------------------------------------------------- 210cdf0e10cSrcweir static sal_Bool readOption( sal_Bool * pbOpt, const sal_Char * pOpt, 211cdf0e10cSrcweir sal_Int32 * pnIndex, const OUString & aArg) 212cdf0e10cSrcweir { 213cdf0e10cSrcweir const OUString dashdash(RTL_CONSTASCII_USTRINGPARAM("--")); 214cdf0e10cSrcweir OUString aOpt = OUString::createFromAscii(pOpt); 215cdf0e10cSrcweir 216cdf0e10cSrcweir if(aArg.indexOf(dashdash) == 0 && aOpt.equals(aArg.copy(2))) 217cdf0e10cSrcweir { 218cdf0e10cSrcweir ++(*pnIndex); 219cdf0e10cSrcweir *pbOpt = sal_True; 220cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 1 221cdf0e10cSrcweir out( "\n> identified option --" ); 222cdf0e10cSrcweir out( pOpt ); 223cdf0e10cSrcweir #endif 224cdf0e10cSrcweir return sal_True; 225cdf0e10cSrcweir } 226cdf0e10cSrcweir return sal_False; 227cdf0e10cSrcweir } 228cdf0e10cSrcweir 229cdf0e10cSrcweir 230cdf0e10cSrcweir //################################################################################################## 231cdf0e10cSrcweir //################################################################################################## 232cdf0e10cSrcweir //################################################################################################## 233cdf0e10cSrcweir 234cdf0e10cSrcweir 235cdf0e10cSrcweir //-------------------------------------------------------------------------------------------------- 236cdf0e10cSrcweir template< class T > 237cdf0e10cSrcweir void createInstance( 238cdf0e10cSrcweir Reference< T > & rxOut, 239cdf0e10cSrcweir const Reference< XComponentContext > & xContext, 240cdf0e10cSrcweir const OUString & rServiceName ) 241cdf0e10cSrcweir throw (Exception) 242cdf0e10cSrcweir { 243cdf0e10cSrcweir Reference< XMultiComponentFactory > xMgr( xContext->getServiceManager() ); 244cdf0e10cSrcweir Reference< XInterface > x( xMgr->createInstanceWithContext( rServiceName, xContext ) ); 245cdf0e10cSrcweir 246cdf0e10cSrcweir if (! x.is()) 247cdf0e10cSrcweir { 248cdf0e10cSrcweir static sal_Bool s_bSet = sal_False; 249cdf0e10cSrcweir if (! s_bSet) 250cdf0e10cSrcweir { 251cdf0e10cSrcweir MutexGuard aGuard( Mutex::getGlobalMutex() ); 252cdf0e10cSrcweir if (! s_bSet) 253cdf0e10cSrcweir { 254cdf0e10cSrcweir Reference< XSet > xSet( xMgr, UNO_QUERY ); 255cdf0e10cSrcweir if (xSet.is()) 256cdf0e10cSrcweir { 257cdf0e10cSrcweir Reference< XMultiServiceFactory > xSF( xMgr, UNO_QUERY ); 258cdf0e10cSrcweir // acceptor 259cdf0e10cSrcweir xSet->insert( makeAny( loadSharedLibComponentFactory( 260cdf0e10cSrcweir OUString( RTL_CONSTASCII_USTRINGPARAM( 261cdf0e10cSrcweir "acceptor.uno" SAL_DLLEXTENSION) ), 262cdf0e10cSrcweir OUString(), 263cdf0e10cSrcweir OUString( RTL_CONSTASCII_USTRINGPARAM( 264cdf0e10cSrcweir "com.sun.star.comp.io.Acceptor") ), 265cdf0e10cSrcweir xSF, Reference< XRegistryKey >() ) ) ); 266cdf0e10cSrcweir // connector 267cdf0e10cSrcweir xSet->insert( makeAny( loadSharedLibComponentFactory( 268cdf0e10cSrcweir OUString( RTL_CONSTASCII_USTRINGPARAM( 269cdf0e10cSrcweir "connector.uno" SAL_DLLEXTENSION) ), 270cdf0e10cSrcweir OUString(), 271cdf0e10cSrcweir OUString( RTL_CONSTASCII_USTRINGPARAM( 272cdf0e10cSrcweir "com.sun.star.comp.io.Connector") ), 273cdf0e10cSrcweir xSF, Reference< XRegistryKey >() ) ) ); 274cdf0e10cSrcweir // bridge factory 275cdf0e10cSrcweir xSet->insert( makeAny( loadSharedLibComponentFactory( 276cdf0e10cSrcweir OUString( RTL_CONSTASCII_USTRINGPARAM( 277cdf0e10cSrcweir "binaryurp.uno" SAL_DLLEXTENSION) ), 278cdf0e10cSrcweir OUString(), 279cdf0e10cSrcweir OUString( 280cdf0e10cSrcweir RTL_CONSTASCII_USTRINGPARAM( 281cdf0e10cSrcweir "com.sun.star.comp.bridge.BridgeFactory") ), 282cdf0e10cSrcweir xSF, Reference< XRegistryKey >() ) ) ); 283cdf0e10cSrcweir } 284cdf0e10cSrcweir s_bSet = sal_True; 285cdf0e10cSrcweir } 286cdf0e10cSrcweir } 287cdf0e10cSrcweir x = xMgr->createInstanceWithContext( rServiceName, xContext ); 288cdf0e10cSrcweir } 289cdf0e10cSrcweir 290cdf0e10cSrcweir if (! x.is()) 291cdf0e10cSrcweir { 292cdf0e10cSrcweir OUStringBuffer buf( 64 ); 293cdf0e10cSrcweir buf.appendAscii( RTL_CONSTASCII_STRINGPARAM("cannot get service instance \"") ); 294cdf0e10cSrcweir buf.append( rServiceName ); 295cdf0e10cSrcweir buf.appendAscii( RTL_CONSTASCII_STRINGPARAM("\"!") ); 296cdf0e10cSrcweir throw RuntimeException( buf.makeStringAndClear(), Reference< XInterface >() ); 297cdf0e10cSrcweir } 298cdf0e10cSrcweir 299cdf0e10cSrcweir rxOut = Reference< T >::query( x ); 300cdf0e10cSrcweir if (! rxOut.is()) 301cdf0e10cSrcweir { 302cdf0e10cSrcweir OUStringBuffer buf( 64 ); 303cdf0e10cSrcweir buf.appendAscii( RTL_CONSTASCII_STRINGPARAM("service instance \"") ); 304cdf0e10cSrcweir buf.append( rServiceName ); 305cdf0e10cSrcweir buf.appendAscii( RTL_CONSTASCII_STRINGPARAM("\" does not support demanded interface \"") ); 306cdf0e10cSrcweir const Type & rType = ::getCppuType( (const Reference< T > *)0 ); 307cdf0e10cSrcweir buf.append( rType.getTypeName() ); 308cdf0e10cSrcweir buf.appendAscii( RTL_CONSTASCII_STRINGPARAM("\"!") ); 309cdf0e10cSrcweir throw RuntimeException( buf.makeStringAndClear(), Reference< XInterface >() ); 310cdf0e10cSrcweir } 311cdf0e10cSrcweir } 312cdf0e10cSrcweir //-------------------------------------------------------------------------------------------------- 313cdf0e10cSrcweir static Reference< XSimpleRegistry > nestRegistries( 314cdf0e10cSrcweir const Reference< XSimpleRegistry > & xReadWrite, 315cdf0e10cSrcweir const Reference< XSimpleRegistry > & xReadOnly ) 316cdf0e10cSrcweir throw (Exception) 317cdf0e10cSrcweir { 318cdf0e10cSrcweir Reference< XSimpleRegistry > xReg( createNestedRegistry() ); 319cdf0e10cSrcweir if (! xReg.is()) 320cdf0e10cSrcweir { 321cdf0e10cSrcweir throw RuntimeException( 322cdf0e10cSrcweir OUString( RTL_CONSTASCII_USTRINGPARAM("no nested registry service!" ) ), 323cdf0e10cSrcweir Reference< XInterface >() ); 324cdf0e10cSrcweir } 325cdf0e10cSrcweir 326cdf0e10cSrcweir Reference< XInitialization > xInit( xReg, UNO_QUERY ); 327cdf0e10cSrcweir if (! xInit.is()) 328cdf0e10cSrcweir throw RuntimeException( OUString( RTL_CONSTASCII_USTRINGPARAM("nested registry does not export interface \"com.sun.star.lang.XInitialization\"!" ) ), Reference< XInterface >() ); 329cdf0e10cSrcweir 330cdf0e10cSrcweir Sequence< Any > aArgs( 2 ); 331cdf0e10cSrcweir aArgs[0] <<= xReadWrite; 332cdf0e10cSrcweir aArgs[1] <<= xReadOnly; 333cdf0e10cSrcweir xInit->initialize( aArgs ); 334cdf0e10cSrcweir 335cdf0e10cSrcweir return xReg; 336cdf0e10cSrcweir } 337cdf0e10cSrcweir //-------------------------------------------------------------------------------------------------- 338cdf0e10cSrcweir static Reference< XSimpleRegistry > openRegistry( 339cdf0e10cSrcweir const OUString & rURL, 340cdf0e10cSrcweir sal_Bool bReadOnly, sal_Bool bCreate ) 341cdf0e10cSrcweir throw (Exception) 342cdf0e10cSrcweir { 343cdf0e10cSrcweir Reference< XSimpleRegistry > xNewReg( createSimpleRegistry() ); 344cdf0e10cSrcweir if (! xNewReg.is()) 345cdf0e10cSrcweir { 346cdf0e10cSrcweir throw RuntimeException( 347cdf0e10cSrcweir OUString( RTL_CONSTASCII_USTRINGPARAM("no simple registry service!" ) ), 348cdf0e10cSrcweir Reference< XInterface >() ); 349cdf0e10cSrcweir } 350cdf0e10cSrcweir 351cdf0e10cSrcweir try 352cdf0e10cSrcweir { 353cdf0e10cSrcweir xNewReg->open( convertToFileUrl(rURL), bReadOnly, bCreate ); 354cdf0e10cSrcweir if (xNewReg->isValid()) 355cdf0e10cSrcweir return xNewReg; 356cdf0e10cSrcweir else 357cdf0e10cSrcweir xNewReg->close(); 358cdf0e10cSrcweir } 359cdf0e10cSrcweir catch (Exception &) 360cdf0e10cSrcweir { 361cdf0e10cSrcweir } 362cdf0e10cSrcweir 363cdf0e10cSrcweir out( "\n> warning: cannot open registry \"" ); 364cdf0e10cSrcweir out( rURL ); 365cdf0e10cSrcweir if (bReadOnly) 366cdf0e10cSrcweir out( "\" for reading, ignoring!" ); 367cdf0e10cSrcweir else 368cdf0e10cSrcweir out( "\" for reading and writing, ignoring!" ); 369cdf0e10cSrcweir return Reference< XSimpleRegistry >(); 370cdf0e10cSrcweir } 371cdf0e10cSrcweir //-------------------------------------------------------------------------------------------------- 372cdf0e10cSrcweir static Reference< XInterface > loadComponent( 373cdf0e10cSrcweir const Reference< XComponentContext > & xContext, 374cdf0e10cSrcweir const OUString & rImplName, const OUString & rLocation ) 375cdf0e10cSrcweir throw (Exception) 376cdf0e10cSrcweir { 377cdf0e10cSrcweir // determine loader to be used 378cdf0e10cSrcweir sal_Int32 nDot = rLocation.lastIndexOf( '.' ); 379cdf0e10cSrcweir if (nDot > 0 && nDot < rLocation.getLength()) 380cdf0e10cSrcweir { 381cdf0e10cSrcweir Reference< XImplementationLoader > xLoader; 382cdf0e10cSrcweir 383cdf0e10cSrcweir OUString aExt( rLocation.copy( nDot +1 ) ); 384cdf0e10cSrcweir 385cdf0e10cSrcweir if (aExt.compareToAscii( "dll" ) == 0 || 386cdf0e10cSrcweir aExt.compareToAscii( "exe" ) == 0 || 387cdf0e10cSrcweir aExt.compareToAscii( "dylib" ) == 0 || 388cdf0e10cSrcweir aExt.compareToAscii( "so" ) == 0) 389cdf0e10cSrcweir { 390cdf0e10cSrcweir createInstance( 391cdf0e10cSrcweir xLoader, xContext, OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.loader.SharedLibrary") ) ); 392cdf0e10cSrcweir } 393cdf0e10cSrcweir else if (aExt.compareToAscii( "jar" ) == 0 || 394cdf0e10cSrcweir aExt.compareToAscii( "class" ) == 0) 395cdf0e10cSrcweir { 396cdf0e10cSrcweir createInstance( 397cdf0e10cSrcweir xLoader, xContext, OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.loader.Java") ) ); 398cdf0e10cSrcweir } 399cdf0e10cSrcweir else 400cdf0e10cSrcweir { 401cdf0e10cSrcweir OUStringBuffer buf( 64 ); 402cdf0e10cSrcweir buf.appendAscii( RTL_CONSTASCII_STRINGPARAM("unknown extension of \"") ); 403cdf0e10cSrcweir buf.append( rLocation ); 404cdf0e10cSrcweir buf.appendAscii( RTL_CONSTASCII_STRINGPARAM("\"! No loader available!") ); 405cdf0e10cSrcweir throw RuntimeException( buf.makeStringAndClear(), Reference< XInterface >() ); 406cdf0e10cSrcweir } 407cdf0e10cSrcweir 408cdf0e10cSrcweir Reference< XInterface > xInstance; 409cdf0e10cSrcweir 410cdf0e10cSrcweir // activate 411cdf0e10cSrcweir Reference< XInterface > xFactory( xLoader->activate( 412cdf0e10cSrcweir rImplName, OUString(), rLocation, Reference< XRegistryKey >() ) ); 413cdf0e10cSrcweir if (xFactory.is()) 414cdf0e10cSrcweir { 415cdf0e10cSrcweir Reference< XSingleComponentFactory > xCFac( xFactory, UNO_QUERY ); 416cdf0e10cSrcweir if (xCFac.is()) 417cdf0e10cSrcweir { 418cdf0e10cSrcweir xInstance = xCFac->createInstanceWithContext( xContext ); 419cdf0e10cSrcweir } 420cdf0e10cSrcweir else 421cdf0e10cSrcweir { 422cdf0e10cSrcweir Reference< XSingleServiceFactory > xSFac( xFactory, UNO_QUERY ); 423cdf0e10cSrcweir if (xSFac.is()) 424cdf0e10cSrcweir { 425cdf0e10cSrcweir out( "\n> warning: ignroing context for implementation \"" ); 426cdf0e10cSrcweir out( rImplName ); 427cdf0e10cSrcweir out( "\"!" ); 428cdf0e10cSrcweir xInstance = xSFac->createInstance(); 429cdf0e10cSrcweir } 430cdf0e10cSrcweir } 431cdf0e10cSrcweir } 432cdf0e10cSrcweir 433cdf0e10cSrcweir if (! xInstance.is()) 434cdf0e10cSrcweir { 435cdf0e10cSrcweir OUStringBuffer buf( 64 ); 436cdf0e10cSrcweir buf.appendAscii( RTL_CONSTASCII_STRINGPARAM("activating component \"") ); 437cdf0e10cSrcweir buf.append( rImplName ); 438cdf0e10cSrcweir buf.appendAscii( RTL_CONSTASCII_STRINGPARAM("\" from location \"") ); 439cdf0e10cSrcweir buf.append( rLocation ); 440cdf0e10cSrcweir buf.appendAscii( RTL_CONSTASCII_STRINGPARAM("\" failed!") ); 441cdf0e10cSrcweir throw RuntimeException( buf.makeStringAndClear(), Reference< XInterface >() ); 442cdf0e10cSrcweir } 443cdf0e10cSrcweir 444cdf0e10cSrcweir return xInstance; 445cdf0e10cSrcweir } 446cdf0e10cSrcweir else 447cdf0e10cSrcweir { 448cdf0e10cSrcweir OUStringBuffer buf( 64 ); 449cdf0e10cSrcweir buf.appendAscii( RTL_CONSTASCII_STRINGPARAM("location \"") ); 450cdf0e10cSrcweir buf.append( rLocation ); 451cdf0e10cSrcweir buf.appendAscii( RTL_CONSTASCII_STRINGPARAM("\" has no extension! Cannot determine loader to be used!") ); 452cdf0e10cSrcweir throw RuntimeException( buf.makeStringAndClear(), Reference< XInterface >() ); 453cdf0e10cSrcweir } 454cdf0e10cSrcweir } 455cdf0e10cSrcweir 456cdf0e10cSrcweir 457cdf0e10cSrcweir //################################################################################################## 458cdf0e10cSrcweir //################################################################################################## 459cdf0e10cSrcweir //################################################################################################## 460cdf0e10cSrcweir 461cdf0e10cSrcweir 462cdf0e10cSrcweir //================================================================================================== 463cdf0e10cSrcweir class OInstanceProvider 464cdf0e10cSrcweir : public WeakImplHelper1< XInstanceProvider > 465cdf0e10cSrcweir { 466cdf0e10cSrcweir Reference< XComponentContext > _xContext; 467cdf0e10cSrcweir 468cdf0e10cSrcweir Mutex _aSingleInstanceMutex; 469cdf0e10cSrcweir Reference< XInterface > _xSingleInstance; 470cdf0e10cSrcweir sal_Bool _bSingleInstance; 471cdf0e10cSrcweir 472cdf0e10cSrcweir OUString _aImplName; 473cdf0e10cSrcweir OUString _aLocation; 474cdf0e10cSrcweir OUString _aServiceName; 475cdf0e10cSrcweir Sequence< Any > _aInitParams; 476cdf0e10cSrcweir 477cdf0e10cSrcweir OUString _aInstanceName; 478cdf0e10cSrcweir 479cdf0e10cSrcweir inline Reference< XInterface > createInstance() throw (Exception); 480cdf0e10cSrcweir 481cdf0e10cSrcweir public: 482cdf0e10cSrcweir OInstanceProvider( const Reference< XComponentContext > & xContext, 483cdf0e10cSrcweir const OUString & rImplName, const OUString & rLocation, 484cdf0e10cSrcweir const OUString & rServiceName, const Sequence< Any > & rInitParams, 485cdf0e10cSrcweir sal_Bool bSingleInstance, const OUString & rInstanceName ) 486cdf0e10cSrcweir : _xContext( xContext ) 487cdf0e10cSrcweir , _bSingleInstance( bSingleInstance ) 488cdf0e10cSrcweir , _aImplName( rImplName ) 489cdf0e10cSrcweir , _aLocation( rLocation ) 490cdf0e10cSrcweir , _aServiceName( rServiceName ) 491cdf0e10cSrcweir , _aInitParams( rInitParams ) 492cdf0e10cSrcweir , _aInstanceName( rInstanceName ) 493cdf0e10cSrcweir {} 494cdf0e10cSrcweir 495cdf0e10cSrcweir // XInstanceProvider 496cdf0e10cSrcweir virtual Reference< XInterface > SAL_CALL getInstance( const OUString & rName ) 497cdf0e10cSrcweir throw (NoSuchElementException, RuntimeException); 498cdf0e10cSrcweir }; 499cdf0e10cSrcweir //__________________________________________________________________________________________________ 500cdf0e10cSrcweir inline Reference< XInterface > OInstanceProvider::createInstance() 501cdf0e10cSrcweir throw (Exception) 502cdf0e10cSrcweir { 503cdf0e10cSrcweir Reference< XInterface > xRet; 504cdf0e10cSrcweir if (_aImplName.getLength()) // manually via loader 505cdf0e10cSrcweir xRet = loadComponent( _xContext, _aImplName, _aLocation ); 506cdf0e10cSrcweir else // via service manager 507cdf0e10cSrcweir unoexe::createInstance( xRet, _xContext, _aServiceName ); 508cdf0e10cSrcweir 509cdf0e10cSrcweir // opt XInit 510cdf0e10cSrcweir Reference< XInitialization > xInit( xRet, UNO_QUERY ); 511cdf0e10cSrcweir if (xInit.is()) 512cdf0e10cSrcweir xInit->initialize( _aInitParams ); 513cdf0e10cSrcweir 514cdf0e10cSrcweir return xRet; 515cdf0e10cSrcweir } 516cdf0e10cSrcweir //__________________________________________________________________________________________________ 517cdf0e10cSrcweir Reference< XInterface > OInstanceProvider::getInstance( const OUString & rName ) 518cdf0e10cSrcweir throw (NoSuchElementException, RuntimeException) 519cdf0e10cSrcweir { 520cdf0e10cSrcweir try 521cdf0e10cSrcweir { 522cdf0e10cSrcweir if (_aInstanceName == rName) 523cdf0e10cSrcweir { 524cdf0e10cSrcweir Reference< XInterface > xRet; 525cdf0e10cSrcweir 526cdf0e10cSrcweir if (_aImplName.getLength() == 0 && _aServiceName.getLength() == 0) 527cdf0e10cSrcweir { 528cdf0e10cSrcweir OSL_ASSERT( 529cdf0e10cSrcweir rName.equalsAsciiL( 530cdf0e10cSrcweir RTL_CONSTASCII_STRINGPARAM("uno.ComponentContext") ) ); 531cdf0e10cSrcweir xRet = _xContext; 532cdf0e10cSrcweir } 533cdf0e10cSrcweir else if (_bSingleInstance) 534cdf0e10cSrcweir { 535cdf0e10cSrcweir if (! _xSingleInstance.is()) 536cdf0e10cSrcweir { 537cdf0e10cSrcweir MutexGuard aGuard( _aSingleInstanceMutex ); 538cdf0e10cSrcweir if (! _xSingleInstance.is()) 539cdf0e10cSrcweir { 540cdf0e10cSrcweir _xSingleInstance = createInstance(); 541cdf0e10cSrcweir } 542cdf0e10cSrcweir } 543cdf0e10cSrcweir xRet = _xSingleInstance; 544cdf0e10cSrcweir } 545cdf0e10cSrcweir else 546cdf0e10cSrcweir { 547cdf0e10cSrcweir xRet = createInstance(); 548cdf0e10cSrcweir } 549cdf0e10cSrcweir 550cdf0e10cSrcweir return xRet; 551cdf0e10cSrcweir } 552cdf0e10cSrcweir } 553cdf0e10cSrcweir catch (Exception & rExc) 554cdf0e10cSrcweir { 555cdf0e10cSrcweir out( "\n> error: " ); 556cdf0e10cSrcweir out( rExc.Message ); 557cdf0e10cSrcweir } 558cdf0e10cSrcweir OUStringBuffer buf( 64 ); 559cdf0e10cSrcweir buf.appendAscii( RTL_CONSTASCII_STRINGPARAM("no such element \"") ); 560cdf0e10cSrcweir buf.append( rName ); 561cdf0e10cSrcweir buf.appendAscii( RTL_CONSTASCII_STRINGPARAM("\"!") ); 562cdf0e10cSrcweir throw NoSuchElementException( buf.makeStringAndClear(), Reference< XInterface >() ); 563cdf0e10cSrcweir } 564cdf0e10cSrcweir 565cdf0e10cSrcweir //================================================================================================== 566cdf0e10cSrcweir struct ODisposingListener : public WeakImplHelper1< XEventListener > 567cdf0e10cSrcweir { 568cdf0e10cSrcweir Condition cDisposed; 569cdf0e10cSrcweir 570cdf0e10cSrcweir // XEventListener 571cdf0e10cSrcweir virtual void SAL_CALL disposing( const EventObject & rEvt ) 572cdf0e10cSrcweir throw (RuntimeException); 573cdf0e10cSrcweir 574cdf0e10cSrcweir //---------------------------------------------------------------------------------------------- 575cdf0e10cSrcweir static void waitFor( const Reference< XComponent > & xComp ); 576cdf0e10cSrcweir }; 577cdf0e10cSrcweir //__________________________________________________________________________________________________ 578cdf0e10cSrcweir void ODisposingListener::disposing( const EventObject & ) 579cdf0e10cSrcweir throw (RuntimeException) 580cdf0e10cSrcweir { 581cdf0e10cSrcweir cDisposed.set(); 582cdf0e10cSrcweir } 583cdf0e10cSrcweir //-------------------------------------------------------------------------------------------------- 584cdf0e10cSrcweir void ODisposingListener::waitFor( const Reference< XComponent > & xComp ) 585cdf0e10cSrcweir { 586cdf0e10cSrcweir ODisposingListener * pListener = new ODisposingListener(); 587cdf0e10cSrcweir Reference< XEventListener > xListener( pListener ); 588cdf0e10cSrcweir 589cdf0e10cSrcweir xComp->addEventListener( xListener ); 590cdf0e10cSrcweir pListener->cDisposed.wait(); 591cdf0e10cSrcweir } 592cdf0e10cSrcweir 593cdf0e10cSrcweir 594cdf0e10cSrcweir //################################################################################################## 595cdf0e10cSrcweir //################################################################################################## 596cdf0e10cSrcweir //################################################################################################## 597cdf0e10cSrcweir 598cdf0e10cSrcweir 599cdf0e10cSrcweir //################################################################################################## 600cdf0e10cSrcweir } // namespace unoexe 601cdf0e10cSrcweir 602cdf0e10cSrcweir using namespace unoexe; 603cdf0e10cSrcweir 604cdf0e10cSrcweir SAL_IMPLEMENT_MAIN_WITH_ARGS(argc,) 605cdf0e10cSrcweir { 606cdf0e10cSrcweir if (argc <= 1) 607cdf0e10cSrcweir { 608cdf0e10cSrcweir out( arUsingText ); 609cdf0e10cSrcweir return 0; 610cdf0e10cSrcweir } 611cdf0e10cSrcweir 612cdf0e10cSrcweir sal_Int32 nRet = 0; 613cdf0e10cSrcweir Reference< XComponentContext > xContext; 614cdf0e10cSrcweir 615cdf0e10cSrcweir 616cdf0e10cSrcweir try 617cdf0e10cSrcweir { 618cdf0e10cSrcweir OUString aImplName, aLocation, aServiceName, aUnoUrl; 619cdf0e10cSrcweir vector< OUString > aReadOnlyRegistries; 620cdf0e10cSrcweir Sequence< OUString > aParams; 621cdf0e10cSrcweir sal_Bool bSingleAccept = sal_False; 622cdf0e10cSrcweir sal_Bool bSingleInstance = sal_False; 623cdf0e10cSrcweir 624cdf0e10cSrcweir //#### read command line arguments ######################################################### 625cdf0e10cSrcweir 626cdf0e10cSrcweir bool bOldRegistryMimic = false; 627cdf0e10cSrcweir bool bNewRegistryMimic = false; 628cdf0e10cSrcweir OUString aReadWriteRegistry; 629cdf0e10cSrcweir 630cdf0e10cSrcweir sal_Int32 nPos = 0; 631cdf0e10cSrcweir sal_Int32 nCount = (sal_Int32)rtl_getAppCommandArgCount(); 632cdf0e10cSrcweir // read up to arguments 633cdf0e10cSrcweir while (nPos < nCount) 634cdf0e10cSrcweir { 635cdf0e10cSrcweir OUString arg; 636cdf0e10cSrcweir 637cdf0e10cSrcweir rtl_getAppCommandArg(nPos, &arg.pData); 638cdf0e10cSrcweir 639cdf0e10cSrcweir const OUString dashdash = OUString(RTL_CONSTASCII_USTRINGPARAM("--")); 640cdf0e10cSrcweir if (dashdash == arg) 641cdf0e10cSrcweir { 642cdf0e10cSrcweir ++nPos; 643cdf0e10cSrcweir break; 644cdf0e10cSrcweir } 645cdf0e10cSrcweir 646cdf0e10cSrcweir if (readOption( &aImplName, "c", &nPos, arg) || 647cdf0e10cSrcweir readOption( &aLocation, "l", &nPos, arg) || 648cdf0e10cSrcweir readOption( &aServiceName, "s", &nPos, arg) || 649cdf0e10cSrcweir readOption( &aUnoUrl, "u", &nPos, arg) || 650cdf0e10cSrcweir readOption( &s_quiet, "quiet", &nPos, arg) || 651cdf0e10cSrcweir readOption( &bSingleAccept, "singleaccept", &nPos, arg) || 652cdf0e10cSrcweir readOption( &bSingleInstance, "singleinstance", &nPos, arg)) 653cdf0e10cSrcweir { 654cdf0e10cSrcweir continue; 655cdf0e10cSrcweir } 656cdf0e10cSrcweir OUString aRegistry; 657cdf0e10cSrcweir if (readOption( &aRegistry, "ro", &nPos, arg)) 658cdf0e10cSrcweir { 659cdf0e10cSrcweir aReadOnlyRegistries.push_back( aRegistry ); 660cdf0e10cSrcweir bNewRegistryMimic = true; 661cdf0e10cSrcweir continue; 662cdf0e10cSrcweir } 663cdf0e10cSrcweir if (readOption( &aReadWriteRegistry, "rw", &nPos, arg)) 664cdf0e10cSrcweir { 665cdf0e10cSrcweir bNewRegistryMimic = true; 666cdf0e10cSrcweir continue; 667cdf0e10cSrcweir } 668cdf0e10cSrcweir if (readOption( &aRegistry, "r", &nPos, arg)) 669cdf0e10cSrcweir { 670cdf0e10cSrcweir aReadOnlyRegistries.push_back( aRegistry ); 671cdf0e10cSrcweir aReadWriteRegistry = aRegistry; 672cdf0e10cSrcweir out( "\n> warning: DEPRECATED use of option -r, use -ro or -rw!" ); 673cdf0e10cSrcweir bOldRegistryMimic = true; 674cdf0e10cSrcweir continue; 675cdf0e10cSrcweir } 676cdf0e10cSrcweir 677cdf0e10cSrcweir // else illegal argument 678cdf0e10cSrcweir OUStringBuffer buf( 64 ); 679cdf0e10cSrcweir buf.appendAscii( RTL_CONSTASCII_STRINGPARAM("unexpected parameter \"") ); 680cdf0e10cSrcweir buf.append(arg); 681cdf0e10cSrcweir buf.appendAscii( RTL_CONSTASCII_STRINGPARAM("\"!") ); 682cdf0e10cSrcweir throw RuntimeException( buf.makeStringAndClear(), Reference< XInterface >() ); 683cdf0e10cSrcweir } 684cdf0e10cSrcweir 685cdf0e10cSrcweir if (bOldRegistryMimic) // last one was set to be read-write 686cdf0e10cSrcweir { 687cdf0e10cSrcweir aReadOnlyRegistries.pop_back(); 688cdf0e10cSrcweir if (bOldRegistryMimic && bNewRegistryMimic) 689cdf0e10cSrcweir { 690cdf0e10cSrcweir throw RuntimeException( 691cdf0e10cSrcweir OUString( RTL_CONSTASCII_USTRINGPARAM("mixing with DEPRECATED registry options!") ), 692cdf0e10cSrcweir Reference< XInterface >() ); 693cdf0e10cSrcweir } 694cdf0e10cSrcweir } 695cdf0e10cSrcweir 696cdf0e10cSrcweir if ((aImplName.getLength() != 0) && (aServiceName.getLength() != 0)) 697cdf0e10cSrcweir throw RuntimeException( OUString( RTL_CONSTASCII_USTRINGPARAM("give component exOR service name!" ) ), Reference< XInterface >() ); 698cdf0e10cSrcweir if (aImplName.getLength() == 0 && aServiceName.getLength() == 0) 699cdf0e10cSrcweir { 700cdf0e10cSrcweir if (! aUnoUrl.endsWithIgnoreAsciiCaseAsciiL( 701cdf0e10cSrcweir RTL_CONSTASCII_STRINGPARAM(";uno.ComponentContext") )) 702cdf0e10cSrcweir throw RuntimeException( 703cdf0e10cSrcweir OUString( RTL_CONSTASCII_USTRINGPARAM( 704cdf0e10cSrcweir "expected UNO-URL with instance name " 705cdf0e10cSrcweir "uno.ComponentContext!") ), 706cdf0e10cSrcweir Reference<XInterface>() ); 707cdf0e10cSrcweir if (bSingleInstance) 708cdf0e10cSrcweir throw RuntimeException( 709cdf0e10cSrcweir OUString( RTL_CONSTASCII_USTRINGPARAM( 710cdf0e10cSrcweir "unexpected option --singleinstance!") ), 711cdf0e10cSrcweir Reference<XInterface>() ); 712cdf0e10cSrcweir } 713cdf0e10cSrcweir if (aImplName.getLength() && !aLocation.getLength()) 714cdf0e10cSrcweir throw RuntimeException( OUString( RTL_CONSTASCII_USTRINGPARAM("give component location!" ) ), Reference< XInterface >() ); 715cdf0e10cSrcweir if (aServiceName.getLength() && aLocation.getLength()) 716cdf0e10cSrcweir out( "\n> warning: service name given, will ignore location!" ); 717cdf0e10cSrcweir 718cdf0e10cSrcweir // read component params 719cdf0e10cSrcweir aParams.realloc( nCount - nPos ); 720cdf0e10cSrcweir OUString * pParams = aParams.getArray(); 721cdf0e10cSrcweir 722cdf0e10cSrcweir sal_Int32 nOffset = nPos; 723cdf0e10cSrcweir for ( ; nPos < nCount; ++nPos ) 724cdf0e10cSrcweir { 725cdf0e10cSrcweir if (rtl_getAppCommandArg( nPos, &pParams[nPos -nOffset].pData ) 726cdf0e10cSrcweir != osl_Process_E_None) 727cdf0e10cSrcweir { 728cdf0e10cSrcweir OSL_ASSERT(false); 729cdf0e10cSrcweir } 730cdf0e10cSrcweir } 731cdf0e10cSrcweir 732cdf0e10cSrcweir if (aReadOnlyRegistries.size() > 0 || 733cdf0e10cSrcweir aReadWriteRegistry.getLength() > 0) 734cdf0e10cSrcweir { 735cdf0e10cSrcweir //#### create registry ############################################# 736cdf0e10cSrcweir 737cdf0e10cSrcweir Reference< XSimpleRegistry > xRegistry; 738cdf0e10cSrcweir 739cdf0e10cSrcweir // ReadOnly registries 740cdf0e10cSrcweir for ( size_t nReg = 0; nReg < aReadOnlyRegistries.size(); ++nReg ) 741cdf0e10cSrcweir { 742cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 1 743cdf0e10cSrcweir out( "\n> trying to open ro registry: " ); 744cdf0e10cSrcweir out( OUStringToOString( 745cdf0e10cSrcweir aReadOnlyRegistries[ nReg ], 746cdf0e10cSrcweir RTL_TEXTENCODING_ASCII_US ).getStr() ); 747cdf0e10cSrcweir #endif 748cdf0e10cSrcweir Reference< XSimpleRegistry > xNewReg( 749cdf0e10cSrcweir openRegistry( 750cdf0e10cSrcweir aReadOnlyRegistries[ nReg ], sal_True, sal_False ) ); 751cdf0e10cSrcweir if (xNewReg.is()) 752cdf0e10cSrcweir xRegistry = (xRegistry.is() ? nestRegistries( 753cdf0e10cSrcweir xNewReg, xRegistry ) : xNewReg); 754cdf0e10cSrcweir } 755cdf0e10cSrcweir if (aReadWriteRegistry.getLength()) 756cdf0e10cSrcweir { 757cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 1 758cdf0e10cSrcweir out( "\n> trying to open rw registry: " ); 759cdf0e10cSrcweir out( OUStringToOString( 760cdf0e10cSrcweir aReadWriteRegistry, 761cdf0e10cSrcweir RTL_TEXTENCODING_ASCII_US ).getStr() ); 762cdf0e10cSrcweir #endif 763cdf0e10cSrcweir // ReadWrite registry 764cdf0e10cSrcweir Reference< XSimpleRegistry > xNewReg( 765cdf0e10cSrcweir openRegistry( aReadWriteRegistry, sal_False, sal_True ) ); 766cdf0e10cSrcweir if (xNewReg.is()) 767cdf0e10cSrcweir xRegistry = (xRegistry.is() 768cdf0e10cSrcweir ? nestRegistries( xNewReg, xRegistry ) 769cdf0e10cSrcweir : xNewReg); 770cdf0e10cSrcweir } 771cdf0e10cSrcweir 772cdf0e10cSrcweir OSL_ASSERT( xRegistry.is() ); 773cdf0e10cSrcweir xContext = bootstrap_InitialComponentContext( xRegistry ); 774cdf0e10cSrcweir } 775cdf0e10cSrcweir else // defaulting 776cdf0e10cSrcweir { 777cdf0e10cSrcweir xContext = defaultBootstrap_InitialComponentContext(); 778cdf0e10cSrcweir } 779cdf0e10cSrcweir 780*5e7dbebbSJohn Bampton //#### accept, instantiate, etc. ########################################################### 781cdf0e10cSrcweir 782cdf0e10cSrcweir if (aUnoUrl.getLength()) // accepting connections 783cdf0e10cSrcweir { 784cdf0e10cSrcweir sal_Int32 nIndex = 0, nTokens = 0; 785cdf0e10cSrcweir do { aUnoUrl.getToken( 0, ';', nIndex ); nTokens++; } while( nIndex != -1 ); 786cdf0e10cSrcweir if (nTokens != 3 || aUnoUrl.getLength() < 10 || 787cdf0e10cSrcweir !aUnoUrl.copy( 0, 4 ).equalsIgnoreAsciiCase( OUString( RTL_CONSTASCII_USTRINGPARAM("uno:") ) )) 788cdf0e10cSrcweir { 789cdf0e10cSrcweir throw RuntimeException( OUString( RTL_CONSTASCII_USTRINGPARAM("illegal uno url given!" ) ), Reference< XInterface >() ); 790cdf0e10cSrcweir } 791cdf0e10cSrcweir nIndex = 0; 792cdf0e10cSrcweir OUString aConnectDescr( aUnoUrl.getToken( 0, ';', nIndex ).copy( 4 ) ); // uno:CONNECTDESCR;iiop;InstanceName 793cdf0e10cSrcweir OUString aInstanceName( aUnoUrl.getToken( 1, ';', nIndex ) ); 794cdf0e10cSrcweir 795cdf0e10cSrcweir Reference< XAcceptor > xAcceptor; 796cdf0e10cSrcweir createInstance( 797cdf0e10cSrcweir xAcceptor, xContext, 798cdf0e10cSrcweir OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.connection.Acceptor") ) ); 799cdf0e10cSrcweir 800cdf0e10cSrcweir // init params 801cdf0e10cSrcweir Sequence< Any > aInitParams( aParams.getLength() ); 802cdf0e10cSrcweir const OUString * p = aParams.getConstArray(); 803cdf0e10cSrcweir Any * pInitParams = aInitParams.getArray(); 804cdf0e10cSrcweir for ( sal_Int32 i = aParams.getLength(); i--; ) 805cdf0e10cSrcweir { 806cdf0e10cSrcweir pInitParams[i] = makeAny( p[i] ); 807cdf0e10cSrcweir } 808cdf0e10cSrcweir 809cdf0e10cSrcweir // instance provider 810cdf0e10cSrcweir Reference< XInstanceProvider > xInstanceProvider( new OInstanceProvider( 811cdf0e10cSrcweir xContext, aImplName, aLocation, aServiceName, aInitParams, 812cdf0e10cSrcweir bSingleInstance, aInstanceName ) ); 813cdf0e10cSrcweir 814cdf0e10cSrcweir nIndex = 0; 815cdf0e10cSrcweir OUString aUnoUrlToken( aUnoUrl.getToken( 1, ';', nIndex ) ); 816cdf0e10cSrcweir for (;;) 817cdf0e10cSrcweir { 818cdf0e10cSrcweir // accepting 819cdf0e10cSrcweir out( "\n> accepting " ); 820cdf0e10cSrcweir out( aConnectDescr ); 821cdf0e10cSrcweir out( "..." ); 822cdf0e10cSrcweir Reference< XConnection > xConnection( xAcceptor->accept( aConnectDescr ) ); 823cdf0e10cSrcweir out( "connection established." ); 824cdf0e10cSrcweir 825cdf0e10cSrcweir Reference< XBridgeFactory > xBridgeFactory; 826cdf0e10cSrcweir createInstance( 827cdf0e10cSrcweir xBridgeFactory, xContext, 828cdf0e10cSrcweir OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.bridge.BridgeFactory") ) ); 829cdf0e10cSrcweir 830cdf0e10cSrcweir // bridge 831cdf0e10cSrcweir Reference< XBridge > xBridge( xBridgeFactory->createBridge( 832cdf0e10cSrcweir OUString(), aUnoUrlToken, 833cdf0e10cSrcweir xConnection, xInstanceProvider ) ); 834cdf0e10cSrcweir 835cdf0e10cSrcweir if (bSingleAccept) 836cdf0e10cSrcweir { 837cdf0e10cSrcweir Reference< XComponent > xComp( xBridge, UNO_QUERY ); 838cdf0e10cSrcweir if (! xComp.is()) 839cdf0e10cSrcweir throw RuntimeException( OUString( RTL_CONSTASCII_USTRINGPARAM("bridge factory does not export interface \"com.sun.star.lang.XComponent\"!" ) ), Reference< XInterface >() ); 840cdf0e10cSrcweir ODisposingListener::waitFor( xComp ); 841cdf0e10cSrcweir break; 842cdf0e10cSrcweir } 843cdf0e10cSrcweir } 844cdf0e10cSrcweir } 845cdf0e10cSrcweir else // no uno url 846cdf0e10cSrcweir { 847cdf0e10cSrcweir Reference< XInterface > xInstance; 848cdf0e10cSrcweir if (aImplName.getLength()) // manually via loader 849cdf0e10cSrcweir xInstance = loadComponent( xContext, aImplName, aLocation ); 850cdf0e10cSrcweir else // via service manager 851cdf0e10cSrcweir createInstance( xInstance, xContext, aServiceName ); 852cdf0e10cSrcweir 853cdf0e10cSrcweir // execution 854cdf0e10cSrcweir Reference< XMain > xMain( xInstance, UNO_QUERY ); 855cdf0e10cSrcweir if (xMain.is()) 856cdf0e10cSrcweir { 857cdf0e10cSrcweir nRet = xMain->run( aParams ); 858cdf0e10cSrcweir } 859cdf0e10cSrcweir else 860cdf0e10cSrcweir { 861cdf0e10cSrcweir Reference< XComponent > xComp( xInstance, UNO_QUERY ); 862cdf0e10cSrcweir if (xComp.is()) 863cdf0e10cSrcweir xComp->dispose(); 864cdf0e10cSrcweir throw RuntimeException( OUString( RTL_CONSTASCII_USTRINGPARAM("component does not export interface interface \"com.sun.star.lang.XMain\"!" ) ), Reference< XInterface >() ); 865cdf0e10cSrcweir } 866cdf0e10cSrcweir } 867cdf0e10cSrcweir } 868cdf0e10cSrcweir catch (Exception & rExc) 869cdf0e10cSrcweir { 870cdf0e10cSrcweir out( "\n> error: " ); 871cdf0e10cSrcweir out( rExc.Message ); 872cdf0e10cSrcweir out( "\n> dying..." ); 873cdf0e10cSrcweir nRet = 1; 874cdf0e10cSrcweir } 875cdf0e10cSrcweir 876cdf0e10cSrcweir // cleanup 877cdf0e10cSrcweir Reference< XComponent > xComp( xContext, UNO_QUERY ); 878cdf0e10cSrcweir if (xComp.is()) 879cdf0e10cSrcweir xComp->dispose(); 880cdf0e10cSrcweir 881cdf0e10cSrcweir out( "\n" ); 882cdf0e10cSrcweir return nRet; 883cdf0e10cSrcweir } 884