1*87d2adbcSAndrew Rist /**************************************************************
2cdf0e10cSrcweir *
3*87d2adbcSAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one
4*87d2adbcSAndrew Rist * or more contributor license agreements. See the NOTICE file
5*87d2adbcSAndrew Rist * distributed with this work for additional information
6*87d2adbcSAndrew Rist * regarding copyright ownership. The ASF licenses this file
7*87d2adbcSAndrew Rist * to you under the Apache License, Version 2.0 (the
8*87d2adbcSAndrew Rist * "License"); you may not use this file except in compliance
9*87d2adbcSAndrew Rist * with the License. You may obtain a copy of the License at
10*87d2adbcSAndrew Rist *
11*87d2adbcSAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
12*87d2adbcSAndrew Rist *
13*87d2adbcSAndrew Rist * Unless required by applicable law or agreed to in writing,
14*87d2adbcSAndrew Rist * software distributed under the License is distributed on an
15*87d2adbcSAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*87d2adbcSAndrew Rist * KIND, either express or implied. See the License for the
17*87d2adbcSAndrew Rist * specific language governing permissions and limitations
18*87d2adbcSAndrew Rist * under the License.
19*87d2adbcSAndrew Rist *
20*87d2adbcSAndrew Rist *************************************************************/
21*87d2adbcSAndrew Rist
22*87d2adbcSAndrew Rist
23cdf0e10cSrcweir
24cdf0e10cSrcweir
25cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
26cdf0e10cSrcweir #include "precompiled_sal.hxx"
27cdf0e10cSrcweir
28cdf0e10cSrcweir #include<osl/module.hxx>
29cdf0e10cSrcweir #include <osl/time.h>
30cdf0e10cSrcweir #include <rtl/ustring.hxx>
31cdf0e10cSrcweir #include <stdio.h>
32cdf0e10cSrcweir #include <cppuhelper/factory.hxx>
33cdf0e10cSrcweir #include <cppuhelper/servicefactory.hxx>
34cdf0e10cSrcweir #include <com/sun/star/lang/XMultiServiceFactory.hpp>
35cdf0e10cSrcweir #include <com/sun/star/lang/XSingleServiceFactory.hpp>
36cdf0e10cSrcweir #include <com/sun/star/lang/XServiceInfo.hpp>
37cdf0e10cSrcweir #include <com/sun/star/lang/XComponent.hpp>
38cdf0e10cSrcweir #include <com/sun/star/beans/XPropertySet.hpp>
39cdf0e10cSrcweir #include <com/sun/star/uno/XComponentContext.hpp>
40cdf0e10cSrcweir #include <com/sun/star/uno/XUnloadingPreference.hpp>
41cdf0e10cSrcweir #include <com/sun/star/lang/XTypeProvider.hpp>
42cdf0e10cSrcweir #include <com/sun/star/container/XContentEnumerationAccess.hpp>
43cdf0e10cSrcweir
44cdf0e10cSrcweir #include <stdio.h>
45cdf0e10cSrcweir using namespace ::rtl;
46cdf0e10cSrcweir using namespace ::osl;
47cdf0e10cSrcweir using namespace ::com::sun::star::uno;
48cdf0e10cSrcweir using namespace ::com::sun::star::lang;
49cdf0e10cSrcweir using namespace ::cppu;
50cdf0e10cSrcweir using namespace ::com::sun::star::beans;
51cdf0e10cSrcweir using namespace ::com::sun::star::container;
52cdf0e10cSrcweir
53cdf0e10cSrcweir #define IMPLNAME1 "com.sun.star.comp.sal.UnloadingTest1"
54cdf0e10cSrcweir #define SERVICENAME1 "com.sun.star.UnloadingTest1"
55cdf0e10cSrcweir #define IMPLNAME2 "com.sun.star.comp.sal.UnloadingTest2"
56cdf0e10cSrcweir #define SERVICENAME2 "com.sun.star.UnloadingTest2"
57cdf0e10cSrcweir #define IMPLNAME3 "com.sun.star.comp.sal.UnloadingTest3"
58cdf0e10cSrcweir #define SERVICENAME3 "com.sun.star.UnloadingTest3"
59cdf0e10cSrcweir #define IMPLNAME4 "com.sun.star.comp.sal.OneInstanceTest"
60cdf0e10cSrcweir #define SERVICENAME4 "com.sun.star.OneInstanceTest"
61cdf0e10cSrcweir
62cdf0e10cSrcweir #define IMPLNAME21 "com.sun.star.comp.sal.UnloadingTest21"
63cdf0e10cSrcweir #define SERVICENAME21 "com.sun.star.UnloadingTest21"
64cdf0e10cSrcweir #define IMPLNAME22 "com.sun.star.comp.sal.UnloadingTest22"
65cdf0e10cSrcweir #define SERVICENAME22 "com.sun.star.UnloadingTest22"
66cdf0e10cSrcweir #define IMPLNAME23 "com.sun.star.comp.sal.UnloadingTest23"
67cdf0e10cSrcweir #define SERVICENAME23 "com.sun.star.UnloadingTest23"
68cdf0e10cSrcweir
69cdf0e10cSrcweir #ifdef UNX
70cdf0e10cSrcweir #define LIBRARY1 "libsamplelib1.so"
71cdf0e10cSrcweir #define LIBRARY2 "libsamplelib2.so"
72cdf0e10cSrcweir #elif defined WNT
73cdf0e10cSrcweir #define LIBRARY1 "samplelib1"
74cdf0e10cSrcweir #define LIBRARY2 "samplelib2"
75cdf0e10cSrcweir #endif
76cdf0e10cSrcweir /*
77cdf0e10cSrcweir Tested: rtl_registerModuleForUnloading, rtl_unregisterModuleForUnloading, rtl_unloadUnusedLibraries
78cdf0e10cSrcweir 1 component.
79cdf0e10cSrcweir
80cdf0e10cSrcweir next: Test with multiple components
81cdf0e10cSrcweir Listener mechanism.
82cdf0e10cSrcweir */
83cdf0e10cSrcweir
84cdf0e10cSrcweir sal_Bool test1();
85cdf0e10cSrcweir sal_Bool test2();
86cdf0e10cSrcweir sal_Bool test3();
87cdf0e10cSrcweir sal_Bool test4();
88cdf0e10cSrcweir sal_Bool test5();
89cdf0e10cSrcweir sal_Bool test6();
90cdf0e10cSrcweir sal_Bool test7();
91cdf0e10cSrcweir sal_Bool test8();
92cdf0e10cSrcweir sal_Bool test9();
93cdf0e10cSrcweir void SAL_CALL listenerCallback( void* id);
94cdf0e10cSrcweir
main(int argc,char * argv[])95cdf0e10cSrcweir int main(int argc, char* argv[])
96cdf0e10cSrcweir {
97cdf0e10cSrcweir // Test if the servicemanager can be created and if the sample libs
98cdf0e10cSrcweir // can be loaded
99cdf0e10cSrcweir // Reference<XMultiServiceFactory> serviceManager= createRegistryServiceFactory(
100cdf0e10cSrcweir // OUString( RTL_CONSTASCII_USTRINGPARAM("applicat.rdb")));
101cdf0e10cSrcweir // if( !serviceManager.is())
102cdf0e10cSrcweir // {
103cdf0e10cSrcweir // printf("\n ####################################################\n"
104cdf0e10cSrcweir // "Error: could not create service manager. \n"
105cdf0e10cSrcweir // "Is the executable in the office program directory?\n");
106cdf0e10cSrcweir // return -1;
107cdf0e10cSrcweir // }
108cdf0e10cSrcweir
109cdf0e10cSrcweir // Reference<XInterface> xint1= serviceManager->createInstance( OUString(
110cdf0e10cSrcweir // RTL_CONSTASCII_USTRINGPARAM(SERVICENAME1)));
111cdf0e10cSrcweir
112cdf0e10cSrcweir // if( !xint1.is())
113cdf0e10cSrcweir // {
114cdf0e10cSrcweir // printf("\n ###################################################\n"
115cdf0e10cSrcweir // "Error: could not create service from samplelib1\n"
116cdf0e10cSrcweir // "Is samplelib1 in the office program directory and is it "
117cdf0e10cSrcweir // "registered?\n");
118cdf0e10cSrcweir // return -1;
119cdf0e10cSrcweir // }
120cdf0e10cSrcweir // Reference<XInterface> xint2= serviceManager->createInstance( OUString(
121cdf0e10cSrcweir // RTL_CONSTASCII_USTRINGPARAM(SERVICENAME21)));
122cdf0e10cSrcweir // if( !xint2.is())
123cdf0e10cSrcweir // {
124cdf0e10cSrcweir // printf("\n ###################################################"
125cdf0e10cSrcweir // "Error: could not create service from samplelib2\n"
126cdf0e10cSrcweir // "Is samplelib2 in the office program directory and is it "
127cdf0e10cSrcweir // "registered?\n");
128cdf0e10cSrcweir // return -1;
129cdf0e10cSrcweir // }
130cdf0e10cSrcweir // //destroy servicemanager
131cdf0e10cSrcweir // Reference<XPropertySet> xSet( serviceManager, UNO_QUERY);
132cdf0e10cSrcweir // Any any_prop= xSet->getPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("DefaultContext")));
133cdf0e10cSrcweir // Reference<XComponentContext> xContext;
134cdf0e10cSrcweir // any_prop >>= xContext;
135cdf0e10cSrcweir // Reference<XComponent> xComponent( xContext, UNO_QUERY);
136cdf0e10cSrcweir // xComponent->dispose();
137cdf0e10cSrcweir
138cdf0e10cSrcweir // //unload samplelib1 and samplelib2. We need the handles, therefore load
139cdf0e10cSrcweir // // the libs
140cdf0e10cSrcweir // OUString libname1( RTL_CONSTASCII_USTRINGPARAM(LIBRARY1));
141cdf0e10cSrcweir // OUString libname2( RTL_CONSTASCII_USTRINGPARAM(LIBRARY2));
142cdf0e10cSrcweir // oslModule m1= osl_loadModule(libname1.pData, 0);
143cdf0e10cSrcweir // oslModule m2= osl_loadModule(libname2.pData, 0);
144cdf0e10cSrcweir // osl_unloadModule( m1);
145cdf0e10cSrcweir // osl_unloadModule( m1);
146cdf0e10cSrcweir // osl_unloadModule( m2);
147cdf0e10cSrcweir // osl_unloadModule( m2);
148cdf0e10cSrcweir
149cdf0e10cSrcweir
150cdf0e10cSrcweir sal_Bool ret1= test1();
151cdf0e10cSrcweir if( ret1) printf( "\n Test 1 successful \n");
152cdf0e10cSrcweir else printf("\n !!!!!! Test 1 failed\n");
153cdf0e10cSrcweir sal_Bool ret2= test2();
154cdf0e10cSrcweir if( ret2) printf( "\n Test 2 successful \n");
155cdf0e10cSrcweir else printf("\n !!!!!! Test 2 failed\n");
156cdf0e10cSrcweir sal_Bool ret3= test3();
157cdf0e10cSrcweir if( ret3) printf( "\n Test 3 successful \n");
158cdf0e10cSrcweir else printf("\n !!!!!! Test 3 failed\n");
159cdf0e10cSrcweir sal_Bool ret4= test4();
160cdf0e10cSrcweir if( ret4) printf( "\n Test 4 successful \n");
161cdf0e10cSrcweir else printf("\n !!!!!! Test 4 failed\n");
162cdf0e10cSrcweir sal_Bool ret5= test5();
163cdf0e10cSrcweir if( ret5) printf( "\n Test 5 successful \n");
164cdf0e10cSrcweir else printf("\n !!!!!! Test 5 failed\n");
165cdf0e10cSrcweir // takes some time (10s)
166cdf0e10cSrcweir sal_Bool ret6= test6();
167cdf0e10cSrcweir sal_Bool ret7= test7(); // prints message itself
168cdf0e10cSrcweir sal_Bool ret8= test8();
169cdf0e10cSrcweir if( ret8) printf( "\n Test 8 successful \n");
170cdf0e10cSrcweir else printf("\n !!!!!! Test 8 failed\n");
171cdf0e10cSrcweir sal_Bool ret9= test9();
172cdf0e10cSrcweir if( ret9) printf( "\n Test 9 successful: service manager is unloading listener\n");
173cdf0e10cSrcweir else printf("\n !!!!! Test 9 failed\n");
174cdf0e10cSrcweir
175cdf0e10cSrcweir return 0;
176cdf0e10cSrcweir }
177cdf0e10cSrcweir
178cdf0e10cSrcweir /* Create an instance of SERVICENAME1, call a function and unload module.
179cdf0e10cSrcweir This tests the loader and basic functionality.
180cdf0e10cSrcweir The library will be loaded once manually and the handle will be stored.
181cdf0e10cSrcweir Then the library will be unloaded. After rtl_unloadUnusedLibraries we try to
182cdf0e10cSrcweir get a symbol of the unloaded lib. If this fails then the test is successful.
183cdf0e10cSrcweir */
test1()184cdf0e10cSrcweir sal_Bool test1()
185cdf0e10cSrcweir {
186cdf0e10cSrcweir printf("Test 1 ####################################################\n");
187cdf0e10cSrcweir oslModule handleMod=0;
188cdf0e10cSrcweir OUString lib1Name( RTL_CONSTASCII_USTRINGPARAM(LIBRARY1));
189cdf0e10cSrcweir {
190cdf0e10cSrcweir Reference<XMultiServiceFactory> serviceManager= createRegistryServiceFactory(
191cdf0e10cSrcweir OUString( RTL_CONSTASCII_USTRINGPARAM("applicat.rdb")));
192cdf0e10cSrcweir Reference<XInterface> xint= serviceManager->createInstance( OUString(
193cdf0e10cSrcweir RTL_CONSTASCII_USTRINGPARAM(SERVICENAME1)));
194cdf0e10cSrcweir
195cdf0e10cSrcweir // get the handle
196cdf0e10cSrcweir handleMod= osl_loadModule( lib1Name.pData, 0);
197cdf0e10cSrcweir osl_unloadModule( handleMod);
198cdf0e10cSrcweir xint=0;
199cdf0e10cSrcweir
200cdf0e10cSrcweir Reference<XPropertySet> xSet( serviceManager, UNO_QUERY);
201cdf0e10cSrcweir Any any_prop= xSet->getPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("DefaultContext")));
202cdf0e10cSrcweir Reference<XComponentContext> xContext;
203cdf0e10cSrcweir any_prop >>= xContext;
204cdf0e10cSrcweir Reference<XComponent> xComponent( xContext, UNO_QUERY);
205cdf0e10cSrcweir xComponent->dispose();
206cdf0e10cSrcweir }
207cdf0e10cSrcweir rtl_unloadUnusedModules( NULL);
208cdf0e10cSrcweir
209cdf0e10cSrcweir // Try to get a symbol, must fail
210cdf0e10cSrcweir OUString sSymbol( RTL_CONSTASCII_USTRINGPARAM("component_getFactory"));
211cdf0e10cSrcweir void* pSymbol= osl_getSymbol( handleMod, sSymbol.pData);
212cdf0e10cSrcweir
213cdf0e10cSrcweir if( !pSymbol)
214cdf0e10cSrcweir return sal_True;
215cdf0e10cSrcweir return sal_False;
216cdf0e10cSrcweir }
217cdf0e10cSrcweir
218cdf0e10cSrcweir /* Multipe loadModule + rtl_registerModuleForUnloading.
219cdf0e10cSrcweir The module will be registered as often as it has been loaded.
220cdf0e10cSrcweir */
test2()221cdf0e10cSrcweir sal_Bool test2()
222cdf0e10cSrcweir {
223cdf0e10cSrcweir printf("Test 2 ####################################################\n");
224cdf0e10cSrcweir oslModule handleMod=0;
225cdf0e10cSrcweir OUString lib1Name( RTL_CONSTASCII_USTRINGPARAM(LIBRARY1));
226cdf0e10cSrcweir {
227cdf0e10cSrcweir Reference<XMultiServiceFactory> serviceManager= createRegistryServiceFactory(
228cdf0e10cSrcweir OUString( RTL_CONSTASCII_USTRINGPARAM("applicat.rdb")));
229cdf0e10cSrcweir
230cdf0e10cSrcweir Reference<XInterface> xint= serviceManager->createInstance( OUString(
231cdf0e10cSrcweir RTL_CONSTASCII_USTRINGPARAM(SERVICENAME1)));
232cdf0e10cSrcweir
233cdf0e10cSrcweir handleMod= osl_loadModule( lib1Name.pData, 0);
234cdf0e10cSrcweir osl_unloadModule( handleMod);
235cdf0e10cSrcweir //-----------------------------------------------------------
236cdf0e10cSrcweir oslModule mod1= osl_loadModule( lib1Name.pData, 0);
237cdf0e10cSrcweir oslModule mod2= osl_loadModule( lib1Name.pData, 0);
238cdf0e10cSrcweir oslModule mod3= osl_loadModule( lib1Name.pData, 0);
239cdf0e10cSrcweir
240cdf0e10cSrcweir rtl_registerModuleForUnloading(mod1);
241cdf0e10cSrcweir rtl_registerModuleForUnloading(mod2);
242cdf0e10cSrcweir rtl_registerModuleForUnloading(mod3);
243cdf0e10cSrcweir // ----------------------------------------------------------
244cdf0e10cSrcweir Reference<XPropertySet> xSet( serviceManager, UNO_QUERY);
245cdf0e10cSrcweir Any any_prop= xSet->getPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("DefaultContext")));
246cdf0e10cSrcweir Reference<XComponentContext> xContext;
247cdf0e10cSrcweir any_prop >>= xContext;
248cdf0e10cSrcweir Reference<XComponent> xComponent( xContext, UNO_QUERY);
249cdf0e10cSrcweir xComponent->dispose();
250cdf0e10cSrcweir }
251cdf0e10cSrcweir rtl_unloadUnusedModules( NULL);
252cdf0e10cSrcweir
253cdf0e10cSrcweir // Try to get a symbol, must fail
254cdf0e10cSrcweir OUString sSymbol( RTL_CONSTASCII_USTRINGPARAM("component_getFactory"));
255cdf0e10cSrcweir void* pSymbol= osl_getSymbol( handleMod, sSymbol.pData);
256cdf0e10cSrcweir
257cdf0e10cSrcweir if( !pSymbol)
258cdf0e10cSrcweir return sal_True;
259cdf0e10cSrcweir return sal_False;
260cdf0e10cSrcweir }
261cdf0e10cSrcweir
262cdf0e10cSrcweir /* Multipe loadModule + rtl_registerModuleForUnloading.
263cdf0e10cSrcweir The module will be registered one time less as it has been loaded.
264cdf0e10cSrcweir */
test3()265cdf0e10cSrcweir sal_Bool test3()
266cdf0e10cSrcweir {
267cdf0e10cSrcweir printf("Test 3 ####################################################\n");
268cdf0e10cSrcweir oslModule handleMod=0;
269cdf0e10cSrcweir sal_Bool retval=sal_False;
270cdf0e10cSrcweir OUString lib1Name( RTL_CONSTASCII_USTRINGPARAM(LIBRARY1));
271cdf0e10cSrcweir {
272cdf0e10cSrcweir Reference<XMultiServiceFactory> serviceManager= createRegistryServiceFactory(
273cdf0e10cSrcweir OUString( RTL_CONSTASCII_USTRINGPARAM("applicat.rdb")));
274cdf0e10cSrcweir
275cdf0e10cSrcweir Reference<XInterface> xint= serviceManager->createInstance( OUString(
276cdf0e10cSrcweir RTL_CONSTASCII_USTRINGPARAM(SERVICENAME1)));
277cdf0e10cSrcweir
278cdf0e10cSrcweir handleMod= osl_loadModule( lib1Name.pData, 0);
279cdf0e10cSrcweir osl_unloadModule( handleMod);
280cdf0e10cSrcweir //-----------------------------------------------------------
281cdf0e10cSrcweir oslModule mod1= osl_loadModule( lib1Name.pData, 0);
282cdf0e10cSrcweir oslModule mod2= osl_loadModule( lib1Name.pData, 0);
283cdf0e10cSrcweir oslModule mod3= osl_loadModule( lib1Name.pData, 0);
284cdf0e10cSrcweir
285cdf0e10cSrcweir rtl_registerModuleForUnloading(mod1);
286cdf0e10cSrcweir rtl_registerModuleForUnloading(mod2);
287cdf0e10cSrcweir // ----------------------------------------------------------
288cdf0e10cSrcweir Reference<XPropertySet> xSet( serviceManager, UNO_QUERY);
289cdf0e10cSrcweir Any any_prop= xSet->getPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("DefaultContext")));
290cdf0e10cSrcweir Reference<XComponentContext> xContext;
291cdf0e10cSrcweir any_prop >>= xContext;
292cdf0e10cSrcweir Reference<XComponent> xComponent( xContext, UNO_QUERY);
293cdf0e10cSrcweir xComponent->dispose();
294cdf0e10cSrcweir }
295cdf0e10cSrcweir rtl_unloadUnusedModules( NULL);
296cdf0e10cSrcweir
297cdf0e10cSrcweir // Try to get a symbol, must succeed
298cdf0e10cSrcweir OUString sSymbol( RTL_CONSTASCII_USTRINGPARAM("component_getFactory"));
299cdf0e10cSrcweir void* pSymbol= osl_getSymbol( handleMod, sSymbol.pData);
300cdf0e10cSrcweir
301cdf0e10cSrcweir if( pSymbol)
302cdf0e10cSrcweir {
303cdf0e10cSrcweir retval= sal_True;
304cdf0e10cSrcweir osl_unloadModule( handleMod);
305cdf0e10cSrcweir pSymbol= osl_getSymbol( handleMod, sSymbol.pData);
306cdf0e10cSrcweir }
307cdf0e10cSrcweir return retval;
308cdf0e10cSrcweir }
309cdf0e10cSrcweir /* 2 Modules
310cdf0e10cSrcweir
311cdf0e10cSrcweir */
test4()312cdf0e10cSrcweir sal_Bool test4()
313cdf0e10cSrcweir {
314cdf0e10cSrcweir printf("Test 4 ####################################################\n");
315cdf0e10cSrcweir oslModule handleMod1=0;
316cdf0e10cSrcweir oslModule handleMod2=0;
317cdf0e10cSrcweir OUString lib1Name( RTL_CONSTASCII_USTRINGPARAM(LIBRARY1));
318cdf0e10cSrcweir OUString lib2Name( RTL_CONSTASCII_USTRINGPARAM(LIBRARY2));
319cdf0e10cSrcweir {
320cdf0e10cSrcweir Reference<XMultiServiceFactory> serviceManager= createRegistryServiceFactory(
321cdf0e10cSrcweir OUString( RTL_CONSTASCII_USTRINGPARAM("applicat.rdb")));
322cdf0e10cSrcweir
323cdf0e10cSrcweir Reference<XInterface> xint= serviceManager->createInstance( OUString(
324cdf0e10cSrcweir RTL_CONSTASCII_USTRINGPARAM(SERVICENAME1)));
325cdf0e10cSrcweir
326cdf0e10cSrcweir handleMod1= osl_loadModule( lib1Name.pData, 0);
327cdf0e10cSrcweir osl_unloadModule( handleMod1);
328cdf0e10cSrcweir Reference<XInterface> xint2= serviceManager->createInstance( OUString(
329cdf0e10cSrcweir RTL_CONSTASCII_USTRINGPARAM(SERVICENAME21)));
330cdf0e10cSrcweir
331cdf0e10cSrcweir handleMod2= osl_loadModule( lib2Name.pData, 0);
332cdf0e10cSrcweir osl_unloadModule( handleMod2);
333cdf0e10cSrcweir
334cdf0e10cSrcweir //-----------------------------------------------------------
335cdf0e10cSrcweir // ----------------------------------------------------------
336cdf0e10cSrcweir Reference<XPropertySet> xSet( serviceManager, UNO_QUERY);
337cdf0e10cSrcweir Any any_prop= xSet->getPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("DefaultContext")));
338cdf0e10cSrcweir Reference<XComponentContext> xContext;
339cdf0e10cSrcweir any_prop >>= xContext;
340cdf0e10cSrcweir Reference<XComponent> xComponent( xContext, UNO_QUERY);
341cdf0e10cSrcweir xComponent->dispose();
342cdf0e10cSrcweir }
343cdf0e10cSrcweir rtl_unloadUnusedModules( NULL);
344cdf0e10cSrcweir
345cdf0e10cSrcweir // Try to get a symbol, must fail
346cdf0e10cSrcweir OUString sSymbol( RTL_CONSTASCII_USTRINGPARAM("component_getFactory"));
347cdf0e10cSrcweir void* pSymbol= osl_getSymbol( handleMod1, sSymbol.pData);
348cdf0e10cSrcweir
349cdf0e10cSrcweir void* pSymbol2= osl_getSymbol( handleMod2, sSymbol.pData);
350cdf0e10cSrcweir if( ! pSymbol && !pSymbol2)
351cdf0e10cSrcweir return sal_True;
352cdf0e10cSrcweir return sal_False;
353cdf0e10cSrcweir }
354cdf0e10cSrcweir
355cdf0e10cSrcweir /* 2 Modules and 6 services
356cdf0e10cSrcweir
357cdf0e10cSrcweir */
test5()358cdf0e10cSrcweir sal_Bool test5()
359cdf0e10cSrcweir {
360cdf0e10cSrcweir printf("test5 ####################################################\n");
361cdf0e10cSrcweir oslModule handleMod1=0;
362cdf0e10cSrcweir oslModule handleMod2=0;
363cdf0e10cSrcweir sal_Bool btest1= sal_False;
364cdf0e10cSrcweir OUString lib1Name( RTL_CONSTASCII_USTRINGPARAM(LIBRARY1));
365cdf0e10cSrcweir OUString lib2Name( RTL_CONSTASCII_USTRINGPARAM(LIBRARY2));
366cdf0e10cSrcweir OUString sSymbol( RTL_CONSTASCII_USTRINGPARAM("component_getFactory"));
367cdf0e10cSrcweir {
368cdf0e10cSrcweir Reference<XMultiServiceFactory> serviceManager= createRegistryServiceFactory(
369cdf0e10cSrcweir OUString( RTL_CONSTASCII_USTRINGPARAM("applicat.rdb")));
370cdf0e10cSrcweir
371cdf0e10cSrcweir //-----------------------------------------------------------
372cdf0e10cSrcweir Reference<XInterface> xint= serviceManager->createInstance( OUString(
373cdf0e10cSrcweir RTL_CONSTASCII_USTRINGPARAM(SERVICENAME1)));
374cdf0e10cSrcweir Reference<XInterface> xint2= serviceManager->createInstance( OUString(
375cdf0e10cSrcweir RTL_CONSTASCII_USTRINGPARAM(SERVICENAME2)));
376cdf0e10cSrcweir Reference<XInterface> xint3= serviceManager->createInstance( OUString(
377cdf0e10cSrcweir RTL_CONSTASCII_USTRINGPARAM(SERVICENAME3)));
378cdf0e10cSrcweir Reference<XInterface> xint4= serviceManager->createInstance( OUString(
379cdf0e10cSrcweir RTL_CONSTASCII_USTRINGPARAM(SERVICENAME21)));
380cdf0e10cSrcweir Reference<XInterface> xint5= serviceManager->createInstance( OUString(
381cdf0e10cSrcweir RTL_CONSTASCII_USTRINGPARAM(SERVICENAME22)));
382cdf0e10cSrcweir Reference<XInterface> xint6= serviceManager->createInstance( OUString(
383cdf0e10cSrcweir RTL_CONSTASCII_USTRINGPARAM(SERVICENAME23)));
384cdf0e10cSrcweir
385cdf0e10cSrcweir // ----------------------------------------------------------
386cdf0e10cSrcweir handleMod1= osl_loadModule( lib1Name.pData, 0);
387cdf0e10cSrcweir osl_unloadModule( handleMod1);
388cdf0e10cSrcweir handleMod2= osl_loadModule( lib2Name.pData, 0);
389cdf0e10cSrcweir osl_unloadModule( handleMod2);
390cdf0e10cSrcweir
391cdf0e10cSrcweir // get rid of the service manager
392cdf0e10cSrcweir Reference<XPropertySet> xSet( serviceManager, UNO_QUERY);
393cdf0e10cSrcweir Any any_prop= xSet->getPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("DefaultContext")));
394cdf0e10cSrcweir Reference<XComponentContext> xContext;
395cdf0e10cSrcweir any_prop >>= xContext;
396cdf0e10cSrcweir Reference<XComponent> xComponent( xContext, UNO_QUERY);
397cdf0e10cSrcweir xComponent->dispose();
398cdf0e10cSrcweir
399cdf0e10cSrcweir // try unloading, must fail
400cdf0e10cSrcweir rtl_unloadUnusedModules( NULL);
401cdf0e10cSrcweir void* pSymbol= osl_getSymbol( handleMod1, sSymbol.pData);
402cdf0e10cSrcweir
403cdf0e10cSrcweir void* pSymbol2= osl_getSymbol( handleMod2, sSymbol.pData);
404cdf0e10cSrcweir if( pSymbol && pSymbol2)
405cdf0e10cSrcweir btest1= sal_True;
406cdf0e10cSrcweir
407cdf0e10cSrcweir }
408cdf0e10cSrcweir
409cdf0e10cSrcweir // Try to get a symbol, must succeed
410cdf0e10cSrcweir rtl_unloadUnusedModules( NULL);
411cdf0e10cSrcweir
412cdf0e10cSrcweir void* pSymbol= osl_getSymbol( handleMod1, sSymbol.pData);
413cdf0e10cSrcweir void* pSymbol2= osl_getSymbol( handleMod2, sSymbol.pData);
414cdf0e10cSrcweir if( ! pSymbol && !pSymbol2 && btest1)
415cdf0e10cSrcweir return sal_True;
416cdf0e10cSrcweir return sal_False;
417cdf0e10cSrcweir }
418cdf0e10cSrcweir
419cdf0e10cSrcweir /*
420cdf0e10cSrcweir TimeValue Test
421cdf0e10cSrcweir rtl_unloadUnusedModules takes a TimeValue which determines a timespan
422cdf0e10cSrcweir a module must have been constantly unused in order to be unloaded.
423cdf0e10cSrcweir This is only a rough test. To make accurate tests, one should directly
424cdf0e10cSrcweir write code in the unload.cxx file.
425cdf0e10cSrcweir The function will not return (loop) when the test fails or the result value
426cdf0e10cSrcweir is far off the 10 seconds value.
427cdf0e10cSrcweir */
test6()428cdf0e10cSrcweir sal_Bool test6()
429cdf0e10cSrcweir {
430cdf0e10cSrcweir printf("test6 ####################################################\n");
431cdf0e10cSrcweir oslModule handleMod1=0;
432cdf0e10cSrcweir oslModule handleMod2=0;
433cdf0e10cSrcweir OUString lib1Name( RTL_CONSTASCII_USTRINGPARAM(LIBRARY1));
434cdf0e10cSrcweir OUString lib2Name( RTL_CONSTASCII_USTRINGPARAM(LIBRARY2));
435cdf0e10cSrcweir OUString sSymbol( RTL_CONSTASCII_USTRINGPARAM("component_getFactory"));
436cdf0e10cSrcweir {
437cdf0e10cSrcweir Reference<XMultiServiceFactory> serviceManager= createRegistryServiceFactory(
438cdf0e10cSrcweir OUString( RTL_CONSTASCII_USTRINGPARAM("applicat.rdb")));
439cdf0e10cSrcweir Reference<XInterface> xint= serviceManager->createInstance( OUString(
440cdf0e10cSrcweir RTL_CONSTASCII_USTRINGPARAM(SERVICENAME1)));
441cdf0e10cSrcweir
442cdf0e10cSrcweir // ----------------------------------------------------------
443cdf0e10cSrcweir handleMod1= osl_loadModule( lib1Name.pData, 0);
444cdf0e10cSrcweir osl_unloadModule( handleMod1);
445cdf0e10cSrcweir
446cdf0e10cSrcweir // get rid of the service manager
447cdf0e10cSrcweir Reference<XPropertySet> xSet( serviceManager, UNO_QUERY);
448cdf0e10cSrcweir Any any_prop= xSet->getPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("DefaultContext")));
449cdf0e10cSrcweir Reference<XComponentContext> xContext;
450cdf0e10cSrcweir any_prop >>= xContext;
451cdf0e10cSrcweir Reference<XComponent> xComponent( xContext, UNO_QUERY);
452cdf0e10cSrcweir xComponent->dispose();
453cdf0e10cSrcweir }
454cdf0e10cSrcweir
455cdf0e10cSrcweir // Enter a loop and try unloading. At least after 10 seconds
456cdf0e10cSrcweir // this should be successful.
457cdf0e10cSrcweir TimeValue time={10,0};
458cdf0e10cSrcweir
459cdf0e10cSrcweir TimeValue beforeTime={0,0};
460cdf0e10cSrcweir printf("\n unloading should take about 10 seconds\n");
461cdf0e10cSrcweir osl_getSystemTime( &beforeTime);
462cdf0e10cSrcweir for(;;)
463cdf0e10cSrcweir {
464cdf0e10cSrcweir
465cdf0e10cSrcweir rtl_unloadUnusedModules( &time);
466cdf0e10cSrcweir void* pSymbol= osl_getSymbol( handleMod1, sSymbol.pData);
467cdf0e10cSrcweir if( ! pSymbol)
468cdf0e10cSrcweir break;
469cdf0e10cSrcweir }
470cdf0e10cSrcweir TimeValue afterTime={0,0};
471cdf0e10cSrcweir osl_getSystemTime( &afterTime);
472cdf0e10cSrcweir
473cdf0e10cSrcweir printf("\n it took about %i seconds \n Check the value!!!", afterTime.Seconds - beforeTime.Seconds);
474cdf0e10cSrcweir printf(" hit return to continue\n");
475cdf0e10cSrcweir getchar();
476cdf0e10cSrcweir
477cdf0e10cSrcweir return sal_True;
478cdf0e10cSrcweir }
479cdf0e10cSrcweir
480cdf0e10cSrcweir /*
481cdf0e10cSrcweir */
test7()482cdf0e10cSrcweir sal_Bool test7()
483cdf0e10cSrcweir {
484cdf0e10cSrcweir printf("Test 7 ####################################################"
485cdf0e10cSrcweir "\nThe callback function should be called 3 times\n");
486cdf0e10cSrcweir sal_Int32 id1=1;
487cdf0e10cSrcweir sal_Int32 id2=2;
488cdf0e10cSrcweir sal_Int32 id3=3;
489cdf0e10cSrcweir sal_Int32 cookie1= rtl_addUnloadingListener( listenerCallback, &id1);
490cdf0e10cSrcweir sal_Int32 cookie2= rtl_addUnloadingListener( listenerCallback, &id2);
491cdf0e10cSrcweir sal_Int32 cookie3= rtl_addUnloadingListener( listenerCallback, &id3);
492cdf0e10cSrcweir
493cdf0e10cSrcweir printf("\nTest 7 \nThe listener should be called 3 times\n");
494cdf0e10cSrcweir rtl_unloadUnusedModules( NULL);
495cdf0e10cSrcweir
496cdf0e10cSrcweir rtl_removeUnloadingListener( cookie1);
497cdf0e10cSrcweir rtl_removeUnloadingListener( cookie2);
498cdf0e10cSrcweir rtl_removeUnloadingListener( cookie3);
499cdf0e10cSrcweir
500cdf0e10cSrcweir sal_Int32 cookie4= rtl_addUnloadingListener( listenerCallback, &id1);
501cdf0e10cSrcweir sal_Int32 cookie5= rtl_addUnloadingListener( listenerCallback, &id2);
502cdf0e10cSrcweir sal_Int32 cookie6= rtl_addUnloadingListener( listenerCallback, &id3);
503cdf0e10cSrcweir
504cdf0e10cSrcweir if( cookie1 == cookie4 &&
505cdf0e10cSrcweir cookie2 == cookie5 )
506cdf0e10cSrcweir {
507cdf0e10cSrcweir printf("\n###cookie recycling works\n");
508cdf0e10cSrcweir printf("hit return to continue\n");
509cdf0e10cSrcweir getchar();
510cdf0e10cSrcweir }
511cdf0e10cSrcweir else
512cdf0e10cSrcweir {
513cdf0e10cSrcweir printf("\n###cookie recycling failed!!!\n");
514cdf0e10cSrcweir printf("hit return to continue\n");
515cdf0e10cSrcweir getchar();
516cdf0e10cSrcweir }
517cdf0e10cSrcweir
518cdf0e10cSrcweir rtl_removeUnloadingListener( cookie1);
519cdf0e10cSrcweir rtl_removeUnloadingListener( cookie2);
520cdf0e10cSrcweir rtl_removeUnloadingListener( cookie3);
521cdf0e10cSrcweir return sal_True;
522cdf0e10cSrcweir }
523cdf0e10cSrcweir
524cdf0e10cSrcweir /* Test one-instance-service default factory (XUnloadingPreference)
525cdf0e10cSrcweir cppuhelper/source/factory.cxx
526cdf0e10cSrcweir */
test8()527cdf0e10cSrcweir sal_Bool test8()
528cdf0e10cSrcweir {
529cdf0e10cSrcweir printf("Test 8 ####################################################\n");
530cdf0e10cSrcweir oslModule handleMod1=0;
531cdf0e10cSrcweir OUString lib1Name( RTL_CONSTASCII_USTRINGPARAM(LIBRARY1));
532cdf0e10cSrcweir OUString sSymbol( RTL_CONSTASCII_USTRINGPARAM("component_getFactory"));
533cdf0e10cSrcweir
534cdf0e10cSrcweir sal_Bool b_ifaceSupported=sal_False;
535cdf0e10cSrcweir sal_Bool b_instances_identical= sal_False;
536cdf0e10cSrcweir sal_Bool b_releaseBeforeLoading= sal_False;
537cdf0e10cSrcweir sal_Bool b_releaseAfterLoading= sal_False;
538cdf0e10cSrcweir sal_Bool b_unloaded= sal_False;
539cdf0e10cSrcweir
540cdf0e10cSrcweir {
541cdf0e10cSrcweir Reference<XMultiServiceFactory> serviceManager= createRegistryServiceFactory(
542cdf0e10cSrcweir OUString( RTL_CONSTASCII_USTRINGPARAM("applicat.rdb")));
543cdf0e10cSrcweir Reference<XContentEnumerationAccess> xContent( serviceManager, UNO_QUERY);
544cdf0e10cSrcweir Reference<XEnumeration> xenum= xContent->createContentEnumeration(
545cdf0e10cSrcweir OUString( RTL_CONSTASCII_USTRINGPARAM( SERVICENAME4)));
546cdf0e10cSrcweir
547cdf0e10cSrcweir Any any_elem;
548cdf0e10cSrcweir if( xenum->hasMoreElements())
549cdf0e10cSrcweir any_elem= xenum->nextElement();
550cdf0e10cSrcweir Reference<XInterface> xinterfaceFact;
551cdf0e10cSrcweir any_elem>>=xinterfaceFact;
552cdf0e10cSrcweir Reference<XTypeProvider> xprov( xinterfaceFact, UNO_QUERY);
553cdf0e10cSrcweir
554cdf0e10cSrcweir Sequence<Type> seqTypes= xprov->getTypes();
555cdf0e10cSrcweir
556cdf0e10cSrcweir // XTypeProvider test
557cdf0e10cSrcweir for( sal_Int32 i=0; i<seqTypes.getLength(); i++)
558cdf0e10cSrcweir {
559cdf0e10cSrcweir OUString name= seqTypes[i].getTypeName();
560cdf0e10cSrcweir if( name == OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.uno.XUnloadingPreference")))
561cdf0e10cSrcweir b_ifaceSupported= sal_True;
562cdf0e10cSrcweir }
563cdf0e10cSrcweir
564cdf0e10cSrcweir // XUnloadingPreference::releaseOnNotification should return true now because we haven't
565cdf0e10cSrcweir // created an instance yet
566cdf0e10cSrcweir Reference<XUnloadingPreference> xreject( xinterfaceFact, UNO_QUERY);
567cdf0e10cSrcweir b_releaseBeforeLoading= xreject->releaseOnNotification();
568cdf0e10cSrcweir
569cdf0e10cSrcweir // Create instance. Afterwards releaseOnNotification should return false.
570cdf0e10cSrcweir Reference<XInterface> xint= serviceManager->createInstance( OUString(
571cdf0e10cSrcweir RTL_CONSTASCII_USTRINGPARAM(SERVICENAME4)));
572cdf0e10cSrcweir b_releaseAfterLoading= xreject->releaseOnNotification();
573cdf0e10cSrcweir b_releaseAfterLoading= b_releaseAfterLoading? sal_False : sal_True;
574cdf0e10cSrcweir
575cdf0e10cSrcweir // safe the handle of the module
576cdf0e10cSrcweir handleMod1= osl_loadModule( lib1Name.pData, 0);
577cdf0e10cSrcweir osl_unloadModule( handleMod1);
578cdf0e10cSrcweir
579cdf0e10cSrcweir // ----------------------------------------------------------
580cdf0e10cSrcweir // for debugging
581cdf0e10cSrcweir Reference<XServiceInfo> info( xint, UNO_QUERY);
582cdf0e10cSrcweir OUString s= info->getImplementationName();
583cdf0e10cSrcweir
584cdf0e10cSrcweir // get another instance which must be the same
585cdf0e10cSrcweir Reference<XInterface> xint2= serviceManager->createInstance( OUString(
586cdf0e10cSrcweir RTL_CONSTASCII_USTRINGPARAM(SERVICENAME4)));
587cdf0e10cSrcweir
588cdf0e10cSrcweir b_instances_identical= xint == xint2;
589cdf0e10cSrcweir
590cdf0e10cSrcweir // get rid of the service manager
591cdf0e10cSrcweir Reference<XPropertySet> xSet( serviceManager, UNO_QUERY);
592cdf0e10cSrcweir Any any_prop= xSet->getPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("DefaultContext")));
593cdf0e10cSrcweir Reference<XComponentContext> xContext;
594cdf0e10cSrcweir any_prop >>= xContext;
595cdf0e10cSrcweir Reference<XComponent> xComponent( xContext, UNO_QUERY);
596cdf0e10cSrcweir xComponent->dispose();
597cdf0e10cSrcweir }
598cdf0e10cSrcweir
599cdf0e10cSrcweir rtl_unloadUnusedModules( NULL);
600cdf0e10cSrcweir
601cdf0e10cSrcweir // The library must be unloaded now
602cdf0e10cSrcweir void* pSymbol= osl_getSymbol( handleMod1, sSymbol.pData);
603cdf0e10cSrcweir if( ! pSymbol )
604cdf0e10cSrcweir b_unloaded= sal_True;
605cdf0e10cSrcweir
606cdf0e10cSrcweir if( b_ifaceSupported && b_instances_identical && b_releaseBeforeLoading &&
607cdf0e10cSrcweir b_releaseAfterLoading && b_unloaded)
608cdf0e10cSrcweir return sal_True;
609cdf0e10cSrcweir return sal_False;
610cdf0e10cSrcweir }
611cdf0e10cSrcweir
listenerCallback(void * id)612cdf0e10cSrcweir void SAL_CALL listenerCallback( void* id)
613cdf0e10cSrcweir {
614cdf0e10cSrcweir printf(" listener called with id= %i\n", *(sal_Int32*)id);
615cdf0e10cSrcweir }
616cdf0e10cSrcweir
617cdf0e10cSrcweir /*
618cdf0e10cSrcweir
619cdf0e10cSrcweir */
test9()620cdf0e10cSrcweir sal_Bool test9()
621cdf0e10cSrcweir {
622cdf0e10cSrcweir printf("Test 9 ####################################################\n");
623cdf0e10cSrcweir oslModule handleMod=0;
624cdf0e10cSrcweir sal_Bool retval=sal_False;
625cdf0e10cSrcweir OUString lib1Name( RTL_CONSTASCII_USTRINGPARAM(LIBRARY1));
626cdf0e10cSrcweir
627cdf0e10cSrcweir Reference<XMultiServiceFactory> serviceManager= createRegistryServiceFactory(
628cdf0e10cSrcweir OUString( RTL_CONSTASCII_USTRINGPARAM("applicat.rdb")));
629cdf0e10cSrcweir
630cdf0e10cSrcweir Reference<XInterface> xint= serviceManager->createInstance( OUString(
631cdf0e10cSrcweir RTL_CONSTASCII_USTRINGPARAM(SERVICENAME1)));
632cdf0e10cSrcweir // Release the service. The library refcount should be 1
633cdf0e10cSrcweir xint=0;
634cdf0e10cSrcweir
635cdf0e10cSrcweir handleMod= osl_loadModule( lib1Name.pData, 0);
636cdf0e10cSrcweir osl_unloadModule( handleMod);
637cdf0e10cSrcweir //-----------------------------------------------------------
638cdf0e10cSrcweir
639cdf0e10cSrcweir // the service manager is still alive
640cdf0e10cSrcweir rtl_unloadUnusedModules( NULL);
641cdf0e10cSrcweir // Try to get a symbol, must fail
642cdf0e10cSrcweir OUString sSymbol( RTL_CONSTASCII_USTRINGPARAM("component_getFactory"));
643cdf0e10cSrcweir void* pSymbol= osl_getSymbol( handleMod, sSymbol.pData);
644cdf0e10cSrcweir
645cdf0e10cSrcweir if( pSymbol)
646cdf0e10cSrcweir {
647cdf0e10cSrcweir retval= sal_False;
648cdf0e10cSrcweir }
649cdf0e10cSrcweir else
650cdf0e10cSrcweir retval= sal_True;
651cdf0e10cSrcweir return retval;
652cdf0e10cSrcweir }
653