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