summaryrefslogtreecommitdiff
path: root/sal/test/unloading/unloadTest.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sal/test/unloading/unloadTest.cxx')
-rw-r--r--sal/test/unloading/unloadTest.cxx656
1 files changed, 656 insertions, 0 deletions
diff --git a/sal/test/unloading/unloadTest.cxx b/sal/test/unloading/unloadTest.cxx
new file mode 100644
index 000000000000..d8589ab76717
--- /dev/null
+++ b/sal/test/unloading/unloadTest.cxx
@@ -0,0 +1,656 @@
+/*************************************************************************
+ *
+ * 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;
+}