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 #include "sal/main.h"
26 #include "osl/file.hxx"
27
28 #include "typelib/typedescription.hxx"
29
30 #include "cppuhelper/bootstrap.hxx"
31 #include "cppuhelper/shlib.hxx"
32
33 #include <com/sun/star/lang/XComponent.hpp>
34
35 #include "uno/environment.hxx"
36 #include "cppu/EnvDcp.hxx"
37 #include "cppu/EnvGuards.hxx"
38
39 #include <iostream>
40
41
42 #ifndef SAL_DLLPREFIX
43 # define SAL_DLLPREFIX ""
44 #endif
45
46
47 using namespace com::sun::star;
48
49
50 static rtl::OUString s_comment;
51
s_check_object_is_in(void * pObject)52 static bool s_check_object_is_in(void * pObject)
53 {
54 uno::Environment currentEnv(uno::Environment::getCurrent());
55
56 rtl_uString * pOId = NULL;
57 currentEnv.get()->pExtEnv->getObjectIdentifier(currentEnv.get()->pExtEnv, &pOId, pObject);
58
59
60 uno::TypeDescription typeDescription(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.uno.XInterface")));
61
62 void * pRegisteredObject = NULL;
63 currentEnv.get()->pExtEnv->getRegisteredInterface(currentEnv.get()->pExtEnv,
64 &pRegisteredObject,
65 pOId,
66 (typelib_InterfaceTypeDescription *)typeDescription.get());
67
68
69 if (pOId) rtl_uString_release(pOId);
70
71 bool result = pRegisteredObject != NULL;
72
73 if (result)
74 currentEnv.get()->pExtEnv->releaseInterface(currentEnv.get()->pExtEnv, pRegisteredObject);
75
76 return result;
77 }
78
s_test__loadSharedLibComponentFactory(rtl::OUString const & clientPurpose,rtl::OUString const & servicePurpose)79 static void s_test__loadSharedLibComponentFactory(rtl::OUString const & clientPurpose,
80 rtl::OUString const & servicePurpose)
81 {
82 cppu::EnvGuard envGuard(uno::Environment(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(UNO_LB_UNO))
83 + clientPurpose, NULL));
84 if (clientPurpose.getLength() && !envGuard.is())
85 {
86 s_comment += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("\t\tcouldn't get purpose env: \""));
87 s_comment += clientPurpose;
88 s_comment += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("\" - FAILURE\n"));
89
90 return;
91 }
92
93 rtl::OString os_clientPurpose(rtl::OUStringToOString(clientPurpose, RTL_TEXTENCODING_ASCII_US));
94
95 uno::Reference<uno::XInterface> xItf(
96 cppu::loadSharedLibComponentFactory(
97 rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SAL_DLLPREFIX "TestComponent.uno" SAL_DLLEXTENSION)),
98 #ifdef WIN32
99 rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("")),
100 #else
101 rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("file://../lib/")),
102 #endif
103 rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("impl.test.TestComponent")) + servicePurpose,
104 uno::Reference<lang::XMultiServiceFactory>(),
105 uno::Reference<registry::XRegistryKey>()
106 )
107 );
108
109 if (!xItf.is())
110 {
111 s_comment += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("\t\tgot no object - FAILURE\n"));
112 return;
113 }
114
115 if (!clientPurpose.equals(servicePurpose) && !s_check_object_is_in(xItf.get()))
116 {
117 s_comment += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("\t\tcouldn't find object in current purpose \""));
118 s_comment += clientPurpose;
119 s_comment += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("\" - FAILURE\n"));
120 }
121
122 if (!cppu::EnvDcp::getPurpose(uno::Environment::getCurrent().getTypeName()).equals(clientPurpose))
123 {
124 s_comment += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("\t\tdid not enter client purpose \""));
125 s_comment += clientPurpose;
126 s_comment += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("\" - FAILURE\n"));
127 }
128 }
129
s_test__loadSharedLibComponentFactory__free_free()130 static void s_test__loadSharedLibComponentFactory__free_free()
131 {
132 s_comment += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("\ts_test__loadSharedLibComponentFactory__free_free\n"));
133
134 s_test__loadSharedLibComponentFactory(rtl::OUString(), rtl::OUString());
135 }
136
s_test__loadSharedLibComponentFactory__free_purpose()137 static void s_test__loadSharedLibComponentFactory__free_purpose()
138 {
139 s_comment += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("\ts_test__loadSharedLibComponentFactory__free_purpose\n"));
140
141 s_test__loadSharedLibComponentFactory(rtl::OUString(),
142 rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(":testenv")));
143 }
144
s_test__loadSharedLibComponentFactory__purpose_free()145 static void s_test__loadSharedLibComponentFactory__purpose_free()
146 {
147 s_comment += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("\ts_test__loadSharedLibComponentFactory__purpose_free\n"));
148
149 s_test__loadSharedLibComponentFactory(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(":testenv")),
150 rtl::OUString());
151 }
152
s_test__loadSharedLibComponentFactory__purpose_purpose()153 static void s_test__loadSharedLibComponentFactory__purpose_purpose()
154 {
155 s_comment += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("\ts_test__loadSharedLibComponentFactory__purpose_purpose\n"));
156
157 s_test__loadSharedLibComponentFactory(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(":testenv")),
158 rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(":testenv")));
159 }
160
s_getSDrive(void)161 static rtl::OUString s_getSDrive(void)
162 {
163 rtl::OUString path;//(RTL_CONSTASCII_USTRINGPARAM("file://"));
164
165 char const * tmp = getenv("SOLARVER");
166 path += rtl::OUString(tmp, rtl_str_getLength(tmp), RTL_TEXTENCODING_ASCII_US);
167 path += rtl::OUString(SAL_PATHDELIMITER);
168
169 tmp = getenv("INPATH");
170 path += rtl::OUString(tmp, rtl_str_getLength(tmp), RTL_TEXTENCODING_ASCII_US);
171 path += rtl::OUString(SAL_PATHDELIMITER);
172 #ifdef WIN32
173 path += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("bin"));
174
175 #else
176 path += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("lib"));
177 #endif
178
179 tmp = getenv("UPDMINOREXT");
180 if (tmp)
181 path += rtl::OUString(tmp, rtl_str_getLength(tmp), RTL_TEXTENCODING_ASCII_US);
182
183 osl::FileBase::getFileURLFromSystemPath(path, path);
184
185 return path;
186 }
187
s_test__createSimpleRegistry(rtl::OUString const & clientPurpose)188 static void s_test__createSimpleRegistry(rtl::OUString const & clientPurpose)
189 {
190 cppu::EnvGuard envGuard(uno::Environment(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(UNO_LB_UNO))
191 + clientPurpose, NULL));
192 if (clientPurpose.getLength() && !envGuard.is())
193 {
194 s_comment += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("\t\tcouldn't get purpose env: \""));
195 s_comment += clientPurpose;
196 s_comment += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("\" - FAILURE\n"));
197
198 return;
199 }
200
201 uno::Reference<registry::XSimpleRegistry> registry(cppu::createSimpleRegistry(
202 s_getSDrive()));
203
204 if (!registry.is())
205 {
206 s_comment += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("\t\tgot no object - FAILURE\n"));
207 return;
208 }
209
210 if (clientPurpose.getLength() != 0 && !s_check_object_is_in(registry.get()))
211 {
212 s_comment += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("\t\tcouldn't find object in current purpose \""));
213 s_comment += clientPurpose;
214 s_comment += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("\" - FAILURE\n"));
215 }
216 }
217
s_test__createSimpleRegistry__free(void)218 static void s_test__createSimpleRegistry__free(void)
219 {
220 s_comment += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("\ts_test__createSimpleRegistry__free\n"));
221
222 s_test__createSimpleRegistry(rtl::OUString());
223 }
224
s_test__createSimpleRegistry__purpose(void)225 static void s_test__createSimpleRegistry__purpose(void)
226 {
227 s_comment += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("\ts_test__createSimpleRegistry__purpose\n"));
228
229 s_test__createSimpleRegistry(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(":testenv")));
230 }
231
232
s_test__bootstrap_InitialComponentContext(rtl::OUString const & clientPurpose)233 static void s_test__bootstrap_InitialComponentContext(rtl::OUString const & clientPurpose)
234 {
235 cppu::EnvGuard envGuard(uno::Environment(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(UNO_LB_UNO))
236 + clientPurpose, NULL));
237 if (clientPurpose.getLength() && !envGuard.is())
238 {
239 s_comment += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("\t\tcouldn't get purpose env: \""));
240 s_comment += clientPurpose;
241 s_comment += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("\" - FAILURE\n"));
242
243 return;
244 }
245
246 uno::Reference<uno::XComponentContext> xContext(
247 cppu::bootstrap_InitialComponentContext(
248 uno::Reference<registry::XSimpleRegistry>(),
249 s_getSDrive())
250 );
251
252 if (!xContext.is())
253 {
254 s_comment += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("\t\tgot no object - FAILURE\n"));
255 return;
256 }
257
258 if (clientPurpose.getLength() != 0 && !s_check_object_is_in(xContext.get()))
259 {
260 s_comment += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("\t\tcouldn't find object in current purpose \""));
261 s_comment += clientPurpose;
262 s_comment += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("\" - FAILURE\n"));
263 }
264
265 uno::Reference<lang::XComponent> xComponent(xContext, uno::UNO_QUERY_THROW);
266 xComponent->dispose();
267 }
268
s_test__bootstrap_InitialComponentContext__free(void)269 static void s_test__bootstrap_InitialComponentContext__free(void)
270 {
271 s_comment += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("\ts_test__bootstrap_InitialComponentContext__free\n"));
272
273 s_test__bootstrap_InitialComponentContext(rtl::OUString());
274 }
275
s_test__bootstrap_InitialComponentContext__purpose(void)276 static void s_test__bootstrap_InitialComponentContext__purpose(void)
277 {
278 s_comment += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("\ts_test__bootstrap_InitialComponentContext__purpose\n"));
279
280 s_test__bootstrap_InitialComponentContext(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(":testenv")));
281 }
282
283
284 SAL_IMPLEMENT_MAIN_WITH_ARGS(/*argc*/, argv)
285 {
286 s_test__createSimpleRegistry__free();
287 s_test__createSimpleRegistry__purpose();
288
289 s_test__loadSharedLibComponentFactory__free_free();
290 s_test__loadSharedLibComponentFactory__free_purpose();
291 s_test__loadSharedLibComponentFactory__purpose_free();
292 s_test__loadSharedLibComponentFactory__purpose_purpose();
293
294 s_test__bootstrap_InitialComponentContext__free();
295 s_test__bootstrap_InitialComponentContext__purpose();
296
297 int ret;
298 if (s_comment.indexOf(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("FAILURE"))) == -1)
299 {
300 s_comment += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("TESTS PASSED\n"));
301 ret = 0;
302 }
303 else
304 {
305 s_comment += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("TESTS _NOT_ PASSED\n"));
306 ret = -1;
307 }
308
309 std::cerr
310 << argv[0]
311 << std::endl
312 << rtl::OUStringToOString(s_comment, RTL_TEXTENCODING_ASCII_US).getStr()
313 << std::endl;
314
315 return ret;
316 }
317