xref: /trunk/main/remotebridges/source/unourl_resolver/unourl_resolver.cxx (revision 1ecadb572e7010ff3b3382ad9bf179dbc6efadbb)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 //  #define TRACE(x) OSL_TRACE(x)
29 #define TRACE(x)
30 
31 #include <osl/diagnose.h>
32 #include <osl/mutex.hxx>
33 #include <cppuhelper/factory.hxx>
34 #include <cppuhelper/implbase2.hxx>
35 #include <cppuhelper/implementationentry.hxx>
36 #include "cppuhelper/unourl.hxx"
37 #include "rtl/malformeduriexception.hxx"
38 
39 #include <com/sun/star/lang/XServiceInfo.hpp>
40 #include <com/sun/star/lang/XComponent.hpp>
41 #include <com/sun/star/registry/XRegistryKey.hpp>
42 #include <com/sun/star/connection/XConnector.hpp>
43 #include <com/sun/star/bridge/XBridgeFactory.hpp>
44 #include <com/sun/star/bridge/XUnoUrlResolver.hpp>
45 
46 using namespace cppu;
47 using namespace rtl;
48 using namespace osl;
49 using namespace com::sun::star::uno;
50 using namespace com::sun::star::lang;
51 using namespace com::sun::star::connection;
52 using namespace com::sun::star::bridge;
53 using namespace com::sun::star::registry;
54 
55 #define SERVICENAME     "com.sun.star.bridge.UnoUrlResolver"
56 #define IMPLNAME        "com.sun.star.comp.bridge.UnoUrlResolver"
57 
58 namespace unourl_resolver
59 {
60     rtl_StandardModuleCount g_moduleCount = MODULE_COUNT_INIT;
61 //--------------------------------------------------------------------------------------------------
62 Sequence< OUString > resolver_getSupportedServiceNames()
63 {
64     static Sequence < OUString > *pNames = 0;
65     if( ! pNames )
66     {
67         MutexGuard guard( Mutex::getGlobalMutex() );
68         if( !pNames )
69         {
70             static Sequence< OUString > seqNames(1);
71             seqNames.getArray()[0] = OUString(RTL_CONSTASCII_USTRINGPARAM(SERVICENAME));
72             pNames = &seqNames;
73         }
74     }
75     return *pNames;
76 }
77 
78 OUString resolver_getImplementationName()
79 {
80     static OUString *pImplName = 0;
81     if( ! pImplName )
82     {
83         MutexGuard guard( Mutex::getGlobalMutex() );
84         if( ! pImplName )
85         {
86             static OUString implName(
87                 RTL_CONSTASCII_USTRINGPARAM( IMPLNAME ) );
88             pImplName = &implName;
89         }
90     }
91     return *pImplName;
92 }
93 
94 //==================================================================================================
95 class ResolverImpl : public WeakImplHelper2< XServiceInfo, XUnoUrlResolver >
96 {
97     Reference< XMultiComponentFactory > _xSMgr;
98     Reference< XComponentContext > _xCtx;
99 
100 public:
101     ResolverImpl( const Reference< XComponentContext > & xSMgr );
102     virtual ~ResolverImpl();
103 
104     // XServiceInfo
105     virtual OUString SAL_CALL getImplementationName() throw(::com::sun::star::uno::RuntimeException);
106     virtual sal_Bool SAL_CALL supportsService( const OUString & rServiceName ) throw(::com::sun::star::uno::RuntimeException);
107     virtual Sequence< OUString > SAL_CALL getSupportedServiceNames() throw(::com::sun::star::uno::RuntimeException);
108 
109     // XUnoUrlResolver
110     virtual Reference< XInterface > SAL_CALL resolve( const OUString & rUnoUrl )
111         throw (NoConnectException, ConnectionSetupException, RuntimeException);
112 };
113 
114 //##################################################################################################
115 
116 //__________________________________________________________________________________________________
117 ResolverImpl::ResolverImpl( const Reference< XComponentContext > & xCtx )
118     : _xSMgr( xCtx->getServiceManager() )
119     , _xCtx( xCtx )
120 {
121     g_moduleCount.modCnt.acquire( &g_moduleCount.modCnt );
122 }
123 //__________________________________________________________________________________________________
124 ResolverImpl::~ResolverImpl()
125 {
126     g_moduleCount.modCnt.release( &g_moduleCount.modCnt );
127 }
128 
129 // XServiceInfo
130 //__________________________________________________________________________________________________
131 OUString ResolverImpl::getImplementationName()
132     throw(::com::sun::star::uno::RuntimeException)
133 {
134     return resolver_getImplementationName();
135 }
136 //__________________________________________________________________________________________________
137 sal_Bool ResolverImpl::supportsService( const OUString & rServiceName )
138     throw(::com::sun::star::uno::RuntimeException)
139 {
140     const Sequence< OUString > & rSNL = getSupportedServiceNames();
141     const OUString * pArray = rSNL.getConstArray();
142     for ( sal_Int32 nPos = rSNL.getLength(); nPos--; )
143     {
144         if (pArray[nPos] == rServiceName)
145             return sal_True;
146     }
147     return sal_False;
148 }
149 //__________________________________________________________________________________________________
150 Sequence< OUString > ResolverImpl::getSupportedServiceNames()
151     throw(::com::sun::star::uno::RuntimeException)
152 {
153     return resolver_getSupportedServiceNames();
154 }
155 
156 // XUnoUrlResolver
157 //__________________________________________________________________________________________________
158 Reference< XInterface > ResolverImpl::resolve( const OUString & rUnoUrl )
159     throw (NoConnectException, ConnectionSetupException, RuntimeException)
160 {
161     OUString aProtocolDescr;
162     OUString aConnectDescr;
163     OUString aInstanceName;
164     try
165     {
166         cppu::UnoUrl aUrl(rUnoUrl);
167         aProtocolDescr = aUrl.getProtocol().getDescriptor();
168         aConnectDescr = aUrl.getConnection().getDescriptor();
169         aInstanceName = aUrl.getObjectName();
170     }
171     catch (rtl::MalformedUriException & rEx)
172     {
173         throw ConnectionSetupException(rEx.getMessage(), 0);
174     }
175 
176     Reference< XConnector > xConnector(
177         _xSMgr->createInstanceWithContext(
178             OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.connection.Connector") ),
179             _xCtx ),
180         UNO_QUERY );
181 
182     if (! xConnector.is())
183         throw RuntimeException( OUString( RTL_CONSTASCII_USTRINGPARAM("no connector!" ) ), Reference< XInterface >() );
184 
185     Reference< XConnection > xConnection( xConnector->connect( aConnectDescr ) );
186 
187     // As soon as singletons are ready, switch to singleton !
188     Reference< XBridgeFactory > xBridgeFactory(
189         _xSMgr->createInstanceWithContext(
190             OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.bridge.BridgeFactory") ),
191             _xCtx ),
192         UNO_QUERY );
193 
194     if (! xBridgeFactory.is())
195         throw RuntimeException( OUString( RTL_CONSTASCII_USTRINGPARAM("no bridge factory!" ) ), Reference< XInterface >() );
196 
197     // bridge
198     Reference< XBridge > xBridge( xBridgeFactory->createBridge(
199         OUString(), aProtocolDescr,
200         xConnection, Reference< XInstanceProvider >() ) );
201 
202     Reference< XInterface > xRet( xBridge->getInstance( aInstanceName ) );
203 
204     return xRet;
205 }
206 
207 //==================================================================================================
208 static Reference< XInterface > SAL_CALL ResolverImpl_create( const Reference< XComponentContext > & xCtx )
209 {
210     return Reference< XInterface >( *new ResolverImpl( xCtx ) );
211 }
212 
213 
214 }
215 
216 using namespace unourl_resolver;
217 
218 static struct ImplementationEntry g_entries[] =
219 {
220     {
221         ResolverImpl_create, resolver_getImplementationName,
222         resolver_getSupportedServiceNames, createSingleComponentFactory,
223         &g_moduleCount.modCnt , 0
224     },
225     { 0, 0, 0, 0, 0, 0 }
226 };
227 
228 extern "C"
229 {
230 sal_Bool SAL_CALL component_canUnload( TimeValue *pTime )
231 {
232     return g_moduleCount.canUnload( &g_moduleCount , pTime );
233 }
234 
235 //==================================================================================================
236 void SAL_CALL component_getImplementationEnvironment(
237     const sal_Char ** ppEnvTypeName, uno_Environment ** )
238 {
239     *ppEnvTypeName = CPPU_CURRENT_LANGUAGE_BINDING_NAME;
240 }
241 //==================================================================================================
242 void * SAL_CALL component_getFactory(
243     const sal_Char * pImplName, void * pServiceManager, void * pRegistryKey )
244 {
245     return component_getFactoryHelper( pImplName, pServiceManager, pRegistryKey , g_entries );
246 }
247 }
248