/************************************************************** * * 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_bridges.hxx" #include "com/sun/star/bridge/XBridge.hpp" #include "com/sun/star/bridge/XBridgeFactory.hpp" #include "com/sun/star/connection/Connector.hpp" #include "com/sun/star/connection/XConnection.hpp" #include "com/sun/star/connection/XConnector.hpp" #include "com/sun/star/lang/XMultiComponentFactory.hpp" #include "com/sun/star/lang/XServiceInfo.hpp" #include "com/sun/star/lang/XSingleComponentFactory.hpp" #include "com/sun/star/registry/InvalidRegistryException.hpp" #include "com/sun/star/registry/XRegistryKey.hpp" #include "com/sun/star/uno/Exception.hpp" #include "com/sun/star/uno/Reference.hxx" #include "com/sun/star/uno/RuntimeException.hpp" #include "com/sun/star/uno/Sequence.hxx" #include "com/sun/star/uno/XComponentContext.hpp" #include "com/sun/star/uno/XInterface.hpp" #include "cppuhelper/factory.hxx" #include "cppuhelper/implbase2.hxx" #include "cppuhelper/weak.hxx" #include "rtl/string.h" #include "rtl/ustring.hxx" #include "sal/types.h" #include "test/java_uno/equals/XBase.hpp" #include "test/java_uno/equals/XDerived.hpp" #include "test/java_uno/equals/XTestInterface.hpp" #include "uno/environment.h" #include "uno/lbnames.h" namespace css = com::sun::star; namespace { class Service: public cppu::WeakImplHelper2< css::lang::XServiceInfo, test::java_uno::equals::XTestInterface > { public: virtual inline rtl::OUString SAL_CALL getImplementationName() throw (css::uno::RuntimeException) { return rtl::OUString::createFromAscii(getImplementationName_static()); } virtual sal_Bool SAL_CALL supportsService( rtl::OUString const & rServiceName) throw (css::uno::RuntimeException); virtual inline css::uno::Sequence< rtl::OUString > SAL_CALL getSupportedServiceNames() throw (css::uno::RuntimeException) { return getSupportedServiceNames_static(); } virtual void SAL_CALL connect(rtl::OUString const & rConnection, rtl::OUString const & rProtocol) throw (css::uno::Exception); virtual css::uno::Reference< css::uno::XInterface > SAL_CALL get( rtl::OUString const & rName) throw (css::uno::RuntimeException); static inline sal_Char const * getImplementationName_static() { return "com.sun.star.test.bridges.testequals.impl"; } static css::uno::Sequence< rtl::OUString > getSupportedServiceNames_static(); static css::uno::Reference< css::uno::XInterface > SAL_CALL createInstance( css::uno::Reference< css::uno::XComponentContext > const & rContext) throw (css::uno::Exception); private: explicit inline Service( css::uno::Reference< css::uno::XComponentContext > const & rContext): m_xContext(rContext) {} css::uno::Reference< css::uno::XComponentContext > m_xContext; css::uno::Reference< css::bridge::XBridge > m_xBridge; }; } sal_Bool Service::supportsService(rtl::OUString const & rServiceName) throw (css::uno::RuntimeException) { css::uno::Sequence< rtl::OUString > aNames( getSupportedServiceNames_static()); for (sal_Int32 i = 0; i< aNames.getLength(); ++i) if (aNames[i] == rServiceName) return true; return false; } void Service::connect(rtl::OUString const & rConnection, rtl::OUString const & rProtocol) throw (css::uno::Exception) { css::uno::Reference< css::connection::XConnection > xConnection( css::connection::Connector::create(m_xContext)->connect(rConnection)); css::uno::Reference< css::bridge::XBridgeFactory > xBridgeFactory( m_xContext->getServiceManager()->createInstanceWithContext( rtl::OUString::createFromAscii("com.sun.star.bridge.BridgeFactory"), m_xContext), css::uno::UNO_QUERY); m_xBridge = xBridgeFactory->createBridge(rtl::OUString(), rProtocol, xConnection, 0); } css::uno::Reference< css::uno::XInterface > Service::get(rtl::OUString const & rName) throw (css::uno::RuntimeException) { return m_xBridge->getInstance(rName); } css::uno::Sequence< rtl::OUString > Service::getSupportedServiceNames_static() { css::uno::Sequence< rtl::OUString > aNames(1); aNames[0] = rtl::OUString::createFromAscii( "com.sun.star.test.bridges.testequals"); return aNames; } css::uno::Reference< css::uno::XInterface > Service::createInstance( css::uno::Reference< css::uno::XComponentContext > const & rContext) throw (css::uno::Exception) { // Make types known: getCppuType( static_cast< css::uno::Reference< test::java_uno::equals::XBase > const * >(0)); getCppuType( static_cast< css::uno::Reference< test::java_uno::equals::XDerived > const * >(0)); getCppuType( static_cast< css::uno::Reference< test::java_uno::equals::XTestInterface > const * >( 0)); return static_cast< cppu::OWeakObject * >(new Service(rContext)); } extern "C" void SAL_CALL component_getImplementationEnvironment( sal_Char const ** pEnvTypeName, uno_Environment **) { *pEnvTypeName = CPPU_CURRENT_LANGUAGE_BINDING_NAME; } extern "C" void * SAL_CALL component_getFactory(sal_Char const * pImplName, void * pServiceManager, void *) { void * pFactory = 0; if (pServiceManager) if (rtl_str_compare(pImplName, Service::getImplementationName_static()) == 0) { css::uno::Reference< css::lang::XSingleComponentFactory > xFactory(cppu::createSingleComponentFactory( &Service::createInstance, rtl::OUString::createFromAscii( Service::getImplementationName_static()), Service::getSupportedServiceNames_static())); if (xFactory.is()) { xFactory->acquire(); pFactory = xFactory.get(); } } return pFactory; } namespace { bool writeInfo(void * pRegistryKey, sal_Char const * pImplementationName, css::uno::Sequence< rtl::OUString > const & rServiceNames) { rtl::OUString aKeyName(rtl::OUString::createFromAscii("/")); aKeyName += rtl::OUString::createFromAscii(pImplementationName); aKeyName += rtl::OUString::createFromAscii("/UNO/SERVICES"); css::uno::Reference< css::registry::XRegistryKey > xKey; try { xKey = static_cast< css::registry::XRegistryKey * >(pRegistryKey)-> createKey(aKeyName); } catch (css::registry::InvalidRegistryException &) {} if (!xKey.is()) return false; bool bSuccess = true; for (sal_Int32 i = 0; i < rServiceNames.getLength(); ++i) try { xKey->createKey(rServiceNames[i]); } catch (css::registry::InvalidRegistryException &) { bSuccess = false; break; } return bSuccess; } } extern "C" sal_Bool SAL_CALL component_writeInfo(void *, void * pRegistryKey) { return pRegistryKey && writeInfo(pRegistryKey, Service::getImplementationName_static(), Service::getSupportedServiceNames_static()); }