diff options
Diffstat (limited to 'sal/test/unloading')
-rw-r--r-- | sal/test/unloading/exports.dxp | 4 | ||||
-rw-r--r-- | sal/test/unloading/makefile.mk | 126 | ||||
-rw-r--r-- | sal/test/unloading/readme.txt | 14 | ||||
-rw-r--r-- | sal/test/unloading/samplelib1.cxx | 272 | ||||
-rw-r--r-- | sal/test/unloading/samplelib1.xml | 41 | ||||
-rw-r--r-- | sal/test/unloading/samplelib2.cxx | 239 | ||||
-rw-r--r-- | sal/test/unloading/unloadTest.cxx | 659 |
7 files changed, 1355 insertions, 0 deletions
diff --git a/sal/test/unloading/exports.dxp b/sal/test/unloading/exports.dxp new file mode 100644 index 000000000000..82adf8e8be12 --- /dev/null +++ b/sal/test/unloading/exports.dxp @@ -0,0 +1,4 @@ +component_getImplementationEnvironment +component_writeInfo +component_getFactory +component_canUnload diff --git a/sal/test/unloading/makefile.mk b/sal/test/unloading/makefile.mk new file mode 100644 index 000000000000..6c6f6f74f058 --- /dev/null +++ b/sal/test/unloading/makefile.mk @@ -0,0 +1,126 @@ +#************************************************************************* +# +# 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. +# +#************************************************************************* +PRJ=..$/.. + +PRJNAME= sal +TARGET= unloading +TARGET1=samplelib1 +TARGET2=samplelib2 +#LIBTARGET=NO +TARGETTYPE=CUI +COMP1TYPELIST=$(TARGET1) + +NO_BSYMBOLIC= TRUE +ENABLE_EXCEPTIONS=TRUE + +USE_DEFFILE= TRUE + +# --- Settings ----------------------------------------------------- + +.INCLUDE : settings.mk + +CFLAGS+= $(LFS_CFLAGS) +CXXFLAGS+= $(LFS_CFLAGS) + +# --- Files -------------------------------------------------------- + +UNOUCRDEP=$(SOLARBINDIR)$/udkapi.rdb +UNOUCRRDB=$(SOLARBINDIR)$/udkapi.rdb + +CPPUMAKERFLAGS = + +.IF "$(BOOTSTRAP_SERVICE)" == "TRUE" +UNOUCROUT= $(OUT)$/inc$/bootstrap +INCPRE+= $(OUT)$/inc$/bootstrap +.ELSE +.IF "$(COM)" == "MSC" +CPPUMAKERFLAGS = -L +.ENDIF +UNOUCROUT= $(OUT)$/inc$/light +INCPRE+= $(OUT)$/inc$/light +.ENDIF + + +#SLOFILES= \ +# $(SLO)$/samplelib1.obj \ +# $(SLO)$/samplelib2.obj + +LIB1TARGET=$(SLB)$/$(TARGET1).lib +LIB1OBJFILES= \ + $(SLO)$/samplelib1.obj + +SHL1TARGET= $(TARGET1) + +SHL1STDLIBS= \ + $(CPPULIB) \ + $(CPPUHELPERLIB) \ + $(SALLIB) + + + +SHL1DEPN= +#SHL1IMPLIB= i$(TARGET1) +SHL1LIBS= $(SLB)$/$(TARGET1).lib +SHL1DEF= $(MISC)$/$(SHL1TARGET).def +DEF1EXPORTFILE= exports.dxp +DEF1NAME= $(SHL1TARGET) +#------------------------------------------------------- + +LIB2TARGET=$(SLB)$/$(TARGET2).lib +LIB2OBJFILES= \ + $(SLO)$/samplelib2.obj + +SHL2TARGET= $(TARGET2) + +SHL2STDLIBS= \ + $(CPPULIB) \ + $(CPPUHELPERLIB) \ + $(SALLIB) + +SHL2DEPN= +SHL2LIBS= $(SLB)$/$(TARGET2).lib +SHL2DEF= $(MISC)$/$(SHL2TARGET).def +DEF2EXPORTFILE= exports.dxp +DEF2NAME= $(SHL2TARGET) + +# ------------------------------------------------------------------ + +APP1NOSAL=TRUE + +APP1TARGET= $(TARGET) + +APP1OBJS= $(OBJ)$/unloadTest.obj + +APP1STDLIBS= \ + $(SALLIB) \ + $(CPPUHELPERLIB) \ + $(CPPULIB) + +# --- Targets ------------------------------------------------------ + +.INCLUDE : target.mk + diff --git a/sal/test/unloading/readme.txt b/sal/test/unloading/readme.txt new file mode 100644 index 000000000000..7fae8850c1be --- /dev/null +++ b/sal/test/unloading/readme.txt @@ -0,0 +1,14 @@ +The test program test the unloading API, and the default factories from cppuhelper +for their new XUnloadingPreference interface. + +The makefile produces the executable unloading.exe as wells as two +libraries, samplelib1 and samplelib2, which contain services. + + +Usage: + Copy unloading, samplelib1, samplelib2 into the program directory +of an office. + +Register samplelib1 and samplelib2 with regcomp + +Run unloading.
\ No newline at end of file diff --git a/sal/test/unloading/samplelib1.cxx b/sal/test/unloading/samplelib1.cxx new file mode 100644 index 000000000000..1988b7394174 --- /dev/null +++ b/sal/test/unloading/samplelib1.cxx @@ -0,0 +1,272 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_sal.hxx" + +#include <sal/types.h> +#include <osl/time.h> +#include <rtl/ustring.hxx> +#include <uno/environment.h> +#include <cppu/macros.hxx> +#include <cppuhelper/factory.hxx> +#include <com/sun/star/uno/Reference.hxx> +#include <com/sun/star/uno/Sequence.hxx> +#include <cppuhelper/implbase1.hxx> +#include <rtl/unload.h> +#include <rtl/string.hxx> +#include <rtl/ustrbuf.hxx> +#include <com/sun/star/lang/XSingleServiceFactory.hpp> +#include <com/sun/star/lang/XServiceInfo.hpp> +#include <com/sun/star/registry/XRegistryKey.hpp> + +using namespace ::com::sun::star::registry; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::lang; +using namespace ::rtl; +using namespace ::cppu; + +#define IMPLNAME1 "com.sun.star.comp.sal.UnloadingTest1" +#define SERVICENAME1 "com.sun.star.UnloadingTest1" +#define IMPLNAME2 "com.sun.star.comp.sal.UnloadingTest2" +#define SERVICENAME2 "com.sun.star.UnloadingTest2" +#define IMPLNAME3 "com.sun.star.comp.sal.UnloadingTest3" +#define SERVICENAME3 "com.sun.star.UnloadingTest3" +#define IMPLNAME4 "com.sun.star.comp.sal.OneInstanceTest" +#define SERVICENAME4 "com.sun.star.OneInstanceTest" + + +// Unloading Support ---------------------------------------------- +rtl_StandardModuleCount globalModuleCount= MODULE_COUNT_INIT; +//rtl_StandardModuleCount globalModuleCount= { {rtl_moduleCount_acquire,rtl_moduleCount_release}, rtl_moduleCount_canUnload,0,{0,0}}; //, 0, {0, 0}}; +// Services ------------------------------------------------------- +class TestService: public WeakImplHelper1<XServiceInfo> +{ +OUString m_implName; +OUString m_serviceName; +public: + TestService( OUString implName, OUString serviceName); + ~TestService(); + virtual OUString SAL_CALL getImplementationName( ) throw (RuntimeException); + virtual sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) throw (RuntimeException); + virtual Sequence<OUString > SAL_CALL getSupportedServiceNames( ) throw (RuntimeException); +}; + +TestService::TestService( OUString implName, OUString serviceName): + m_implName(implName),m_serviceName(serviceName) +{ // Library unloading support + globalModuleCount.modCnt.acquire( &globalModuleCount.modCnt); +} + +TestService::~TestService() +{ // Library unloading support + globalModuleCount.modCnt.release( &globalModuleCount.modCnt); +} + +OUString SAL_CALL TestService::getImplementationName( ) throw (RuntimeException) +{ + return m_implName; +} +sal_Bool SAL_CALL TestService::supportsService( const OUString& ServiceName ) throw (RuntimeException) +{ + return ServiceName.equals( m_serviceName); +} +Sequence<OUString > SAL_CALL TestService::getSupportedServiceNames( ) throw (RuntimeException) +{ + return Sequence<OUString>( &m_serviceName, 1); +} + + +// Creator functions for Services ------------------------------------------------- +static Reference<XInterface> SAL_CALL test1_createInstance(const Reference<XMultiServiceFactory> & rSMgr) + throw (RuntimeException) +{ + return Reference<XInterface>( static_cast<XWeak*>( new TestService( + OUString( RTL_CONSTASCII_USTRINGPARAM( IMPLNAME1)), + OUString( RTL_CONSTASCII_USTRINGPARAM( SERVICENAME1)) )), UNO_QUERY); +} +static Reference<XInterface> SAL_CALL test2_createInstance(const Reference<XMultiServiceFactory> & rSMgr) + throw (RuntimeException) +{ + return Reference<XInterface>( static_cast<XWeak*>( new TestService( + OUString( RTL_CONSTASCII_USTRINGPARAM( IMPLNAME2)), + OUString( RTL_CONSTASCII_USTRINGPARAM( SERVICENAME2)) )), UNO_QUERY); +} +static Reference<XInterface> SAL_CALL test3_createInstance(const Reference<XMultiServiceFactory> & rSMgr) + throw (RuntimeException) +{ + return Reference<XInterface>( static_cast<XWeak*>( new TestService( + OUString( RTL_CONSTASCII_USTRINGPARAM( IMPLNAME3)), + OUString( RTL_CONSTASCII_USTRINGPARAM( SERVICENAME3)) )), UNO_QUERY); +} +static Reference<XInterface> SAL_CALL test4_createInstance(const Reference<XMultiServiceFactory> & rSMgr) + throw (RuntimeException) +{ + return Reference<XInterface>( static_cast<XWeak*>( new TestService( + OUString( RTL_CONSTASCII_USTRINGPARAM( IMPLNAME4)), + OUString( RTL_CONSTASCII_USTRINGPARAM( SERVICENAME4)) )), UNO_QUERY); +} + + +// Standard UNO library interface ------------------------------------------------- +extern "C" { + void SAL_CALL component_getImplementationEnvironment(const sal_Char ** ppEnvTypeName, uno_Environment ** ppEnv){ + *ppEnvTypeName = CPPU_CURRENT_LANGUAGE_BINDING_NAME; + } + + sal_Bool SAL_CALL component_writeInfo(void * pServiceManager, void * pRegistryKey) throw() + { + if (pRegistryKey) + { + try + { + Reference< XRegistryKey > xNewKey( + reinterpret_cast< XRegistryKey * >( pRegistryKey )->createKey( + OUString::createFromAscii( "/" IMPLNAME1 "/UNO/SERVICES" ) ) ); + + xNewKey->createKey( OUString( RTL_CONSTASCII_USTRINGPARAM( SERVICENAME1))); + + xNewKey= + reinterpret_cast< XRegistryKey * >( pRegistryKey )->createKey( + OUString::createFromAscii( "/" IMPLNAME2 "/UNO/SERVICES" ) ); + + xNewKey->createKey(OUString( RTL_CONSTASCII_USTRINGPARAM( SERVICENAME2))); + xNewKey= + reinterpret_cast< XRegistryKey * >( pRegistryKey )->createKey( + OUString::createFromAscii( "/" IMPLNAME3 "/UNO/SERVICES" ) ); + + xNewKey->createKey(OUString( RTL_CONSTASCII_USTRINGPARAM( SERVICENAME3))); + + xNewKey= + reinterpret_cast< XRegistryKey * >( pRegistryKey )->createKey( + OUString::createFromAscii( "/" IMPLNAME4 "/UNO/SERVICES" ) ); + + xNewKey->createKey(OUString( RTL_CONSTASCII_USTRINGPARAM( SERVICENAME4))); + return sal_True; + } + catch (InvalidRegistryException &) + { + OSL_ENSURE( sal_False, "### InvalidRegistryException!" ); + } + } + return sal_False; + } + + void * SAL_CALL component_getFactory(const sal_Char * pImplName, void * pServiceManager, void * pRegistryKey) throw() + { + void * pRet = 0; + + + OUString implname1( RTL_CONSTASCII_USTRINGPARAM( IMPLNAME1) ); + OUString serviceName1( RTL_CONSTASCII_USTRINGPARAM( SERVICENAME1) ); + OUString implname2( RTL_CONSTASCII_USTRINGPARAM( IMPLNAME2) ); + OUString serviceName2( RTL_CONSTASCII_USTRINGPARAM( SERVICENAME2) ); + OUString implname3( RTL_CONSTASCII_USTRINGPARAM( IMPLNAME3) ); + OUString serviceName3( RTL_CONSTASCII_USTRINGPARAM( SERVICENAME3) ); + OUString implname4( RTL_CONSTASCII_USTRINGPARAM( IMPLNAME4) ); + OUString serviceName4( RTL_CONSTASCII_USTRINGPARAM( SERVICENAME4) ); + + if (implname1.equals( OUString::createFromAscii(pImplName))) + { + Reference<XMultiServiceFactory> mgr= reinterpret_cast<XMultiServiceFactory *>(pServiceManager); + Reference<XSingleServiceFactory> xFactory( createSingleFactory( + reinterpret_cast<XMultiServiceFactory *>(pServiceManager), + implname1, + test1_createInstance, + Sequence<OUString>( &serviceName1, 1), + &globalModuleCount.modCnt + )); + + if (xFactory.is()) + { + xFactory->acquire(); + pRet = xFactory.get(); + } + } + else if( implname2.equals( OUString::createFromAscii(pImplName))) + { + Reference<XMultiServiceFactory> mgr= reinterpret_cast<XMultiServiceFactory *>(pServiceManager); + Reference<XSingleServiceFactory> xFactory( createSingleFactory( + reinterpret_cast<XMultiServiceFactory *>(pServiceManager), + implname2, + test2_createInstance, + Sequence<OUString>( &serviceName2, 1), + &globalModuleCount.modCnt + )); + + if (xFactory.is()) + { + xFactory->acquire(); + pRet = xFactory.get(); + } + } + else if( implname3.equals( OUString::createFromAscii(pImplName))) + { + Reference<XMultiServiceFactory> mgr= reinterpret_cast<XMultiServiceFactory *>(pServiceManager); + Reference<XSingleServiceFactory> xFactory( createSingleFactory( + reinterpret_cast<XMultiServiceFactory *>(pServiceManager), + implname3, + test3_createInstance, + Sequence<OUString>( &serviceName3, 1), + &globalModuleCount.modCnt + )); + + if (xFactory.is()) + { + xFactory->acquire(); + pRet = xFactory.get(); + } + } + else if( implname4.equals( OUString::createFromAscii(pImplName))) + { + Reference<XMultiServiceFactory> mgr= reinterpret_cast<XMultiServiceFactory *>(pServiceManager); + Reference<XSingleServiceFactory> xFactory( createOneInstanceFactory( + reinterpret_cast<XMultiServiceFactory *>(pServiceManager), + implname3, + test4_createInstance, + Sequence<OUString>( &serviceName3, 1), + &globalModuleCount.modCnt + )); + + if (xFactory.is()) + { + xFactory->acquire(); + pRet = xFactory.get(); + } + } + return pRet; + } + + sal_Bool component_canUnload( TimeValue* libUnused) + { + return globalModuleCount.canUnload( &globalModuleCount, libUnused); + } +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sal/test/unloading/samplelib1.xml b/sal/test/unloading/samplelib1.xml new file mode 100644 index 000000000000..da1d0640a4bb --- /dev/null +++ b/sal/test/unloading/samplelib1.xml @@ -0,0 +1,41 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE module-description PUBLIC "-//StarOffice//DTD ComponentDescription 1.0//EN" "module-description.dtd"> +<module-description xmlns:xlink="http://www.w3.org/1999/xlink"> + <module-name> samplelib1 </module-name> + <component-description> + <author> Joachim Lingner </author> + <name> com.sun.star.comp.stoc.JavaVirtualMachine </name> + <description> + </description> + <loader-name> com.sun.star.loader.SharedLibrary </loader-name> + <language> c++ </language> + <status value="final"/> + <supported-service> com.sun.star.Unloading1 </supported-service> + <service-dependency> ... </service-dependency> + <type> com.sun.star.lang.XSingleComponentFactory </type> + <type> com.sun.star.lang.XComponent </type> + <type> com.sun.star.container.XNameAccess </type> + <type> com.sun.star.container.XContentEnumerationAccess </type> + <type> com.sun.star.container.XEnumeration </type> + <type> com.sun.star.lang.XTypeProvider </type> + <type> com.sun.star.lang.XServiceInfo </type> + <type> com.sun.star.lang.XSingleServiceFactory </type> + <type> com.sun.star.lang.XMultiServiceFactory </type> + <type> com.sun.star.registry.XSimpleRegistry </type> + <type> com.sun.star.lang.XSingleComponentFactory </type> + <type> com.sun.star.uno.XComponentContext </type> + <type> com.sun.star.uno.XUnloadingPreference </type> + <type> com.sun.star.uno.XAggregation </type> + <type> com.sun.star.uno.XWeak </type> + <type> com.sun.star.uno.TypeClass </type> + <type> com.sun.star.beans.XPropertySet </type> + </component-description> + <project-build-dependency> cppuhelper </project-build-dependency> + <project-build-dependency> cppu </project-build-dependency> + <project-build-dependency> tools </project-build-dependency> + <project-build-dependency> sal </project-build-dependency> + <runtime-module-dependency> cppuhelper3$(COM) </runtime-module-dependency> + <runtime-module-dependency> cppu3 </runtime-module-dependency> + <runtime-module-dependency> tl(COM) </runtime-module-dependency> + <runtime-module-dependency> sal3 </runtime-module-dependency> +</module-description> diff --git a/sal/test/unloading/samplelib2.cxx b/sal/test/unloading/samplelib2.cxx new file mode 100644 index 000000000000..616dc13503c8 --- /dev/null +++ b/sal/test/unloading/samplelib2.cxx @@ -0,0 +1,239 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_sal.hxx" + +#include <sal/types.h> +#include <osl/time.h> +#include <rtl/ustring.hxx> +#include <uno/environment.h> +#include <cppu/macros.hxx> +#include <cppuhelper/factory.hxx> +#include <com/sun/star/uno/Reference.hxx> +#include <com/sun/star/uno/Sequence.hxx> +#include <cppuhelper/implbase1.hxx> +#include <rtl/unload.h> +#include <rtl/string.hxx> +#include <rtl/ustrbuf.hxx> +#include <com/sun/star/lang/XSingleServiceFactory.hpp> +#include <com/sun/star/lang/XServiceInfo.hpp> +#include <com/sun/star/registry/XRegistryKey.hpp> + +using namespace ::com::sun::star::registry; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::lang; +using namespace ::rtl; +using namespace ::cppu; + +#define IMPLNAME1 "com.sun.star.comp.sal.UnloadingTest21" +#define SERVICENAME1 "com.sun.star.UnloadingTest21" +#define IMPLNAME2 "com.sun.star.comp.sal.UnloadingTest22" +#define SERVICENAME2 "com.sun.star.UnloadingTest22" +#define IMPLNAME3 "com.sun.star.comp.sal.UnloadingTest23" +#define SERVICENAME3 "com.sun.star.UnloadingTest23" + +// Unloading Support ---------------------------------------------- +rtl_StandardModuleCount globalModuleCount= MODULE_COUNT_INIT; +//rtl_StandardModuleCount globalModuleCount= { {rtl_moduleCount_acquire,rtl_moduleCount_release}, rtl_moduleCount_canUnload,0,{0,0}}; //, 0, {0, 0}}; +// Services ------------------------------------------------------- +class TestService: public WeakImplHelper1<XServiceInfo> +{ +OUString m_implName; +OUString m_serviceName; +public: + TestService( OUString implName, OUString serviceName); + ~TestService(); + virtual OUString SAL_CALL getImplementationName( ) throw (RuntimeException); + virtual sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) throw (RuntimeException); + virtual Sequence<OUString > SAL_CALL getSupportedServiceNames( ) throw (RuntimeException); +}; + +TestService::TestService( OUString implName, OUString serviceName): + m_implName(implName),m_serviceName(serviceName) +{ // Library unloading support + globalModuleCount.modCnt.acquire( &globalModuleCount.modCnt); +} + +TestService::~TestService() +{ // Library unloading support + globalModuleCount.modCnt.release( &globalModuleCount.modCnt); +} + +OUString SAL_CALL TestService::getImplementationName( ) throw (RuntimeException) +{ + return m_implName; +} +sal_Bool SAL_CALL TestService::supportsService( const OUString& ServiceName ) throw (RuntimeException) +{ + return ServiceName.equals( m_serviceName); +} +Sequence<OUString > SAL_CALL TestService::getSupportedServiceNames( ) throw (RuntimeException) +{ + return Sequence<OUString>( &m_serviceName, 1); +} + + +// Creator functions for Services ------------------------------------------------- +static Reference<XInterface> SAL_CALL test21_createInstance(const Reference<XMultiServiceFactory> & rSMgr) + throw (RuntimeException) +{ + return Reference<XInterface>( static_cast<XWeak*>( new TestService( + OUString( RTL_CONSTASCII_USTRINGPARAM( IMPLNAME1)), + OUString( RTL_CONSTASCII_USTRINGPARAM( SERVICENAME1)) )), UNO_QUERY); +} +static Reference<XInterface> SAL_CALL test22_createInstance(const Reference<XMultiServiceFactory> & rSMgr) + throw (RuntimeException) +{ + return Reference<XInterface>( static_cast<XWeak*>( new TestService( + OUString( RTL_CONSTASCII_USTRINGPARAM( IMPLNAME2)), + OUString( RTL_CONSTASCII_USTRINGPARAM( SERVICENAME2)) )), UNO_QUERY); +} +static Reference<XInterface> SAL_CALL test23_createInstance(const Reference<XMultiServiceFactory> & rSMgr) + throw (RuntimeException) +{ + return Reference<XInterface>( static_cast<XWeak*>( new TestService( + OUString( RTL_CONSTASCII_USTRINGPARAM( IMPLNAME3)), + OUString( RTL_CONSTASCII_USTRINGPARAM( SERVICENAME3)) )), UNO_QUERY); +} + + +// Standard UNO library interface ------------------------------------------------- +extern "C" { + void SAL_CALL component_getImplementationEnvironment(const sal_Char ** ppEnvTypeName, uno_Environment ** ppEnv){ + *ppEnvTypeName = CPPU_CURRENT_LANGUAGE_BINDING_NAME; + } + + sal_Bool SAL_CALL component_writeInfo(void * pServiceManager, void * pRegistryKey) throw() + { + if (pRegistryKey) + { + try + { + Reference< XRegistryKey > xNewKey( + reinterpret_cast< XRegistryKey * >( pRegistryKey )->createKey( + OUString::createFromAscii( "/" IMPLNAME1 "/UNO/SERVICES" ) ) ); + + xNewKey->createKey( OUString( RTL_CONSTASCII_USTRINGPARAM( SERVICENAME1))); + + xNewKey= + reinterpret_cast< XRegistryKey * >( pRegistryKey )->createKey( + OUString::createFromAscii( "/" IMPLNAME2 "/UNO/SERVICES" ) ); + + xNewKey->createKey(OUString( RTL_CONSTASCII_USTRINGPARAM( SERVICENAME2))); + xNewKey= + reinterpret_cast< XRegistryKey * >( pRegistryKey )->createKey( + OUString::createFromAscii( "/" IMPLNAME3 "/UNO/SERVICES" ) ); + + xNewKey->createKey(OUString( RTL_CONSTASCII_USTRINGPARAM( SERVICENAME3))); + + return sal_True; + } + catch (InvalidRegistryException &) + { + OSL_ENSURE( sal_False, "### InvalidRegistryException!" ); + } + } + return sal_False; + } + + void * SAL_CALL component_getFactory(const sal_Char * pImplName, void * pServiceManager, void * pRegistryKey) throw() + { + void * pRet = 0; + + + OUString implname1( RTL_CONSTASCII_USTRINGPARAM( IMPLNAME1) ); + OUString serviceName1( RTL_CONSTASCII_USTRINGPARAM( SERVICENAME1) ); + OUString implname2( RTL_CONSTASCII_USTRINGPARAM( IMPLNAME2) ); + OUString serviceName2( RTL_CONSTASCII_USTRINGPARAM( SERVICENAME2) ); + OUString implname3( RTL_CONSTASCII_USTRINGPARAM( IMPLNAME3) ); + OUString serviceName3( RTL_CONSTASCII_USTRINGPARAM( SERVICENAME3) ); + + if (implname1.equals( OUString::createFromAscii(pImplName))) + { + Reference<XMultiServiceFactory> mgr= reinterpret_cast<XMultiServiceFactory *>(pServiceManager); + Reference<XSingleServiceFactory> xFactory( createSingleFactory( + reinterpret_cast<XMultiServiceFactory *>(pServiceManager), + implname1, + test21_createInstance, + Sequence<OUString>( &serviceName1, 1), + &globalModuleCount.modCnt + )); + + if (xFactory.is()) + { + xFactory->acquire(); + pRet = xFactory.get(); + } + } + else if( implname2.equals( OUString::createFromAscii(pImplName))) + { + Reference<XMultiServiceFactory> mgr= reinterpret_cast<XMultiServiceFactory *>(pServiceManager); + Reference<XSingleServiceFactory> xFactory( createSingleFactory( + reinterpret_cast<XMultiServiceFactory *>(pServiceManager), + implname2, + test22_createInstance, + Sequence<OUString>( &serviceName2, 1), + &globalModuleCount.modCnt + )); + + if (xFactory.is()) + { + xFactory->acquire(); + pRet = xFactory.get(); + } + } + else if( implname3.equals( OUString::createFromAscii(pImplName))) + { + Reference<XMultiServiceFactory> mgr= reinterpret_cast<XMultiServiceFactory *>(pServiceManager); + Reference<XSingleServiceFactory> xFactory( createSingleFactory( + reinterpret_cast<XMultiServiceFactory *>(pServiceManager), + implname3, + test23_createInstance, + Sequence<OUString>( &serviceName3, 1), + &globalModuleCount.modCnt + )); + + if (xFactory.is()) + { + xFactory->acquire(); + pRet = xFactory.get(); + } + } + + return pRet; + } + + sal_Bool component_canUnload( TimeValue* libUnused) + { + return globalModuleCount.canUnload( &globalModuleCount, libUnused); + } +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sal/test/unloading/unloadTest.cxx b/sal/test/unloading/unloadTest.cxx new file mode 100644 index 000000000000..31c3a6e7e05e --- /dev/null +++ b/sal/test/unloading/unloadTest.cxx @@ -0,0 +1,659 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_sal.hxx" + +#include<osl/module.hxx> +#include <osl/time.h> +#include <rtl/ustring.hxx> +#include <stdio.h> +#include <cppuhelper/factory.hxx> +#include <cppuhelper/servicefactory.hxx> +#include <com/sun/star/lang/XMultiServiceFactory.hpp> +#include <com/sun/star/lang/XSingleServiceFactory.hpp> +#include <com/sun/star/lang/XServiceInfo.hpp> +#include <com/sun/star/lang/XComponent.hpp> +#include <com/sun/star/beans/XPropertySet.hpp> +#include <com/sun/star/uno/XComponentContext.hpp> +#include <com/sun/star/uno/XUnloadingPreference.hpp> +#include <com/sun/star/lang/XTypeProvider.hpp> +#include <com/sun/star/container/XContentEnumerationAccess.hpp> + +#include <stdio.h> +using namespace ::rtl; +using namespace ::osl; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::lang; +using namespace ::cppu; +using namespace ::com::sun::star::beans; +using namespace ::com::sun::star::container; + +#define IMPLNAME1 "com.sun.star.comp.sal.UnloadingTest1" +#define SERVICENAME1 "com.sun.star.UnloadingTest1" +#define IMPLNAME2 "com.sun.star.comp.sal.UnloadingTest2" +#define SERVICENAME2 "com.sun.star.UnloadingTest2" +#define IMPLNAME3 "com.sun.star.comp.sal.UnloadingTest3" +#define SERVICENAME3 "com.sun.star.UnloadingTest3" +#define IMPLNAME4 "com.sun.star.comp.sal.OneInstanceTest" +#define SERVICENAME4 "com.sun.star.OneInstanceTest" + +#define IMPLNAME21 "com.sun.star.comp.sal.UnloadingTest21" +#define SERVICENAME21 "com.sun.star.UnloadingTest21" +#define IMPLNAME22 "com.sun.star.comp.sal.UnloadingTest22" +#define SERVICENAME22 "com.sun.star.UnloadingTest22" +#define IMPLNAME23 "com.sun.star.comp.sal.UnloadingTest23" +#define SERVICENAME23 "com.sun.star.UnloadingTest23" + +#ifdef UNX +#define LIBRARY1 "libsamplelib1.so" +#define LIBRARY2 "libsamplelib2.so" +#elif defined WNT +#define LIBRARY1 "samplelib1" +#define LIBRARY2 "samplelib2" +#endif +/* +Tested: rtl_registerModuleForUnloading, rtl_unregisterModuleForUnloading, rtl_unloadUnusedLibraries + 1 component. + +next: Test with multiple components + Listener mechanism. +*/ + +sal_Bool test1(); +sal_Bool test2(); +sal_Bool test3(); +sal_Bool test4(); +sal_Bool test5(); +sal_Bool test6(); +sal_Bool test7(); +sal_Bool test8(); +sal_Bool test9(); +void SAL_CALL listenerCallback( void* id); + +int main(int argc, char* argv[]) +{ + // Test if the servicemanager can be created and if the sample libs + // can be loaded +// Reference<XMultiServiceFactory> serviceManager= createRegistryServiceFactory( +// OUString( RTL_CONSTASCII_USTRINGPARAM("applicat.rdb"))); +// if( !serviceManager.is()) +// { +// printf("\n ####################################################\n" +// "Error: could not create service manager. \n" +// "Is the executable in the office program directory?\n"); +// return -1; +// } + +// Reference<XInterface> xint1= serviceManager->createInstance( OUString( +// RTL_CONSTASCII_USTRINGPARAM(SERVICENAME1))); + +// if( !xint1.is()) +// { +// printf("\n ###################################################\n" +// "Error: could not create service from samplelib1\n" +// "Is samplelib1 in the office program directory and is it " +// "registered?\n"); +// return -1; +// } +// Reference<XInterface> xint2= serviceManager->createInstance( OUString( +// RTL_CONSTASCII_USTRINGPARAM(SERVICENAME21))); +// if( !xint2.is()) +// { +// printf("\n ###################################################" +// "Error: could not create service from samplelib2\n" +// "Is samplelib2 in the office program directory and is it " +// "registered?\n"); +// return -1; +// } +// //destroy servicemanager +// Reference<XPropertySet> xSet( serviceManager, UNO_QUERY); +// Any any_prop= xSet->getPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("DefaultContext"))); +// Reference<XComponentContext> xContext; +// any_prop >>= xContext; +// Reference<XComponent> xComponent( xContext, UNO_QUERY); +// xComponent->dispose(); + +// //unload samplelib1 and samplelib2. We need the handles, therefore load +// // the libs +// OUString libname1( RTL_CONSTASCII_USTRINGPARAM(LIBRARY1)); +// OUString libname2( RTL_CONSTASCII_USTRINGPARAM(LIBRARY2)); +// oslModule m1= osl_loadModule(libname1.pData, 0); +// oslModule m2= osl_loadModule(libname2.pData, 0); +// osl_unloadModule( m1); +// osl_unloadModule( m1); +// osl_unloadModule( m2); +// osl_unloadModule( m2); + + + sal_Bool ret1= test1(); + if( ret1) printf( "\n Test 1 successful \n"); + else printf("\n !!!!!! Test 1 failed\n"); + sal_Bool ret2= test2(); + if( ret2) printf( "\n Test 2 successful \n"); + else printf("\n !!!!!! Test 2 failed\n"); + sal_Bool ret3= test3(); + if( ret3) printf( "\n Test 3 successful \n"); + else printf("\n !!!!!! Test 3 failed\n"); + sal_Bool ret4= test4(); + if( ret4) printf( "\n Test 4 successful \n"); + else printf("\n !!!!!! Test 4 failed\n"); + sal_Bool ret5= test5(); + if( ret5) printf( "\n Test 5 successful \n"); + else printf("\n !!!!!! Test 5 failed\n"); + // takes some time (10s) + sal_Bool ret6= test6(); + sal_Bool ret7= test7(); // prints message itself + sal_Bool ret8= test8(); + if( ret8) printf( "\n Test 8 successful \n"); + else printf("\n !!!!!! Test 8 failed\n"); + sal_Bool ret9= test9(); + if( ret9) printf( "\n Test 9 successful: service manager is unloading listener\n"); + else printf("\n !!!!! Test 9 failed\n"); + + return 0; +} + +/* Create an instance of SERVICENAME1, call a function and unload module. + This tests the loader and basic functionality. + The library will be loaded once manually and the handle will be stored. + Then the library will be unloaded. After rtl_unloadUnusedLibraries we try to + get a symbol of the unloaded lib. If this fails then the test is successful. +*/ +sal_Bool test1() +{ + printf("Test 1 ####################################################\n"); + oslModule handleMod=0; + OUString lib1Name( RTL_CONSTASCII_USTRINGPARAM(LIBRARY1)); + { + Reference<XMultiServiceFactory> serviceManager= createRegistryServiceFactory( + OUString( RTL_CONSTASCII_USTRINGPARAM("applicat.rdb"))); + Reference<XInterface> xint= serviceManager->createInstance( OUString( + RTL_CONSTASCII_USTRINGPARAM(SERVICENAME1))); + + // get the handle + handleMod= osl_loadModule( lib1Name.pData, 0); + osl_unloadModule( handleMod); + xint=0; + + Reference<XPropertySet> xSet( serviceManager, UNO_QUERY); + Any any_prop= xSet->getPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("DefaultContext"))); + Reference<XComponentContext> xContext; + any_prop >>= xContext; + Reference<XComponent> xComponent( xContext, UNO_QUERY); + xComponent->dispose(); + } + rtl_unloadUnusedModules( NULL); + + // Try to get a symbol, must fail + OUString sSymbol( RTL_CONSTASCII_USTRINGPARAM("component_getFactory")); + void* pSymbol= osl_getSymbol( handleMod, sSymbol.pData); + + if( !pSymbol) + return sal_True; + return sal_False; +} + +/* Multipe loadModule + rtl_registerModuleForUnloading. +The module will be registered as often as it has been loaded. +*/ +sal_Bool test2() +{ + printf("Test 2 ####################################################\n"); + oslModule handleMod=0; + OUString lib1Name( RTL_CONSTASCII_USTRINGPARAM(LIBRARY1)); + { + Reference<XMultiServiceFactory> serviceManager= createRegistryServiceFactory( + OUString( RTL_CONSTASCII_USTRINGPARAM("applicat.rdb"))); + + Reference<XInterface> xint= serviceManager->createInstance( OUString( + RTL_CONSTASCII_USTRINGPARAM(SERVICENAME1))); + + handleMod= osl_loadModule( lib1Name.pData, 0); + osl_unloadModule( handleMod); + //----------------------------------------------------------- + oslModule mod1= osl_loadModule( lib1Name.pData, 0); + oslModule mod2= osl_loadModule( lib1Name.pData, 0); + oslModule mod3= osl_loadModule( lib1Name.pData, 0); + + rtl_registerModuleForUnloading(mod1); + rtl_registerModuleForUnloading(mod2); + rtl_registerModuleForUnloading(mod3); + // ---------------------------------------------------------- + Reference<XPropertySet> xSet( serviceManager, UNO_QUERY); + Any any_prop= xSet->getPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("DefaultContext"))); + Reference<XComponentContext> xContext; + any_prop >>= xContext; + Reference<XComponent> xComponent( xContext, UNO_QUERY); + xComponent->dispose(); + } + rtl_unloadUnusedModules( NULL); + + // Try to get a symbol, must fail + OUString sSymbol( RTL_CONSTASCII_USTRINGPARAM("component_getFactory")); + void* pSymbol= osl_getSymbol( handleMod, sSymbol.pData); + + if( !pSymbol) + return sal_True; + return sal_False; +} + +/* Multipe loadModule + rtl_registerModuleForUnloading. +The module will be registered one time less as it has been loaded. +*/ +sal_Bool test3() +{ + printf("Test 3 ####################################################\n"); + oslModule handleMod=0; + sal_Bool retval=sal_False; + OUString lib1Name( RTL_CONSTASCII_USTRINGPARAM(LIBRARY1)); + { + Reference<XMultiServiceFactory> serviceManager= createRegistryServiceFactory( + OUString( RTL_CONSTASCII_USTRINGPARAM("applicat.rdb"))); + + Reference<XInterface> xint= serviceManager->createInstance( OUString( + RTL_CONSTASCII_USTRINGPARAM(SERVICENAME1))); + + handleMod= osl_loadModule( lib1Name.pData, 0); + osl_unloadModule( handleMod); + //----------------------------------------------------------- + oslModule mod1= osl_loadModule( lib1Name.pData, 0); + oslModule mod2= osl_loadModule( lib1Name.pData, 0); + oslModule mod3= osl_loadModule( lib1Name.pData, 0); + + rtl_registerModuleForUnloading(mod1); + rtl_registerModuleForUnloading(mod2); + // ---------------------------------------------------------- + Reference<XPropertySet> xSet( serviceManager, UNO_QUERY); + Any any_prop= xSet->getPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("DefaultContext"))); + Reference<XComponentContext> xContext; + any_prop >>= xContext; + Reference<XComponent> xComponent( xContext, UNO_QUERY); + xComponent->dispose(); + } + rtl_unloadUnusedModules( NULL); + + // Try to get a symbol, must succeed + OUString sSymbol( RTL_CONSTASCII_USTRINGPARAM("component_getFactory")); + void* pSymbol= osl_getSymbol( handleMod, sSymbol.pData); + + if( pSymbol) + { + retval= sal_True; + osl_unloadModule( handleMod); + pSymbol= osl_getSymbol( handleMod, sSymbol.pData); + } + return retval; +} +/* 2 Modules + +*/ +sal_Bool test4() +{ + printf("Test 4 ####################################################\n"); + oslModule handleMod1=0; + oslModule handleMod2=0; + OUString lib1Name( RTL_CONSTASCII_USTRINGPARAM(LIBRARY1)); + OUString lib2Name( RTL_CONSTASCII_USTRINGPARAM(LIBRARY2)); + { + Reference<XMultiServiceFactory> serviceManager= createRegistryServiceFactory( + OUString( RTL_CONSTASCII_USTRINGPARAM("applicat.rdb"))); + + Reference<XInterface> xint= serviceManager->createInstance( OUString( + RTL_CONSTASCII_USTRINGPARAM(SERVICENAME1))); + + handleMod1= osl_loadModule( lib1Name.pData, 0); + osl_unloadModule( handleMod1); + Reference<XInterface> xint2= serviceManager->createInstance( OUString( + RTL_CONSTASCII_USTRINGPARAM(SERVICENAME21))); + + handleMod2= osl_loadModule( lib2Name.pData, 0); + osl_unloadModule( handleMod2); + + //----------------------------------------------------------- + // ---------------------------------------------------------- + Reference<XPropertySet> xSet( serviceManager, UNO_QUERY); + Any any_prop= xSet->getPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("DefaultContext"))); + Reference<XComponentContext> xContext; + any_prop >>= xContext; + Reference<XComponent> xComponent( xContext, UNO_QUERY); + xComponent->dispose(); + } + rtl_unloadUnusedModules( NULL); + + // Try to get a symbol, must fail + OUString sSymbol( RTL_CONSTASCII_USTRINGPARAM("component_getFactory")); + void* pSymbol= osl_getSymbol( handleMod1, sSymbol.pData); + + void* pSymbol2= osl_getSymbol( handleMod2, sSymbol.pData); + if( ! pSymbol && !pSymbol2) + return sal_True; + return sal_False; +} + +/* 2 Modules and 6 services + +*/ +sal_Bool test5() +{ + printf("test5 ####################################################\n"); + oslModule handleMod1=0; + oslModule handleMod2=0; + sal_Bool btest1= sal_False; + OUString lib1Name( RTL_CONSTASCII_USTRINGPARAM(LIBRARY1)); + OUString lib2Name( RTL_CONSTASCII_USTRINGPARAM(LIBRARY2)); + OUString sSymbol( RTL_CONSTASCII_USTRINGPARAM("component_getFactory")); + { + Reference<XMultiServiceFactory> serviceManager= createRegistryServiceFactory( + OUString( RTL_CONSTASCII_USTRINGPARAM("applicat.rdb"))); + + //----------------------------------------------------------- + Reference<XInterface> xint= serviceManager->createInstance( OUString( + RTL_CONSTASCII_USTRINGPARAM(SERVICENAME1))); + Reference<XInterface> xint2= serviceManager->createInstance( OUString( + RTL_CONSTASCII_USTRINGPARAM(SERVICENAME2))); + Reference<XInterface> xint3= serviceManager->createInstance( OUString( + RTL_CONSTASCII_USTRINGPARAM(SERVICENAME3))); + Reference<XInterface> xint4= serviceManager->createInstance( OUString( + RTL_CONSTASCII_USTRINGPARAM(SERVICENAME21))); + Reference<XInterface> xint5= serviceManager->createInstance( OUString( + RTL_CONSTASCII_USTRINGPARAM(SERVICENAME22))); + Reference<XInterface> xint6= serviceManager->createInstance( OUString( + RTL_CONSTASCII_USTRINGPARAM(SERVICENAME23))); + + // ---------------------------------------------------------- + handleMod1= osl_loadModule( lib1Name.pData, 0); + osl_unloadModule( handleMod1); + handleMod2= osl_loadModule( lib2Name.pData, 0); + osl_unloadModule( handleMod2); + + // get rid of the service manager + Reference<XPropertySet> xSet( serviceManager, UNO_QUERY); + Any any_prop= xSet->getPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("DefaultContext"))); + Reference<XComponentContext> xContext; + any_prop >>= xContext; + Reference<XComponent> xComponent( xContext, UNO_QUERY); + xComponent->dispose(); + + // try unloading, must fail + rtl_unloadUnusedModules( NULL); + void* pSymbol= osl_getSymbol( handleMod1, sSymbol.pData); + + void* pSymbol2= osl_getSymbol( handleMod2, sSymbol.pData); + if( pSymbol && pSymbol2) + btest1= sal_True; + + } + + // Try to get a symbol, must succeed + rtl_unloadUnusedModules( NULL); + + void* pSymbol= osl_getSymbol( handleMod1, sSymbol.pData); + void* pSymbol2= osl_getSymbol( handleMod2, sSymbol.pData); + if( ! pSymbol && !pSymbol2 && btest1) + return sal_True; + return sal_False; +} + +/* +TimeValue Test +rtl_unloadUnusedModules takes a TimeValue which determines a timespan +a module must have been constantly unused in order to be unloaded. +This is only a rough test. To make accurate tests, one should directly +write code in the unload.cxx file. +The function will not return (loop) when the test fails or the result value +is far off the 10 seconds value. +*/ +sal_Bool test6() +{ + printf("test6 ####################################################\n"); + oslModule handleMod1=0; + oslModule handleMod2=0; + OUString lib1Name( RTL_CONSTASCII_USTRINGPARAM(LIBRARY1)); + OUString lib2Name( RTL_CONSTASCII_USTRINGPARAM(LIBRARY2)); + OUString sSymbol( RTL_CONSTASCII_USTRINGPARAM("component_getFactory")); + { + Reference<XMultiServiceFactory> serviceManager= createRegistryServiceFactory( + OUString( RTL_CONSTASCII_USTRINGPARAM("applicat.rdb"))); + Reference<XInterface> xint= serviceManager->createInstance( OUString( + RTL_CONSTASCII_USTRINGPARAM(SERVICENAME1))); + + // ---------------------------------------------------------- + handleMod1= osl_loadModule( lib1Name.pData, 0); + osl_unloadModule( handleMod1); + + // get rid of the service manager + Reference<XPropertySet> xSet( serviceManager, UNO_QUERY); + Any any_prop= xSet->getPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("DefaultContext"))); + Reference<XComponentContext> xContext; + any_prop >>= xContext; + Reference<XComponent> xComponent( xContext, UNO_QUERY); + xComponent->dispose(); + } + + // Enter a loop and try unloading. At least after 10 seconds + // this should be successful. + TimeValue time={10,0}; + + TimeValue beforeTime={0,0}; + printf("\n unloading should take about 10 seconds\n"); + osl_getSystemTime( &beforeTime); + for(;;) + { + + rtl_unloadUnusedModules( &time); + void* pSymbol= osl_getSymbol( handleMod1, sSymbol.pData); + if( ! pSymbol) + break; + } + TimeValue afterTime={0,0}; + osl_getSystemTime( &afterTime); + + printf("\n it took about %i seconds \n Check the value!!!", afterTime.Seconds - beforeTime.Seconds); + printf(" hit return to continue\n"); + getchar(); + + return sal_True; +} + +/* +*/ +sal_Bool test7() +{ + printf("Test 7 ####################################################" + "\nThe callback function should be called 3 times\n"); + sal_Int32 id1=1; + sal_Int32 id2=2; + sal_Int32 id3=3; + sal_Int32 cookie1= rtl_addUnloadingListener( listenerCallback, &id1); + sal_Int32 cookie2= rtl_addUnloadingListener( listenerCallback, &id2); + sal_Int32 cookie3= rtl_addUnloadingListener( listenerCallback, &id3); + + printf("\nTest 7 \nThe listener should be called 3 times\n"); + rtl_unloadUnusedModules( NULL); + + rtl_removeUnloadingListener( cookie1); + rtl_removeUnloadingListener( cookie2); + rtl_removeUnloadingListener( cookie3); + + sal_Int32 cookie4= rtl_addUnloadingListener( listenerCallback, &id1); + sal_Int32 cookie5= rtl_addUnloadingListener( listenerCallback, &id2); + sal_Int32 cookie6= rtl_addUnloadingListener( listenerCallback, &id3); + + if( cookie1 == cookie4 && + cookie2 == cookie5 ) + { + printf("\n###cookie recycling works\n"); + printf("hit return to continue\n"); + getchar(); + } + else + { + printf("\n###cookie recycling failed!!!\n"); + printf("hit return to continue\n"); + getchar(); + } + + rtl_removeUnloadingListener( cookie1); + rtl_removeUnloadingListener( cookie2); + rtl_removeUnloadingListener( cookie3); + return sal_True; +} + +/* Test one-instance-service default factory (XUnloadingPreference) + cppuhelper/source/factory.cxx +*/ +sal_Bool test8() +{ + printf("Test 8 ####################################################\n"); + oslModule handleMod1=0; + OUString lib1Name( RTL_CONSTASCII_USTRINGPARAM(LIBRARY1)); + OUString sSymbol( RTL_CONSTASCII_USTRINGPARAM("component_getFactory")); + + sal_Bool b_ifaceSupported=sal_False; + sal_Bool b_instances_identical= sal_False; + sal_Bool b_releaseBeforeLoading= sal_False; + sal_Bool b_releaseAfterLoading= sal_False; + sal_Bool b_unloaded= sal_False; + + { + Reference<XMultiServiceFactory> serviceManager= createRegistryServiceFactory( + OUString( RTL_CONSTASCII_USTRINGPARAM("applicat.rdb"))); + Reference<XContentEnumerationAccess> xContent( serviceManager, UNO_QUERY); + Reference<XEnumeration> xenum= xContent->createContentEnumeration( + OUString( RTL_CONSTASCII_USTRINGPARAM( SERVICENAME4))); + + Any any_elem; + if( xenum->hasMoreElements()) + any_elem= xenum->nextElement(); + Reference<XInterface> xinterfaceFact; + any_elem>>=xinterfaceFact; + Reference<XTypeProvider> xprov( xinterfaceFact, UNO_QUERY); + + Sequence<Type> seqTypes= xprov->getTypes(); + + // XTypeProvider test + for( sal_Int32 i=0; i<seqTypes.getLength(); i++) + { + OUString name= seqTypes[i].getTypeName(); + if( name == OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.uno.XUnloadingPreference"))) + b_ifaceSupported= sal_True; + } + + // XUnloadingPreference::releaseOnNotification should return true now because we haven't + // created an instance yet + Reference<XUnloadingPreference> xreject( xinterfaceFact, UNO_QUERY); + b_releaseBeforeLoading= xreject->releaseOnNotification(); + + // Create instance. Afterwards releaseOnNotification should return false. + Reference<XInterface> xint= serviceManager->createInstance( OUString( + RTL_CONSTASCII_USTRINGPARAM(SERVICENAME4))); + b_releaseAfterLoading= xreject->releaseOnNotification(); + b_releaseAfterLoading= b_releaseAfterLoading? sal_False : sal_True; + + // safe the handle of the module + handleMod1= osl_loadModule( lib1Name.pData, 0); + osl_unloadModule( handleMod1); + + // ---------------------------------------------------------- + // for debugging + Reference<XServiceInfo> info( xint, UNO_QUERY); + OUString s= info->getImplementationName(); + + // get another instance which must be the same + Reference<XInterface> xint2= serviceManager->createInstance( OUString( + RTL_CONSTASCII_USTRINGPARAM(SERVICENAME4))); + + b_instances_identical= xint == xint2; + + // get rid of the service manager + Reference<XPropertySet> xSet( serviceManager, UNO_QUERY); + Any any_prop= xSet->getPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("DefaultContext"))); + Reference<XComponentContext> xContext; + any_prop >>= xContext; + Reference<XComponent> xComponent( xContext, UNO_QUERY); + xComponent->dispose(); + } + + rtl_unloadUnusedModules( NULL); + + // The library must be unloaded now + void* pSymbol= osl_getSymbol( handleMod1, sSymbol.pData); + if( ! pSymbol ) + b_unloaded= sal_True; + + if( b_ifaceSupported && b_instances_identical && b_releaseBeforeLoading && + b_releaseAfterLoading && b_unloaded) + return sal_True; + return sal_False; +} + +void SAL_CALL listenerCallback( void* id) +{ + printf(" listener called with id= %i\n", *(sal_Int32*)id); +} + +/* + + */ +sal_Bool test9() +{ + printf("Test 9 ####################################################\n"); + oslModule handleMod=0; + sal_Bool retval=sal_False; + OUString lib1Name( RTL_CONSTASCII_USTRINGPARAM(LIBRARY1)); + + Reference<XMultiServiceFactory> serviceManager= createRegistryServiceFactory( + OUString( RTL_CONSTASCII_USTRINGPARAM("applicat.rdb"))); + + Reference<XInterface> xint= serviceManager->createInstance( OUString( + RTL_CONSTASCII_USTRINGPARAM(SERVICENAME1))); + // Release the service. The library refcount should be 1 + xint=0; + + handleMod= osl_loadModule( lib1Name.pData, 0); + osl_unloadModule( handleMod); + //----------------------------------------------------------- + + // the service manager is still alive + rtl_unloadUnusedModules( NULL); + // Try to get a symbol, must fail + OUString sSymbol( RTL_CONSTASCII_USTRINGPARAM("component_getFactory")); + void* pSymbol= osl_getSymbol( handleMod, sSymbol.pData); + + if( pSymbol) + { + retval= sal_False; + } + else + retval= sal_True; + return retval; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |