1*2f86921cSAndrew Rist /**************************************************************
2cdf0e10cSrcweir *
3*2f86921cSAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one
4*2f86921cSAndrew Rist * or more contributor license agreements. See the NOTICE file
5*2f86921cSAndrew Rist * distributed with this work for additional information
6*2f86921cSAndrew Rist * regarding copyright ownership. The ASF licenses this file
7*2f86921cSAndrew Rist * to you under the Apache License, Version 2.0 (the
8*2f86921cSAndrew Rist * "License"); you may not use this file except in compliance
9*2f86921cSAndrew Rist * with the License. You may obtain a copy of the License at
10*2f86921cSAndrew Rist *
11*2f86921cSAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
12*2f86921cSAndrew Rist *
13*2f86921cSAndrew Rist * Unless required by applicable law or agreed to in writing,
14*2f86921cSAndrew Rist * software distributed under the License is distributed on an
15*2f86921cSAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*2f86921cSAndrew Rist * KIND, either express or implied. See the License for the
17*2f86921cSAndrew Rist * specific language governing permissions and limitations
18*2f86921cSAndrew Rist * under the License.
19*2f86921cSAndrew Rist *
20*2f86921cSAndrew Rist *************************************************************/
21*2f86921cSAndrew Rist
22*2f86921cSAndrew Rist
23cdf0e10cSrcweir
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_ucb.hxx"
26cdf0e10cSrcweir
27cdf0e10cSrcweir /**************************************************************************
28cdf0e10cSrcweir TODO
29cdf0e10cSrcweir **************************************************************************
30cdf0e10cSrcweir
31cdf0e10cSrcweir *************************************************************************/
32cdf0e10cSrcweir #include <osl/diagnose.h>
33cdf0e10cSrcweir #include <cppuhelper/interfacecontainer.hxx>
34cdf0e10cSrcweir #include <com/sun/star/lang/IllegalArgumentException.hpp>
35cdf0e10cSrcweir #include <com/sun/star/ucb/GlobalTransferCommandArgument.hpp>
36cdf0e10cSrcweir #include <com/sun/star/ucb/XCommandInfo.hpp>
37cdf0e10cSrcweir #include <com/sun/star/ucb/XContentProvider.hpp>
38cdf0e10cSrcweir #include <com/sun/star/ucb/XContentProviderSupplier.hpp>
39cdf0e10cSrcweir #include <com/sun/star/ucb/XParameterizedContentProvider.hpp>
40cdf0e10cSrcweir #include <com/sun/star/ucb/XContentProviderFactory.hpp>
41cdf0e10cSrcweir #include <com/sun/star/beans/PropertyValue.hpp>
42cdf0e10cSrcweir #include <com/sun/star/container/XHierarchicalNameAccess.hpp>
43cdf0e10cSrcweir #include <com/sun/star/container/XNameAccess.hpp>
44cdf0e10cSrcweir #include <com/sun/star/uno/Any.hxx>
45cdf0e10cSrcweir #include <ucbhelper/cancelcommandexecution.hxx>
46cdf0e10cSrcweir #include "identify.hxx"
47cdf0e10cSrcweir #include "ucbcmds.hxx"
48cdf0e10cSrcweir
49cdf0e10cSrcweir #include "ucb.hxx"
50cdf0e10cSrcweir
51cdf0e10cSrcweir // Definitions for ProviderMap_Impl (Solaris wouldn't find explicit template
52cdf0e10cSrcweir // instantiations for these in another compilation unit...):
53cdf0e10cSrcweir #ifndef _UCB_REGEXPMAP_TPT_
54cdf0e10cSrcweir #include <regexpmap.tpt>
55cdf0e10cSrcweir #endif
56cdf0e10cSrcweir
57cdf0e10cSrcweir using namespace rtl;
58cdf0e10cSrcweir using namespace cppu;
59cdf0e10cSrcweir using namespace com::sun::star::uno;
60cdf0e10cSrcweir using namespace com::sun::star::lang;
61cdf0e10cSrcweir using namespace com::sun::star::ucb;
62cdf0e10cSrcweir using namespace ucb_impl;
63cdf0e10cSrcweir using namespace com::sun::star;
64cdf0e10cSrcweir using namespace ucbhelper;
65cdf0e10cSrcweir
66cdf0e10cSrcweir
67cdf0e10cSrcweir #define CONFIG_CONTENTPROVIDERS_KEY \
68cdf0e10cSrcweir "/org.openoffice.ucb.Configuration/ContentProviders"
69cdf0e10cSrcweir
70cdf0e10cSrcweir
71cdf0e10cSrcweir namespace {
72cdf0e10cSrcweir
fillPlaceholders(rtl::OUString const & rInput,uno::Sequence<uno::Any> const & rReplacements,rtl::OUString * pOutput)73cdf0e10cSrcweir bool fillPlaceholders(rtl::OUString const & rInput,
74cdf0e10cSrcweir uno::Sequence< uno::Any > const & rReplacements,
75cdf0e10cSrcweir rtl::OUString * pOutput)
76cdf0e10cSrcweir {
77cdf0e10cSrcweir sal_Unicode const * p = rInput.getStr();
78cdf0e10cSrcweir sal_Unicode const * pEnd = p + rInput.getLength();
79cdf0e10cSrcweir sal_Unicode const * pCopy = p;
80cdf0e10cSrcweir rtl::OUStringBuffer aBuffer;
81cdf0e10cSrcweir while (p != pEnd)
82cdf0e10cSrcweir switch (*p++)
83cdf0e10cSrcweir {
84cdf0e10cSrcweir case '&':
85cdf0e10cSrcweir if (pEnd - p >= 4
86cdf0e10cSrcweir && p[0] == 'a' && p[1] == 'm' && p[2] == 'p'
87cdf0e10cSrcweir && p[3] == ';')
88cdf0e10cSrcweir {
89cdf0e10cSrcweir aBuffer.append(pCopy, p - 1 - pCopy);
90cdf0e10cSrcweir aBuffer.append(sal_Unicode('&'));
91cdf0e10cSrcweir p += 4;
92cdf0e10cSrcweir pCopy = p;
93cdf0e10cSrcweir }
94cdf0e10cSrcweir else if (pEnd - p >= 3
95cdf0e10cSrcweir && p[0] == 'l' && p[1] == 't' && p[2] == ';')
96cdf0e10cSrcweir {
97cdf0e10cSrcweir aBuffer.append(pCopy, p - 1 - pCopy);
98cdf0e10cSrcweir aBuffer.append(sal_Unicode('<'));
99cdf0e10cSrcweir p += 3;
100cdf0e10cSrcweir pCopy = p;
101cdf0e10cSrcweir }
102cdf0e10cSrcweir else if (pEnd - p >= 3
103cdf0e10cSrcweir && p[0] == 'g' && p[1] == 't' && p[2] == ';')
104cdf0e10cSrcweir {
105cdf0e10cSrcweir aBuffer.append(pCopy, p - 1 - pCopy);
106cdf0e10cSrcweir aBuffer.append(sal_Unicode('>'));
107cdf0e10cSrcweir p += 3;
108cdf0e10cSrcweir pCopy = p;
109cdf0e10cSrcweir }
110cdf0e10cSrcweir break;
111cdf0e10cSrcweir
112cdf0e10cSrcweir case '<':
113cdf0e10cSrcweir sal_Unicode const * q = p;
114cdf0e10cSrcweir while (q != pEnd && *q != '>')
115cdf0e10cSrcweir ++q;
116cdf0e10cSrcweir if (q == pEnd)
117cdf0e10cSrcweir break;
118cdf0e10cSrcweir rtl::OUString aKey(p, q - p);
119cdf0e10cSrcweir rtl::OUString aValue;
120cdf0e10cSrcweir bool bFound = false;
121cdf0e10cSrcweir for (sal_Int32 i = 2; i + 1 < rReplacements.getLength();
122cdf0e10cSrcweir i += 2)
123cdf0e10cSrcweir {
124cdf0e10cSrcweir rtl::OUString aReplaceKey;
125cdf0e10cSrcweir if ((rReplacements[i] >>= aReplaceKey)
126cdf0e10cSrcweir && aReplaceKey == aKey
127cdf0e10cSrcweir && (rReplacements[i + 1] >>= aValue))
128cdf0e10cSrcweir {
129cdf0e10cSrcweir bFound = true;
130cdf0e10cSrcweir break;
131cdf0e10cSrcweir }
132cdf0e10cSrcweir }
133cdf0e10cSrcweir if (!bFound)
134cdf0e10cSrcweir return false;
135cdf0e10cSrcweir aBuffer.append(pCopy, p - 1 - pCopy);
136cdf0e10cSrcweir aBuffer.append(aValue);
137cdf0e10cSrcweir p = q + 1;
138cdf0e10cSrcweir pCopy = p;
139cdf0e10cSrcweir break;
140cdf0e10cSrcweir }
141cdf0e10cSrcweir aBuffer.append(pCopy, pEnd - pCopy);
142cdf0e10cSrcweir *pOutput = aBuffer.makeStringAndClear();
143cdf0e10cSrcweir return true;
144cdf0e10cSrcweir }
145cdf0e10cSrcweir
makeAndAppendXMLName(rtl::OUStringBuffer & rBuffer,const rtl::OUString & rIn)146cdf0e10cSrcweir void makeAndAppendXMLName(
147cdf0e10cSrcweir rtl::OUStringBuffer & rBuffer, const rtl::OUString & rIn )
148cdf0e10cSrcweir {
149cdf0e10cSrcweir sal_Int32 nCount = rIn.getLength();
150cdf0e10cSrcweir for ( sal_Int32 n = 0; n < nCount; ++n )
151cdf0e10cSrcweir {
152cdf0e10cSrcweir const sal_Unicode c = rIn.getStr()[ n ];
153cdf0e10cSrcweir switch ( c )
154cdf0e10cSrcweir {
155cdf0e10cSrcweir case '&':
156cdf0e10cSrcweir rBuffer.appendAscii( "&" );
157cdf0e10cSrcweir break;
158cdf0e10cSrcweir
159cdf0e10cSrcweir case '"':
160cdf0e10cSrcweir rBuffer.appendAscii( """ );
161cdf0e10cSrcweir break;
162cdf0e10cSrcweir
163cdf0e10cSrcweir case '\'':
164cdf0e10cSrcweir rBuffer.appendAscii( "'" );
165cdf0e10cSrcweir break;
166cdf0e10cSrcweir
167cdf0e10cSrcweir case '<':
168cdf0e10cSrcweir rBuffer.appendAscii( "<" );
169cdf0e10cSrcweir break;
170cdf0e10cSrcweir
171cdf0e10cSrcweir case '>':
172cdf0e10cSrcweir rBuffer.appendAscii( ">" );
173cdf0e10cSrcweir break;
174cdf0e10cSrcweir
175cdf0e10cSrcweir default:
176cdf0e10cSrcweir rBuffer.append( c );
177cdf0e10cSrcweir break;
178cdf0e10cSrcweir }
179cdf0e10cSrcweir }
180cdf0e10cSrcweir }
181cdf0e10cSrcweir
createContentProviderData(const rtl::OUString & rProvider,const uno::Reference<container::XHierarchicalNameAccess> & rxHierNameAccess,ContentProviderData & rInfo)182cdf0e10cSrcweir bool createContentProviderData(
183cdf0e10cSrcweir const rtl::OUString & rProvider,
184cdf0e10cSrcweir const uno::Reference< container::XHierarchicalNameAccess >& rxHierNameAccess,
185cdf0e10cSrcweir ContentProviderData & rInfo)
186cdf0e10cSrcweir {
187cdf0e10cSrcweir // Obtain service name.
188cdf0e10cSrcweir rtl::OUStringBuffer aKeyBuffer (rProvider);
189cdf0e10cSrcweir aKeyBuffer.appendAscii( "/ServiceName" );
190cdf0e10cSrcweir
191cdf0e10cSrcweir rtl::OUString aValue;
192cdf0e10cSrcweir try
193cdf0e10cSrcweir {
194cdf0e10cSrcweir if ( !( rxHierNameAccess->getByHierarchicalName(
195cdf0e10cSrcweir aKeyBuffer.makeStringAndClear() ) >>= aValue ) )
196cdf0e10cSrcweir {
197cdf0e10cSrcweir OSL_ENSURE( false,
198cdf0e10cSrcweir "UniversalContentBroker::getContentProviderData - "
199cdf0e10cSrcweir "Error getting item value!" );
200cdf0e10cSrcweir }
201cdf0e10cSrcweir }
202cdf0e10cSrcweir catch (container::NoSuchElementException &)
203cdf0e10cSrcweir {
204cdf0e10cSrcweir return false;
205cdf0e10cSrcweir }
206cdf0e10cSrcweir
207cdf0e10cSrcweir rInfo.ServiceName = aValue;
208cdf0e10cSrcweir
209cdf0e10cSrcweir // Obtain URL Template.
210cdf0e10cSrcweir aKeyBuffer.append(rProvider);
211cdf0e10cSrcweir aKeyBuffer.appendAscii( "/URLTemplate" );
212cdf0e10cSrcweir
213cdf0e10cSrcweir if ( !( rxHierNameAccess->getByHierarchicalName(
214cdf0e10cSrcweir aKeyBuffer.makeStringAndClear() ) >>= aValue ) )
215cdf0e10cSrcweir {
216cdf0e10cSrcweir OSL_ENSURE( false,
217cdf0e10cSrcweir "UniversalContentBroker::getContentProviderData - "
218cdf0e10cSrcweir "Error getting item value!" );
219cdf0e10cSrcweir }
220cdf0e10cSrcweir
221cdf0e10cSrcweir rInfo.URLTemplate = aValue;
222cdf0e10cSrcweir
223cdf0e10cSrcweir // Obtain Arguments.
224cdf0e10cSrcweir aKeyBuffer.append(rProvider);
225cdf0e10cSrcweir aKeyBuffer.appendAscii( "/Arguments" );
226cdf0e10cSrcweir
227cdf0e10cSrcweir if ( !( rxHierNameAccess->getByHierarchicalName(
228cdf0e10cSrcweir aKeyBuffer.makeStringAndClear() ) >>= aValue ) )
229cdf0e10cSrcweir {
230cdf0e10cSrcweir OSL_ENSURE( false,
231cdf0e10cSrcweir "UniversalContentBroker::getContentProviderData - "
232cdf0e10cSrcweir "Error getting item value!" );
233cdf0e10cSrcweir }
234cdf0e10cSrcweir
235cdf0e10cSrcweir rInfo.Arguments = aValue;
236cdf0e10cSrcweir return true;
237cdf0e10cSrcweir }
238cdf0e10cSrcweir
239cdf0e10cSrcweir }
240cdf0e10cSrcweir
241cdf0e10cSrcweir //=========================================================================
242cdf0e10cSrcweir //
243cdf0e10cSrcweir // UniversalContentBroker Implementation.
244cdf0e10cSrcweir //
245cdf0e10cSrcweir //=========================================================================
246cdf0e10cSrcweir
UniversalContentBroker(const Reference<com::sun::star::lang::XMultiServiceFactory> & rXSMgr)247cdf0e10cSrcweir UniversalContentBroker::UniversalContentBroker(
248cdf0e10cSrcweir const Reference< com::sun::star::lang::XMultiServiceFactory >& rXSMgr )
249cdf0e10cSrcweir : m_xSMgr( rXSMgr ),
250cdf0e10cSrcweir m_pDisposeEventListeners( NULL ),
251cdf0e10cSrcweir m_nInitCount( 0 ), //@@@ see initialize() method
252cdf0e10cSrcweir m_nCommandId( 0 )
253cdf0e10cSrcweir {
254cdf0e10cSrcweir OSL_ENSURE( m_xSMgr.is(),
255cdf0e10cSrcweir "UniversalContentBroker ctor: No service manager" );
256cdf0e10cSrcweir }
257cdf0e10cSrcweir
258cdf0e10cSrcweir //=========================================================================
259cdf0e10cSrcweir // virtual
~UniversalContentBroker()260cdf0e10cSrcweir UniversalContentBroker::~UniversalContentBroker()
261cdf0e10cSrcweir {
262cdf0e10cSrcweir delete m_pDisposeEventListeners;
263cdf0e10cSrcweir }
264cdf0e10cSrcweir
265cdf0e10cSrcweir //=========================================================================
266cdf0e10cSrcweir //
267cdf0e10cSrcweir // XInterface methods.
268cdf0e10cSrcweir //
269cdf0e10cSrcweir //=========================================================================
270cdf0e10cSrcweir
271cdf0e10cSrcweir XINTERFACE_IMPL_8( UniversalContentBroker,
272cdf0e10cSrcweir XTypeProvider,
273cdf0e10cSrcweir XComponent,
274cdf0e10cSrcweir XServiceInfo,
275cdf0e10cSrcweir XInitialization,
276cdf0e10cSrcweir XContentProviderManager,
277cdf0e10cSrcweir XContentProvider,
278cdf0e10cSrcweir XContentIdentifierFactory,
279cdf0e10cSrcweir XCommandProcessor );
280cdf0e10cSrcweir
281cdf0e10cSrcweir //=========================================================================
282cdf0e10cSrcweir //
283cdf0e10cSrcweir // XTypeProvider methods.
284cdf0e10cSrcweir //
285cdf0e10cSrcweir //=========================================================================
286cdf0e10cSrcweir
287cdf0e10cSrcweir XTYPEPROVIDER_IMPL_8( UniversalContentBroker,
288cdf0e10cSrcweir XTypeProvider,
289cdf0e10cSrcweir XComponent,
290cdf0e10cSrcweir XServiceInfo,
291cdf0e10cSrcweir XInitialization,
292cdf0e10cSrcweir XContentProviderManager,
293cdf0e10cSrcweir XContentProvider,
294cdf0e10cSrcweir XContentIdentifierFactory,
295cdf0e10cSrcweir XCommandProcessor );
296cdf0e10cSrcweir
297cdf0e10cSrcweir //=========================================================================
298cdf0e10cSrcweir //
299cdf0e10cSrcweir // XComponent methods.
300cdf0e10cSrcweir //
301cdf0e10cSrcweir //=========================================================================
302cdf0e10cSrcweir
303cdf0e10cSrcweir // virtual
dispose()304cdf0e10cSrcweir void SAL_CALL UniversalContentBroker::dispose()
305cdf0e10cSrcweir throw( com::sun::star::uno::RuntimeException )
306cdf0e10cSrcweir {
307cdf0e10cSrcweir if ( m_pDisposeEventListeners && m_pDisposeEventListeners->getLength() )
308cdf0e10cSrcweir {
309cdf0e10cSrcweir EventObject aEvt;
310cdf0e10cSrcweir aEvt.Source = SAL_STATIC_CAST( XComponent*, this );
311cdf0e10cSrcweir m_pDisposeEventListeners->disposeAndClear( aEvt );
312cdf0e10cSrcweir }
313cdf0e10cSrcweir
314cdf0e10cSrcweir if ( m_xNotifier.is() )
315cdf0e10cSrcweir m_xNotifier->removeChangesListener( this );
316cdf0e10cSrcweir }
317cdf0e10cSrcweir
318cdf0e10cSrcweir //=========================================================================
319cdf0e10cSrcweir // virtual
addEventListener(const Reference<XEventListener> & Listener)320cdf0e10cSrcweir void SAL_CALL UniversalContentBroker::addEventListener(
321cdf0e10cSrcweir const Reference< XEventListener >& Listener )
322cdf0e10cSrcweir throw( com::sun::star::uno::RuntimeException )
323cdf0e10cSrcweir {
324cdf0e10cSrcweir if ( !m_pDisposeEventListeners )
325cdf0e10cSrcweir m_pDisposeEventListeners = new OInterfaceContainerHelper( m_aMutex );
326cdf0e10cSrcweir
327cdf0e10cSrcweir m_pDisposeEventListeners->addInterface( Listener );
328cdf0e10cSrcweir }
329cdf0e10cSrcweir
330cdf0e10cSrcweir //=========================================================================
331cdf0e10cSrcweir // virtual
removeEventListener(const Reference<XEventListener> & Listener)332cdf0e10cSrcweir void SAL_CALL UniversalContentBroker::removeEventListener(
333cdf0e10cSrcweir const Reference< XEventListener >& Listener )
334cdf0e10cSrcweir throw( com::sun::star::uno::RuntimeException )
335cdf0e10cSrcweir {
336cdf0e10cSrcweir if ( m_pDisposeEventListeners )
337cdf0e10cSrcweir m_pDisposeEventListeners->removeInterface( Listener );
338cdf0e10cSrcweir
339cdf0e10cSrcweir // Note: Don't want to delete empty container here -> performance.
340cdf0e10cSrcweir }
341cdf0e10cSrcweir
342cdf0e10cSrcweir //=========================================================================
343cdf0e10cSrcweir //
344cdf0e10cSrcweir // XServiceInfo methods.
345cdf0e10cSrcweir //
346cdf0e10cSrcweir //=========================================================================
347cdf0e10cSrcweir
348cdf0e10cSrcweir XSERVICEINFO_IMPL_1( UniversalContentBroker,
349cdf0e10cSrcweir OUString::createFromAscii(
350cdf0e10cSrcweir "com.sun.star.comp.ucb.UniversalContentBroker" ),
351cdf0e10cSrcweir OUString::createFromAscii(
352cdf0e10cSrcweir UCB_SERVICE_NAME ) );
353cdf0e10cSrcweir
354cdf0e10cSrcweir //=========================================================================
355cdf0e10cSrcweir //
356cdf0e10cSrcweir // Service factory implementation.
357cdf0e10cSrcweir //
358cdf0e10cSrcweir //=========================================================================
359cdf0e10cSrcweir
360cdf0e10cSrcweir ONE_INSTANCE_SERVICE_FACTORY_IMPL( UniversalContentBroker );
361cdf0e10cSrcweir
362cdf0e10cSrcweir //=========================================================================
363cdf0e10cSrcweir //
364cdf0e10cSrcweir // XInitialization methods.
365cdf0e10cSrcweir //
366cdf0e10cSrcweir //=========================================================================
367cdf0e10cSrcweir
368cdf0e10cSrcweir // virtual
initialize(const com::sun::star::uno::Sequence<Any> & aArguments)369cdf0e10cSrcweir void SAL_CALL UniversalContentBroker::initialize(
370cdf0e10cSrcweir const com::sun::star::uno::Sequence< Any >& aArguments )
371cdf0e10cSrcweir throw( com::sun::star::uno::Exception,
372cdf0e10cSrcweir com::sun::star::uno::RuntimeException )
373cdf0e10cSrcweir {
374cdf0e10cSrcweir //@@@ At the moment, there's a problem when one (non-one-instance) factory
375cdf0e10cSrcweir // 'wraps' another (one-instance) factory, causing this method to be
376cdf0e10cSrcweir // called several times:
377cdf0e10cSrcweir m_aArguments = aArguments;
378cdf0e10cSrcweir
379cdf0e10cSrcweir oslInterlockedCount nCount = osl_incrementInterlockedCount(&m_nInitCount);
380cdf0e10cSrcweir if (nCount == 1)
381cdf0e10cSrcweir configureUcb();
382cdf0e10cSrcweir else
383cdf0e10cSrcweir osl_decrementInterlockedCount(&m_nInitCount);
384cdf0e10cSrcweir // make the possibility of overflow less likely...
385cdf0e10cSrcweir }
386cdf0e10cSrcweir
387cdf0e10cSrcweir //=========================================================================
388cdf0e10cSrcweir //
389cdf0e10cSrcweir // XContentProviderManager methods.
390cdf0e10cSrcweir //
391cdf0e10cSrcweir //=========================================================================
392cdf0e10cSrcweir
393cdf0e10cSrcweir // virtual
394cdf0e10cSrcweir Reference< XContentProvider > SAL_CALL
registerContentProvider(const Reference<XContentProvider> & Provider,const OUString & Scheme,sal_Bool ReplaceExisting)395cdf0e10cSrcweir UniversalContentBroker::registerContentProvider(
396cdf0e10cSrcweir const Reference< XContentProvider >& Provider,
397cdf0e10cSrcweir const OUString& Scheme,
398cdf0e10cSrcweir sal_Bool ReplaceExisting )
399cdf0e10cSrcweir throw( DuplicateProviderException, com::sun::star::uno::RuntimeException )
400cdf0e10cSrcweir {
401cdf0e10cSrcweir osl::MutexGuard aGuard(m_aMutex);
402cdf0e10cSrcweir
403cdf0e10cSrcweir ProviderMap_Impl::iterator aIt;
404cdf0e10cSrcweir try
405cdf0e10cSrcweir {
406cdf0e10cSrcweir aIt = m_aProviders.find(Scheme);
407cdf0e10cSrcweir }
408cdf0e10cSrcweir catch (IllegalArgumentException const &)
409cdf0e10cSrcweir {
410cdf0e10cSrcweir return 0; //@@@
411cdf0e10cSrcweir }
412cdf0e10cSrcweir
413cdf0e10cSrcweir Reference< XContentProvider > xPrevious;
414cdf0e10cSrcweir if (aIt == m_aProviders.end())
415cdf0e10cSrcweir {
416cdf0e10cSrcweir ProviderList_Impl aList;
417cdf0e10cSrcweir aList.push_front(Provider);
418cdf0e10cSrcweir try
419cdf0e10cSrcweir {
420cdf0e10cSrcweir m_aProviders.add(Scheme, aList, false);
421cdf0e10cSrcweir }
422cdf0e10cSrcweir catch (IllegalArgumentException const &)
423cdf0e10cSrcweir {
424cdf0e10cSrcweir return 0; //@@@
425cdf0e10cSrcweir }
426cdf0e10cSrcweir }
427cdf0e10cSrcweir else
428cdf0e10cSrcweir {
429cdf0e10cSrcweir if (!ReplaceExisting)
430cdf0e10cSrcweir throw DuplicateProviderException();
431cdf0e10cSrcweir
432cdf0e10cSrcweir ProviderList_Impl & rList = aIt->getValue();
433cdf0e10cSrcweir xPrevious = rList.front().getProvider();
434cdf0e10cSrcweir rList.push_front(Provider);
435cdf0e10cSrcweir }
436cdf0e10cSrcweir
437cdf0e10cSrcweir return xPrevious;
438cdf0e10cSrcweir }
439cdf0e10cSrcweir
440cdf0e10cSrcweir //=========================================================================
441cdf0e10cSrcweir // virtual
deregisterContentProvider(const Reference<XContentProvider> & Provider,const OUString & Scheme)442cdf0e10cSrcweir void SAL_CALL UniversalContentBroker::deregisterContentProvider(
443cdf0e10cSrcweir const Reference< XContentProvider >& Provider,
444cdf0e10cSrcweir const OUString& Scheme )
445cdf0e10cSrcweir throw( com::sun::star::uno::RuntimeException )
446cdf0e10cSrcweir {
447cdf0e10cSrcweir osl::MutexGuard aGuard(m_aMutex);
448cdf0e10cSrcweir
449cdf0e10cSrcweir ProviderMap_Impl::iterator aMapIt;
450cdf0e10cSrcweir try
451cdf0e10cSrcweir {
452cdf0e10cSrcweir aMapIt = m_aProviders.find(Scheme);
453cdf0e10cSrcweir }
454cdf0e10cSrcweir catch (IllegalArgumentException const &)
455cdf0e10cSrcweir {
456cdf0e10cSrcweir return; //@@@
457cdf0e10cSrcweir }
458cdf0e10cSrcweir
459cdf0e10cSrcweir if (aMapIt != m_aProviders.end())
460cdf0e10cSrcweir {
461cdf0e10cSrcweir ProviderList_Impl & rList = aMapIt->getValue();
462cdf0e10cSrcweir
463cdf0e10cSrcweir ProviderList_Impl::iterator aListEnd(rList.end());
464cdf0e10cSrcweir for (ProviderList_Impl::iterator aListIt(rList.begin());
465cdf0e10cSrcweir aListIt != aListEnd; ++aListIt)
466cdf0e10cSrcweir {
467cdf0e10cSrcweir if ((*aListIt).getProvider() == Provider)
468cdf0e10cSrcweir {
469cdf0e10cSrcweir rList.erase(aListIt);
470cdf0e10cSrcweir break;
471cdf0e10cSrcweir }
472cdf0e10cSrcweir }
473cdf0e10cSrcweir
474cdf0e10cSrcweir if (rList.empty())
475cdf0e10cSrcweir m_aProviders.erase(aMapIt);
476cdf0e10cSrcweir }
477cdf0e10cSrcweir }
478cdf0e10cSrcweir
479cdf0e10cSrcweir //=========================================================================
480cdf0e10cSrcweir // virtual
481cdf0e10cSrcweir com::sun::star::uno::Sequence< ContentProviderInfo > SAL_CALL
queryContentProviders()482cdf0e10cSrcweir UniversalContentBroker::queryContentProviders()
483cdf0e10cSrcweir throw( com::sun::star::uno::RuntimeException )
484cdf0e10cSrcweir {
485cdf0e10cSrcweir // Return a list with information about active(!) content providers.
486cdf0e10cSrcweir
487cdf0e10cSrcweir osl::MutexGuard aGuard(m_aMutex);
488cdf0e10cSrcweir
489cdf0e10cSrcweir com::sun::star::uno::Sequence< ContentProviderInfo > aSeq(
490cdf0e10cSrcweir m_aProviders.size() );
491cdf0e10cSrcweir ContentProviderInfo* pInfo = aSeq.getArray();
492cdf0e10cSrcweir
493cdf0e10cSrcweir ProviderMap_Impl::const_iterator end = m_aProviders.end();
494cdf0e10cSrcweir for (ProviderMap_Impl::const_iterator it(m_aProviders.begin()); it != end;
495cdf0e10cSrcweir ++it)
496cdf0e10cSrcweir {
497cdf0e10cSrcweir // Note: Active provider is always the first list element.
498cdf0e10cSrcweir pInfo->ContentProvider = it->getValue().front().getProvider();
499cdf0e10cSrcweir pInfo->Scheme = it->getRegexp();
500cdf0e10cSrcweir ++pInfo;
501cdf0e10cSrcweir }
502cdf0e10cSrcweir
503cdf0e10cSrcweir return aSeq;
504cdf0e10cSrcweir }
505cdf0e10cSrcweir
506cdf0e10cSrcweir //=========================================================================
507cdf0e10cSrcweir // virtual
508cdf0e10cSrcweir Reference< XContentProvider > SAL_CALL
queryContentProvider(const OUString & Identifier)509cdf0e10cSrcweir UniversalContentBroker::queryContentProvider( const OUString&
510cdf0e10cSrcweir Identifier )
511cdf0e10cSrcweir throw( com::sun::star::uno::RuntimeException )
512cdf0e10cSrcweir {
513cdf0e10cSrcweir return queryContentProvider( Identifier, sal_False );
514cdf0e10cSrcweir }
515cdf0e10cSrcweir
516cdf0e10cSrcweir //=========================================================================
517cdf0e10cSrcweir //
518cdf0e10cSrcweir // XContentProvider methods.
519cdf0e10cSrcweir //
520cdf0e10cSrcweir //=========================================================================
521cdf0e10cSrcweir
522cdf0e10cSrcweir // virtual
queryContent(const Reference<XContentIdentifier> & Identifier)523cdf0e10cSrcweir Reference< XContent > SAL_CALL UniversalContentBroker::queryContent(
524cdf0e10cSrcweir const Reference< XContentIdentifier >& Identifier )
525cdf0e10cSrcweir throw( IllegalIdentifierException, com::sun::star::uno::RuntimeException )
526cdf0e10cSrcweir {
527cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////
528cdf0e10cSrcweir // Let the content provider for the scheme given with the content
529cdf0e10cSrcweir // identifier create the XContent instance.
530cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////
531cdf0e10cSrcweir
532cdf0e10cSrcweir if ( !Identifier.is() )
533cdf0e10cSrcweir return Reference< XContent >();
534cdf0e10cSrcweir
535cdf0e10cSrcweir Reference< XContentProvider > xProv =
536cdf0e10cSrcweir queryContentProvider( Identifier->getContentIdentifier(), sal_True );
537cdf0e10cSrcweir if ( xProv.is() )
538cdf0e10cSrcweir return xProv->queryContent( Identifier );
539cdf0e10cSrcweir
540cdf0e10cSrcweir return Reference< XContent >();
541cdf0e10cSrcweir }
542cdf0e10cSrcweir
543cdf0e10cSrcweir //=========================================================================
544cdf0e10cSrcweir // virtual
compareContentIds(const Reference<XContentIdentifier> & Id1,const Reference<XContentIdentifier> & Id2)545cdf0e10cSrcweir sal_Int32 SAL_CALL UniversalContentBroker::compareContentIds(
546cdf0e10cSrcweir const Reference< XContentIdentifier >& Id1,
547cdf0e10cSrcweir const Reference< XContentIdentifier >& Id2 )
548cdf0e10cSrcweir throw( com::sun::star::uno::RuntimeException )
549cdf0e10cSrcweir {
550cdf0e10cSrcweir OUString aURI1( Id1->getContentIdentifier() );
551cdf0e10cSrcweir OUString aURI2( Id2->getContentIdentifier() );
552cdf0e10cSrcweir
553cdf0e10cSrcweir Reference< XContentProvider > xProv1
554cdf0e10cSrcweir = queryContentProvider( aURI1, sal_True );
555cdf0e10cSrcweir Reference< XContentProvider > xProv2
556cdf0e10cSrcweir = queryContentProvider( aURI2, sal_True );
557cdf0e10cSrcweir
558cdf0e10cSrcweir // When both identifiers belong to the same provider, let that provider
559cdf0e10cSrcweir // compare them; otherwise, simply compare the URI strings (which must
560cdf0e10cSrcweir // be different):
561cdf0e10cSrcweir if ( xProv1.is() && ( xProv1 == xProv2 ) )
562cdf0e10cSrcweir return xProv1->compareContentIds( Id1, Id2 );
563cdf0e10cSrcweir else
564cdf0e10cSrcweir return aURI1.compareTo( aURI2 );
565cdf0e10cSrcweir }
566cdf0e10cSrcweir
567cdf0e10cSrcweir //=========================================================================
568cdf0e10cSrcweir //
569cdf0e10cSrcweir // XContentIdentifierFactory methods.
570cdf0e10cSrcweir //
571cdf0e10cSrcweir //=========================================================================
572cdf0e10cSrcweir
573cdf0e10cSrcweir // virtual
574cdf0e10cSrcweir Reference< XContentIdentifier > SAL_CALL
createContentIdentifier(const OUString & ContentId)575cdf0e10cSrcweir UniversalContentBroker::createContentIdentifier(
576cdf0e10cSrcweir const OUString& ContentId )
577cdf0e10cSrcweir throw( com::sun::star::uno::RuntimeException )
578cdf0e10cSrcweir {
579cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////
580cdf0e10cSrcweir // Let the content provider for the scheme given with content
581cdf0e10cSrcweir // identifier create the XContentIdentifier instance, if he supports
582cdf0e10cSrcweir // the XContentIdentifierFactory interface. Otherwise create standard
583cdf0e10cSrcweir // implementation object for XContentIdentifier.
584cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////
585cdf0e10cSrcweir
586cdf0e10cSrcweir Reference< XContentIdentifier > xIdentifier;
587cdf0e10cSrcweir
588cdf0e10cSrcweir Reference< XContentProvider > xProv
589cdf0e10cSrcweir = queryContentProvider( ContentId, sal_True );
590cdf0e10cSrcweir if ( xProv.is() )
591cdf0e10cSrcweir {
592cdf0e10cSrcweir Reference< XContentIdentifierFactory > xFac( xProv, UNO_QUERY );
593cdf0e10cSrcweir if ( xFac.is() )
594cdf0e10cSrcweir xIdentifier = xFac->createContentIdentifier( ContentId );
595cdf0e10cSrcweir }
596cdf0e10cSrcweir
597cdf0e10cSrcweir if ( !xIdentifier.is() )
598cdf0e10cSrcweir xIdentifier = new ContentIdentifier( m_xSMgr, ContentId );
599cdf0e10cSrcweir
600cdf0e10cSrcweir return xIdentifier;
601cdf0e10cSrcweir }
602cdf0e10cSrcweir
603cdf0e10cSrcweir //=========================================================================
604cdf0e10cSrcweir //
605cdf0e10cSrcweir // XCommandProcessor methods.
606cdf0e10cSrcweir //
607cdf0e10cSrcweir //=========================================================================
608cdf0e10cSrcweir
609cdf0e10cSrcweir // virtual
createCommandIdentifier()610cdf0e10cSrcweir sal_Int32 SAL_CALL UniversalContentBroker::createCommandIdentifier()
611cdf0e10cSrcweir throw( RuntimeException )
612cdf0e10cSrcweir {
613cdf0e10cSrcweir osl::MutexGuard aGuard( m_aMutex );
614cdf0e10cSrcweir
615cdf0e10cSrcweir // Just increase counter on every call to generate an identifier.
616cdf0e10cSrcweir return ++m_nCommandId;
617cdf0e10cSrcweir }
618cdf0e10cSrcweir
619cdf0e10cSrcweir //=========================================================================
620cdf0e10cSrcweir // virtual
execute(const Command & aCommand,sal_Int32,const Reference<XCommandEnvironment> & Environment)621cdf0e10cSrcweir Any SAL_CALL UniversalContentBroker::execute(
622cdf0e10cSrcweir const Command& aCommand,
623cdf0e10cSrcweir sal_Int32,
624cdf0e10cSrcweir const Reference< XCommandEnvironment >& Environment )
625cdf0e10cSrcweir throw( Exception, CommandAbortedException, RuntimeException )
626cdf0e10cSrcweir {
627cdf0e10cSrcweir Any aRet;
628cdf0e10cSrcweir
629cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////
630cdf0e10cSrcweir // Note: Don't forget to adapt ucb_commands::CommandProcessorInfo
631cdf0e10cSrcweir // ctor in ucbcmds.cxx when adding new commands!
632cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////
633cdf0e10cSrcweir
634cdf0e10cSrcweir if ( ( aCommand.Handle == GETCOMMANDINFO_HANDLE ) ||
635cdf0e10cSrcweir aCommand.Name.equalsAsciiL(
636cdf0e10cSrcweir RTL_CONSTASCII_STRINGPARAM( GETCOMMANDINFO_NAME ) ) )
637cdf0e10cSrcweir {
638cdf0e10cSrcweir //////////////////////////////////////////////////////////////////
639cdf0e10cSrcweir // getCommandInfo
640cdf0e10cSrcweir //////////////////////////////////////////////////////////////////
641cdf0e10cSrcweir
642cdf0e10cSrcweir aRet <<= getCommandInfo();
643cdf0e10cSrcweir }
644cdf0e10cSrcweir else if ( ( aCommand.Handle == GLOBALTRANSFER_HANDLE ) ||
645cdf0e10cSrcweir aCommand.Name.equalsAsciiL(
646cdf0e10cSrcweir RTL_CONSTASCII_STRINGPARAM(GLOBALTRANSFER_NAME ) ) )
647cdf0e10cSrcweir {
648cdf0e10cSrcweir //////////////////////////////////////////////////////////////////
649cdf0e10cSrcweir // globalTransfer
650cdf0e10cSrcweir //////////////////////////////////////////////////////////////////
651cdf0e10cSrcweir
652cdf0e10cSrcweir GlobalTransferCommandArgument aTransferArg;
653cdf0e10cSrcweir if ( !( aCommand.Argument >>= aTransferArg ) )
654cdf0e10cSrcweir {
655cdf0e10cSrcweir ucbhelper::cancelCommandExecution(
656cdf0e10cSrcweir makeAny( IllegalArgumentException(
657cdf0e10cSrcweir rtl::OUString::createFromAscii(
658cdf0e10cSrcweir "Wrong argument type!" ),
659cdf0e10cSrcweir static_cast< cppu::OWeakObject * >( this ),
660cdf0e10cSrcweir -1 ) ),
661cdf0e10cSrcweir Environment );
662cdf0e10cSrcweir // Unreachable
663cdf0e10cSrcweir }
664cdf0e10cSrcweir
665cdf0e10cSrcweir globalTransfer( aTransferArg, Environment );
666cdf0e10cSrcweir }
667cdf0e10cSrcweir else
668cdf0e10cSrcweir {
669cdf0e10cSrcweir //////////////////////////////////////////////////////////////////
670cdf0e10cSrcweir // Unknown command
671cdf0e10cSrcweir //////////////////////////////////////////////////////////////////
672cdf0e10cSrcweir
673cdf0e10cSrcweir ucbhelper::cancelCommandExecution(
674cdf0e10cSrcweir makeAny( UnsupportedCommandException(
675cdf0e10cSrcweir rtl::OUString(),
676cdf0e10cSrcweir static_cast< cppu::OWeakObject * >( this ) ) ),
677cdf0e10cSrcweir Environment );
678cdf0e10cSrcweir // Unreachable
679cdf0e10cSrcweir }
680cdf0e10cSrcweir
681cdf0e10cSrcweir return aRet;
682cdf0e10cSrcweir }
683cdf0e10cSrcweir
684cdf0e10cSrcweir //=========================================================================
685cdf0e10cSrcweir // virtual
abort(sal_Int32)686cdf0e10cSrcweir void SAL_CALL UniversalContentBroker::abort( sal_Int32 )
687cdf0e10cSrcweir throw( RuntimeException )
688cdf0e10cSrcweir {
689cdf0e10cSrcweir // @@@ Not implemeted ( yet).
690cdf0e10cSrcweir }
691cdf0e10cSrcweir
692cdf0e10cSrcweir //=========================================================================
693cdf0e10cSrcweir //
694cdf0e10cSrcweir // XChangesListener methods
695cdf0e10cSrcweir //
696cdf0e10cSrcweir //=========================================================================
697cdf0e10cSrcweir // virtual
changesOccurred(const util::ChangesEvent & Event)698cdf0e10cSrcweir void SAL_CALL UniversalContentBroker::changesOccurred( const util::ChangesEvent& Event )
699cdf0e10cSrcweir throw( uno::RuntimeException )
700cdf0e10cSrcweir {
701cdf0e10cSrcweir sal_Int32 nCount = Event.Changes.getLength();
702cdf0e10cSrcweir if ( nCount )
703cdf0e10cSrcweir {
704cdf0e10cSrcweir uno::Reference< container::XHierarchicalNameAccess > xHierNameAccess;
705cdf0e10cSrcweir Event.Base >>= xHierNameAccess;
706cdf0e10cSrcweir
707cdf0e10cSrcweir OSL_ASSERT( xHierNameAccess.is() );
708cdf0e10cSrcweir
709cdf0e10cSrcweir const util::ElementChange* pElementChanges
710cdf0e10cSrcweir = Event.Changes.getConstArray();
711cdf0e10cSrcweir
712cdf0e10cSrcweir ContentProviderDataList aData;
713cdf0e10cSrcweir for ( sal_Int32 n = 0; n < nCount; ++n )
714cdf0e10cSrcweir {
715cdf0e10cSrcweir const util::ElementChange& rElem = pElementChanges[ n ];
716cdf0e10cSrcweir rtl::OUString aKey;
717cdf0e10cSrcweir rElem.Accessor >>= aKey;
718cdf0e10cSrcweir
719cdf0e10cSrcweir ContentProviderData aInfo;
720cdf0e10cSrcweir
721cdf0e10cSrcweir // Removal of UCPs from the configuration leads to changesOccurred
722cdf0e10cSrcweir // notifications, too, but it is hard to tell for a given
723cdf0e10cSrcweir // ElementChange whether it is an addition or a removal, so as a
724cdf0e10cSrcweir // heuristic consider as removals those that cause a
725cdf0e10cSrcweir // NoSuchElementException in createContentProviderData.
726cdf0e10cSrcweir //
727cdf0e10cSrcweir // For now, removal of UCPs from the configuration is simply ignored
728cdf0e10cSrcweir // (and not reflected in the UCB's data structures):
729cdf0e10cSrcweir if (createContentProviderData(aKey, xHierNameAccess, aInfo))
730cdf0e10cSrcweir {
731cdf0e10cSrcweir aData.push_back(aInfo);
732cdf0e10cSrcweir }
733cdf0e10cSrcweir }
734cdf0e10cSrcweir
735cdf0e10cSrcweir prepareAndRegister(aData);
736cdf0e10cSrcweir }
737cdf0e10cSrcweir }
738cdf0e10cSrcweir
739cdf0e10cSrcweir //=========================================================================
740cdf0e10cSrcweir //
741cdf0e10cSrcweir // XEventListener methods
742cdf0e10cSrcweir //
743cdf0e10cSrcweir //=========================================================================
744cdf0e10cSrcweir // virtual
disposing(const lang::EventObject &)745cdf0e10cSrcweir void SAL_CALL UniversalContentBroker::disposing(const lang::EventObject&)
746cdf0e10cSrcweir throw( uno::RuntimeException )
747cdf0e10cSrcweir {
748cdf0e10cSrcweir if ( m_xNotifier.is() )
749cdf0e10cSrcweir {
750cdf0e10cSrcweir osl::Guard< osl::Mutex > aGuard( m_aMutex );
751cdf0e10cSrcweir
752cdf0e10cSrcweir if ( m_xNotifier.is() )
753cdf0e10cSrcweir m_xNotifier.clear();
754cdf0e10cSrcweir }
755cdf0e10cSrcweir }
756cdf0e10cSrcweir
757cdf0e10cSrcweir //=========================================================================
758cdf0e10cSrcweir //
759cdf0e10cSrcweir // Non-interface methods
760cdf0e10cSrcweir //
761cdf0e10cSrcweir //=========================================================================
762cdf0e10cSrcweir
queryContentProvider(const OUString & Identifier,sal_Bool bResolved)763cdf0e10cSrcweir Reference< XContentProvider > UniversalContentBroker::queryContentProvider(
764cdf0e10cSrcweir const OUString& Identifier,
765cdf0e10cSrcweir sal_Bool bResolved )
766cdf0e10cSrcweir {
767cdf0e10cSrcweir osl::MutexGuard aGuard( m_aMutex );
768cdf0e10cSrcweir
769cdf0e10cSrcweir ProviderList_Impl const * pList = m_aProviders.map( Identifier );
770cdf0e10cSrcweir return pList ? bResolved ? pList->front().getResolvedProvider()
771cdf0e10cSrcweir : pList->front().getProvider()
772cdf0e10cSrcweir : Reference< XContentProvider >();
773cdf0e10cSrcweir }
774cdf0e10cSrcweir
configureUcb()775cdf0e10cSrcweir bool UniversalContentBroker::configureUcb()
776cdf0e10cSrcweir throw (uno::RuntimeException)
777cdf0e10cSrcweir {
778cdf0e10cSrcweir rtl::OUString aKey1;
779cdf0e10cSrcweir rtl::OUString aKey2;
780cdf0e10cSrcweir if (m_aArguments.getLength() < 2
781cdf0e10cSrcweir || !(m_aArguments[0] >>= aKey1) || !(m_aArguments[1] >>= aKey2))
782cdf0e10cSrcweir {
783cdf0e10cSrcweir OSL_ENSURE(false, "UniversalContentBroker::configureUcb(): Bad arguments");
784cdf0e10cSrcweir return false;
785cdf0e10cSrcweir }
786cdf0e10cSrcweir
787cdf0e10cSrcweir ContentProviderDataList aData;
788cdf0e10cSrcweir if (!getContentProviderData(aKey1, aKey2, aData))
789cdf0e10cSrcweir {
790cdf0e10cSrcweir OSL_ENSURE(false, "UniversalContentBroker::configureUcb(): No configuration");
791cdf0e10cSrcweir return false;
792cdf0e10cSrcweir }
793cdf0e10cSrcweir
794cdf0e10cSrcweir prepareAndRegister(aData);
795cdf0e10cSrcweir
796cdf0e10cSrcweir return true;
797cdf0e10cSrcweir }
798cdf0e10cSrcweir
prepareAndRegister(const ContentProviderDataList & rData)799cdf0e10cSrcweir void UniversalContentBroker::prepareAndRegister(
800cdf0e10cSrcweir const ContentProviderDataList& rData)
801cdf0e10cSrcweir {
802cdf0e10cSrcweir ContentProviderDataList::const_iterator aEnd(rData.end());
803cdf0e10cSrcweir for (ContentProviderDataList::const_iterator aIt(rData.begin());
804cdf0e10cSrcweir aIt != aEnd; ++aIt)
805cdf0e10cSrcweir {
806cdf0e10cSrcweir rtl::OUString aProviderArguments;
807cdf0e10cSrcweir if (fillPlaceholders(aIt->Arguments,
808cdf0e10cSrcweir m_aArguments,
809cdf0e10cSrcweir &aProviderArguments))
810cdf0e10cSrcweir {
811cdf0e10cSrcweir registerAtUcb(this,
812cdf0e10cSrcweir m_xSMgr,
813cdf0e10cSrcweir aIt->ServiceName,
814cdf0e10cSrcweir aProviderArguments,
815cdf0e10cSrcweir aIt->URLTemplate,
816cdf0e10cSrcweir 0);
817cdf0e10cSrcweir
818cdf0e10cSrcweir }
819cdf0e10cSrcweir else
820cdf0e10cSrcweir OSL_ENSURE(false,
821cdf0e10cSrcweir "UniversalContentBroker::prepareAndRegister(): Bad argument placeholders");
822cdf0e10cSrcweir }
823cdf0e10cSrcweir }
824cdf0e10cSrcweir
825cdf0e10cSrcweir //=========================================================================
getContentProviderData(const rtl::OUString & rKey1,const rtl::OUString & rKey2,ContentProviderDataList & rListToFill)826cdf0e10cSrcweir bool UniversalContentBroker::getContentProviderData(
827cdf0e10cSrcweir const rtl::OUString & rKey1,
828cdf0e10cSrcweir const rtl::OUString & rKey2,
829cdf0e10cSrcweir ContentProviderDataList & rListToFill )
830cdf0e10cSrcweir {
831cdf0e10cSrcweir if ( !m_xSMgr.is() || !rKey1.getLength() || !rKey2.getLength() )
832cdf0e10cSrcweir {
833cdf0e10cSrcweir OSL_ENSURE( false,
834cdf0e10cSrcweir "UniversalContentBroker::getContentProviderData - Invalid argument!" );
835cdf0e10cSrcweir return false;
836cdf0e10cSrcweir }
837cdf0e10cSrcweir
838cdf0e10cSrcweir try
839cdf0e10cSrcweir {
840cdf0e10cSrcweir uno::Reference< lang::XMultiServiceFactory > xConfigProv(
841cdf0e10cSrcweir m_xSMgr->createInstance(
842cdf0e10cSrcweir rtl::OUString::createFromAscii(
843cdf0e10cSrcweir "com.sun.star.configuration.ConfigurationProvider" ) ),
844cdf0e10cSrcweir uno::UNO_QUERY_THROW );
845cdf0e10cSrcweir
846cdf0e10cSrcweir rtl::OUStringBuffer aFullPath;
847cdf0e10cSrcweir aFullPath.appendAscii( CONFIG_CONTENTPROVIDERS_KEY "/['" );
848cdf0e10cSrcweir makeAndAppendXMLName( aFullPath, rKey1 );
849cdf0e10cSrcweir aFullPath.appendAscii( "']/SecondaryKeys/['" );
850cdf0e10cSrcweir makeAndAppendXMLName( aFullPath, rKey2 );
851cdf0e10cSrcweir aFullPath.appendAscii( "']/ProviderData" );
852cdf0e10cSrcweir
853cdf0e10cSrcweir uno::Sequence< uno::Any > aArguments( 1 );
854cdf0e10cSrcweir beans::PropertyValue aProperty;
855cdf0e10cSrcweir aProperty.Name
856cdf0e10cSrcweir = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "nodepath" ) );
857cdf0e10cSrcweir aProperty.Value <<= aFullPath.makeStringAndClear();
858cdf0e10cSrcweir aArguments[ 0 ] <<= aProperty;
859cdf0e10cSrcweir
860cdf0e10cSrcweir uno::Reference< uno::XInterface > xInterface(
861cdf0e10cSrcweir xConfigProv->createInstanceWithArguments(
862cdf0e10cSrcweir rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(
863cdf0e10cSrcweir "com.sun.star.configuration.ConfigurationAccess" ) ),
864cdf0e10cSrcweir aArguments ) );
865cdf0e10cSrcweir
866cdf0e10cSrcweir if ( !m_xNotifier.is() )
867cdf0e10cSrcweir {
868cdf0e10cSrcweir m_xNotifier = uno::Reference< util::XChangesNotifier >(
869cdf0e10cSrcweir xInterface, uno::UNO_QUERY_THROW );
870cdf0e10cSrcweir
871cdf0e10cSrcweir m_xNotifier->addChangesListener( this );
872cdf0e10cSrcweir }
873cdf0e10cSrcweir
874cdf0e10cSrcweir uno::Reference< container::XNameAccess > xNameAccess(
875cdf0e10cSrcweir xInterface, uno::UNO_QUERY_THROW );
876cdf0e10cSrcweir
877cdf0e10cSrcweir uno::Sequence< rtl::OUString > aElems = xNameAccess->getElementNames();
878cdf0e10cSrcweir const rtl::OUString* pElems = aElems.getConstArray();
879cdf0e10cSrcweir sal_Int32 nCount = aElems.getLength();
880cdf0e10cSrcweir
881cdf0e10cSrcweir if ( nCount > 0 )
882cdf0e10cSrcweir {
883cdf0e10cSrcweir uno::Reference< container::XHierarchicalNameAccess >
884cdf0e10cSrcweir xHierNameAccess( xInterface, uno::UNO_QUERY_THROW );
885cdf0e10cSrcweir
886cdf0e10cSrcweir // Iterate over children.
887cdf0e10cSrcweir for ( sal_Int32 n = 0; n < nCount; ++n )
888cdf0e10cSrcweir {
889cdf0e10cSrcweir
890cdf0e10cSrcweir try
891cdf0e10cSrcweir {
892cdf0e10cSrcweir
893cdf0e10cSrcweir ContentProviderData aInfo;
894cdf0e10cSrcweir
895cdf0e10cSrcweir rtl::OUStringBuffer aElemBuffer;
896cdf0e10cSrcweir aElemBuffer.appendAscii( "['" );
897cdf0e10cSrcweir makeAndAppendXMLName( aElemBuffer, pElems[ n ] );
898cdf0e10cSrcweir aElemBuffer.appendAscii( "']" );
899cdf0e10cSrcweir
900cdf0e10cSrcweir OSL_VERIFY(
901cdf0e10cSrcweir createContentProviderData(
902cdf0e10cSrcweir aElemBuffer.makeStringAndClear(), xHierNameAccess,
903cdf0e10cSrcweir aInfo));
904cdf0e10cSrcweir
905cdf0e10cSrcweir rListToFill.push_back( aInfo );
906cdf0e10cSrcweir }
907cdf0e10cSrcweir catch ( container::NoSuchElementException& )
908cdf0e10cSrcweir {
909cdf0e10cSrcweir // getByHierarchicalName
910cdf0e10cSrcweir OSL_ENSURE( false,
911cdf0e10cSrcweir "UniversalContentBroker::getContentProviderData - "
912cdf0e10cSrcweir "caught NoSuchElementException!" );
913cdf0e10cSrcweir }
914cdf0e10cSrcweir }
915cdf0e10cSrcweir }
916cdf0e10cSrcweir }
917cdf0e10cSrcweir catch ( uno::RuntimeException& )
918cdf0e10cSrcweir {
919cdf0e10cSrcweir OSL_ENSURE( false,
920cdf0e10cSrcweir "UniversalContentBroker::getContentProviderData - caught RuntimeException!" );
921cdf0e10cSrcweir return false;
922cdf0e10cSrcweir }
923cdf0e10cSrcweir catch ( uno::Exception& )
924cdf0e10cSrcweir {
925cdf0e10cSrcweir // createInstance, createInstanceWithArguments
926cdf0e10cSrcweir
927cdf0e10cSrcweir OSL_ENSURE( false,
928cdf0e10cSrcweir "UniversalContentBroker::getContentProviderData - caught Exception!" );
929cdf0e10cSrcweir return false;
930cdf0e10cSrcweir }
931cdf0e10cSrcweir
932cdf0e10cSrcweir return true;
933cdf0e10cSrcweir }
934cdf0e10cSrcweir
935cdf0e10cSrcweir //=========================================================================
936cdf0e10cSrcweir //
937cdf0e10cSrcweir // ProviderListEntry_Impl implementation.
938cdf0e10cSrcweir //
939cdf0e10cSrcweir //=========================================================================
940cdf0e10cSrcweir
resolveProvider() const941cdf0e10cSrcweir Reference< XContentProvider > ProviderListEntry_Impl::resolveProvider() const
942cdf0e10cSrcweir {
943cdf0e10cSrcweir if ( !m_xResolvedProvider.is() )
944cdf0e10cSrcweir {
945cdf0e10cSrcweir Reference< XContentProviderSupplier > xSupplier(
946cdf0e10cSrcweir m_xProvider, UNO_QUERY );
947cdf0e10cSrcweir if ( xSupplier.is() )
948cdf0e10cSrcweir m_xResolvedProvider = xSupplier->getContentProvider();
949cdf0e10cSrcweir
950cdf0e10cSrcweir if ( !m_xResolvedProvider.is() )
951cdf0e10cSrcweir m_xResolvedProvider = m_xProvider;
952cdf0e10cSrcweir }
953cdf0e10cSrcweir
954cdf0e10cSrcweir return m_xResolvedProvider;
955cdf0e10cSrcweir }
956