xref: /AOO41X/main/xmlhelp/source/cxxhelp/provider/provider.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1*cdf0e10cSrcweir /*************************************************************************
2*cdf0e10cSrcweir  *
3*cdf0e10cSrcweir  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4*cdf0e10cSrcweir  *
5*cdf0e10cSrcweir  * Copyright 2000, 2010 Oracle and/or its affiliates.
6*cdf0e10cSrcweir  *
7*cdf0e10cSrcweir  * OpenOffice.org - a multi-platform office productivity suite
8*cdf0e10cSrcweir  *
9*cdf0e10cSrcweir  * This file is part of OpenOffice.org.
10*cdf0e10cSrcweir  *
11*cdf0e10cSrcweir  * OpenOffice.org is free software: you can redistribute it and/or modify
12*cdf0e10cSrcweir  * it under the terms of the GNU Lesser General Public License version 3
13*cdf0e10cSrcweir  * only, as published by the Free Software Foundation.
14*cdf0e10cSrcweir  *
15*cdf0e10cSrcweir  * OpenOffice.org is distributed in the hope that it will be useful,
16*cdf0e10cSrcweir  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17*cdf0e10cSrcweir  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18*cdf0e10cSrcweir  * GNU Lesser General Public License version 3 for more details
19*cdf0e10cSrcweir  * (a copy is included in the LICENSE file that accompanied this code).
20*cdf0e10cSrcweir  *
21*cdf0e10cSrcweir  * You should have received a copy of the GNU Lesser General Public License
22*cdf0e10cSrcweir  * version 3 along with OpenOffice.org.  If not, see
23*cdf0e10cSrcweir  * <http://www.openoffice.org/license.html>
24*cdf0e10cSrcweir  * for a copy of the LGPLv3 License.
25*cdf0e10cSrcweir  *
26*cdf0e10cSrcweir  ************************************************************************/
27*cdf0e10cSrcweir 
28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
29*cdf0e10cSrcweir #include "precompiled_xmlhelp.hxx"
30*cdf0e10cSrcweir 
31*cdf0e10cSrcweir /**************************************************************************
32*cdf0e10cSrcweir 								TODO
33*cdf0e10cSrcweir  **************************************************************************
34*cdf0e10cSrcweir 
35*cdf0e10cSrcweir  *************************************************************************/
36*cdf0e10cSrcweir 
37*cdf0e10cSrcweir #include <stdio.h>
38*cdf0e10cSrcweir #include <osl/file.hxx>
39*cdf0e10cSrcweir #ifndef _VOS_DIAGNOSE_HXX_
40*cdf0e10cSrcweir #include <vos/diagnose.hxx>
41*cdf0e10cSrcweir #endif
42*cdf0e10cSrcweir #include <ucbhelper/contentidentifier.hxx>
43*cdf0e10cSrcweir #include <com/sun/star/frame/XConfigManager.hpp>
44*cdf0e10cSrcweir #ifndef _COM_SUN_STAR_BEANS_PROPERTYATTRIBBUTE_HPP_
45*cdf0e10cSrcweir #include <com/sun/star/beans/PropertyAttribute.hpp>
46*cdf0e10cSrcweir #endif
47*cdf0e10cSrcweir #include <com/sun/star/beans/PropertyValue.hpp>
48*cdf0e10cSrcweir #include <com/sun/star/container/XContainer.hpp>
49*cdf0e10cSrcweir #include <com/sun/star/container/XNameAccess.hpp>
50*cdf0e10cSrcweir #include <com/sun/star/container/XNameReplace.hpp>
51*cdf0e10cSrcweir #include <com/sun/star/uno/XComponentContext.hpp>
52*cdf0e10cSrcweir #include <com/sun/star/beans/XPropertySet.hpp>
53*cdf0e10cSrcweir #include <rtl/bootstrap.hxx>
54*cdf0e10cSrcweir 
55*cdf0e10cSrcweir #include "databases.hxx"
56*cdf0e10cSrcweir #include "provider.hxx"
57*cdf0e10cSrcweir #include "content.hxx"
58*cdf0e10cSrcweir #include "databases.hxx"
59*cdf0e10cSrcweir 
60*cdf0e10cSrcweir using namespace com::sun::star;
61*cdf0e10cSrcweir using namespace chelp;
62*cdf0e10cSrcweir 
63*cdf0e10cSrcweir //=========================================================================
64*cdf0e10cSrcweir //=========================================================================
65*cdf0e10cSrcweir //
66*cdf0e10cSrcweir // ContentProvider Implementation.
67*cdf0e10cSrcweir //
68*cdf0e10cSrcweir //=========================================================================
69*cdf0e10cSrcweir //=========================================================================
70*cdf0e10cSrcweir 
71*cdf0e10cSrcweir ContentProvider::ContentProvider(
72*cdf0e10cSrcweir     const uno::Reference< lang::XMultiServiceFactory >& rSMgr )
73*cdf0e10cSrcweir     : ::ucbhelper::ContentProviderImplHelper( rSMgr ),
74*cdf0e10cSrcweir         isInitialized( false ),
75*cdf0e10cSrcweir         m_aScheme( rtl::OUString::createFromAscii( MYUCP_URL_SCHEME ) ),
76*cdf0e10cSrcweir         m_pDatabases( 0 )
77*cdf0e10cSrcweir {
78*cdf0e10cSrcweir }
79*cdf0e10cSrcweir 
80*cdf0e10cSrcweir //=========================================================================
81*cdf0e10cSrcweir // virtual
82*cdf0e10cSrcweir ContentProvider::~ContentProvider()
83*cdf0e10cSrcweir {
84*cdf0e10cSrcweir 	delete m_pDatabases;
85*cdf0e10cSrcweir }
86*cdf0e10cSrcweir 
87*cdf0e10cSrcweir //=========================================================================
88*cdf0e10cSrcweir //
89*cdf0e10cSrcweir // XInterface methods.
90*cdf0e10cSrcweir //
91*cdf0e10cSrcweir //=========================================================================
92*cdf0e10cSrcweir 
93*cdf0e10cSrcweir XINTERFACE_IMPL_6( ContentProvider,
94*cdf0e10cSrcweir 				   lang::XTypeProvider,
95*cdf0e10cSrcweir 				   lang::XServiceInfo,
96*cdf0e10cSrcweir 				   ucb::XContentProvider,
97*cdf0e10cSrcweir 				   lang::XComponent,
98*cdf0e10cSrcweir                    lang::XEventListener, /* base of XContainerListener */
99*cdf0e10cSrcweir 				   container::XContainerListener);
100*cdf0e10cSrcweir 
101*cdf0e10cSrcweir //=========================================================================
102*cdf0e10cSrcweir //
103*cdf0e10cSrcweir // XTypeProvider methods.
104*cdf0e10cSrcweir //
105*cdf0e10cSrcweir //=========================================================================
106*cdf0e10cSrcweir 
107*cdf0e10cSrcweir XTYPEPROVIDER_IMPL_5( ContentProvider,
108*cdf0e10cSrcweir 				   	  lang::XTypeProvider,
109*cdf0e10cSrcweir 				   	  lang::XServiceInfo,
110*cdf0e10cSrcweir 				   	  ucb::XContentProvider,
111*cdf0e10cSrcweir 					  lang::XComponent,
112*cdf0e10cSrcweir 					  container::XContainerListener);
113*cdf0e10cSrcweir 
114*cdf0e10cSrcweir //=========================================================================
115*cdf0e10cSrcweir //
116*cdf0e10cSrcweir // XServiceInfo methods.
117*cdf0e10cSrcweir //
118*cdf0e10cSrcweir //=========================================================================
119*cdf0e10cSrcweir 
120*cdf0e10cSrcweir rtl::OUString SAL_CALL ContentProvider::getImplementationName()
121*cdf0e10cSrcweir 	throw( uno::RuntimeException )
122*cdf0e10cSrcweir {
123*cdf0e10cSrcweir 	return getImplementationName_Static();
124*cdf0e10cSrcweir }
125*cdf0e10cSrcweir 
126*cdf0e10cSrcweir rtl::OUString ContentProvider::getImplementationName_Static()
127*cdf0e10cSrcweir {
128*cdf0e10cSrcweir 	return rtl::OUString::createFromAscii("CHelpContentProvider" );
129*cdf0e10cSrcweir }
130*cdf0e10cSrcweir 
131*cdf0e10cSrcweir sal_Bool SAL_CALL
132*cdf0e10cSrcweir ContentProvider::supportsService(const rtl::OUString& ServiceName )
133*cdf0e10cSrcweir 	throw( uno::RuntimeException )
134*cdf0e10cSrcweir {
135*cdf0e10cSrcweir 	uno::Sequence< rtl::OUString > aSNL = getSupportedServiceNames();
136*cdf0e10cSrcweir 	const rtl::OUString* pArray = aSNL.getArray();
137*cdf0e10cSrcweir 	for( sal_Int32 i = 0; i < aSNL.getLength(); i++ )
138*cdf0e10cSrcweir 	{
139*cdf0e10cSrcweir 		if( pArray[ i ] == ServiceName )
140*cdf0e10cSrcweir 			return sal_True;
141*cdf0e10cSrcweir 	}
142*cdf0e10cSrcweir 
143*cdf0e10cSrcweir 	return sal_False;
144*cdf0e10cSrcweir }
145*cdf0e10cSrcweir 
146*cdf0e10cSrcweir uno::Sequence< rtl::OUString > SAL_CALL
147*cdf0e10cSrcweir ContentProvider::getSupportedServiceNames()
148*cdf0e10cSrcweir 	throw( uno::RuntimeException )
149*cdf0e10cSrcweir {
150*cdf0e10cSrcweir 	return getSupportedServiceNames_Static();
151*cdf0e10cSrcweir }
152*cdf0e10cSrcweir 
153*cdf0e10cSrcweir static uno::Reference< uno::XInterface > SAL_CALL
154*cdf0e10cSrcweir ContentProvider_CreateInstance(
155*cdf0e10cSrcweir  	    const uno::Reference< lang::XMultiServiceFactory> & rSMgr )
156*cdf0e10cSrcweir 	throw( uno::Exception )
157*cdf0e10cSrcweir {
158*cdf0e10cSrcweir     lang::XServiceInfo * pX = static_cast< lang::XServiceInfo * >(
159*cdf0e10cSrcweir         new ContentProvider( rSMgr ) );
160*cdf0e10cSrcweir     return uno::Reference< uno::XInterface >::query( pX );
161*cdf0e10cSrcweir }
162*cdf0e10cSrcweir 
163*cdf0e10cSrcweir uno::Sequence< rtl::OUString >
164*cdf0e10cSrcweir ContentProvider::getSupportedServiceNames_Static()
165*cdf0e10cSrcweir {
166*cdf0e10cSrcweir 	uno::Sequence< rtl::OUString > aSNS( 2 );
167*cdf0e10cSrcweir 	aSNS.getArray()[ 0 ] =
168*cdf0e10cSrcweir 		rtl::OUString::createFromAscii(
169*cdf0e10cSrcweir 			MYUCP_CONTENT_PROVIDER_SERVICE_NAME1 );
170*cdf0e10cSrcweir 	aSNS.getArray()[ 1 ] =
171*cdf0e10cSrcweir 		rtl::OUString::createFromAscii(
172*cdf0e10cSrcweir 			MYUCP_CONTENT_PROVIDER_SERVICE_NAME2 );
173*cdf0e10cSrcweir 
174*cdf0e10cSrcweir 	return aSNS;
175*cdf0e10cSrcweir }
176*cdf0e10cSrcweir 
177*cdf0e10cSrcweir //=========================================================================
178*cdf0e10cSrcweir //
179*cdf0e10cSrcweir // Service factory implementation.
180*cdf0e10cSrcweir //
181*cdf0e10cSrcweir //=========================================================================
182*cdf0e10cSrcweir 
183*cdf0e10cSrcweir ONE_INSTANCE_SERVICE_FACTORY_IMPL( ContentProvider );
184*cdf0e10cSrcweir 
185*cdf0e10cSrcweir //=========================================================================
186*cdf0e10cSrcweir //
187*cdf0e10cSrcweir // XContentProvider methods.
188*cdf0e10cSrcweir //
189*cdf0e10cSrcweir //=========================================================================
190*cdf0e10cSrcweir 
191*cdf0e10cSrcweir // virtual
192*cdf0e10cSrcweir uno::Reference< ucb::XContent > SAL_CALL
193*cdf0e10cSrcweir ContentProvider::queryContent(
194*cdf0e10cSrcweir         const uno::Reference< ucb::XContentIdentifier >& xCanonicId )
195*cdf0e10cSrcweir     throw( ucb::IllegalIdentifierException, uno::RuntimeException )
196*cdf0e10cSrcweir {
197*cdf0e10cSrcweir     if ( !xCanonicId->getContentProviderScheme()
198*cdf0e10cSrcweir              .equalsIgnoreAsciiCase( m_aScheme ) )
199*cdf0e10cSrcweir     {   // Wrong URL-scheme
200*cdf0e10cSrcweir         throw ucb::IllegalIdentifierException();
201*cdf0e10cSrcweir     }
202*cdf0e10cSrcweir 
203*cdf0e10cSrcweir     {
204*cdf0e10cSrcweir         osl::MutexGuard aGuard( m_aMutex );
205*cdf0e10cSrcweir         if( !isInitialized )
206*cdf0e10cSrcweir             init();
207*cdf0e10cSrcweir     }
208*cdf0e10cSrcweir 
209*cdf0e10cSrcweir     if( !m_pDatabases )
210*cdf0e10cSrcweir         throw uno::RuntimeException();
211*cdf0e10cSrcweir 
212*cdf0e10cSrcweir     rtl::OUString aOUString( m_pDatabases->getInstallPathAsURL() );
213*cdf0e10cSrcweir     rtl::OString aOString( aOUString.getStr(),
214*cdf0e10cSrcweir                            aOUString.getLength(),
215*cdf0e10cSrcweir                            RTL_TEXTENCODING_UTF8 );
216*cdf0e10cSrcweir 
217*cdf0e10cSrcweir     // Check, if a content with given id already exists...
218*cdf0e10cSrcweir     uno::Reference< ucb::XContent > xContent
219*cdf0e10cSrcweir         = queryExistingContent( xCanonicId ).get();
220*cdf0e10cSrcweir     if ( xContent.is() )
221*cdf0e10cSrcweir         return xContent;
222*cdf0e10cSrcweir 
223*cdf0e10cSrcweir     xContent = new Content( m_xSMgr, this, xCanonicId, m_pDatabases );
224*cdf0e10cSrcweir 
225*cdf0e10cSrcweir     // register new content
226*cdf0e10cSrcweir     registerNewContent( xContent );
227*cdf0e10cSrcweir 
228*cdf0e10cSrcweir     // Further checks
229*cdf0e10cSrcweir 
230*cdf0e10cSrcweir     if ( !xContent->getIdentifier().is() )
231*cdf0e10cSrcweir         throw ucb::IllegalIdentifierException();
232*cdf0e10cSrcweir 
233*cdf0e10cSrcweir     return xContent;
234*cdf0e10cSrcweir }
235*cdf0e10cSrcweir 
236*cdf0e10cSrcweir void SAL_CALL
237*cdf0e10cSrcweir ContentProvider::dispose()
238*cdf0e10cSrcweir 	throw ( uno::RuntimeException)
239*cdf0e10cSrcweir {
240*cdf0e10cSrcweir 	if(m_xContainer.is())
241*cdf0e10cSrcweir 	{
242*cdf0e10cSrcweir 		m_xContainer->removeContainerListener(this);
243*cdf0e10cSrcweir 		m_xContainer.clear();
244*cdf0e10cSrcweir 	}
245*cdf0e10cSrcweir }
246*cdf0e10cSrcweir 
247*cdf0e10cSrcweir void SAL_CALL
248*cdf0e10cSrcweir ContentProvider::elementReplaced(const container::ContainerEvent& Event)
249*cdf0e10cSrcweir 	throw (uno::RuntimeException)
250*cdf0e10cSrcweir {
251*cdf0e10cSrcweir 	if(!m_pDatabases)
252*cdf0e10cSrcweir 		return;
253*cdf0e10cSrcweir 
254*cdf0e10cSrcweir 	rtl::OUString accessor;
255*cdf0e10cSrcweir 	Event.Accessor >>= accessor;
256*cdf0e10cSrcweir 	if(accessor.compareToAscii("HelpStyleSheet"))
257*cdf0e10cSrcweir 		return;
258*cdf0e10cSrcweir 
259*cdf0e10cSrcweir 	rtl::OUString replacedElement,element;
260*cdf0e10cSrcweir 	Event.ReplacedElement >>= replacedElement;
261*cdf0e10cSrcweir 	Event.Element >>= element;
262*cdf0e10cSrcweir 
263*cdf0e10cSrcweir 	if(replacedElement == element)
264*cdf0e10cSrcweir 		return;
265*cdf0e10cSrcweir 
266*cdf0e10cSrcweir 	m_pDatabases->changeCSS(element);
267*cdf0e10cSrcweir }
268*cdf0e10cSrcweir 
269*cdf0e10cSrcweir void ContentProvider::init()
270*cdf0e10cSrcweir {
271*cdf0e10cSrcweir 	osl::MutexGuard aGuard( m_aMutex );
272*cdf0e10cSrcweir 
273*cdf0e10cSrcweir 	isInitialized = true;
274*cdf0e10cSrcweir 	uno::Reference< lang::XMultiServiceFactory > sProvider(
275*cdf0e10cSrcweir         getConfiguration() );
276*cdf0e10cSrcweir     uno::Reference< container::XHierarchicalNameAccess > xHierAccess(
277*cdf0e10cSrcweir         getHierAccess( sProvider,
278*cdf0e10cSrcweir                        "org.openoffice.Office.Common" ) );
279*cdf0e10cSrcweir 
280*cdf0e10cSrcweir 	rtl::OUString instPath( getKey( xHierAccess,"Path/Current/Help" ) );
281*cdf0e10cSrcweir 	if( ! instPath.getLength() )
282*cdf0e10cSrcweir 		// try to determine path from default
283*cdf0e10cSrcweir 		instPath = rtl::OUString::createFromAscii( "$(instpath)/help" );
284*cdf0e10cSrcweir 	// replace anything like $(instpath);
285*cdf0e10cSrcweir 	subst( instPath );
286*cdf0e10cSrcweir 
287*cdf0e10cSrcweir 	rtl::OUString stylesheet( getKey( xHierAccess,"Help/HelpStyleSheet" ) );
288*cdf0e10cSrcweir 	try
289*cdf0e10cSrcweir     {
290*cdf0e10cSrcweir 		// now adding as configuration change listener for the stylesheet
291*cdf0e10cSrcweir 		uno::Reference< container::XNameAccess> xAccess(
292*cdf0e10cSrcweir             xHierAccess, uno::UNO_QUERY );
293*cdf0e10cSrcweir 		if( xAccess.is() )
294*cdf0e10cSrcweir         {
295*cdf0e10cSrcweir             uno::Any aAny =
296*cdf0e10cSrcweir                 xAccess->getByName( rtl::OUString::createFromAscii( "Help" ) );
297*cdf0e10cSrcweir             aAny >>= m_xContainer;
298*cdf0e10cSrcweir             if( m_xContainer.is() )
299*cdf0e10cSrcweir                 m_xContainer->addContainerListener( this );
300*cdf0e10cSrcweir         }
301*cdf0e10cSrcweir 	}
302*cdf0e10cSrcweir     catch( uno::Exception const & )
303*cdf0e10cSrcweir     {
304*cdf0e10cSrcweir 	}
305*cdf0e10cSrcweir 
306*cdf0e10cSrcweir 	/**
307*cdf0e10cSrcweir 	 *  now determing
308*cdf0e10cSrcweir 	 *  productname,
309*cdf0e10cSrcweir 	 *  productversion,
310*cdf0e10cSrcweir 	 */
311*cdf0e10cSrcweir 
312*cdf0e10cSrcweir 	xHierAccess = getHierAccess( sProvider, "org.openoffice.Setup" );
313*cdf0e10cSrcweir 	rtl::OUString productname(
314*cdf0e10cSrcweir         getKey( xHierAccess,"Product/ooName" ) );
315*cdf0e10cSrcweir 
316*cdf0e10cSrcweir 	rtl::OUString setupversion(
317*cdf0e10cSrcweir         getKey( xHierAccess,"Product/ooSetupVersion" ) );
318*cdf0e10cSrcweir     rtl::OUString setupextension;
319*cdf0e10cSrcweir 
320*cdf0e10cSrcweir     try
321*cdf0e10cSrcweir     {
322*cdf0e10cSrcweir         uno::Reference< lang::XMultiServiceFactory > xConfigProvider(
323*cdf0e10cSrcweir 	          m_xSMgr ->createInstance(::rtl::OUString::createFromAscii("com.sun.star.configuration.ConfigurationProvider")), uno::UNO_QUERY_THROW);
324*cdf0e10cSrcweir 
325*cdf0e10cSrcweir         uno::Sequence < uno::Any > lParams(1);
326*cdf0e10cSrcweir         beans::PropertyValue                       aParam ;
327*cdf0e10cSrcweir         aParam.Name    = ::rtl::OUString::createFromAscii("nodepath");
328*cdf0e10cSrcweir         aParam.Value <<= ::rtl::OUString::createFromAscii("/org.openoffice.Setup/Product");
329*cdf0e10cSrcweir         lParams[0] = uno::makeAny(aParam);
330*cdf0e10cSrcweir 
331*cdf0e10cSrcweir         // open it
332*cdf0e10cSrcweir         uno::Reference< uno::XInterface > xCFG( xConfigProvider->createInstanceWithArguments(
333*cdf0e10cSrcweir                     ::rtl::OUString::createFromAscii("com.sun.star.configuration.ConfigurationAccess"),
334*cdf0e10cSrcweir                     lParams) );
335*cdf0e10cSrcweir 
336*cdf0e10cSrcweir         uno::Reference< container::XNameAccess > xDirectAccess(xCFG, uno::UNO_QUERY);
337*cdf0e10cSrcweir         uno::Any aRet = xDirectAccess->getByName(::rtl::OUString::createFromAscii("ooSetupExtension"));
338*cdf0e10cSrcweir 
339*cdf0e10cSrcweir         aRet >>= setupextension;
340*cdf0e10cSrcweir     }
341*cdf0e10cSrcweir     catch ( uno::Exception& )
342*cdf0e10cSrcweir     {
343*cdf0e10cSrcweir     }
344*cdf0e10cSrcweir 
345*cdf0e10cSrcweir 	rtl::OUString productversion(
346*cdf0e10cSrcweir         setupversion +
347*cdf0e10cSrcweir 		rtl::OUString::createFromAscii( " " ) +
348*cdf0e10cSrcweir 		setupextension );
349*cdf0e10cSrcweir 
350*cdf0e10cSrcweir     uno::Sequence< rtl::OUString > aImagesZipPaths( 2 );
351*cdf0e10cSrcweir     xHierAccess = getHierAccess( sProvider,	 "org.openoffice.Office.Common" );
352*cdf0e10cSrcweir 
353*cdf0e10cSrcweir     rtl::OUString aPath( getKey( xHierAccess, "Path/Current/UserConfig" ) );
354*cdf0e10cSrcweir     subst( aPath );
355*cdf0e10cSrcweir     aImagesZipPaths[ 0 ] = aPath;
356*cdf0e10cSrcweir 
357*cdf0e10cSrcweir 	aPath = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("$OOO_BASE_DIR/share/config"));
358*cdf0e10cSrcweir 	rtl::Bootstrap::expandMacros(aPath);
359*cdf0e10cSrcweir     aImagesZipPaths[ 1 ] = aPath;
360*cdf0e10cSrcweir 
361*cdf0e10cSrcweir 	uno::Reference< uno::XComponentContext > xContext;
362*cdf0e10cSrcweir 	uno::Reference< beans::XPropertySet > xProps( m_xSMgr, uno::UNO_QUERY );
363*cdf0e10cSrcweir     OSL_ASSERT( xProps.is() );
364*cdf0e10cSrcweir     if (xProps.is())
365*cdf0e10cSrcweir     {
366*cdf0e10cSrcweir         xProps->getPropertyValue(
367*cdf0e10cSrcweir 			::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("DefaultContext") ) ) >>= xContext;
368*cdf0e10cSrcweir         OSL_ASSERT( xContext.is() );
369*cdf0e10cSrcweir     }
370*cdf0e10cSrcweir 
371*cdf0e10cSrcweir     sal_Bool showBasic = getBooleanKey(xHierAccess,"Help/ShowBasic");
372*cdf0e10cSrcweir     m_pDatabases = new Databases( showBasic,
373*cdf0e10cSrcweir 								  instPath,
374*cdf0e10cSrcweir 								  aImagesZipPaths,
375*cdf0e10cSrcweir 								  productname,
376*cdf0e10cSrcweir 								  productversion,
377*cdf0e10cSrcweir 								  stylesheet,
378*cdf0e10cSrcweir 								  xContext );
379*cdf0e10cSrcweir }
380*cdf0e10cSrcweir 
381*cdf0e10cSrcweir uno::Reference< lang::XMultiServiceFactory >
382*cdf0e10cSrcweir ContentProvider::getConfiguration() const
383*cdf0e10cSrcweir {
384*cdf0e10cSrcweir     uno::Reference< lang::XMultiServiceFactory > sProvider;
385*cdf0e10cSrcweir 	if( m_xSMgr.is() )
386*cdf0e10cSrcweir 	{
387*cdf0e10cSrcweir 		try
388*cdf0e10cSrcweir 		{
389*cdf0e10cSrcweir 			rtl::OUString sProviderService =
390*cdf0e10cSrcweir 				rtl::OUString::createFromAscii(
391*cdf0e10cSrcweir 					"com.sun.star.configuration.ConfigurationProvider" );
392*cdf0e10cSrcweir 			sProvider =
393*cdf0e10cSrcweir 				uno::Reference< lang::XMultiServiceFactory >(
394*cdf0e10cSrcweir 					m_xSMgr->createInstance( sProviderService ),
395*cdf0e10cSrcweir 					uno::UNO_QUERY );
396*cdf0e10cSrcweir 		}
397*cdf0e10cSrcweir 		catch( const uno::Exception& )
398*cdf0e10cSrcweir 		{
399*cdf0e10cSrcweir             OSL_ENSURE( sProvider.is(), "cant instantiate configuration" );
400*cdf0e10cSrcweir 		}
401*cdf0e10cSrcweir 	}
402*cdf0e10cSrcweir 
403*cdf0e10cSrcweir 	return sProvider;
404*cdf0e10cSrcweir }
405*cdf0e10cSrcweir 
406*cdf0e10cSrcweir uno::Reference< container::XHierarchicalNameAccess >
407*cdf0e10cSrcweir ContentProvider::getHierAccess(
408*cdf0e10cSrcweir     const uno::Reference< lang::XMultiServiceFactory >& sProvider,
409*cdf0e10cSrcweir     const char* file ) const
410*cdf0e10cSrcweir {
411*cdf0e10cSrcweir 	uno::Reference< container::XHierarchicalNameAccess > xHierAccess;
412*cdf0e10cSrcweir 
413*cdf0e10cSrcweir 	if( sProvider.is() )
414*cdf0e10cSrcweir 	{
415*cdf0e10cSrcweir 		uno::Sequence< uno::Any > seq( 1 );
416*cdf0e10cSrcweir 		rtl::OUString sReaderService(
417*cdf0e10cSrcweir 			rtl::OUString::createFromAscii(
418*cdf0e10cSrcweir                 "com.sun.star.configuration.ConfigurationAccess" ) );
419*cdf0e10cSrcweir 
420*cdf0e10cSrcweir 		seq[ 0 ] <<= rtl::OUString::createFromAscii( file );
421*cdf0e10cSrcweir 
422*cdf0e10cSrcweir 		try
423*cdf0e10cSrcweir 		{
424*cdf0e10cSrcweir 			xHierAccess =
425*cdf0e10cSrcweir 				uno::Reference< container::XHierarchicalNameAccess >(
426*cdf0e10cSrcweir                     sProvider->createInstanceWithArguments(
427*cdf0e10cSrcweir                         sReaderService, seq ),
428*cdf0e10cSrcweir                     uno::UNO_QUERY );
429*cdf0e10cSrcweir 		}
430*cdf0e10cSrcweir 		catch( const uno::Exception& )
431*cdf0e10cSrcweir 		{
432*cdf0e10cSrcweir 		}
433*cdf0e10cSrcweir 	}
434*cdf0e10cSrcweir 	return xHierAccess;
435*cdf0e10cSrcweir }
436*cdf0e10cSrcweir 
437*cdf0e10cSrcweir 
438*cdf0e10cSrcweir 
439*cdf0e10cSrcweir rtl::OUString
440*cdf0e10cSrcweir ContentProvider::getKey(
441*cdf0e10cSrcweir     const uno::Reference< container::XHierarchicalNameAccess >& xHierAccess,
442*cdf0e10cSrcweir     const char* key ) const
443*cdf0e10cSrcweir {
444*cdf0e10cSrcweir     rtl::OUString instPath;
445*cdf0e10cSrcweir 	if( xHierAccess.is() )
446*cdf0e10cSrcweir 	{
447*cdf0e10cSrcweir 		uno::Any aAny;
448*cdf0e10cSrcweir 		try
449*cdf0e10cSrcweir 		{
450*cdf0e10cSrcweir 			aAny =
451*cdf0e10cSrcweir 				xHierAccess->getByHierarchicalName(
452*cdf0e10cSrcweir 					rtl::OUString::createFromAscii( key ) );
453*cdf0e10cSrcweir 		}
454*cdf0e10cSrcweir 		catch( const container::NoSuchElementException& )
455*cdf0e10cSrcweir 		{
456*cdf0e10cSrcweir 		}
457*cdf0e10cSrcweir 		aAny >>= instPath;
458*cdf0e10cSrcweir 	}
459*cdf0e10cSrcweir 	return instPath;
460*cdf0e10cSrcweir }
461*cdf0e10cSrcweir 
462*cdf0e10cSrcweir sal_Bool
463*cdf0e10cSrcweir ContentProvider::getBooleanKey(
464*cdf0e10cSrcweir     const uno::Reference< container::XHierarchicalNameAccess >& xHierAccess,
465*cdf0e10cSrcweir     const char* key ) const
466*cdf0e10cSrcweir {
467*cdf0e10cSrcweir   sal_Bool ret = sal_False;
468*cdf0e10cSrcweir   if( xHierAccess.is() )
469*cdf0e10cSrcweir   {
470*cdf0e10cSrcweir 	  uno::Any aAny;
471*cdf0e10cSrcweir 	  try
472*cdf0e10cSrcweir       {
473*cdf0e10cSrcweir 		  aAny =
474*cdf0e10cSrcweir 			xHierAccess->getByHierarchicalName(
475*cdf0e10cSrcweir                 rtl::OUString::createFromAscii( key ) );
476*cdf0e10cSrcweir       }
477*cdf0e10cSrcweir 	  catch( const container::NoSuchElementException& )
478*cdf0e10cSrcweir       {
479*cdf0e10cSrcweir       }
480*cdf0e10cSrcweir 	  aAny >>= ret;
481*cdf0e10cSrcweir   }
482*cdf0e10cSrcweir   return ret;
483*cdf0e10cSrcweir }
484*cdf0e10cSrcweir 
485*cdf0e10cSrcweir void ContentProvider::subst( rtl::OUString& instpath ) const
486*cdf0e10cSrcweir {
487*cdf0e10cSrcweir 	uno::Reference< frame::XConfigManager > xCfgMgr;
488*cdf0e10cSrcweir 	if( m_xSMgr.is() )
489*cdf0e10cSrcweir 	{
490*cdf0e10cSrcweir 		try
491*cdf0e10cSrcweir 		{
492*cdf0e10cSrcweir 			xCfgMgr =
493*cdf0e10cSrcweir 				uno::Reference< frame::XConfigManager >(
494*cdf0e10cSrcweir 					m_xSMgr->createInstance(
495*cdf0e10cSrcweir                         rtl::OUString::createFromAscii(
496*cdf0e10cSrcweir                             "com.sun.star.config.SpecialConfigManager" ) ),
497*cdf0e10cSrcweir 					uno::UNO_QUERY );
498*cdf0e10cSrcweir 		}
499*cdf0e10cSrcweir 		catch( const uno::Exception&)
500*cdf0e10cSrcweir 		{
501*cdf0e10cSrcweir 			OSL_ENSURE( xCfgMgr.is(),
502*cdf0e10cSrcweir                         "cant instantiate the special config manager " );
503*cdf0e10cSrcweir 		}
504*cdf0e10cSrcweir     }
505*cdf0e10cSrcweir 
506*cdf0e10cSrcweir 	OSL_ENSURE( xCfgMgr.is(), "specialconfigmanager not found\n" );
507*cdf0e10cSrcweir 
508*cdf0e10cSrcweir 	if( xCfgMgr.is() )
509*cdf0e10cSrcweir         instpath = xCfgMgr->substituteVariables( instpath );
510*cdf0e10cSrcweir }
511