/**************************************************************
 * 
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the 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;
}
