diff options
author | Joachim Lingner <jl@openoffice.org> | 2001-06-07 09:14:37 +0000 |
---|---|---|
committer | Joachim Lingner <jl@openoffice.org> | 2001-06-07 09:14:37 +0000 |
commit | 73b69d6e294b3264af3f4f5f68539a53df0ac290 (patch) | |
tree | 267eb0bfdbccd30c39d77fcd811ec86942c4123a /sal/test | |
parent | 46049d9ec096157dfcca6b403c0b74056d8d6f57 (diff) |
*** empty log message ***
Diffstat (limited to 'sal/test')
-rw-r--r-- | sal/test/unloading/samplelib1.xml | 41 | ||||
-rw-r--r-- | sal/test/unloading/samplelib2.cxx | 206 | ||||
-rw-r--r-- | sal/test/unloading/unloadTest.cxx | 526 |
3 files changed, 773 insertions, 0 deletions
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..3a6cdadb936f --- /dev/null +++ b/sal/test/unloading/samplelib2.cxx @@ -0,0 +1,206 @@ + +#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); + } +} diff --git a/sal/test/unloading/unloadTest.cxx b/sal/test/unloading/unloadTest.cxx new file mode 100644 index 000000000000..60ffc9d91072 --- /dev/null +++ b/sal/test/unloading/unloadTest.cxx @@ -0,0 +1,526 @@ + +#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" + + +#define LIBRARY1 "samplelib1" +#define LIBRARY2 "samplelib2" +/* +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(); +void SAL_CALL listenerCallback( void* id); + +void main(int argc, char* argv[]) +{ + + 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"); +} + +/* 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 fail + OUString sSymbol( RTL_CONSTASCII_USTRINGPARAM("component_getFactory")); + void* pSymbol= osl_getSymbol( handleMod, sSymbol.pData); + + if( pSymbol) + { + retval= sal_True; + osl_unloadModule( handleMod); + } + return retval; +} +/* 2 Modules +The module will be registered one time less as it has been loaded. +*/ +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); +}
\ No newline at end of file |