diff options
Diffstat (limited to 'cpputools/source/registercomponent/registercomponent.cxx')
-rw-r--r-- | cpputools/source/registercomponent/registercomponent.cxx | 855 |
1 files changed, 855 insertions, 0 deletions
diff --git a/cpputools/source/registercomponent/registercomponent.cxx b/cpputools/source/registercomponent/registercomponent.cxx new file mode 100644 index 000000000000..70e469ddba23 --- /dev/null +++ b/cpputools/source/registercomponent/registercomponent.cxx @@ -0,0 +1,855 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * 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. + * + * 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). + * + * 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. + * + ************************************************************************/ +#include <stdlib.h> +#include <stdio.h> +#include <string.h> + +#include <vector> + +#include "sal/main.h" +#include <rtl/strbuf.hxx> +#include <rtl/ustrbuf.hxx> + +#include <cppuhelper/servicefactory.hxx> +#include <cppuhelper/shlib.hxx> + +#include <com/sun/star/container/XSet.hpp> +#include <com/sun/star/container/XContentEnumerationAccess.hpp> +#include <com/sun/star/registry/XImplementationRegistration2.hpp> +#include <com/sun/star/registry/XSimpleRegistry.hpp> +#include <com/sun/star/lang/XComponent.hpp> + +#include <algorithm> +#include <osl/process.h> +#include <osl/diagnose.h> +#include <osl/thread.h> +#include <osl/file.hxx> + +#ifdef SAL_UNX +#define SEPARATOR '/' +#else +#define SEPARATOR '\\' +#endif + +using namespace ::rtl; +using namespace ::osl; +using namespace ::cppu; +using namespace ::std; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::lang; +using namespace ::com::sun::star::registry; +using com::sun::star::container::XSet; +using com::sun::star::container::XContentEnumerationAccess; +using com::sun::star::container::XEnumeration; + +#ifdef SAL_W32 +#define putenv _putenv +#endif + +namespace { + +OUString replacePrefix(OUString const & url, OUString const & prefix) { + sal_Int32 i = url.lastIndexOf('/'); + // Backward compatibility with stoc/source/implementationregistration/ + // implreg.cxx:1.27 l. 1892: + if (i == -1) { + i = url.lastIndexOf('\\'); + } + return prefix + url.copy(i + 1); +} + +} + +sal_Bool isFileUrl(const OUString& fileName) +{ + if (fileName.indexOf(OUString::createFromAscii("file://")) == 0 ) + return sal_True; + return sal_False; +} + +OUString convertToFileUrl(const OUString& fileName) +{ + if ( isFileUrl(fileName) ) + { + return fileName; + } + + OUString uUrlFileName; + if ( fileName.indexOf('.') == 0 || fileName.indexOf(SEPARATOR) < 0 ) + { + OUString uWorkingDir; + if (osl_getProcessWorkingDir(&uWorkingDir.pData) != osl_Process_E_None) { + OSL_ASSERT(false); + } + if (FileBase::getAbsoluteFileURL(uWorkingDir, fileName, uUrlFileName) + != FileBase::E_None) + { + OSL_ASSERT(false); + } + } else + { + if (FileBase::getFileURLFromSystemPath(fileName, uUrlFileName) + != FileBase::E_None) + { + OSL_ASSERT(false); + } + } + + return uUrlFileName; +} +static void usingRegisterImpl() +{ + fprintf(stderr, "usage: regcomp -register|revoke -r registryfile -c locationUrl [-br registryfile] [-l componentLoaderUrl] [-s] [-classpath path]\n"); + fprintf(stderr, " Parameters:\n"); + fprintf(stderr, " -register\n" + " register a new component.\n"); + fprintf(stderr, " -revoke\n" + " revoke a component.\n"); + fprintf(stderr, " -br registryfile\n" + " the name of the registry used for bootstrapping\n" + " regcomp. The option can be given twice, each\n" + " one followed by exactly one registry file.\n" + " The registries are used to access both types and\n" + " registered components.\n"); + fprintf(stderr, " -r registryfile\n" + " the name of the target registry (will be created\n" + " if it does not exists). The file name may match\n" + " with one of the filenames given with the -br option.\n"); + fprintf(stderr, " -c locationUrls\n" + " the location of a component (a url to a shared\n" + " library or a absolute url to a .jar file) or a\n" + " list of urls seperated by ';' or ' '. Note if a\n" + " list of urls is specified, the components must\n" + " all need the same loader (quoting is possible with\n" + " \\ or \"\").\n"); + fprintf(stderr, " -l componentLoaderUrl\n" + " the name of the needed loader. If no loader is\n" + " specified and the components have a .jar suffix,\n" + " the default is com.sun.star.loader.Java2.\n" + " Otherwise, the default is\n" + " com.sun.star.loader.SharedLibrary\n" + " -s\n" + " silent, regcomp prints messages only on error.\n" + " -wop\n" + " register the component name only without path\n" + " -wop=prefix\n" + " register the component name with path replaced\n" + " by given prefix\n" + " -classpath path\n" + " sets the java classpath to path (overwriting the\n" + " current classpath environment variable). Note that\n" + " in case you start regcomp e.g. within an office\n" + " environment, the classpath entries in the\n" + " configuration still have precedence over this\n" + " option.\n"); +} + +class IllegalArgument +{ +public: + IllegalArgument(const OString& rMessage) + : m_message(rMessage) + {} + + OString m_message; +}; + +struct Options +{ + Options() + : bRegister(sal_False) + , bRevoke(sal_False) + , bSilent( sal_False ) + , bPrefix( sal_False ) + {} + + sal_Bool bRegister; + sal_Bool bRevoke; + sal_Bool bSilent; + sal_Bool bPrefix; + OUString sPrefix; + OUString sProgramName; + OUString sBootRegName; + OUString sBootRegName2; + OUString sRegName; + OUString sComponentUrls; + OUString sLoaderName; +}; + +sal_Bool parseOptions(int ac, char* av[], Options& rOptions, sal_Bool bCmdFile) + throw( IllegalArgument ) +{ + sal_Bool ret = sal_True; + sal_uInt16 i=0; + sal_Bool bLoaderExplicitlyGiven = sal_False; + + rOptions.sProgramName = OUString::createFromAscii(av[i++]); + + if (!bCmdFile) + { + bCmdFile = sal_True; + + if (ac < 2) + { + usingRegisterImpl(); + ret = sal_False; + } + } + + for (; i < ac; i++) + { + if (av[i][0] == '-') + { + switch (av[i][1]) + { + case 'r': + if (strcmp(av[i], "-register") == 0) + { + rOptions.bRegister = sal_True; + } else + if (strcmp(av[i], "-revoke") == 0) + { + rOptions.bRevoke = sal_True; + } else + if (av[i][2] == '\0') + { + if (i < ac - 1 && av[i+1][0] != '-') + { + i++; + rOptions.sRegName = OStringToOUString(av[i], osl_getThreadTextEncoding()); + } else + { + OString tmp("'-r', please check"); + if (i <= ac - 1) + { + tmp += " your input '" + OString(av[i+1]) + "'"; + } + throw IllegalArgument(tmp); + } + } else + { + rOptions.sRegName = OStringToOUString(av[i]+2, osl_getThreadTextEncoding()); + } + break; + case 'b': + if (av[i][2] != 'r') + { + OString tmp("'-b', invalid option!"); + throw IllegalArgument(tmp); + } + if (av[i][3] == '\0') + { + if (i < ac - 1 && av[i+1][0] != '-') + { + i++; + OUString regName = OStringToOUString(av[i], osl_getThreadTextEncoding()); + if( ! rOptions.sBootRegName.getLength() ) + { + rOptions.sBootRegName = regName; + } + else + { + rOptions.sBootRegName2 = regName; + } + } else + { + OString tmp("'-br', please check"); + if (i <= ac - 1) + { + tmp += " your input '" + OString(av[i+1]) + "'"; + } + throw IllegalArgument(tmp); + } + } else + { + rOptions.sBootRegName = OStringToOUString(av[i]+3, osl_getThreadTextEncoding()); + } + break; + case 'c': + { + OUString sUrls; + if (av[i][2] == '\0') + { + if (i < ac - 1 && av[i+1][0] != '-') + { + i++; + sUrls = OStringToOUString(av[i], osl_getThreadTextEncoding()); + } else + { + OString tmp("'-c', please check"); + if (i <= ac - 1) + { + tmp += " your input '" + OString(av[i+1]) + "'"; + } + throw IllegalArgument(tmp); + } + } + else if( 0 == strncmp( av[i] , "-classpath" ,10 ) ) + { + i++; + if( i < ac ) + { + // leak this string as some platforms assume to own + // the pointer + sal_Char * p = (sal_Char *) rtl_allocateMemory( 13+ strlen( av[i] ) ); + p[0] = 0; + strcat( p, "CLASSPATH=" ); // #100211# - checked + strcat( p, av[i] ); // #100211# - checked + + putenv( p ); + } + break; + } + else + { + sUrls = OStringToOUString(av[i]+2, osl_getThreadTextEncoding()); + } + + if (rOptions.sComponentUrls.getLength()) + { + OUString tmp(rOptions.sComponentUrls + OUString(";", 1, osl_getThreadTextEncoding()) + sUrls); + rOptions.sComponentUrls = tmp; + } else + { + rOptions.sComponentUrls = sUrls; + } + break; + } + case 'l': + { + if (av[i][2] == '\0') + { + if (i < ac - 1 && av[i+1][0] != '-') + { + i++; + rOptions.sLoaderName = OUString::createFromAscii(av[i]); + bLoaderExplicitlyGiven = sal_True; + } else + { + OString tmp("'-l', please check"); + if (i <= ac - 1) + { + tmp += " your input '" + OString(av[i+1]) + "'"; + } + throw IllegalArgument(tmp); + } + } else + { + bLoaderExplicitlyGiven = sal_True; + rOptions.sLoaderName = OUString::createFromAscii(av[i]+2); + } + break; + } + case 's': + { + if( av[i][2] == 0 ) + { + rOptions.bSilent = sal_True; + } + else + { + rtl::OStringBuffer buf; + buf.append( "Unknown error " ); + buf.append( av[i] ); + throw IllegalArgument( av[i] ); + } + break; + } + case 'e': + { + if( av[i][2] == 'n' && av[i][3] == 'v' && av[i][4] == ':' ) + { + // bootstrap variable, ignore it + break; + } + } + case 'w': + { + if (strcmp(av[i], "-wop") == 0) + { + rOptions.bPrefix = sal_True; + rOptions.sPrefix = OUString(); + // in case there are multiple -wops + break; + } + else if ( + strncmp(av[i], "-wop=", RTL_CONSTASCII_LENGTH("-wop=")) + == 0) + { + rOptions.bPrefix = sal_True; + rOptions.sPrefix = OStringToOUString( + av[i] + RTL_CONSTASCII_LENGTH("-wop="), + osl_getThreadTextEncoding()); + break; + } + } + default: + { + OString tmp( "unknown option " ); + tmp += av[i]; + throw IllegalArgument( tmp ); + } + } + } else + { + if (av[i][0] == '@') + { + FILE* cmdFile = fopen(av[i]+1, "r"); + if( cmdFile == NULL ) + { + usingRegisterImpl(); + ret = sal_False; + } else + { + fseek( cmdFile , 0 , SEEK_END ); + sal_Int32 nLen = ftell( cmdFile); + fseek( cmdFile, 0, SEEK_SET ); + + // 2 chars per string is a upper limit for the number of + // substrings ( at least one separator char needed for fscanf). + char ** rargv = (char **)rtl_allocateMemory( nLen * sizeof( char* ) /2); + if( ! rargv ) + { + OStringBuffer buf; + buf.append( "Not enough memory for reading command file " ); + buf.append( av[i] +1 ); + buf.append( " with length " ); + buf.append( nLen ); + buf.append( "." ); + throw IllegalArgument( buf.makeStringAndClear() ); + } + char *buffer = ( char * )rtl_allocateMemory( nLen +1 ); + if( ! buffer ) + { + OStringBuffer buf; + buf.append( "Not enough memory for reading command file " ); + buf.append( av[i] +1 ); + buf.append( " with length " ); + buf.append( nLen ); + buf.append( "." ); + throw IllegalArgument( buf.makeStringAndClear() ); + } + + // we start at one to omit argv[0] + sal_Int32 rargc = 1; + rargv[0] = av[0]; + while ( fscanf(cmdFile, "%s", buffer) != EOF ) + { + rargv[rargc]= (char * )rtl_allocateMemory( strlen( buffer ) +1 ); + if( ! rargv[rargc] ) + { + OStringBuffer buf; + buf.append( "Not enough memory for reading command file " ); + buf.append( av[i] +1 ); + buf.append( " with length " ); + buf.append( nLen ); + buf.append( "." ); + throw IllegalArgument( buf.makeStringAndClear() ); + } + strcpy( rargv[rargc] , buffer ); // #100211# - checked + rargc++; + } + fclose(cmdFile); + + parseOptions(rargc, rargv, rOptions, bCmdFile); + + for (long j=1; j < rargc; j++) + { + rtl_freeMemory(rargv[j]); + } + rtl_freeMemory( buffer ); + rtl_freeMemory( rargv ); + } + } else + { + usingRegisterImpl(); + ret = sal_False; + } + } + } + + if( ! bLoaderExplicitlyGiven ) + { + if ( rOptions.sComponentUrls.getLength() > 4 && + rOptions.sComponentUrls.matchAsciiL( + ".jar" , 4 , rOptions.sComponentUrls.getLength() - 4 ) ) + { + if( ! rOptions.bSilent ) + { + printf( "using loader com.sun.star.loader.Java2\n" ); + } + rOptions.sLoaderName = OUString( + RTL_CONSTASCII_USTRINGPARAM("com.sun.star.loader.Java2")); + } + else + { + rOptions.sLoaderName = OUString( + RTL_CONSTASCII_USTRINGPARAM("com.sun.star.loader.SharedLibrary") ); + } + } + + return ret; +} + + +struct DoIt +{ + sal_Bool _bRegister; + sal_Bool _bRevoke; + sal_Bool _bSilent; + sal_Bool _bPrefix; + OUString _sPrefix; + OString _sRegName; + OUString _sLoaderName; + Reference<XImplementationRegistration2> _xImplRegistration; + Reference<XSimpleRegistry> _xReg; + sal_uInt32 * _exitCode; + + DoIt(sal_Bool bRegister, + sal_Bool bRevoke, + sal_Bool bSilent, + sal_Bool bPrefix, + const OUString & sPrefix, + const Reference<XSimpleRegistry> & xReg, + const OString & sRegName, + const Reference<XImplementationRegistration2> & xImplRegistration, + const OUString & sLoaderName, + sal_uInt32 * exitCode) + throw(); + + void operator()(const OUString & url) throw(); +}; + +DoIt::DoIt(sal_Bool bRegister, + sal_Bool bRevoke, + sal_Bool bSilent, + sal_Bool bPrefix, + const OUString & sPrefix, + const Reference<XSimpleRegistry> & xReg, + const OString & sRegName, + const Reference<XImplementationRegistration2> & xImplRegistration, + const OUString & sLoaderName, + sal_uInt32 * exitCode) throw() + : _bRegister(bRegister), + _bRevoke(bRevoke), + _bSilent( bSilent ), + _bPrefix( bPrefix ), + _sPrefix( sPrefix ), + _sRegName(sRegName), + _sLoaderName(sLoaderName), + _xImplRegistration(xImplRegistration), + _xReg(xReg), + _exitCode(exitCode) +{} + +void DoIt::operator() (const OUString & url) throw() +{ + OString sUrl = OUStringToOString(url, osl_getThreadTextEncoding()); + + if (_bRegister) + { + try + { + Reference<XImplementationRegistration2> _xImplRegistration2(_xImplRegistration, UNO_QUERY); + if ( _bPrefix ) { + _xImplRegistration->registerImplementationWithLocation( + _sLoaderName, url, replacePrefix(url, _sPrefix), _xReg); + } else { + _xImplRegistration->registerImplementation(_sLoaderName, url, _xReg); + } + + if ( ! _bSilent ) + { + fprintf(stderr, "register component '%s' in registry '%s' succesful!\n", sUrl.getStr(), _sRegName.getStr()); + } + + } + catch(CannotRegisterImplementationException & cannotRegisterImplementationException) { + OString aMessage(OUStringToOString(cannotRegisterImplementationException.Message, RTL_TEXTENCODING_ASCII_US)); + fprintf(stderr, "register component '%s' in registry '%s' failed!\n", sUrl.getStr(), _sRegName.getStr()); + fprintf(stderr, "error (CannotRegisterImplementationException): %s\n", aMessage.getStr()); + + ++ (*_exitCode); + } + catch( RuntimeException & e ) + { + OString aMessage(OUStringToOString(e.Message, RTL_TEXTENCODING_ASCII_US)); + fprintf(stderr, "register component '%s' in registry '%s' failed!\n", sUrl.getStr(), _sRegName.getStr()); + fprintf(stderr, "error (RuntimeException): %s\n", aMessage.getStr()); + + ++ (*_exitCode); + } + } + else if(_bRevoke) + { + try + { + sal_Bool bRet = _xImplRegistration->revokeImplementation(url, _xReg); + + if (bRet) + { + if ( ! _bSilent ) + fprintf(stderr, "revoke component '%s' from registry '%s' succesful!\n", sUrl.getStr(), _sRegName.getStr()); + } + else + { + fprintf(stderr, "revoke component '%s' from registry '%s' failed!\n", sUrl.getStr(), _sRegName.getStr()); + ++ (*_exitCode); + } + } + catch( RuntimeException & e ) + { + OString aMessage(OUStringToOString(e.Message, RTL_TEXTENCODING_ASCII_US)); + fprintf( stderr, + "revoke component '%s' from registry '%s' failed!\n", + sUrl.getStr(), + _sRegName.getStr() ); + fprintf( stderr, "RuntimeException: %s\n" , aMessage.getStr()); + ++ (*_exitCode); + } + } +} + +static bool hasService( + const Reference< XMultiServiceFactory > &xSMgr, + const sal_Char * service ) +{ + bool ret = false; + + Reference< XContentEnumerationAccess > access( xSMgr, UNO_QUERY ); + if( access.is( )) + { + Reference< XEnumeration > enumeration = access->createContentEnumeration( + OUString::createFromAscii( service ) ); + + if( enumeration.is() && enumeration->hasMoreElements() ) + { + ret = true; + } + } + return ret; +} + +static void bootstrap( + Options & opt , + Reference< XMultiServiceFactory > &xSMgr, + Reference< XSimpleRegistry > & reg ) throw ( Exception ) +{ + if( opt.sRegName.equals( opt.sBootRegName2 ) ) + { + OUString tmp2 = opt.sBootRegName; + opt.sBootRegName = opt.sBootRegName2; + opt.sBootRegName2 = tmp2; + } + + if ( opt.sRegName.equals(opt.sBootRegName) ) + { + if( opt.sBootRegName2.getLength() ) + { + xSMgr = createRegistryServiceFactory( + convertToFileUrl(opt.sRegName), + convertToFileUrl(opt.sBootRegName2), + sal_False ); + } + else + { + xSMgr = createRegistryServiceFactory( + convertToFileUrl(opt.sRegName) , sal_False ); + } + } + else + { + if( opt.sBootRegName2.getLength() ) + { + xSMgr = createRegistryServiceFactory( + convertToFileUrl( opt.sBootRegName2 ), + convertToFileUrl( opt.sBootRegName ), + sal_True ); + } + else if ( opt.sBootRegName.getLength() ) + { + xSMgr = createRegistryServiceFactory( + convertToFileUrl( opt.sBootRegName ), + sal_True ); + } + else + { + xSMgr = createServiceFactory(); + } + reg = Reference< XSimpleRegistry >( + xSMgr->createInstance( + rtl::OUString::createFromAscii("com.sun.star.registry.SimpleRegistry")), UNO_QUERY); + + if (reg.is()) + { + try + { + reg->open( convertToFileUrl(opt.sRegName), sal_False, sal_True); + if (!reg->isValid()) + { + fprintf(stderr, "ERROR: open|create registry '%s' failed!\n", + OUStringToOString(opt.sRegName, osl_getThreadTextEncoding() ).getStr()); + exit(1); + } + } + catch( InvalidRegistryException & e) + { + OString o = OUStringToOString( e.Message , RTL_TEXTENCODING_ASCII_US ); + fprintf(stderr, + "ERROR: create registry '%s' failed!\n" + "InvalidRegistryException: %s\n", + OUStringToOString( opt.sRegName, osl_getThreadTextEncoding()).getStr(), + o.getStr() ); + exit(1); + } + } + } + + if( ! opt.sLoaderName.compareToAscii( "com.sun.star.loader.Java2" ) && + ! hasService( xSMgr, "com.sun.star.loader.Java2" ) ) + { + // we know our java loader, so we check, whether a java-loader is + // registered + Reference< XInterface > r = loadSharedLibComponentFactory( + OUString::createFromAscii( "javavm.uno" SAL_DLLEXTENSION ), + OUString(), + OUString::createFromAscii( "com.sun.star.comp.stoc.JavaVirtualMachine" ), + xSMgr, + Reference< XRegistryKey > () ); + Reference< XInterface > r2 = loadSharedLibComponentFactory( + OUString::createFromAscii( "javaloader.uno" SAL_DLLEXTENSION ), + OUString(), + OUString::createFromAscii(( "com.sun.star.comp.stoc.JavaComponentLoader" ) ), + xSMgr, + Reference< XRegistryKey > () ); + Reference <XSet> xSet( xSMgr, UNO_QUERY ); + if( r.is() && r2.is() && xSet.is() ) + { + xSet->insert( makeAny( r ) ); + xSet->insert( makeAny( r2 ) ); + } + } +} + +SAL_IMPLEMENT_MAIN_WITH_ARGS(argc, argv) +{ + sal_Bool bRet = sal_False; + sal_uInt32 exitCode = 0; + Options aOptions; + + try + { + if ( !parseOptions(argc, argv, aOptions, sal_False) ) + { + exit(1); + } + } + catch ( IllegalArgument& e) + { + fprintf(stderr, "ERROR: %s\n", e.m_message.getStr()); + exit(1); + } + + if( ! aOptions.sRegName.getLength() ) + { + fprintf( stderr, "ERROR: target registry missing (-r option)\n" ); + exit( 1 ); + } + if ( aOptions.sComponentUrls.getLength() == 0 ) + { + fprintf(stderr, "ERROR: no component url is specified!\n"); + exit(1); + } + + Reference< XMultiServiceFactory > xSMgr; + Reference< XSimpleRegistry > xReg; + try + { + bootstrap( aOptions, xSMgr ,xReg ); + } + catch( Exception& e ) + { + fprintf(stderr, "ERROR: create ServiceManager failed!\n"); + if ( e.Message.getLength() ) + { + fprintf(stderr, "ERROR description: %s\n", + OUStringToOString(e.Message, osl_getThreadTextEncoding()).getStr()); + } + exit(1); + } + + Reference<XImplementationRegistration2> xImplRegistration( + xSMgr->createInstance( + OUString(RTL_CONSTASCII_USTRINGPARAM( + "com.sun.star.registry.ImplementationRegistration"))), + UNO_QUERY); + + if (xImplRegistration.is()) + { + sal_Int32 index = 0; + vector<OUString> urls; + + OUString urlListWithSemikolon = aOptions.sComponentUrls; + do { + OUString aToken = urlListWithSemikolon.getToken( 0, ';', index); + fprintf(stderr, "%s\n", OUStringToOString(aToken, osl_getThreadTextEncoding()).getStr()); + urls.push_back(aToken); + } while ( index >= 0 ); + + + OString sRegName = OUStringToOString( aOptions.sRegName, osl_getThreadTextEncoding() ); + if(aOptions.bRegister || aOptions.bRevoke) + { + for_each(urls.begin(), urls.end(), + DoIt(aOptions.bRegister, aOptions.bRevoke, aOptions.bSilent, + aOptions.bPrefix, aOptions.sPrefix, + xReg, sRegName, xImplRegistration, + aOptions.sLoaderName, &exitCode)); + } + else + { + ++ exitCode; + usingRegisterImpl(); + } + } + else + { + fprintf(stderr, "Component registration service could not be loaded!\n"); + exitCode++; + } + + if (!bRet && xReg.is() && xReg->isValid()) + xReg->close(); + + Reference< XComponent > xComponent( xSMgr, UNO_QUERY ); + if ( xComponent.is() ) + xComponent->dispose(); + + return exitCode; +} + + |