1 /**************************************************************
2 *
3 * Licensed to the Apache Software Foundation (ASF) under one
4 * or more contributor license agreements. See the NOTICE file
5 * distributed with this work for additional information
6 * regarding copyright ownership. The ASF licenses this file
7 * to you under the Apache License, Version 2.0 (the
8 * "License"); you may not use this file except in compliance
9 * with the License. You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing,
14 * software distributed under the License is distributed on an
15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16 * KIND, either express or implied. See the License for the
17 * specific language governing permissions and limitations
18 * under the License.
19 *
20 *************************************************************/
21
22
23
24
25 // MARKER(update_precomp.py): autogen include statement, do not remove
26 #include "precompiled_extensions.hxx"
27
28 #include<osl/module.hxx>
29 #include <osl/time.h>
30 #include <rtl/ustring.hxx>
31 #include <stdio.h>
32 #include <cppuhelper/factory.hxx>
33 #include <cppuhelper/servicefactory.hxx>
34 #include <cppuhelper/bootstrap.hxx>
35 #include <com/sun/star/lang/XMultiComponentFactory.hpp>
36 #include <com/sun/star/lang/XSingleServiceFactory.hpp>
37 #include <com/sun/star/lang/XServiceInfo.hpp>
38 #include <com/sun/star/lang/XComponent.hpp>
39 #include <com/sun/star/uno/XComponentContext.hpp>
40 #include <com/sun/star/registry/XSimpleRegistry.hpp>
41
42 #include <stdio.h>
43 using namespace ::rtl;
44 using namespace ::osl;
45 using namespace ::com::sun::star::uno;
46 using namespace ::com::sun::star::lang;
47 using namespace ::cppu;
48 using namespace ::com::sun::star::registry;
49
50
51 sal_Bool test1();
52 sal_Bool test2();
53 sal_Bool test3();
54 sal_Bool test4();
55
main(int,char **)56 int main(int, char**)
57 {
58 sal_Bool bTest1= test1();
59 sal_Bool bTest2= test2();
60 sal_Bool bTest3= test3();
61 sal_Bool bTest4= test4();
62
63 if( bTest1 && bTest2 && bTest3 && bTest4)
64 printf("\n#########################\n Test was successful\n#######################\n");
65
66 return 0;
67 }
68
test1()69 sal_Bool test1()
70 {
71 printf("\n Test1: com.sun.star.bridge.oleautomation.BridgeSupplier\n");
72 Reference<XSimpleRegistry> xreg= createSimpleRegistry();
73 xreg->open( OUString( RTL_CONSTASCII_USTRINGPARAM("services.rdb")),
74 sal_False, sal_False );
75
76 Reference< XComponentContext > context= bootstrap_InitialComponentContext(xreg);
77 Reference<XMultiComponentFactory> fac= context->getServiceManager();
78 OUString sService1( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.bridge.oleautomation.BridgeSupplier"));
79 Reference<XInterface> xint1= fac->createInstanceWithContext( sService1, context);
80
81 OUString sModule(
82 RTL_CONSTASCII_USTRINGPARAM("oleautobridge.uno" SAL_DLLEXTENSION));
83 oslModule hMod= osl_loadModule( sModule.pData, 0);
84 osl_unloadModule( hMod);
85
86 rtl_unloadUnusedModules( NULL);
87
88 OUString sFactoryFunc( RTL_CONSTASCII_USTRINGPARAM("component_getFactory"));
89 void* pSymbol= osl_getSymbol( hMod,sFactoryFunc.pData);
90 // true, instance alive
91 sal_Bool bTest1= pSymbol ? sal_True : sal_False;
92
93 xint1=0;
94 rtl_unloadUnusedModules( NULL);
95 pSymbol= osl_getSymbol( hMod,sFactoryFunc.pData);
96 sal_Bool bTest2= pSymbol ? sal_False : sal_True;
97
98 Reference<XComponent> xcomp( context, UNO_QUERY);
99 xcomp->dispose();
100
101 return bTest2 && bTest1;
102 }
103
test2()104 sal_Bool test2()
105 {
106 printf("Test2: com.sun.star.bridge.OleBridgeSupplierVar1\n");
107 Reference<XSimpleRegistry> xreg= createSimpleRegistry();
108 xreg->open( OUString( RTL_CONSTASCII_USTRINGPARAM("services.rdb")),
109 sal_False, sal_False );
110
111 Reference< XComponentContext > context= bootstrap_InitialComponentContext(xreg);
112 Reference<XMultiComponentFactory> fac= context->getServiceManager();
113 OUString sService2( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.bridge.OleBridgeSupplierVar1"));
114 Reference<XInterface> xint= fac->createInstanceWithContext( sService2, context);
115
116 OUString sModule(
117 RTL_CONSTASCII_USTRINGPARAM("oleautobridge.uno" SAL_DLLEXTENSION));
118 oslModule hMod= osl_loadModule( sModule.pData, 0);
119 osl_unloadModule( hMod);
120
121 rtl_unloadUnusedModules( NULL);
122 OUString sFactoryFunc( RTL_CONSTASCII_USTRINGPARAM("component_getFactory"));
123 void* pSymbol= osl_getSymbol( hMod,sFactoryFunc.pData);
124 // true, instance alive
125 sal_Bool bTest1= pSymbol ? sal_True : sal_False;
126
127 xint=0;
128 rtl_unloadUnusedModules( NULL);
129 pSymbol= osl_getSymbol( hMod,sFactoryFunc.pData);
130 sal_Bool bTest2= pSymbol ? sal_False : sal_True;
131
132 Reference<XComponent> xcomp( context, UNO_QUERY);
133 xcomp->dispose();
134 return bTest1 && bTest2;
135 }
136
test3()137 sal_Bool test3()
138 {
139 printf("Test3: com.sun.star.bridge.oleautomation.Factory\n");
140 Reference<XSimpleRegistry> xreg= createSimpleRegistry();
141 xreg->open( OUString( RTL_CONSTASCII_USTRINGPARAM("services.rdb")),
142 sal_False, sal_False );
143
144 Reference< XComponentContext > context= bootstrap_InitialComponentContext(xreg);
145
146 Reference<XMultiComponentFactory> fac= context->getServiceManager();
147 OUString sService( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.bridge.oleautomation.Factory"));
148 Reference<XInterface> xint= fac->createInstanceWithContext( sService, context);
149
150
151 OUString sModule(
152 RTL_CONSTASCII_USTRINGPARAM("oleautobridge.uno" SAL_DLLEXTENSION));
153 oslModule hMod= osl_loadModule( sModule.pData, 0);
154 osl_unloadModule( hMod);
155
156 rtl_unloadUnusedModules( NULL);
157 OUString sFactoryFunc( RTL_CONSTASCII_USTRINGPARAM("component_getFactory"));
158 void* pSymbol= osl_getSymbol( hMod,sFactoryFunc.pData);
159 // true, instance alive
160 sal_Bool bTest1= pSymbol ? sal_True : sal_False;
161
162 xint=0;
163 rtl_unloadUnusedModules( NULL);
164 pSymbol= osl_getSymbol( hMod,sFactoryFunc.pData);
165 sal_Bool bTest2= pSymbol ? sal_False : sal_True;
166
167 Reference<XComponent> xcomp( context, UNO_QUERY);
168 xcomp->dispose();
169
170 // for (int i=0; i < 10; i++)
171 // {
172 // Reference<XSimpleRegistry> xreg= createSimpleRegistry();
173 // xreg->open( OUString( RTL_CONSTASCII_USTRINGPARAM("applicat.rdb")),
174 // sal_False, sal_False );
175 // Reference< XComponentContext > context= bootstrap_InitialComponentContext(xreg);
176 // Reference<XComponent> xcomp( context, UNO_QUERY);
177 // xcomp->dispose();
178 //
179 // }
180
181 // return sal_True;
182 return bTest1 && bTest2;
183 }
184
test4()185 sal_Bool test4()
186 {
187 void* pSymbol= NULL;
188 sal_Bool bTest1= sal_False;
189 sal_Bool bTest2= sal_False;
190 oslModule hMod= NULL;
191 OUString sModule(
192 RTL_CONSTASCII_USTRINGPARAM("oleautobridge.uno" SAL_DLLEXTENSION));
193 OUString sFactoryFunc( RTL_CONSTASCII_USTRINGPARAM("component_getFactory"));
194 {
195 printf("Test4: com.sun.star.bridge.oleautomation.ApplicationRegistration\n");
196 Reference<XSimpleRegistry> xreg= createSimpleRegistry();
197 xreg->open( OUString( RTL_CONSTASCII_USTRINGPARAM("services.rdb")),
198 sal_False, sal_False );
199
200 Reference< XComponentContext > context= bootstrap_InitialComponentContext(xreg);
201 Reference<XMultiComponentFactory> fac= context->getServiceManager();
202 OUString sService4( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.bridge.oleautomation.ApplicationRegistration"));
203 Reference<XInterface> xint= fac->createInstanceWithContext( sService4, context);
204
205 hMod= osl_loadModule( sModule.pData, 0);
206 osl_unloadModule( hMod);
207
208 rtl_unloadUnusedModules( NULL);
209 void* pSymbol= osl_getSymbol( hMod,sFactoryFunc.pData);
210 // true, instance alive
211 bTest1= pSymbol ? sal_True : sal_False;
212 // ApplicationRegistration is a one-instance-service, therefore kill service manager first
213 Reference<XComponent> xcomp( context, UNO_QUERY);
214 xcomp->dispose();
215
216 }
217 rtl_unloadUnusedModules( NULL);
218 pSymbol= osl_getSymbol( hMod,sFactoryFunc.pData);
219 bTest2= pSymbol ? sal_False : sal_True;
220
221 return bTest1 && bTest2;
222 }
223