| /************************************************************** |
| * |
| * 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. |
| * |
| *************************************************************/ |
| |
| |
| |
| |
| #include "sal/main.h" |
| #include "osl/file.hxx" |
| |
| #include "typelib/typedescription.hxx" |
| |
| #include "cppuhelper/bootstrap.hxx" |
| #include "cppuhelper/shlib.hxx" |
| |
| #include <com/sun/star/lang/XComponent.hpp> |
| |
| #include "uno/environment.hxx" |
| #include "cppu/EnvDcp.hxx" |
| #include "cppu/EnvGuards.hxx" |
| |
| #include <iostream> |
| |
| |
| #ifndef SAL_DLLPREFIX |
| # define SAL_DLLPREFIX "" |
| #endif |
| |
| |
| using namespace com::sun::star; |
| |
| |
| static rtl::OUString s_comment; |
| |
| static bool s_check_object_is_in(void * pObject) |
| { |
| uno::Environment currentEnv(uno::Environment::getCurrent()); |
| |
| rtl_uString * pOId = NULL; |
| currentEnv.get()->pExtEnv->getObjectIdentifier(currentEnv.get()->pExtEnv, &pOId, pObject); |
| |
| |
| uno::TypeDescription typeDescription(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.uno.XInterface"))); |
| |
| void * pRegisteredObject = NULL; |
| currentEnv.get()->pExtEnv->getRegisteredInterface(currentEnv.get()->pExtEnv, |
| &pRegisteredObject, |
| pOId, |
| (typelib_InterfaceTypeDescription *)typeDescription.get()); |
| |
| |
| if (pOId) rtl_uString_release(pOId); |
| |
| bool result = pRegisteredObject != NULL; |
| |
| if (result) |
| currentEnv.get()->pExtEnv->releaseInterface(currentEnv.get()->pExtEnv, pRegisteredObject); |
| |
| return result; |
| } |
| |
| static void s_test__loadSharedLibComponentFactory(rtl::OUString const & clientPurpose, |
| rtl::OUString const & servicePurpose) |
| { |
| cppu::EnvGuard envGuard(uno::Environment(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(UNO_LB_UNO)) |
| + clientPurpose, NULL)); |
| if (clientPurpose.getLength() && !envGuard.is()) |
| { |
| s_comment += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("\t\tcouldn't get purpose env: \"")); |
| s_comment += clientPurpose; |
| s_comment += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("\" - FAILURE\n")); |
| |
| return; |
| } |
| |
| rtl::OString os_clientPurpose(rtl::OUStringToOString(clientPurpose, RTL_TEXTENCODING_ASCII_US)); |
| |
| uno::Reference<uno::XInterface> xItf( |
| cppu::loadSharedLibComponentFactory( |
| rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SAL_DLLPREFIX "TestComponent.uno" SAL_DLLEXTENSION)), |
| #ifdef WIN32 |
| rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("")), |
| #else |
| rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("file://../lib/")), |
| #endif |
| rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("impl.test.TestComponent")) + servicePurpose, |
| uno::Reference<lang::XMultiServiceFactory>(), |
| uno::Reference<registry::XRegistryKey>() |
| ) |
| ); |
| |
| if (!xItf.is()) |
| { |
| s_comment += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("\t\tgot no object - FAILURE\n")); |
| return; |
| } |
| |
| if (!clientPurpose.equals(servicePurpose) && !s_check_object_is_in(xItf.get())) |
| { |
| s_comment += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("\t\tcouldn't find object in current purpose \"")); |
| s_comment += clientPurpose; |
| s_comment += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("\" - FAILURE\n")); |
| } |
| |
| if (!cppu::EnvDcp::getPurpose(uno::Environment::getCurrent().getTypeName()).equals(clientPurpose)) |
| { |
| s_comment += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("\t\tdid not enter client purpose \"")); |
| s_comment += clientPurpose; |
| s_comment += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("\" - FAILURE\n")); |
| } |
| } |
| |
| static void s_test__loadSharedLibComponentFactory__free_free() |
| { |
| s_comment += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("\ts_test__loadSharedLibComponentFactory__free_free\n")); |
| |
| s_test__loadSharedLibComponentFactory(rtl::OUString(), rtl::OUString()); |
| } |
| |
| static void s_test__loadSharedLibComponentFactory__free_purpose() |
| { |
| s_comment += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("\ts_test__loadSharedLibComponentFactory__free_purpose\n")); |
| |
| s_test__loadSharedLibComponentFactory(rtl::OUString(), |
| rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(":testenv"))); |
| } |
| |
| static void s_test__loadSharedLibComponentFactory__purpose_free() |
| { |
| s_comment += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("\ts_test__loadSharedLibComponentFactory__purpose_free\n")); |
| |
| s_test__loadSharedLibComponentFactory(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(":testenv")), |
| rtl::OUString()); |
| } |
| |
| static void s_test__loadSharedLibComponentFactory__purpose_purpose() |
| { |
| s_comment += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("\ts_test__loadSharedLibComponentFactory__purpose_purpose\n")); |
| |
| s_test__loadSharedLibComponentFactory(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(":testenv")), |
| rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(":testenv"))); |
| } |
| |
| static rtl::OUString s_getSDrive(void) |
| { |
| rtl::OUString path;//(RTL_CONSTASCII_USTRINGPARAM("file://")); |
| |
| char const * tmp = getenv("SOLARVER"); |
| path += rtl::OUString(tmp, rtl_str_getLength(tmp), RTL_TEXTENCODING_ASCII_US); |
| path += rtl::OUString(SAL_PATHDELIMITER); |
| |
| tmp = getenv("INPATH"); |
| path += rtl::OUString(tmp, rtl_str_getLength(tmp), RTL_TEXTENCODING_ASCII_US); |
| path += rtl::OUString(SAL_PATHDELIMITER); |
| #ifdef WIN32 |
| path += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("bin")); |
| |
| #else |
| path += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("lib")); |
| #endif |
| |
| tmp = getenv("UPDMINOREXT"); |
| if (tmp) |
| path += rtl::OUString(tmp, rtl_str_getLength(tmp), RTL_TEXTENCODING_ASCII_US); |
| |
| osl::FileBase::getFileURLFromSystemPath(path, path); |
| |
| return path; |
| } |
| |
| static void s_test__createSimpleRegistry(rtl::OUString const & clientPurpose) |
| { |
| cppu::EnvGuard envGuard(uno::Environment(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(UNO_LB_UNO)) |
| + clientPurpose, NULL)); |
| if (clientPurpose.getLength() && !envGuard.is()) |
| { |
| s_comment += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("\t\tcouldn't get purpose env: \"")); |
| s_comment += clientPurpose; |
| s_comment += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("\" - FAILURE\n")); |
| |
| return; |
| } |
| |
| uno::Reference<registry::XSimpleRegistry> registry(cppu::createSimpleRegistry( |
| s_getSDrive())); |
| |
| if (!registry.is()) |
| { |
| s_comment += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("\t\tgot no object - FAILURE\n")); |
| return; |
| } |
| |
| if (clientPurpose.getLength() != 0 && !s_check_object_is_in(registry.get())) |
| { |
| s_comment += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("\t\tcouldn't find object in current purpose \"")); |
| s_comment += clientPurpose; |
| s_comment += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("\" - FAILURE\n")); |
| } |
| } |
| |
| static void s_test__createSimpleRegistry__free(void) |
| { |
| s_comment += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("\ts_test__createSimpleRegistry__free\n")); |
| |
| s_test__createSimpleRegistry(rtl::OUString()); |
| } |
| |
| static void s_test__createSimpleRegistry__purpose(void) |
| { |
| s_comment += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("\ts_test__createSimpleRegistry__purpose\n")); |
| |
| s_test__createSimpleRegistry(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(":testenv"))); |
| } |
| |
| |
| static void s_test__bootstrap_InitialComponentContext(rtl::OUString const & clientPurpose) |
| { |
| cppu::EnvGuard envGuard(uno::Environment(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(UNO_LB_UNO)) |
| + clientPurpose, NULL)); |
| if (clientPurpose.getLength() && !envGuard.is()) |
| { |
| s_comment += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("\t\tcouldn't get purpose env: \"")); |
| s_comment += clientPurpose; |
| s_comment += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("\" - FAILURE\n")); |
| |
| return; |
| } |
| |
| uno::Reference<uno::XComponentContext> xContext( |
| cppu::bootstrap_InitialComponentContext( |
| uno::Reference<registry::XSimpleRegistry>(), |
| s_getSDrive()) |
| ); |
| |
| if (!xContext.is()) |
| { |
| s_comment += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("\t\tgot no object - FAILURE\n")); |
| return; |
| } |
| |
| if (clientPurpose.getLength() != 0 && !s_check_object_is_in(xContext.get())) |
| { |
| s_comment += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("\t\tcouldn't find object in current purpose \"")); |
| s_comment += clientPurpose; |
| s_comment += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("\" - FAILURE\n")); |
| } |
| |
| uno::Reference<lang::XComponent> xComponent(xContext, uno::UNO_QUERY_THROW); |
| xComponent->dispose(); |
| } |
| |
| static void s_test__bootstrap_InitialComponentContext__free(void) |
| { |
| s_comment += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("\ts_test__bootstrap_InitialComponentContext__free\n")); |
| |
| s_test__bootstrap_InitialComponentContext(rtl::OUString()); |
| } |
| |
| static void s_test__bootstrap_InitialComponentContext__purpose(void) |
| { |
| s_comment += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("\ts_test__bootstrap_InitialComponentContext__purpose\n")); |
| |
| s_test__bootstrap_InitialComponentContext(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(":testenv"))); |
| } |
| |
| |
| SAL_IMPLEMENT_MAIN_WITH_ARGS(/*argc*/, argv) |
| { |
| s_test__createSimpleRegistry__free(); |
| s_test__createSimpleRegistry__purpose(); |
| |
| s_test__loadSharedLibComponentFactory__free_free(); |
| s_test__loadSharedLibComponentFactory__free_purpose(); |
| s_test__loadSharedLibComponentFactory__purpose_free(); |
| s_test__loadSharedLibComponentFactory__purpose_purpose(); |
| |
| s_test__bootstrap_InitialComponentContext__free(); |
| s_test__bootstrap_InitialComponentContext__purpose(); |
| |
| int ret; |
| if (s_comment.indexOf(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("FAILURE"))) == -1) |
| { |
| s_comment += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("TESTS PASSED\n")); |
| ret = 0; |
| } |
| else |
| { |
| s_comment += rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("TESTS _NOT_ PASSED\n")); |
| ret = -1; |
| } |
| |
| std::cerr |
| << argv[0] |
| << std::endl |
| << rtl::OUStringToOString(s_comment, RTL_TEXTENCODING_ASCII_US).getStr() |
| << std::endl; |
| |
| return ret; |
| } |