xref: /AOO41X/main/ucb/source/core/provprox.cxx (revision 2f86921c33504fdff5a030df6c0b258927045abb)
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     throw( RuntimeException )
108 {
109     return Reference< XContentProvider >(
110                         new UcbContentProviderProxy( m_xSMgr, Service ) );
111 }
112 
113 //=========================================================================
114 //=========================================================================
115 //
116 // UcbContentProviderProxy Implementation.
117 //
118 //=========================================================================
119 //=========================================================================
120 
UcbContentProviderProxy(const Reference<XMultiServiceFactory> & rxSMgr,const OUString & Service)121 UcbContentProviderProxy::UcbContentProviderProxy(
122                         const Reference< XMultiServiceFactory >& rxSMgr,
123                         const OUString& Service )
124 : m_aService( Service ),
125   m_bReplace( sal_False ),
126   m_bRegister( sal_False ),
127   m_xSMgr( rxSMgr )
128 {
129 }
130 
131 //=========================================================================
132 // virtual
~UcbContentProviderProxy()133 UcbContentProviderProxy::~UcbContentProviderProxy()
134 {
135 }
136 
137 //=========================================================================
138 //
139 // XInterface methods.
140 //
141 //=========================================================================
142 
143 XINTERFACE_COMMON_IMPL( UcbContentProviderProxy );
144 
145 //============================================================================
146 // virtual
147 Any SAL_CALL
queryInterface(const Type & rType)148 UcbContentProviderProxy::queryInterface( const Type & rType )
149     throw ( RuntimeException )
150 {
151     Any aRet = cppu::queryInterface( rType,
152                 static_cast< XTypeProvider * >( this ),
153                 static_cast< XServiceInfo * >( this ),
154                 static_cast< XContentProvider * >( this ),
155                 static_cast< XParameterizedContentProvider * >( this ),
156                 static_cast< XContentProviderSupplier * >( this ) );
157 
158     if ( !aRet.hasValue() )
159         aRet = OWeakObject::queryInterface( rType );
160 
161     if ( !aRet.hasValue() )
162     {
163         // Get original provider an forward the call...
164         osl::Guard< osl::Mutex > aGuard( m_aMutex );
165         Reference< XContentProvider > xProvider = getContentProvider();
166         if ( xProvider.is() )
167             aRet = xProvider->queryInterface( rType );
168     }
169 
170     return aRet;
171 }
172 
173 //=========================================================================
174 //
175 // XTypeProvider methods.
176 //
177 //=========================================================================
178 
179 XTYPEPROVIDER_COMMON_IMPL( UcbContentProviderProxy );
180 
181 //=========================================================================
182 
getTypes()183 Sequence< Type > SAL_CALL UcbContentProviderProxy::getTypes()                                                           \
184     throw( RuntimeException )
185 {
186     // Get original provider an forward the call...
187     osl::Guard< osl::Mutex > aGuard( m_aMutex );
188     Reference< XTypeProvider > xProvider( getContentProvider(), UNO_QUERY );
189     if ( xProvider.is() )
190     {
191         return xProvider->getTypes();
192     }
193     else
194     {
195         static cppu::OTypeCollection collection(
196             CPPU_TYPE_REF( XTypeProvider ),
197             CPPU_TYPE_REF( XServiceInfo ),
198             CPPU_TYPE_REF( XContentProvider ),
199             CPPU_TYPE_REF( XParameterizedContentProvider ),
200             CPPU_TYPE_REF( XContentProviderSupplier ) );
201         return collection.getTypes();
202     }
203 }
204 
205 //=========================================================================
206 //
207 // XServiceInfo methods.
208 //
209 //=========================================================================
210 
211 XSERVICEINFO_NOFACTORY_IMPL_1( UcbContentProviderProxy,
212                            OUString::createFromAscii(
213                             "com.sun.star.comp.ucb.UcbContentProviderProxy" ),
214                            OUString::createFromAscii(
215                             PROVIDER_PROXY_SERVICE_NAME ) );
216 
217 //=========================================================================
218 //
219 // XContentProvider methods.
220 //
221 //=========================================================================
222 
223 // virtual
queryContent(const Reference<XContentIdentifier> & Identifier)224 Reference< XContent > SAL_CALL UcbContentProviderProxy::queryContent(
225                         const Reference< XContentIdentifier >& Identifier )
226     throw( IllegalIdentifierException,
227            RuntimeException )
228 {
229     // Get original provider an forward the call...
230 
231     osl::Guard< osl::Mutex > aGuard( m_aMutex );
232 
233     Reference< XContentProvider > xProvider = getContentProvider();
234     if ( xProvider.is() )
235         return xProvider->queryContent( Identifier );
236 
237     return Reference< XContent >();
238 }
239 
240 //=========================================================================
241 // virtual
compareContentIds(const Reference<XContentIdentifier> & Id1,const Reference<XContentIdentifier> & Id2)242 sal_Int32 SAL_CALL UcbContentProviderProxy::compareContentIds(
243                        const Reference< XContentIdentifier >& Id1,
244                        const Reference< XContentIdentifier >& Id2 )
245     throw( RuntimeException )
246 {
247     // Get original provider an forward the call...
248 
249     osl::Guard< osl::Mutex > aGuard( m_aMutex );
250     Reference< XContentProvider > xProvider = getContentProvider();
251     if ( xProvider.is() )
252         return xProvider->compareContentIds( Id1, Id2 );
253 
254     // OSL_ENSURE( sal_False,
255     // "UcbContentProviderProxy::compareContentIds - No provider!" );
256 
257     // @@@ What else?
258     return 0;
259 }
260 
261 //=========================================================================
262 //
263 // XParameterizedContentProvider methods.
264 //
265 //=========================================================================
266 
267 // virtual
268 Reference< XContentProvider > SAL_CALL
registerInstance(const OUString & Template,const OUString & Arguments,sal_Bool ReplaceExisting)269 UcbContentProviderProxy::registerInstance( const OUString& Template,
270                                            const OUString& Arguments,
271                                            sal_Bool ReplaceExisting )
272     throw( IllegalArgumentException,
273            RuntimeException )
274 {
275     // Just remember that this method was called ( and the params ).
276 
277     osl::Guard< osl::Mutex > aGuard( m_aMutex );
278 
279     if ( !m_bRegister )
280     {
281 //      m_xTargetProvider = 0;
282         m_aTemplate  = Template;
283         m_aArguments = Arguments;
284         m_bReplace   = ReplaceExisting;
285 
286         m_bRegister  = sal_True;
287     }
288     return this;
289 }
290 
291 //=========================================================================
292 // virtual
293 Reference< XContentProvider > SAL_CALL
deregisterInstance(const OUString & Template,const OUString & Arguments)294 UcbContentProviderProxy::deregisterInstance( const OUString& Template,
295                                              const OUString& Arguments )
296     throw( IllegalArgumentException,
297            RuntimeException )
298 {
299     osl::Guard< osl::Mutex > aGuard( m_aMutex );
300 
301     // registerInstance called at proxy and at original?
302     if ( m_bRegister && m_xTargetProvider.is() )
303     {
304         m_bRegister       = sal_False;
305         m_xTargetProvider = 0;
306 
307         Reference< XParameterizedContentProvider >
308                                 xParamProvider( m_xProvider, UNO_QUERY );
309         if ( xParamProvider.is() )
310         {
311             try
312             {
313                 xParamProvider->deregisterInstance( Template, Arguments );
314             }
315             catch ( IllegalIdentifierException const & )
316             {
317                 OSL_ENSURE( sal_False,
318                     "UcbContentProviderProxy::deregisterInstance - "
319                     "Caught IllegalIdentifierException!" );
320             }
321         }
322     }
323 
324     return this;
325 }
326 
327 //=========================================================================
328 //
329 // XContentProviderSupplier methods.
330 //
331 //=========================================================================
332 
333 // virtual
334 Reference< XContentProvider > SAL_CALL
getContentProvider()335 UcbContentProviderProxy::getContentProvider()
336     throw( RuntimeException )
337 {
338     osl::Guard< osl::Mutex > aGuard( m_aMutex );
339     if ( !m_xProvider.is() )
340     {
341         try
342         {
343             m_xProvider
344                 = Reference< XContentProvider >(
345                     m_xSMgr->createInstance( m_aService ), UNO_QUERY );
346             if(m_aArguments.compareToAscii("NoConfig") == 0)
347             {
348                 Reference<XInitialization> xInit(m_xProvider,UNO_QUERY);
349                 if(xInit.is()) {
350                     Sequence<Any> aArgs(1);
351                     aArgs[0] <<= m_aArguments;
352                     xInit->initialize(aArgs);
353                 }
354             }
355         }
356         catch ( RuntimeException const & )
357         {
358             throw;
359         }
360         catch ( Exception const & )
361         {
362         }
363 
364         // registerInstance called at proxy, but not yet at original?
365         if ( m_xProvider.is() && m_bRegister )
366         {
367             Reference< XParameterizedContentProvider >
368                 xParamProvider( m_xProvider, UNO_QUERY );
369             if ( xParamProvider.is() )
370             {
371                 try
372                 {
373                     m_xTargetProvider
374                         = xParamProvider->registerInstance( m_aTemplate,
375                                                             m_aArguments,
376                                                             m_bReplace );
377                 }
378                 catch ( IllegalIdentifierException const & )
379                 {
380                     OSL_ENSURE( sal_False,
381                         "UcbContentProviderProxy::getContentProvider - "
382                         "Caught IllegalIdentifierException!" );
383                 }
384 
385                 OSL_ENSURE( m_xTargetProvider.is(),
386                     "UcbContentProviderProxy::getContentProvider - "
387                     "No provider!" );
388             }
389         }
390         if ( !m_xTargetProvider.is() )
391             m_xTargetProvider = m_xProvider;
392     }
393 
394     OSL_ENSURE( m_xProvider.is(),
395                 "UcbContentProviderProxy::getContentProvider - No provider!" );
396     return m_xTargetProvider;
397 }
398