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