xref: /aoo41x/main/ucb/source/core/ucb.cxx (revision 2f86921c)
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( "&amp;" );
157cdf0e10cSrcweir                 break;
158cdf0e10cSrcweir 
159cdf0e10cSrcweir             case '"':
160cdf0e10cSrcweir                 rBuffer.appendAscii( "&quot;" );
161cdf0e10cSrcweir                 break;
162cdf0e10cSrcweir 
163cdf0e10cSrcweir             case '\'':
164cdf0e10cSrcweir                 rBuffer.appendAscii( "&apos;" );
165cdf0e10cSrcweir                 break;
166cdf0e10cSrcweir 
167cdf0e10cSrcweir             case '<':
168cdf0e10cSrcweir                 rBuffer.appendAscii( "&lt;" );
169cdf0e10cSrcweir                 break;
170cdf0e10cSrcweir 
171cdf0e10cSrcweir             case '>':
172cdf0e10cSrcweir                 rBuffer.appendAscii( "&gt;" );
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