xref: /trunk/main/ucb/source/core/provprox.cxx (revision 91144cd0085a7583d2099b982122deb2184ab956)
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 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_ucb.hxx"
26 #include <osl/diagnose.h>
27 #include "provprox.hxx"
28 #include <com/sun/star/lang/XInitialization.hpp>
29 
30 using namespace rtl;
31 using namespace com::sun::star::lang;
32 using namespace com::sun::star::ucb;
33 using namespace com::sun::star::uno;
34 
35 //=========================================================================
36 //=========================================================================
37 //
38 // UcbContentProviderProxyFactory Implementation.
39 //
40 //=========================================================================
41 //=========================================================================
42 
UcbContentProviderProxyFactory(const Reference<XMultiServiceFactory> & rxSMgr)43 UcbContentProviderProxyFactory::UcbContentProviderProxyFactory(
44                         const Reference< XMultiServiceFactory >& rxSMgr )
45 : m_xSMgr( rxSMgr )
46 {
47 }
48 
49 //=========================================================================
50 // virtual
~UcbContentProviderProxyFactory()51 UcbContentProviderProxyFactory::~UcbContentProviderProxyFactory()
52 {
53 }
54 
55 //=========================================================================
56 //
57 // XInterface methods.
58 //
59 //=========================================================================
60 
61 XINTERFACE_IMPL_3( UcbContentProviderProxyFactory,
62                    XTypeProvider,
63                    XServiceInfo,
64                    XContentProviderFactory );
65 
66 //=========================================================================
67 //
68 // XTypeProvider methods.
69 //
70 //=========================================================================
71 
72 XTYPEPROVIDER_IMPL_3( UcbContentProviderProxyFactory,
73                       XTypeProvider,
74                       XServiceInfo,
75                       XContentProviderFactory );
76 
77 //=========================================================================
78 //
79 // XServiceInfo methods.
80 //
81 //=========================================================================
82 
83 XSERVICEINFO_IMPL_1( UcbContentProviderProxyFactory,
84                      OUString::createFromAscii(
85                         "com.sun.star.comp.ucb.UcbContentProviderProxyFactory" ),
86                      OUString::createFromAscii(
87                         PROVIDER_FACTORY_SERVICE_NAME ) );
88 
89 //=========================================================================
90 //
91 // Service factory implementation.
92 //
93 //=========================================================================
94 
95 ONE_INSTANCE_SERVICE_FACTORY_IMPL( UcbContentProviderProxyFactory );
96 
97 //=========================================================================
98 //
99 // XContentProviderFactory methods.
100 //
101 //=========================================================================
102 
103 // virtual
104 Reference< XContentProvider > SAL_CALL
createContentProvider(const OUString & Service)105 UcbContentProviderProxyFactory::createContentProvider(
106                                                 const OUString& Service )
107 {
108     return Reference< XContentProvider >(
109                         new UcbContentProviderProxy( m_xSMgr, Service ) );
110 }
111 
112 //=========================================================================
113 //=========================================================================
114 //
115 // UcbContentProviderProxy Implementation.
116 //
117 //=========================================================================
118 //=========================================================================
119 
UcbContentProviderProxy(const Reference<XMultiServiceFactory> & rxSMgr,const OUString & Service)120 UcbContentProviderProxy::UcbContentProviderProxy(
121                         const Reference< XMultiServiceFactory >& rxSMgr,
122                         const OUString& Service )
123 : m_aService( Service ),
124   m_bReplace( sal_False ),
125   m_bRegister( sal_False ),
126   m_xSMgr( rxSMgr )
127 {
128 }
129 
130 //=========================================================================
131 // virtual
~UcbContentProviderProxy()132 UcbContentProviderProxy::~UcbContentProviderProxy()
133 {
134 }
135 
136 //=========================================================================
137 //
138 // XInterface methods.
139 //
140 //=========================================================================
141 
142 XINTERFACE_COMMON_IMPL( UcbContentProviderProxy );
143 
144 //============================================================================
145 // virtual
146 Any SAL_CALL
queryInterface(const Type & rType)147 UcbContentProviderProxy::queryInterface( const Type & rType )
148 {
149     Any aRet = cppu::queryInterface( rType,
150                 static_cast< XTypeProvider * >( this ),
151                 static_cast< XServiceInfo * >( this ),
152                 static_cast< XContentProvider * >( this ),
153                 static_cast< XParameterizedContentProvider * >( this ),
154                 static_cast< XContentProviderSupplier * >( this ) );
155 
156     if ( !aRet.hasValue() )
157         aRet = OWeakObject::queryInterface( rType );
158 
159     if ( !aRet.hasValue() )
160     {
161         // Get original provider and forward the call...
162         osl::Guard< osl::Mutex > aGuard( m_aMutex );
163         Reference< XContentProvider > xProvider = getContentProvider();
164         if ( xProvider.is() )
165             aRet = xProvider->queryInterface( rType );
166     }
167 
168     return aRet;
169 }
170 
171 //=========================================================================
172 //
173 // XTypeProvider methods.
174 //
175 //=========================================================================
176 
177 XTYPEPROVIDER_COMMON_IMPL( UcbContentProviderProxy );
178 
179 //=========================================================================
180 
getTypes()181 Sequence< Type > SAL_CALL UcbContentProviderProxy::getTypes()
182 {
183     // Get original provider and forward the call...
184     osl::Guard< osl::Mutex > aGuard( m_aMutex );
185     Reference< XTypeProvider > xProvider( getContentProvider(), UNO_QUERY );
186     if ( xProvider.is() )
187     {
188         return xProvider->getTypes();
189     }
190     else
191     {
192         static cppu::OTypeCollection collection(
193             CPPU_TYPE_REF( XTypeProvider ),
194             CPPU_TYPE_REF( XServiceInfo ),
195             CPPU_TYPE_REF( XContentProvider ),
196             CPPU_TYPE_REF( XParameterizedContentProvider ),
197             CPPU_TYPE_REF( XContentProviderSupplier ) );
198         return collection.getTypes();
199     }
200 }
201 
202 //=========================================================================
203 //
204 // XServiceInfo methods.
205 //
206 //=========================================================================
207 
208 XSERVICEINFO_NOFACTORY_IMPL_1( UcbContentProviderProxy,
209                            OUString::createFromAscii(
210                             "com.sun.star.comp.ucb.UcbContentProviderProxy" ),
211                            OUString::createFromAscii(
212                             PROVIDER_PROXY_SERVICE_NAME ) );
213 
214 //=========================================================================
215 //
216 // XContentProvider methods.
217 //
218 //=========================================================================
219 
220 // virtual
queryContent(const Reference<XContentIdentifier> & Identifier)221 Reference< XContent > SAL_CALL UcbContentProviderProxy::queryContent(
222                         const Reference< XContentIdentifier >& Identifier )
223 {
224     // Get original provider and forward the call...
225 
226     osl::Guard< osl::Mutex > aGuard( m_aMutex );
227 
228     Reference< XContentProvider > xProvider = getContentProvider();
229     if ( xProvider.is() )
230         return xProvider->queryContent( Identifier );
231 
232     return Reference< XContent >();
233 }
234 
235 //=========================================================================
236 // virtual
compareContentIds(const Reference<XContentIdentifier> & Id1,const Reference<XContentIdentifier> & Id2)237 sal_Int32 SAL_CALL UcbContentProviderProxy::compareContentIds(
238                        const Reference< XContentIdentifier >& Id1,
239                        const Reference< XContentIdentifier >& Id2 )
240 {
241     // Get original provider and forward the call...
242 
243     osl::Guard< osl::Mutex > aGuard( m_aMutex );
244     Reference< XContentProvider > xProvider = getContentProvider();
245     if ( xProvider.is() )
246         return xProvider->compareContentIds( Id1, Id2 );
247 
248     // OSL_ENSURE( sal_False,
249     // "UcbContentProviderProxy::compareContentIds - No provider!" );
250 
251     // @@@ What else?
252     return 0;
253 }
254 
255 //=========================================================================
256 //
257 // XParameterizedContentProvider methods.
258 //
259 //=========================================================================
260 
261 // virtual
262 Reference< XContentProvider > SAL_CALL
registerInstance(const OUString & Template,const OUString & Arguments,sal_Bool ReplaceExisting)263 UcbContentProviderProxy::registerInstance( const OUString& Template,
264                                            const OUString& Arguments,
265                                            sal_Bool ReplaceExisting )
266 {
267     // Just remember that this method was called ( and the params ).
268 
269     osl::Guard< osl::Mutex > aGuard( m_aMutex );
270 
271     if ( !m_bRegister )
272     {
273 //      m_xTargetProvider = 0;
274         m_aTemplate  = Template;
275         m_aArguments = Arguments;
276         m_bReplace   = ReplaceExisting;
277 
278         m_bRegister  = sal_True;
279     }
280     return this;
281 }
282 
283 //=========================================================================
284 // virtual
285 Reference< XContentProvider > SAL_CALL
deregisterInstance(const OUString & Template,const OUString & Arguments)286 UcbContentProviderProxy::deregisterInstance( const OUString& Template,
287                                              const OUString& Arguments )
288 {
289     osl::Guard< osl::Mutex > aGuard( m_aMutex );
290 
291     // registerInstance called at proxy and at original?
292     if ( m_bRegister && m_xTargetProvider.is() )
293     {
294         m_bRegister       = sal_False;
295         m_xTargetProvider = 0;
296 
297         Reference< XParameterizedContentProvider >
298                                 xParamProvider( m_xProvider, UNO_QUERY );
299         if ( xParamProvider.is() )
300         {
301             try
302             {
303                 xParamProvider->deregisterInstance( Template, Arguments );
304             }
305             catch ( IllegalIdentifierException const & )
306             {
307                 OSL_ENSURE( sal_False,
308                     "UcbContentProviderProxy::deregisterInstance - "
309                     "Caught IllegalIdentifierException!" );
310             }
311         }
312     }
313 
314     return this;
315 }
316 
317 //=========================================================================
318 //
319 // XContentProviderSupplier methods.
320 //
321 //=========================================================================
322 
323 // virtual
324 Reference< XContentProvider > SAL_CALL
getContentProvider()325 UcbContentProviderProxy::getContentProvider()
326 {
327     osl::Guard< osl::Mutex > aGuard( m_aMutex );
328     if ( !m_xProvider.is() )
329     {
330         try
331         {
332             m_xProvider
333                 = Reference< XContentProvider >(
334                     m_xSMgr->createInstance( m_aService ), UNO_QUERY );
335             if(m_aArguments.compareToAscii("NoConfig") == 0)
336             {
337                 Reference<XInitialization> xInit(m_xProvider,UNO_QUERY);
338                 if(xInit.is()) {
339                     Sequence<Any> aArgs(1);
340                     aArgs[0] <<= m_aArguments;
341                     xInit->initialize(aArgs);
342                 }
343             }
344         }
345         catch ( RuntimeException const & )
346         {
347             throw;
348         }
349         catch ( Exception const & )
350         {
351         }
352 
353         // registerInstance called at proxy, but not yet at original?
354         if ( m_xProvider.is() && m_bRegister )
355         {
356             Reference< XParameterizedContentProvider >
357                 xParamProvider( m_xProvider, UNO_QUERY );
358             if ( xParamProvider.is() )
359             {
360                 try
361                 {
362                     m_xTargetProvider
363                         = xParamProvider->registerInstance( m_aTemplate,
364                                                             m_aArguments,
365                                                             m_bReplace );
366                 }
367                 catch ( IllegalIdentifierException const & )
368                 {
369                     OSL_ENSURE( sal_False,
370                         "UcbContentProviderProxy::getContentProvider - "
371                         "Caught IllegalIdentifierException!" );
372                 }
373 
374                 OSL_ENSURE( m_xTargetProvider.is(),
375                     "UcbContentProviderProxy::getContentProvider - "
376                     "No provider!" );
377             }
378         }
379         if ( !m_xTargetProvider.is() )
380             m_xTargetProvider = m_xProvider;
381     }
382 
383     OSL_ENSURE( m_xProvider.is(),
384                 "UcbContentProviderProxy::getContentProvider - No provider!" );
385     return m_xTargetProvider;
386 }
387