xref: /AOO41X/main/xmlhelp/source/treeview/tvread.cxx (revision 89dcb3da00a29b2b7b028d5bd430e2099844a09e)
1*89dcb3daSAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*89dcb3daSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*89dcb3daSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*89dcb3daSAndrew Rist  * distributed with this work for additional information
6*89dcb3daSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*89dcb3daSAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*89dcb3daSAndrew Rist  * "License"); you may not use this file except in compliance
9*89dcb3daSAndrew Rist  * with the License.  You may obtain a copy of the License at
10cdf0e10cSrcweir  *
11*89dcb3daSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
13*89dcb3daSAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*89dcb3daSAndrew Rist  * software distributed under the License is distributed on an
15*89dcb3daSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*89dcb3daSAndrew Rist  * KIND, either express or implied.  See the License for the
17*89dcb3daSAndrew Rist  * specific language governing permissions and limitations
18*89dcb3daSAndrew Rist  * under the License.
19cdf0e10cSrcweir  *
20*89dcb3daSAndrew Rist  *************************************************************/
21*89dcb3daSAndrew Rist 
22*89dcb3daSAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir 
25cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
26cdf0e10cSrcweir #include "precompiled_xmlhelp.hxx"
27cdf0e10cSrcweir 
28cdf0e10cSrcweir #include <string.h>
29cdf0e10cSrcweir #include <rtl/ustrbuf.hxx>
30cdf0e10cSrcweir #ifndef _VOS_DIAGNOSE_HXX_
31cdf0e10cSrcweir #include <vos/diagnose.hxx>
32cdf0e10cSrcweir #endif
33cdf0e10cSrcweir #include "tvread.hxx"
34cdf0e10cSrcweir #include <expat.h>
35cdf0e10cSrcweir #include <osl/file.hxx>
36cdf0e10cSrcweir #include <com/sun/star/frame/XConfigManager.hpp>
37cdf0e10cSrcweir #include <com/sun/star/beans/PropertyValue.hpp>
38cdf0e10cSrcweir 
39cdf0e10cSrcweir #include <comphelper/processfactory.hxx>
40cdf0e10cSrcweir #include <com/sun/star/beans/XPropertySet.hpp>
41cdf0e10cSrcweir #include "com/sun/star/deployment/thePackageManagerFactory.hpp"
42cdf0e10cSrcweir #include <com/sun/star/util/XMacroExpander.hpp>
43cdf0e10cSrcweir #include <com/sun/star/uri/XUriReferenceFactory.hpp>
44cdf0e10cSrcweir #include <com/sun/star/uri/XVndSunStarExpandUrl.hpp>
45cdf0e10cSrcweir #include <comphelper/locale.hxx>
46cdf0e10cSrcweir 
47cdf0e10cSrcweir namespace treeview {
48cdf0e10cSrcweir 
49cdf0e10cSrcweir 
50cdf0e10cSrcweir 	class TVDom
51cdf0e10cSrcweir 	{
52cdf0e10cSrcweir 		friend class TVChildTarget;
53cdf0e10cSrcweir 		friend class TVRead;
54cdf0e10cSrcweir 
55cdf0e10cSrcweir 	public:
56cdf0e10cSrcweir 
TVDom(TVDom * arent=0)57cdf0e10cSrcweir 		TVDom( TVDom* arent = 0 )
58cdf0e10cSrcweir 			: kind( other ),
59cdf0e10cSrcweir               parent( arent ),
60cdf0e10cSrcweir 			  childs( 0 )
61cdf0e10cSrcweir 		{
62cdf0e10cSrcweir 		}
63cdf0e10cSrcweir 
~TVDom()64cdf0e10cSrcweir 		~TVDom()
65cdf0e10cSrcweir 		{
66cdf0e10cSrcweir 			for( unsigned i = 0; i < childs.size(); ++i )
67cdf0e10cSrcweir 				delete childs[i];
68cdf0e10cSrcweir 		}
69cdf0e10cSrcweir 
70cdf0e10cSrcweir 
newChild()71cdf0e10cSrcweir 		TVDom* newChild()
72cdf0e10cSrcweir 		{
73cdf0e10cSrcweir 			childs.push_back( new TVDom( this ) );
74cdf0e10cSrcweir 			return childs.back();
75cdf0e10cSrcweir 		}
76cdf0e10cSrcweir 
77cdf0e10cSrcweir 
getParent() const78cdf0e10cSrcweir 		TVDom* getParent() const
79cdf0e10cSrcweir 		{
80cdf0e10cSrcweir 			if( parent )
81cdf0e10cSrcweir 				return parent;
82cdf0e10cSrcweir 			else
83cdf0e10cSrcweir 				return const_cast<TVDom*>(this);    // I am my own parent, if I am the root
84cdf0e10cSrcweir 		}
85cdf0e10cSrcweir 
86cdf0e10cSrcweir 		enum Kind {
87cdf0e10cSrcweir 			tree_view,
88cdf0e10cSrcweir 			tree_node,
89cdf0e10cSrcweir 			tree_leaf,
90cdf0e10cSrcweir 			other
91cdf0e10cSrcweir 		};
92cdf0e10cSrcweir 
isLeaf() const93cdf0e10cSrcweir 		bool isLeaf() const { return kind == TVDom::tree_leaf; }
setKind(Kind ind)94cdf0e10cSrcweir 		void setKind( Kind ind ) { kind = ind; }
getKind() const95cdf0e10cSrcweir 		Kind getKind( ) const { return kind; }
96cdf0e10cSrcweir 
97cdf0e10cSrcweir 
setApplication(const char * appl)98cdf0e10cSrcweir 		void setApplication( const char* appl )
99cdf0e10cSrcweir 		{
100cdf0e10cSrcweir 			application = rtl::OUString( (sal_Char*)(appl),
101cdf0e10cSrcweir 										 strlen( appl ),
102cdf0e10cSrcweir 										 RTL_TEXTENCODING_UTF8 );
103cdf0e10cSrcweir 		}
104cdf0e10cSrcweir 
setTitle(const char * itle)105cdf0e10cSrcweir 		void setTitle( const char* itle )
106cdf0e10cSrcweir 		{
107cdf0e10cSrcweir 			title += rtl::OUString( (sal_Char*)(itle),
108cdf0e10cSrcweir                                     strlen( itle ),
109cdf0e10cSrcweir                                     RTL_TEXTENCODING_UTF8 );
110cdf0e10cSrcweir 		}
111cdf0e10cSrcweir 
setTitle(const XML_Char * itle,int len)112cdf0e10cSrcweir 		void setTitle( const XML_Char* itle,int len )
113cdf0e10cSrcweir 		{
114cdf0e10cSrcweir 			title += rtl::OUString( (sal_Char*)(itle),
115cdf0e10cSrcweir                                     len,
116cdf0e10cSrcweir                                     RTL_TEXTENCODING_UTF8 );
117cdf0e10cSrcweir 		}
118cdf0e10cSrcweir 
setId(const char * d)119cdf0e10cSrcweir 		void setId( const char* d )
120cdf0e10cSrcweir 		{
121cdf0e10cSrcweir 			id = rtl::OUString( (sal_Char*)(d),
122cdf0e10cSrcweir 								strlen( d ),
123cdf0e10cSrcweir 								RTL_TEXTENCODING_UTF8 );
124cdf0e10cSrcweir 		}
125cdf0e10cSrcweir 
setAnchor(const char * nchor)126cdf0e10cSrcweir 		void setAnchor( const char* nchor )
127cdf0e10cSrcweir 		{
128cdf0e10cSrcweir 			anchor = rtl::OUString( (sal_Char*)(nchor),
129cdf0e10cSrcweir 									strlen( nchor ),
130cdf0e10cSrcweir 									RTL_TEXTENCODING_UTF8 );
131cdf0e10cSrcweir 		}
132cdf0e10cSrcweir 
getTargetURL()133cdf0e10cSrcweir 		rtl::OUString getTargetURL()
134cdf0e10cSrcweir 		{
135cdf0e10cSrcweir 			if( ! targetURL.getLength() )
136cdf0e10cSrcweir 			{
137cdf0e10cSrcweir 				sal_Int32 len;
138cdf0e10cSrcweir                 for ( const TVDom* p = this;; p = p->parent )
139cdf0e10cSrcweir                 {
140cdf0e10cSrcweir                     len = p->application.getLength();
141cdf0e10cSrcweir                     if ( len != 0 )
142cdf0e10cSrcweir                         break;
143cdf0e10cSrcweir                 }
144cdf0e10cSrcweir 
145cdf0e10cSrcweir 				rtl::OUStringBuffer strBuff( 22 + len + id.getLength() );
146cdf0e10cSrcweir 				strBuff.appendAscii(
147cdf0e10cSrcweir 									"vnd.sun.star.help://"
148cdf0e10cSrcweir 									).append(id);
149cdf0e10cSrcweir 
150cdf0e10cSrcweir 				targetURL = strBuff.makeStringAndClear();
151cdf0e10cSrcweir 			}
152cdf0e10cSrcweir 
153cdf0e10cSrcweir 			return targetURL;
154cdf0e10cSrcweir 		}
155cdf0e10cSrcweir 
156cdf0e10cSrcweir 	private:
157cdf0e10cSrcweir 
158cdf0e10cSrcweir 		Kind   kind;
159cdf0e10cSrcweir 		rtl::OUString  application;
160cdf0e10cSrcweir 		rtl::OUString  title;
161cdf0e10cSrcweir 		rtl::OUString  id;
162cdf0e10cSrcweir 		rtl::OUString  anchor;
163cdf0e10cSrcweir 		rtl::OUString  targetURL;
164cdf0e10cSrcweir 
165cdf0e10cSrcweir 		TVDom *parent;
166cdf0e10cSrcweir 		std::vector< TVDom* > childs;
167cdf0e10cSrcweir 	};
168cdf0e10cSrcweir 
169cdf0e10cSrcweir }
170cdf0e10cSrcweir 
171cdf0e10cSrcweir 
172cdf0e10cSrcweir 
173cdf0e10cSrcweir using namespace treeview;
174cdf0e10cSrcweir using namespace com::sun::star;
175cdf0e10cSrcweir using namespace com::sun::star::uno;
176cdf0e10cSrcweir using namespace com::sun::star::beans;
177cdf0e10cSrcweir using namespace com::sun::star::lang;
178cdf0e10cSrcweir using namespace com::sun::star::util;
179cdf0e10cSrcweir using namespace com::sun::star::frame;
180cdf0e10cSrcweir using namespace com::sun::star::container;
181cdf0e10cSrcweir using namespace com::sun::star::deployment;
182cdf0e10cSrcweir 
183cdf0e10cSrcweir 
ConfigData()184cdf0e10cSrcweir ConfigData::ConfigData()
185cdf0e10cSrcweir 	: prodName( rtl::OUString::createFromAscii( "%PRODUCTNAME" ) ),
186cdf0e10cSrcweir 	  prodVersion( rtl::OUString::createFromAscii( "%PRODUCTVERSION" ) ),
187cdf0e10cSrcweir 	  vendName( rtl::OUString::createFromAscii( "%VENDORNAME" ) ),
188cdf0e10cSrcweir 	  vendVersion( rtl::OUString::createFromAscii( "%VENDORVERSION" ) ),
189cdf0e10cSrcweir 	  vendShort( rtl::OUString::createFromAscii( "%VENDORSHORT" ) )
190cdf0e10cSrcweir {
191cdf0e10cSrcweir }
192cdf0e10cSrcweir 
replaceName(rtl::OUString & oustring) const193cdf0e10cSrcweir void SAL_CALL ConfigData::replaceName( rtl::OUString& oustring ) const
194cdf0e10cSrcweir {
195cdf0e10cSrcweir 	sal_Int32 idx = -1,k = 0,off;
196cdf0e10cSrcweir 	bool cap = false;
197cdf0e10cSrcweir 	rtl::OUStringBuffer aStrBuf( 0 );
198cdf0e10cSrcweir 
199cdf0e10cSrcweir 	while( ( idx = oustring.indexOf( sal_Unicode('%'),++idx ) ) != -1 )
200cdf0e10cSrcweir 	{
201cdf0e10cSrcweir 		if( oustring.indexOf( prodName,idx ) == idx )
202cdf0e10cSrcweir 			off = PRODUCTNAME;
203cdf0e10cSrcweir 		else if( oustring.indexOf( prodVersion,idx ) == idx )
204cdf0e10cSrcweir 			off = PRODUCTVERSION;
205cdf0e10cSrcweir 		else if( oustring.indexOf( vendName,idx ) == idx )
206cdf0e10cSrcweir 			off = VENDORNAME;
207cdf0e10cSrcweir 		else if( oustring.indexOf( vendVersion,idx ) == idx )
208cdf0e10cSrcweir 			off = VENDORVERSION;
209cdf0e10cSrcweir 		else if( oustring.indexOf( vendShort,idx ) == idx )
210cdf0e10cSrcweir 			off = VENDORSHORT;
211cdf0e10cSrcweir 		else
212cdf0e10cSrcweir 			off = -1;
213cdf0e10cSrcweir 
214cdf0e10cSrcweir 		if( off != -1 )
215cdf0e10cSrcweir 		{
216cdf0e10cSrcweir 			if( ! cap )
217cdf0e10cSrcweir 			{
218cdf0e10cSrcweir 				cap = true;
219cdf0e10cSrcweir 				aStrBuf.ensureCapacity( 256 );
220cdf0e10cSrcweir 			}
221cdf0e10cSrcweir 
222cdf0e10cSrcweir 			aStrBuf.append( &oustring.getStr()[k],idx - k );
223cdf0e10cSrcweir 			aStrBuf.append( m_vReplacement[off] );
224cdf0e10cSrcweir 			k = idx + m_vAdd[off];
225cdf0e10cSrcweir 		}
226cdf0e10cSrcweir 	}
227cdf0e10cSrcweir 
228cdf0e10cSrcweir 	if( cap )
229cdf0e10cSrcweir 	{
230cdf0e10cSrcweir 		if( k < oustring.getLength() )
231cdf0e10cSrcweir 			aStrBuf.append( &oustring.getStr()[k],oustring.getLength()-k );
232cdf0e10cSrcweir 		oustring = aStrBuf.makeStringAndClear();
233cdf0e10cSrcweir 	}
234cdf0e10cSrcweir }
235cdf0e10cSrcweir 
236cdf0e10cSrcweir 
237cdf0e10cSrcweir 
238cdf0e10cSrcweir 
239cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////
240cdf0e10cSrcweir // XInterface
241cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////
242cdf0e10cSrcweir 
243cdf0e10cSrcweir 
244cdf0e10cSrcweir void SAL_CALL
acquire(void)245cdf0e10cSrcweir TVBase::acquire(
246cdf0e10cSrcweir 	void )
247cdf0e10cSrcweir 	throw()
248cdf0e10cSrcweir {
249cdf0e10cSrcweir   OWeakObject::acquire();
250cdf0e10cSrcweir }
251cdf0e10cSrcweir 
252cdf0e10cSrcweir 
253cdf0e10cSrcweir void SAL_CALL
release(void)254cdf0e10cSrcweir TVBase::release(
255cdf0e10cSrcweir 		      void )
256cdf0e10cSrcweir   throw()
257cdf0e10cSrcweir {
258cdf0e10cSrcweir   OWeakObject::release();
259cdf0e10cSrcweir }
260cdf0e10cSrcweir 
261cdf0e10cSrcweir 
262cdf0e10cSrcweir Any SAL_CALL
queryInterface(const Type & rType)263cdf0e10cSrcweir TVBase::queryInterface(
264cdf0e10cSrcweir 	const Type& rType )
265cdf0e10cSrcweir 	throw( RuntimeException )
266cdf0e10cSrcweir {
267cdf0e10cSrcweir 	Any aRet = cppu::queryInterface( rType,
268cdf0e10cSrcweir 									 SAL_STATIC_CAST( XTypeProvider*, this ),
269cdf0e10cSrcweir 									 SAL_STATIC_CAST( XNameAccess*, this ),
270cdf0e10cSrcweir 									 SAL_STATIC_CAST( XHierarchicalNameAccess*, this ),
271cdf0e10cSrcweir 									 SAL_STATIC_CAST( XChangesNotifier*, this ),
272cdf0e10cSrcweir 									 SAL_STATIC_CAST( XComponent*, this ) );
273cdf0e10cSrcweir 
274cdf0e10cSrcweir 	return aRet.hasValue() ? aRet : OWeakObject::queryInterface( rType );
275cdf0e10cSrcweir }
276cdf0e10cSrcweir 
277cdf0e10cSrcweir 
278cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////////////////
279cdf0e10cSrcweir //
280cdf0e10cSrcweir // XTypeProvider methods.
281cdf0e10cSrcweir 
282cdf0e10cSrcweir XTYPEPROVIDER_IMPL_5( TVBase,
283cdf0e10cSrcweir 				   	  XTypeProvider,
284cdf0e10cSrcweir 					  XNameAccess,
285cdf0e10cSrcweir 					  XHierarchicalNameAccess,
286cdf0e10cSrcweir 					  XChangesNotifier,
287cdf0e10cSrcweir 					  XComponent );
288cdf0e10cSrcweir 
289cdf0e10cSrcweir 
290cdf0e10cSrcweir 
291cdf0e10cSrcweir 
292cdf0e10cSrcweir 
293cdf0e10cSrcweir 
294cdf0e10cSrcweir // TVRead
295cdf0e10cSrcweir 
296cdf0e10cSrcweir 
TVRead(const ConfigData & configData,TVDom * tvDom)297cdf0e10cSrcweir TVRead::TVRead( const ConfigData& configData,TVDom* tvDom )
298cdf0e10cSrcweir {
299cdf0e10cSrcweir 	if( ! tvDom )
300cdf0e10cSrcweir 		return;
301cdf0e10cSrcweir 
302cdf0e10cSrcweir 	Title = tvDom->title;
303cdf0e10cSrcweir 	configData.replaceName( Title );
304cdf0e10cSrcweir 	if( tvDom->isLeaf() )
305cdf0e10cSrcweir 	{
306cdf0e10cSrcweir 		TargetURL = ( tvDom->getTargetURL() + configData.appendix );
307cdf0e10cSrcweir 		if( tvDom->anchor.getLength() )
308cdf0e10cSrcweir 			TargetURL += ( rtl::OUString::createFromAscii( "#" ) +
309cdf0e10cSrcweir 						   tvDom->anchor );
310cdf0e10cSrcweir 	}
311cdf0e10cSrcweir 	else
312cdf0e10cSrcweir 		Children = new TVChildTarget( configData,tvDom );
313cdf0e10cSrcweir }
314cdf0e10cSrcweir 
315cdf0e10cSrcweir 
316cdf0e10cSrcweir 
~TVRead()317cdf0e10cSrcweir TVRead::~TVRead()
318cdf0e10cSrcweir {
319cdf0e10cSrcweir }
320cdf0e10cSrcweir 
321cdf0e10cSrcweir 
322cdf0e10cSrcweir 
323cdf0e10cSrcweir 
324cdf0e10cSrcweir 
325cdf0e10cSrcweir 
326cdf0e10cSrcweir // XNameAccess
327cdf0e10cSrcweir 
328cdf0e10cSrcweir Any SAL_CALL
getByName(const rtl::OUString & aName)329cdf0e10cSrcweir TVRead::getByName( const rtl::OUString& aName )
330cdf0e10cSrcweir 	throw( NoSuchElementException,
331cdf0e10cSrcweir 		   WrappedTargetException,
332cdf0e10cSrcweir 		   RuntimeException )
333cdf0e10cSrcweir {
334cdf0e10cSrcweir 	bool found( true );
335cdf0e10cSrcweir 	Any aAny;
336cdf0e10cSrcweir 	if( aName.compareToAscii( "Title" ) == 0 )
337cdf0e10cSrcweir 		aAny <<= Title;
338cdf0e10cSrcweir 	else if( aName.compareToAscii( "TargetURL" ) == 0 )
339cdf0e10cSrcweir 		aAny <<= TargetURL;
340cdf0e10cSrcweir 	else if( aName.compareToAscii( "Children" ) == 0 )
341cdf0e10cSrcweir 	{
342cdf0e10cSrcweir 		cppu::OWeakObject* p = Children.get();
343cdf0e10cSrcweir 		aAny <<= Reference< XInterface >( p );
344cdf0e10cSrcweir 	}
345cdf0e10cSrcweir 	else
346cdf0e10cSrcweir 		found = false;
347cdf0e10cSrcweir 
348cdf0e10cSrcweir 	if( found )
349cdf0e10cSrcweir 		return aAny;
350cdf0e10cSrcweir 
351cdf0e10cSrcweir 	throw NoSuchElementException();
352cdf0e10cSrcweir }
353cdf0e10cSrcweir 
354cdf0e10cSrcweir 
355cdf0e10cSrcweir 
356cdf0e10cSrcweir 
357cdf0e10cSrcweir Sequence< rtl::OUString > SAL_CALL
getElementNames()358cdf0e10cSrcweir TVRead::getElementNames( )
359cdf0e10cSrcweir 	throw( RuntimeException )
360cdf0e10cSrcweir {
361cdf0e10cSrcweir 	Sequence< rtl::OUString > seq( 3 );
362cdf0e10cSrcweir 
363cdf0e10cSrcweir 	seq[0] = rtl::OUString::createFromAscii( "Title" );
364cdf0e10cSrcweir 	seq[1] = rtl::OUString::createFromAscii( "TargetURL" );
365cdf0e10cSrcweir 	seq[2] = rtl::OUString::createFromAscii( "Children" );
366cdf0e10cSrcweir 
367cdf0e10cSrcweir 	return seq;
368cdf0e10cSrcweir }
369cdf0e10cSrcweir 
370cdf0e10cSrcweir 
371cdf0e10cSrcweir 
372cdf0e10cSrcweir sal_Bool SAL_CALL
hasByName(const rtl::OUString & aName)373cdf0e10cSrcweir TVRead::hasByName( const rtl::OUString& aName )
374cdf0e10cSrcweir 	throw( RuntimeException )
375cdf0e10cSrcweir {
376cdf0e10cSrcweir 	if( aName.compareToAscii( "Title" ) == 0        ||
377cdf0e10cSrcweir 		aName.compareToAscii( "TargetURL" ) == 0    ||
378cdf0e10cSrcweir 		aName.compareToAscii( "Children" ) == 0 )
379cdf0e10cSrcweir 		return true;
380cdf0e10cSrcweir 
381cdf0e10cSrcweir 	return false;
382cdf0e10cSrcweir }
383cdf0e10cSrcweir 
384cdf0e10cSrcweir 
385cdf0e10cSrcweir // XHierarchicalNameAccess
386cdf0e10cSrcweir 
387cdf0e10cSrcweir Any SAL_CALL
getByHierarchicalName(const rtl::OUString & aName)388cdf0e10cSrcweir TVRead::getByHierarchicalName( const rtl::OUString& aName )
389cdf0e10cSrcweir 	throw( NoSuchElementException,
390cdf0e10cSrcweir 		   RuntimeException )
391cdf0e10cSrcweir {
392cdf0e10cSrcweir 	sal_Int32 idx;
393cdf0e10cSrcweir 	rtl::OUString name( aName );
394cdf0e10cSrcweir 
395cdf0e10cSrcweir 	if( ( idx = name.indexOf( sal_Unicode( '/' ) ) ) != -1  &&
396cdf0e10cSrcweir 		name.copy( 0,idx ).compareToAscii( "Children" ) == 0 )
397cdf0e10cSrcweir 		return Children->getByHierarchicalName( name.copy( 1 + idx ) );
398cdf0e10cSrcweir 
399cdf0e10cSrcweir 	return getByName( name );
400cdf0e10cSrcweir }
401cdf0e10cSrcweir 
402cdf0e10cSrcweir 
403cdf0e10cSrcweir 
404cdf0e10cSrcweir 
405cdf0e10cSrcweir sal_Bool SAL_CALL
hasByHierarchicalName(const rtl::OUString & aName)406cdf0e10cSrcweir TVRead::hasByHierarchicalName( const rtl::OUString& aName )
407cdf0e10cSrcweir 	throw( RuntimeException )
408cdf0e10cSrcweir {
409cdf0e10cSrcweir 	sal_Int32 idx;
410cdf0e10cSrcweir 	rtl::OUString name( aName );
411cdf0e10cSrcweir 
412cdf0e10cSrcweir    	if( ( idx = name.indexOf( sal_Unicode( '/' ) ) ) != -1  &&
413cdf0e10cSrcweir 		name.copy( 0,idx ).compareToAscii( "Children" ) == 0 )
414cdf0e10cSrcweir 		return Children->hasByHierarchicalName( name.copy( 1 + idx ) );
415cdf0e10cSrcweir 
416cdf0e10cSrcweir 	return hasByName( name );
417cdf0e10cSrcweir }
418cdf0e10cSrcweir 
419cdf0e10cSrcweir 
420cdf0e10cSrcweir 
421cdf0e10cSrcweir /**************************************************************************/
422cdf0e10cSrcweir /*                                                                        */
423cdf0e10cSrcweir /*                      TVChildTarget                                     */
424cdf0e10cSrcweir /*                                                                        */
425cdf0e10cSrcweir /**************************************************************************/
426cdf0e10cSrcweir 
427cdf0e10cSrcweir 
428cdf0e10cSrcweir 
429cdf0e10cSrcweir 
start_handler(void * userData,const XML_Char * name,const XML_Char ** atts)430cdf0e10cSrcweir extern "C" void start_handler(void *userData,
431cdf0e10cSrcweir 				   const XML_Char *name,
432cdf0e10cSrcweir 				   const XML_Char **atts)
433cdf0e10cSrcweir {
434cdf0e10cSrcweir 	TVDom::Kind kind;
435cdf0e10cSrcweir 
436cdf0e10cSrcweir 	if( strcmp( name,"help_section" ) == 0  ||
437cdf0e10cSrcweir 		strcmp( name,"node" ) == 0 )
438cdf0e10cSrcweir 		kind = TVDom::tree_node;
439cdf0e10cSrcweir 	else if( strcmp( name,"topic" ) == 0 )
440cdf0e10cSrcweir 		kind = TVDom::tree_leaf;
441cdf0e10cSrcweir 	else
442cdf0e10cSrcweir 		return;
443cdf0e10cSrcweir 
444cdf0e10cSrcweir 	TVDom **tvDom = static_cast< TVDom** >( userData );
445cdf0e10cSrcweir 	TVDom  *p;
446cdf0e10cSrcweir 	p = *tvDom;
447cdf0e10cSrcweir 
448cdf0e10cSrcweir 	*tvDom = p->newChild();
449cdf0e10cSrcweir 	p = *tvDom;
450cdf0e10cSrcweir 
451cdf0e10cSrcweir 	p->setKind( kind );
452cdf0e10cSrcweir 	while( *atts )
453cdf0e10cSrcweir 	{
454cdf0e10cSrcweir 		if( strcmp( *atts,"application" ) == 0 )
455cdf0e10cSrcweir 			p->setApplication( *(atts+1) );
456cdf0e10cSrcweir 		else if( strcmp( *atts,"title" ) == 0 )
457cdf0e10cSrcweir 			p->setTitle( *(atts+1) );
458cdf0e10cSrcweir 		else if( strcmp( *atts,"id" ) == 0 )
459cdf0e10cSrcweir 			p->setId( *(atts+1) );
460cdf0e10cSrcweir 		else if( strcmp( *atts,"anchor" ) == 0 )
461cdf0e10cSrcweir 			p->setAnchor( *(atts+1) );
462cdf0e10cSrcweir 
463cdf0e10cSrcweir 		atts+=2;
464cdf0e10cSrcweir 	}
465cdf0e10cSrcweir }
466cdf0e10cSrcweir 
467cdf0e10cSrcweir 
end_handler(void * userData,const XML_Char * name)468cdf0e10cSrcweir extern "C" void end_handler(void *userData,
469cdf0e10cSrcweir 				 const XML_Char *name )
470cdf0e10cSrcweir {
471cdf0e10cSrcweir 	(void)name;
472cdf0e10cSrcweir 
473cdf0e10cSrcweir 	TVDom **tvDom = static_cast< TVDom** >( userData );
474cdf0e10cSrcweir 	*tvDom = (*tvDom)->getParent();
475cdf0e10cSrcweir }
476cdf0e10cSrcweir 
477cdf0e10cSrcweir 
data_handler(void * userData,const XML_Char * s,int len)478cdf0e10cSrcweir extern "C" void data_handler( void *userData,
479cdf0e10cSrcweir 				   const XML_Char *s,
480cdf0e10cSrcweir 				   int len)
481cdf0e10cSrcweir {
482cdf0e10cSrcweir 	TVDom **tvDom = static_cast< TVDom** >( userData );
483cdf0e10cSrcweir 	if( (*tvDom)->isLeaf() )
484cdf0e10cSrcweir 		(*tvDom)->setTitle( s,len );
485cdf0e10cSrcweir }
486cdf0e10cSrcweir 
487cdf0e10cSrcweir 
488cdf0e10cSrcweir 
TVChildTarget(const ConfigData & configData,TVDom * tvDom)489cdf0e10cSrcweir TVChildTarget::TVChildTarget( const ConfigData& configData,TVDom* tvDom )
490cdf0e10cSrcweir {
491cdf0e10cSrcweir 	Elements.resize( tvDom->childs.size() );
492cdf0e10cSrcweir 	for( unsigned i = 0; i < Elements.size(); ++i )
493cdf0e10cSrcweir 		Elements[i] = new TVRead( configData,tvDom->childs[i] );
494cdf0e10cSrcweir }
495cdf0e10cSrcweir 
496cdf0e10cSrcweir 
497cdf0e10cSrcweir 
498cdf0e10cSrcweir 
499cdf0e10cSrcweir 
TVChildTarget(const Reference<XMultiServiceFactory> & xMSF)500cdf0e10cSrcweir TVChildTarget::TVChildTarget( const Reference< XMultiServiceFactory >& xMSF )
501cdf0e10cSrcweir {
502cdf0e10cSrcweir 	ConfigData configData = init( xMSF );
503cdf0e10cSrcweir 
504cdf0e10cSrcweir 	if( ! configData.locale.getLength()  ||
505cdf0e10cSrcweir 		! configData.system.getLength() )
506cdf0e10cSrcweir 		return;
507cdf0e10cSrcweir 
508cdf0e10cSrcweir 	sal_uInt64 	ret,len = 0;
509cdf0e10cSrcweir 	int j = configData.vFileURL.size();
510cdf0e10cSrcweir 
511cdf0e10cSrcweir 	TVDom tvDom;
512cdf0e10cSrcweir 	TVDom* pTVDom = &tvDom;
513cdf0e10cSrcweir 
514cdf0e10cSrcweir 	while( j )
515cdf0e10cSrcweir 	{
516cdf0e10cSrcweir 		len = configData.vFileLen[--j];
517cdf0e10cSrcweir 		char* s = new char[ int(len) ];  // the buffer to hold the installed files
518cdf0e10cSrcweir 		osl::File aFile( configData.vFileURL[j] );
519cdf0e10cSrcweir 		aFile.open( OpenFlag_Read );
520cdf0e10cSrcweir 		aFile.read( s,len,ret );
521cdf0e10cSrcweir 		aFile.close();
522cdf0e10cSrcweir 
523cdf0e10cSrcweir 		XML_Parser parser = XML_ParserCreate( 0 );
524cdf0e10cSrcweir 		XML_SetElementHandler( parser,
525cdf0e10cSrcweir 							   start_handler,
526cdf0e10cSrcweir 							   end_handler );
527cdf0e10cSrcweir 		XML_SetCharacterDataHandler( parser,
528cdf0e10cSrcweir 									 data_handler);
529cdf0e10cSrcweir 		XML_SetUserData( parser,&pTVDom ); // does not return this
530cdf0e10cSrcweir 
531cdf0e10cSrcweir 		int parsed = XML_Parse( parser,s,int( len ),j==0 );
532cdf0e10cSrcweir         (void)parsed;
533cdf0e10cSrcweir 		OSL_ENSURE( parsed, "TVChildTarget::TVChildTarget(): Tree file parsing failed" );
534cdf0e10cSrcweir 
535cdf0e10cSrcweir 		XML_ParserFree( parser );
536cdf0e10cSrcweir 		delete[] s;
537cdf0e10cSrcweir 	}
538cdf0e10cSrcweir 
539cdf0e10cSrcweir 	// now TVDom holds the relevant information
540cdf0e10cSrcweir 
541cdf0e10cSrcweir 	Elements.resize( tvDom.childs.size() );
542cdf0e10cSrcweir 	for( unsigned i = 0; i < Elements.size(); ++i )
543cdf0e10cSrcweir 		Elements[i] = new TVRead( configData,tvDom.childs[i] );
544cdf0e10cSrcweir }
545cdf0e10cSrcweir 
546cdf0e10cSrcweir 
~TVChildTarget()547cdf0e10cSrcweir TVChildTarget::~TVChildTarget()
548cdf0e10cSrcweir {
549cdf0e10cSrcweir }
550cdf0e10cSrcweir 
551cdf0e10cSrcweir 
552cdf0e10cSrcweir 
553cdf0e10cSrcweir Any SAL_CALL
getByName(const rtl::OUString & aName)554cdf0e10cSrcweir TVChildTarget::getByName( const rtl::OUString& aName )
555cdf0e10cSrcweir 	throw( NoSuchElementException,
556cdf0e10cSrcweir 		   WrappedTargetException,
557cdf0e10cSrcweir 		   RuntimeException )
558cdf0e10cSrcweir {
559cdf0e10cSrcweir 	rtl::OUString num( aName.getStr()+2,aName.getLength()-4 );
560cdf0e10cSrcweir 	sal_Int32 idx = num.toInt32() - 1;
561cdf0e10cSrcweir 	if( idx < 0 || Elements.size() <= sal_uInt32( idx ) )
562cdf0e10cSrcweir 		throw NoSuchElementException();
563cdf0e10cSrcweir 
564cdf0e10cSrcweir 	Any aAny;
565cdf0e10cSrcweir 	cppu::OWeakObject* p = Elements[idx].get();
566cdf0e10cSrcweir 	aAny <<= Reference< XInterface >( p );
567cdf0e10cSrcweir 	return aAny;
568cdf0e10cSrcweir }
569cdf0e10cSrcweir 
570cdf0e10cSrcweir 
571cdf0e10cSrcweir 
572cdf0e10cSrcweir 
573cdf0e10cSrcweir Sequence< rtl::OUString > SAL_CALL
getElementNames()574cdf0e10cSrcweir TVChildTarget::getElementNames( )
575cdf0e10cSrcweir 	throw( RuntimeException )
576cdf0e10cSrcweir {
577cdf0e10cSrcweir 	Sequence< rtl::OUString > seq( Elements.size() );
578cdf0e10cSrcweir 	for( unsigned i = 0; i < Elements.size(); ++i )
579cdf0e10cSrcweir 		seq[i] = rtl::OUString::valueOf( sal_Int32( 1+i ) );
580cdf0e10cSrcweir 
581cdf0e10cSrcweir 	return seq;
582cdf0e10cSrcweir }
583cdf0e10cSrcweir 
584cdf0e10cSrcweir 
585cdf0e10cSrcweir 
586cdf0e10cSrcweir sal_Bool SAL_CALL
hasByName(const rtl::OUString & aName)587cdf0e10cSrcweir TVChildTarget::hasByName( const rtl::OUString& aName )
588cdf0e10cSrcweir 	throw( RuntimeException )
589cdf0e10cSrcweir {
590cdf0e10cSrcweir 	rtl::OUString num( aName.getStr()+2,aName.getLength()-4 );
591cdf0e10cSrcweir 	sal_Int32 idx = num.toInt32() - 1;
592cdf0e10cSrcweir 	if( idx < 0 || Elements.size() <= sal_uInt32( idx ) )
593cdf0e10cSrcweir 		return false;
594cdf0e10cSrcweir 
595cdf0e10cSrcweir 	return true;
596cdf0e10cSrcweir }
597cdf0e10cSrcweir 
598cdf0e10cSrcweir 
599cdf0e10cSrcweir 
600cdf0e10cSrcweir // XHierarchicalNameAccess
601cdf0e10cSrcweir 
602cdf0e10cSrcweir Any SAL_CALL
getByHierarchicalName(const rtl::OUString & aName)603cdf0e10cSrcweir TVChildTarget::getByHierarchicalName( const rtl::OUString& aName )
604cdf0e10cSrcweir 	throw( NoSuchElementException,
605cdf0e10cSrcweir 		   RuntimeException )
606cdf0e10cSrcweir {
607cdf0e10cSrcweir 	sal_Int32 idx;
608cdf0e10cSrcweir 	rtl::OUString name( aName );
609cdf0e10cSrcweir 
610cdf0e10cSrcweir 	if( ( idx = name.indexOf( sal_Unicode( '/' ) ) ) != -1 )
611cdf0e10cSrcweir 	{
612cdf0e10cSrcweir 		rtl::OUString num( name.getStr()+2,idx-4 );
613cdf0e10cSrcweir 		sal_Int32 pref = num.toInt32() - 1;
614cdf0e10cSrcweir 
615cdf0e10cSrcweir 		if( pref < 0 || Elements.size() <= sal_uInt32( pref ) )
616cdf0e10cSrcweir 			throw NoSuchElementException();
617cdf0e10cSrcweir 
618cdf0e10cSrcweir 		return Elements[pref]->getByHierarchicalName( name.copy( 1 + idx ) );
619cdf0e10cSrcweir 	}
620cdf0e10cSrcweir 	else
621cdf0e10cSrcweir 		return getByName( name );
622cdf0e10cSrcweir }
623cdf0e10cSrcweir 
624cdf0e10cSrcweir 
625cdf0e10cSrcweir 
626cdf0e10cSrcweir sal_Bool SAL_CALL
hasByHierarchicalName(const rtl::OUString & aName)627cdf0e10cSrcweir TVChildTarget::hasByHierarchicalName( const rtl::OUString& aName )
628cdf0e10cSrcweir 	throw( RuntimeException )
629cdf0e10cSrcweir {
630cdf0e10cSrcweir 	sal_Int32 idx;
631cdf0e10cSrcweir 	rtl::OUString name( aName );
632cdf0e10cSrcweir 
633cdf0e10cSrcweir    	if( ( idx = name.indexOf( sal_Unicode( '/' ) ) ) != -1 )
634cdf0e10cSrcweir 	{
635cdf0e10cSrcweir 		rtl::OUString num( name.getStr()+2,idx-4 );
636cdf0e10cSrcweir 		sal_Int32 pref = num.toInt32() - 1;
637cdf0e10cSrcweir 		if( pref < 0 || Elements.size() <= sal_uInt32( pref ) )
638cdf0e10cSrcweir 			return false;
639cdf0e10cSrcweir 
640cdf0e10cSrcweir 		return Elements[pref]->hasByHierarchicalName( name.copy( 1 + idx ) );
641cdf0e10cSrcweir 	}
642cdf0e10cSrcweir 	else
643cdf0e10cSrcweir 		return hasByName( name );
644cdf0e10cSrcweir }
645cdf0e10cSrcweir 
646cdf0e10cSrcweir 
647cdf0e10cSrcweir 
648cdf0e10cSrcweir 
649cdf0e10cSrcweir 
650cdf0e10cSrcweir 
init(const Reference<XMultiServiceFactory> & xSMgr)651cdf0e10cSrcweir ConfigData TVChildTarget::init( const Reference< XMultiServiceFactory >& xSMgr )
652cdf0e10cSrcweir {
653cdf0e10cSrcweir 	ConfigData configData;
654cdf0e10cSrcweir 	Reference< XMultiServiceFactory >  sProvider( getConfiguration(xSMgr) );
655cdf0e10cSrcweir 
656cdf0e10cSrcweir 	/**********************************************************************/
657cdf0e10cSrcweir 	/*                       reading Office.Common                        */
658cdf0e10cSrcweir 	/**********************************************************************/
659cdf0e10cSrcweir 
660cdf0e10cSrcweir 	Reference< XHierarchicalNameAccess > xHierAccess( getHierAccess( sProvider,
661cdf0e10cSrcweir 																	 "org.openoffice.Office.Common" ) );
662cdf0e10cSrcweir 	rtl::OUString system( getKey( xHierAccess,"Help/System" ) );
663cdf0e10cSrcweir 	sal_Bool showBasic( getBooleanKey(xHierAccess,"Help/ShowBasic") );
664cdf0e10cSrcweir 	rtl::OUString instPath( getKey( xHierAccess,"Path/Current/Help" ) );
665cdf0e10cSrcweir 	if( ! instPath.getLength() )
666cdf0e10cSrcweir 	  // try to determine path from default
667cdf0e10cSrcweir 	  instPath = rtl::OUString::createFromAscii( "$(instpath)/help" );
668cdf0e10cSrcweir 
669cdf0e10cSrcweir 	// replace anything like $(instpath);
670cdf0e10cSrcweir 	subst( xSMgr,instPath );
671cdf0e10cSrcweir 
672cdf0e10cSrcweir 	/**********************************************************************/
673cdf0e10cSrcweir 	/*                       reading setup                                */
674cdf0e10cSrcweir 	/**********************************************************************/
675cdf0e10cSrcweir 
676cdf0e10cSrcweir 	xHierAccess = getHierAccess( sProvider,
677cdf0e10cSrcweir 								 "org.openoffice.Setup" );
678cdf0e10cSrcweir 
679cdf0e10cSrcweir 	rtl::OUString productName( getKey(  xHierAccess,"Product/ooName" ) );
680cdf0e10cSrcweir     rtl::OUString setupversion( getKey( xHierAccess,"Product/ooSetupVersion" ) );
681cdf0e10cSrcweir     rtl::OUString setupextension;
682cdf0e10cSrcweir 
683cdf0e10cSrcweir     try
684cdf0e10cSrcweir     {
685cdf0e10cSrcweir         uno::Reference< lang::XMultiServiceFactory > xConfigProvider(
686cdf0e10cSrcweir 	          xSMgr ->createInstance(::rtl::OUString::createFromAscii("com.sun.star.configuration.ConfigurationProvider")), uno::UNO_QUERY_THROW);
687cdf0e10cSrcweir 
688cdf0e10cSrcweir         uno::Sequence < uno::Any > lParams(1);
689cdf0e10cSrcweir         beans::PropertyValue                       aParam ;
690cdf0e10cSrcweir         aParam.Name    = ::rtl::OUString::createFromAscii("nodepath");
691cdf0e10cSrcweir         aParam.Value <<= ::rtl::OUString::createFromAscii("/org.openoffice.Setup/Product");
692cdf0e10cSrcweir         lParams[0] = uno::makeAny(aParam);
693cdf0e10cSrcweir 
694cdf0e10cSrcweir         // open it
695cdf0e10cSrcweir         uno::Reference< uno::XInterface > xCFG( xConfigProvider->createInstanceWithArguments(
696cdf0e10cSrcweir                     ::rtl::OUString::createFromAscii("com.sun.star.configuration.ConfigurationAccess"),
697cdf0e10cSrcweir                     lParams) );
698cdf0e10cSrcweir 
699cdf0e10cSrcweir         uno::Reference< container::XNameAccess > xDirectAccess(xCFG, uno::UNO_QUERY);
700cdf0e10cSrcweir         uno::Any aRet = xDirectAccess->getByName(::rtl::OUString::createFromAscii("ooSetupExtension"));
701cdf0e10cSrcweir 
702cdf0e10cSrcweir         aRet >>= setupextension;
703cdf0e10cSrcweir     }
704cdf0e10cSrcweir     catch ( uno::Exception& )
705cdf0e10cSrcweir     {
706cdf0e10cSrcweir     }
707cdf0e10cSrcweir 
708cdf0e10cSrcweir 	rtl::OUString productVersion( setupversion +
709cdf0e10cSrcweir 								  rtl::OUString::createFromAscii( " " ) +
710cdf0e10cSrcweir 								  setupextension );
711cdf0e10cSrcweir 	rtl::OUString locale( getKey( xHierAccess,"L10N/ooLocale" ) );
712cdf0e10cSrcweir 
713cdf0e10cSrcweir 
714cdf0e10cSrcweir 	// Determine fileurl from url and locale
715cdf0e10cSrcweir 	rtl::OUString url;
716cdf0e10cSrcweir 	osl::FileBase::RC errFile = osl::FileBase::getFileURLFromSystemPath( instPath,url );
717cdf0e10cSrcweir 	if( errFile != osl::FileBase::E_None ) return configData;
718cdf0e10cSrcweir 	if( url.lastIndexOf( sal_Unicode( '/' ) ) != url.getLength() - 1 )
719cdf0e10cSrcweir 		url += rtl::OUString::createFromAscii( "/" );
720cdf0e10cSrcweir 	rtl::OUString ret;
721cdf0e10cSrcweir 	sal_Int32 idx;
722cdf0e10cSrcweir 	osl::DirectoryItem aDirItem;
723cdf0e10cSrcweir 	if( osl::FileBase::E_None == osl::DirectoryItem::get( url + locale,aDirItem ) )
724cdf0e10cSrcweir 		ret = locale;
725cdf0e10cSrcweir 	else if( ( ( idx = locale.indexOf( '-' ) ) != -1 ||
726cdf0e10cSrcweir 			   ( idx = locale.indexOf( '_' ) ) != -1 ) &&
727cdf0e10cSrcweir 			 osl::FileBase::E_None == osl::DirectoryItem::get( url + locale.copy( 0,idx ),
728cdf0e10cSrcweir 															   aDirItem ) )
729cdf0e10cSrcweir 		ret = locale.copy( 0,idx );
730cdf0e10cSrcweir     else
731cdf0e10cSrcweir         {
732cdf0e10cSrcweir         locale = rtl::OUString::createFromAscii( "en-US" );
733cdf0e10cSrcweir         ret = rtl::OUString::createFromAscii("en");
734cdf0e10cSrcweir         }
735cdf0e10cSrcweir 	url = url + ret;
736cdf0e10cSrcweir 
737cdf0e10cSrcweir 	// first of all, try do determine whether there are any *.tree files present
738cdf0e10cSrcweir 
739cdf0e10cSrcweir 	// Start with extensions to set them at the end of the list
740cdf0e10cSrcweir 	TreeFileIterator aTreeIt( locale );
741cdf0e10cSrcweir 	rtl::OUString aTreeFile;
742cdf0e10cSrcweir 	sal_Int32 nFileSize;
743cdf0e10cSrcweir 	while( (aTreeFile = aTreeIt.nextTreeFile( nFileSize ) ).getLength() > 0 )
744cdf0e10cSrcweir 	{
745cdf0e10cSrcweir 		configData.vFileLen.push_back( nFileSize );
746cdf0e10cSrcweir 		configData.vFileURL.push_back( aTreeFile );
747cdf0e10cSrcweir 	}
748cdf0e10cSrcweir 
749cdf0e10cSrcweir 	osl::Directory aDirectory( url );
750cdf0e10cSrcweir 	osl::FileStatus aFileStatus( FileStatusMask_FileName | FileStatusMask_FileSize | FileStatusMask_FileURL );
751cdf0e10cSrcweir 	if( osl::Directory::E_None == aDirectory.open() )
752cdf0e10cSrcweir 	{
753cdf0e10cSrcweir 		int idx_ = 0;
754cdf0e10cSrcweir 		rtl::OUString aFileUrl, aFileName;
755cdf0e10cSrcweir 		while( aDirectory.getNextItem( aDirItem ) == osl::FileBase::E_None &&
756cdf0e10cSrcweir 			   aDirItem.getFileStatus( aFileStatus ) == osl::FileBase::E_None &&
757cdf0e10cSrcweir 			   aFileStatus.isValid( FileStatusMask_FileURL ) &&
758cdf0e10cSrcweir 			   aFileStatus.isValid( FileStatusMask_FileName ) )
759cdf0e10cSrcweir 		  {
760cdf0e10cSrcweir 			aFileUrl = aFileStatus.getFileURL();
761cdf0e10cSrcweir 			aFileName = aFileStatus.getFileName();
762cdf0e10cSrcweir 			idx_ = aFileName.lastIndexOf( sal_Unicode( '.' ) );
763cdf0e10cSrcweir 			if( idx_ == -1 )
764cdf0e10cSrcweir 			  continue;
765cdf0e10cSrcweir 
766cdf0e10cSrcweir 			const sal_Unicode* str = aFileName.getStr();
767cdf0e10cSrcweir 
768cdf0e10cSrcweir 			if( aFileName.getLength() == idx_ + 5                   &&
769cdf0e10cSrcweir 				( str[idx_ + 1] == 't' || str[idx_ + 1] == 'T' )    &&
770cdf0e10cSrcweir 				( str[idx_ + 2] == 'r' || str[idx_ + 2] == 'R' )    &&
771cdf0e10cSrcweir 				( str[idx_ + 3] == 'e' || str[idx_ + 3] == 'E' )    &&
772cdf0e10cSrcweir 				( str[idx_ + 4] == 'e' || str[idx_ + 4] == 'E' ) )
773cdf0e10cSrcweir 			  {
774cdf0e10cSrcweir 				OSL_ENSURE( aFileStatus.isValid( FileStatusMask_FileSize ),
775cdf0e10cSrcweir                             "invalid file size" );
776cdf0e10cSrcweir 
777cdf0e10cSrcweir 				rtl::OUString baseName = aFileName.copy(0,idx_).toAsciiLowerCase();
778cdf0e10cSrcweir 				if(! showBasic && baseName.compareToAscii("sbasic") == 0 )
779cdf0e10cSrcweir 				  continue;
780cdf0e10cSrcweir 
781cdf0e10cSrcweir 				configData.vFileLen.push_back( aFileStatus.getFileSize() );
782cdf0e10cSrcweir 				configData.vFileURL.push_back( aFileUrl );
783cdf0e10cSrcweir 			  }
784cdf0e10cSrcweir 		  }
785cdf0e10cSrcweir 		aDirectory.close();
786cdf0e10cSrcweir 	}
787cdf0e10cSrcweir 
788cdf0e10cSrcweir 	configData.m_vAdd[0] = 12;
789cdf0e10cSrcweir 	configData.m_vAdd[1] = 15;
790cdf0e10cSrcweir 	configData.m_vAdd[2] = 11;
791cdf0e10cSrcweir 	configData.m_vAdd[3] = 14;
792cdf0e10cSrcweir 	configData.m_vAdd[4] = 12;
793cdf0e10cSrcweir 	configData.m_vReplacement[0] = productName;
794cdf0e10cSrcweir 	configData.m_vReplacement[1] = productVersion;
795cdf0e10cSrcweir 	// m_vReplacement[2...4] (vendorName/-Version/-Short) are empty strings
796cdf0e10cSrcweir 
797cdf0e10cSrcweir    	configData.system = system;
798cdf0e10cSrcweir 	configData.locale = locale;
799cdf0e10cSrcweir 	configData.appendix =
800cdf0e10cSrcweir 		rtl::OUString::createFromAscii( "?Language=" ) +
801cdf0e10cSrcweir 		configData.locale +
802cdf0e10cSrcweir 		rtl::OUString::createFromAscii( "&System=" ) +
803cdf0e10cSrcweir 		configData.system +
804cdf0e10cSrcweir         rtl::OUString::createFromAscii( "&UseDB=no" ) ;
805cdf0e10cSrcweir 
806cdf0e10cSrcweir 	return configData;
807cdf0e10cSrcweir }
808cdf0e10cSrcweir 
809cdf0e10cSrcweir 
810cdf0e10cSrcweir 
811cdf0e10cSrcweir 
812cdf0e10cSrcweir 
813cdf0e10cSrcweir 
814cdf0e10cSrcweir 
815cdf0e10cSrcweir 
816cdf0e10cSrcweir 
817cdf0e10cSrcweir Reference< XMultiServiceFactory >
getConfiguration(const Reference<XMultiServiceFactory> & m_xSMgr) const818cdf0e10cSrcweir TVChildTarget::getConfiguration(const Reference< XMultiServiceFactory >& m_xSMgr) const
819cdf0e10cSrcweir {
820cdf0e10cSrcweir 	Reference< XMultiServiceFactory > sProvider;
821cdf0e10cSrcweir 	if( m_xSMgr.is() )
822cdf0e10cSrcweir 	{
823cdf0e10cSrcweir 		try
824cdf0e10cSrcweir 		{
825cdf0e10cSrcweir 			rtl::OUString sProviderService =
826cdf0e10cSrcweir 				rtl::OUString::createFromAscii( "com.sun.star.configuration.ConfigurationProvider" );
827cdf0e10cSrcweir 			sProvider =
828cdf0e10cSrcweir 				Reference< XMultiServiceFactory >(
829cdf0e10cSrcweir 					m_xSMgr->createInstance( sProviderService ),
830cdf0e10cSrcweir 					UNO_QUERY );
831cdf0e10cSrcweir 		}
832cdf0e10cSrcweir 		catch( const com::sun::star::uno::Exception& )
833cdf0e10cSrcweir 		{
834cdf0e10cSrcweir 			OSL_ENSURE( sProvider.is(),"cant instantiate configuration" );
835cdf0e10cSrcweir 		}
836cdf0e10cSrcweir 	}
837cdf0e10cSrcweir 
838cdf0e10cSrcweir 	return sProvider;
839cdf0e10cSrcweir }
840cdf0e10cSrcweir 
841cdf0e10cSrcweir 
842cdf0e10cSrcweir 
843cdf0e10cSrcweir Reference< XHierarchicalNameAccess >
getHierAccess(const Reference<XMultiServiceFactory> & sProvider,const char * file) const844cdf0e10cSrcweir TVChildTarget::getHierAccess( const Reference< XMultiServiceFactory >& sProvider,
845cdf0e10cSrcweir 							  const char* file ) const
846cdf0e10cSrcweir {
847cdf0e10cSrcweir 	Reference< XHierarchicalNameAccess > xHierAccess;
848cdf0e10cSrcweir 
849cdf0e10cSrcweir 	if( sProvider.is() )
850cdf0e10cSrcweir 	{
851cdf0e10cSrcweir 		Sequence< Any > seq(1);
852cdf0e10cSrcweir 		rtl::OUString sReaderService =
853cdf0e10cSrcweir 			rtl::OUString::createFromAscii( "com.sun.star.configuration.ConfigurationAccess" );
854cdf0e10cSrcweir 
855cdf0e10cSrcweir 		seq[0] <<= rtl::OUString::createFromAscii( file );
856cdf0e10cSrcweir 
857cdf0e10cSrcweir 		try
858cdf0e10cSrcweir 		{
859cdf0e10cSrcweir 			xHierAccess =
860cdf0e10cSrcweir 				Reference< XHierarchicalNameAccess >
861cdf0e10cSrcweir 				( sProvider->createInstanceWithArguments( sReaderService,seq ),
862cdf0e10cSrcweir 				  UNO_QUERY );
863cdf0e10cSrcweir 		}
864cdf0e10cSrcweir 		catch( const com::sun::star::uno::Exception& )
865cdf0e10cSrcweir 		{
866cdf0e10cSrcweir 		}
867cdf0e10cSrcweir 	}
868cdf0e10cSrcweir 
869cdf0e10cSrcweir 	return xHierAccess;
870cdf0e10cSrcweir }
871cdf0e10cSrcweir 
872cdf0e10cSrcweir 
873cdf0e10cSrcweir 
874cdf0e10cSrcweir rtl::OUString
getKey(const Reference<XHierarchicalNameAccess> & xHierAccess,const char * key) const875cdf0e10cSrcweir TVChildTarget::getKey( const Reference< XHierarchicalNameAccess >& xHierAccess,
876cdf0e10cSrcweir 					   const char* key ) const
877cdf0e10cSrcweir {
878cdf0e10cSrcweir     rtl::OUString instPath;
879cdf0e10cSrcweir 	if( xHierAccess.is() )
880cdf0e10cSrcweir 	{
881cdf0e10cSrcweir 		Any aAny;
882cdf0e10cSrcweir 		try
883cdf0e10cSrcweir 		{
884cdf0e10cSrcweir 			aAny =
885cdf0e10cSrcweir 				xHierAccess->getByHierarchicalName( rtl::OUString::createFromAscii( key ) );
886cdf0e10cSrcweir 		}
887cdf0e10cSrcweir 		catch( const com::sun::star::container::NoSuchElementException& )
888cdf0e10cSrcweir 		{
889cdf0e10cSrcweir 		}
890cdf0e10cSrcweir 		aAny >>= instPath;
891cdf0e10cSrcweir 	}
892cdf0e10cSrcweir 	return instPath;
893cdf0e10cSrcweir }
894cdf0e10cSrcweir 
895cdf0e10cSrcweir 
896cdf0e10cSrcweir sal_Bool
getBooleanKey(const Reference<XHierarchicalNameAccess> & xHierAccess,const char * key) const897cdf0e10cSrcweir TVChildTarget::getBooleanKey(const Reference<
898cdf0e10cSrcweir 							 XHierarchicalNameAccess >& xHierAccess,
899cdf0e10cSrcweir 							 const char* key) const
900cdf0e10cSrcweir {
901cdf0e10cSrcweir   sal_Bool ret = sal_False;
902cdf0e10cSrcweir   if( xHierAccess.is() )
903cdf0e10cSrcweir 	{
904cdf0e10cSrcweir 	  Any aAny;
905cdf0e10cSrcweir 	  try
906cdf0e10cSrcweir 		{
907cdf0e10cSrcweir 		  aAny =
908cdf0e10cSrcweir 			xHierAccess->getByHierarchicalName(
909cdf0e10cSrcweir 											   rtl::OUString::createFromAscii(key));
910cdf0e10cSrcweir 		}
911cdf0e10cSrcweir 	  catch( const com::sun::star::container::NoSuchElementException& )
912cdf0e10cSrcweir 		{
913cdf0e10cSrcweir 		}
914cdf0e10cSrcweir 	  aAny >>= ret;
915cdf0e10cSrcweir 	}
916cdf0e10cSrcweir   return ret;
917cdf0e10cSrcweir }
918cdf0e10cSrcweir 
919cdf0e10cSrcweir 
subst(const Reference<XMultiServiceFactory> & m_xSMgr,rtl::OUString & instpath) const920cdf0e10cSrcweir void TVChildTarget::subst( const Reference< XMultiServiceFactory >& m_xSMgr,
921cdf0e10cSrcweir 						   rtl::OUString& instpath ) const
922cdf0e10cSrcweir {
923cdf0e10cSrcweir 	Reference< XConfigManager >  xCfgMgr;
924cdf0e10cSrcweir 	if( m_xSMgr.is() )
925cdf0e10cSrcweir 	{
926cdf0e10cSrcweir 		try
927cdf0e10cSrcweir 		{
928cdf0e10cSrcweir 			xCfgMgr =
929cdf0e10cSrcweir 				Reference< XConfigManager >(
930cdf0e10cSrcweir 					m_xSMgr->createInstance( rtl::OUString::createFromAscii( "com.sun.star.config.SpecialConfigManager" ) ),
931cdf0e10cSrcweir 					UNO_QUERY );
932cdf0e10cSrcweir 		}
933cdf0e10cSrcweir 		catch( const com::sun::star::uno::Exception& )
934cdf0e10cSrcweir 		{
935cdf0e10cSrcweir 			OSL_ENSURE( xCfgMgr.is()," cant instantiate the special config manager " );
936cdf0e10cSrcweir 		}
937cdf0e10cSrcweir     }
938cdf0e10cSrcweir 
939cdf0e10cSrcweir 	OSL_ENSURE( xCfgMgr.is(), "specialconfigmanager not found\n" );
940cdf0e10cSrcweir 
941cdf0e10cSrcweir 	if( xCfgMgr.is() )
942cdf0e10cSrcweir         instpath = xCfgMgr->substituteVariables( instpath );
943cdf0e10cSrcweir }
944cdf0e10cSrcweir 
945cdf0e10cSrcweir 
946cdf0e10cSrcweir //===================================================================
947cdf0e10cSrcweir // class ExtensionIteratorBase
948cdf0e10cSrcweir 
949cdf0e10cSrcweir static rtl::OUString aSlash( rtl::OUString::createFromAscii( "/" ) );
950cdf0e10cSrcweir static rtl::OUString aHelpFilesBaseName( rtl::OUString::createFromAscii( "help" ) );
951cdf0e10cSrcweir static rtl::OUString aHelpMediaType( rtl::OUString::createFromAscii( "application/vnd.sun.star.help" ) );
952cdf0e10cSrcweir 
ExtensionIteratorBase(const rtl::OUString & aLanguage)953cdf0e10cSrcweir ExtensionIteratorBase::ExtensionIteratorBase( const rtl::OUString& aLanguage )
954cdf0e10cSrcweir 		: m_eState( USER_EXTENSIONS )
955cdf0e10cSrcweir 		, m_aLanguage( aLanguage )
956cdf0e10cSrcweir {
957cdf0e10cSrcweir 	init();
958cdf0e10cSrcweir }
959cdf0e10cSrcweir 
init()960cdf0e10cSrcweir void ExtensionIteratorBase::init()
961cdf0e10cSrcweir {
962cdf0e10cSrcweir 	Reference< XMultiServiceFactory > xFactory = comphelper::getProcessServiceFactory();
963cdf0e10cSrcweir 	Reference< XPropertySet > xProps( xFactory, UNO_QUERY );
964cdf0e10cSrcweir 	OSL_ASSERT( xProps.is() );
965cdf0e10cSrcweir 	if (xProps.is())
966cdf0e10cSrcweir 	{
967cdf0e10cSrcweir 		xProps->getPropertyValue(
968cdf0e10cSrcweir 			::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("DefaultContext") ) ) >>= m_xContext;
969cdf0e10cSrcweir 		OSL_ASSERT( m_xContext.is() );
970cdf0e10cSrcweir 	}
971cdf0e10cSrcweir 	if( !m_xContext.is() )
972cdf0e10cSrcweir 	{
973cdf0e10cSrcweir 		throw RuntimeException(
974cdf0e10cSrcweir 			::rtl::OUString::createFromAscii( "ExtensionIteratorBase::init(), no XComponentContext" ),
975cdf0e10cSrcweir 			Reference< XInterface >() );
976cdf0e10cSrcweir 	}
977cdf0e10cSrcweir 
978cdf0e10cSrcweir 	Reference< XMultiComponentFactory > xSMgr( m_xContext->getServiceManager(), UNO_QUERY );
979cdf0e10cSrcweir 	m_xSFA = Reference< ucb::XSimpleFileAccess >(
980cdf0e10cSrcweir 		xSMgr->createInstanceWithContext( rtl::OUString::createFromAscii( "com.sun.star.ucb.SimpleFileAccess" ),
981cdf0e10cSrcweir 		m_xContext ), UNO_QUERY_THROW );
982cdf0e10cSrcweir 
983cdf0e10cSrcweir 	m_bUserPackagesLoaded = false;
984cdf0e10cSrcweir 	m_bSharedPackagesLoaded = false;
985cdf0e10cSrcweir     m_bBundledPackagesLoaded = false;
986cdf0e10cSrcweir 	m_iUserPackage = 0;
987cdf0e10cSrcweir 	m_iSharedPackage = 0;
988cdf0e10cSrcweir     m_iBundledPackage = 0;
989cdf0e10cSrcweir }
990cdf0e10cSrcweir 
implGetHelpPackageFromPackage(Reference<deployment::XPackage> xPackage,Reference<deployment::XPackage> & o_xParentPackageBundle)991cdf0e10cSrcweir Reference< deployment::XPackage > ExtensionIteratorBase::implGetHelpPackageFromPackage
992cdf0e10cSrcweir 	( Reference< deployment::XPackage > xPackage, Reference< deployment::XPackage >& o_xParentPackageBundle )
993cdf0e10cSrcweir {
994cdf0e10cSrcweir 	o_xParentPackageBundle.clear();
995cdf0e10cSrcweir 
996cdf0e10cSrcweir 	Reference< deployment::XPackage > xHelpPackage;
997cdf0e10cSrcweir 	if( !xPackage.is() )
998cdf0e10cSrcweir 		return xHelpPackage;
999cdf0e10cSrcweir 
1000cdf0e10cSrcweir 	// Check if parent package is registered
1001cdf0e10cSrcweir     beans::Optional< beans::Ambiguous<sal_Bool> > option( xPackage->isRegistered
1002cdf0e10cSrcweir 		( Reference<task::XAbortChannel>(), Reference<ucb::XCommandEnvironment>() ) );
1003cdf0e10cSrcweir 	bool bRegistered = false;
1004cdf0e10cSrcweir     if( option.IsPresent )
1005cdf0e10cSrcweir     {
1006cdf0e10cSrcweir         beans::Ambiguous<sal_Bool> const & reg = option.Value;
1007cdf0e10cSrcweir         if( !reg.IsAmbiguous && reg.Value )
1008cdf0e10cSrcweir 			bRegistered = true;
1009cdf0e10cSrcweir     }
1010cdf0e10cSrcweir 	if( !bRegistered )
1011cdf0e10cSrcweir 		return xHelpPackage;
1012cdf0e10cSrcweir 
1013cdf0e10cSrcweir 	if( xPackage->isBundle() )
1014cdf0e10cSrcweir 	{
1015cdf0e10cSrcweir 		Sequence< Reference< deployment::XPackage > > aPkgSeq = xPackage->getBundle
1016cdf0e10cSrcweir 			( Reference<task::XAbortChannel>(), Reference<ucb::XCommandEnvironment>() );
1017cdf0e10cSrcweir 		sal_Int32 nPkgCount = aPkgSeq.getLength();
1018cdf0e10cSrcweir 		const Reference< deployment::XPackage >* pSeq = aPkgSeq.getConstArray();
1019cdf0e10cSrcweir 		for( sal_Int32 iPkg = 0 ; iPkg < nPkgCount ; ++iPkg )
1020cdf0e10cSrcweir 		{
1021cdf0e10cSrcweir 			const Reference< deployment::XPackage > xSubPkg = pSeq[ iPkg ];
1022cdf0e10cSrcweir 			const Reference< deployment::XPackageTypeInfo > xPackageTypeInfo = xSubPkg->getPackageType();
1023cdf0e10cSrcweir 			rtl::OUString aMediaType = xPackageTypeInfo->getMediaType();
1024cdf0e10cSrcweir 			if( aMediaType.equals( aHelpMediaType ) )
1025cdf0e10cSrcweir 			{
1026cdf0e10cSrcweir 				xHelpPackage = xSubPkg;
1027cdf0e10cSrcweir 				o_xParentPackageBundle = xPackage;
1028cdf0e10cSrcweir 				break;
1029cdf0e10cSrcweir 			}
1030cdf0e10cSrcweir 		}
1031cdf0e10cSrcweir 	}
1032cdf0e10cSrcweir 	else
1033cdf0e10cSrcweir 	{
1034cdf0e10cSrcweir 		const Reference< deployment::XPackageTypeInfo > xPackageTypeInfo = xPackage->getPackageType();
1035cdf0e10cSrcweir 		rtl::OUString aMediaType = xPackageTypeInfo->getMediaType();
1036cdf0e10cSrcweir 		if( aMediaType.equals( aHelpMediaType ) )
1037cdf0e10cSrcweir 			xHelpPackage = xPackage;
1038cdf0e10cSrcweir 	}
1039cdf0e10cSrcweir 
1040cdf0e10cSrcweir 	return xHelpPackage;
1041cdf0e10cSrcweir }
1042cdf0e10cSrcweir 
implGetNextUserHelpPackage(Reference<deployment::XPackage> & o_xParentPackageBundle)1043cdf0e10cSrcweir Reference< deployment::XPackage > ExtensionIteratorBase::implGetNextUserHelpPackage
1044cdf0e10cSrcweir 	( Reference< deployment::XPackage >& o_xParentPackageBundle )
1045cdf0e10cSrcweir {
1046cdf0e10cSrcweir 	Reference< deployment::XPackage > xHelpPackage;
1047cdf0e10cSrcweir 
1048cdf0e10cSrcweir 	if( !m_bUserPackagesLoaded )
1049cdf0e10cSrcweir 	{
1050cdf0e10cSrcweir 		Reference< XPackageManager > xUserManager =
1051cdf0e10cSrcweir 			thePackageManagerFactory::get( m_xContext )->getPackageManager( rtl::OUString::createFromAscii("user") );
1052cdf0e10cSrcweir 		m_aUserPackagesSeq = xUserManager->getDeployedPackages
1053cdf0e10cSrcweir 			( Reference< task::XAbortChannel >(), Reference< ucb::XCommandEnvironment >() );
1054cdf0e10cSrcweir 
1055cdf0e10cSrcweir 		m_bUserPackagesLoaded = true;
1056cdf0e10cSrcweir 	}
1057cdf0e10cSrcweir 
1058cdf0e10cSrcweir 	if( m_iUserPackage == m_aUserPackagesSeq.getLength() )
1059cdf0e10cSrcweir 	{
1060cdf0e10cSrcweir 		m_eState = SHARED_EXTENSIONS;		// Later: SHARED_MODULE
1061cdf0e10cSrcweir 	}
1062cdf0e10cSrcweir 	else
1063cdf0e10cSrcweir 	{
1064cdf0e10cSrcweir 		const Reference< deployment::XPackage >* pUserPackages = m_aUserPackagesSeq.getConstArray();
1065cdf0e10cSrcweir 		Reference< deployment::XPackage > xPackage = pUserPackages[ m_iUserPackage++ ];
1066cdf0e10cSrcweir 		VOS_ENSURE( xPackage.is(), "ExtensionIteratorBase::implGetNextUserHelpPackage(): Invalid package" );
1067cdf0e10cSrcweir 		xHelpPackage = implGetHelpPackageFromPackage( xPackage, o_xParentPackageBundle );
1068cdf0e10cSrcweir 	}
1069cdf0e10cSrcweir 
1070cdf0e10cSrcweir 	return xHelpPackage;
1071cdf0e10cSrcweir }
1072cdf0e10cSrcweir 
implGetNextSharedHelpPackage(Reference<deployment::XPackage> & o_xParentPackageBundle)1073cdf0e10cSrcweir Reference< deployment::XPackage > ExtensionIteratorBase::implGetNextSharedHelpPackage
1074cdf0e10cSrcweir 	( Reference< deployment::XPackage >& o_xParentPackageBundle )
1075cdf0e10cSrcweir {
1076cdf0e10cSrcweir 	Reference< deployment::XPackage > xHelpPackage;
1077cdf0e10cSrcweir 
1078cdf0e10cSrcweir 	if( !m_bSharedPackagesLoaded )
1079cdf0e10cSrcweir 	{
1080cdf0e10cSrcweir 		Reference< XPackageManager > xSharedManager =
1081cdf0e10cSrcweir 			thePackageManagerFactory::get( m_xContext )->getPackageManager( rtl::OUString::createFromAscii("shared") );
1082cdf0e10cSrcweir 		m_aSharedPackagesSeq = xSharedManager->getDeployedPackages
1083cdf0e10cSrcweir 			( Reference< task::XAbortChannel >(), Reference< ucb::XCommandEnvironment >() );
1084cdf0e10cSrcweir 
1085cdf0e10cSrcweir 		m_bSharedPackagesLoaded = true;
1086cdf0e10cSrcweir 	}
1087cdf0e10cSrcweir 
1088cdf0e10cSrcweir 	if( m_iSharedPackage == m_aSharedPackagesSeq.getLength() )
1089cdf0e10cSrcweir 	{
1090cdf0e10cSrcweir 		m_eState = BUNDLED_EXTENSIONS;
1091cdf0e10cSrcweir 	}
1092cdf0e10cSrcweir 	else
1093cdf0e10cSrcweir 	{
1094cdf0e10cSrcweir 		const Reference< deployment::XPackage >* pSharedPackages = m_aSharedPackagesSeq.getConstArray();
1095cdf0e10cSrcweir 		Reference< deployment::XPackage > xPackage = pSharedPackages[ m_iSharedPackage++ ];
1096cdf0e10cSrcweir 		VOS_ENSURE( xPackage.is(), "ExtensionIteratorBase::implGetNextSharedHelpPackage(): Invalid package" );
1097cdf0e10cSrcweir 		xHelpPackage = implGetHelpPackageFromPackage( xPackage, o_xParentPackageBundle );
1098cdf0e10cSrcweir 	}
1099cdf0e10cSrcweir 
1100cdf0e10cSrcweir 	return xHelpPackage;
1101cdf0e10cSrcweir }
1102cdf0e10cSrcweir 
implGetNextBundledHelpPackage(Reference<deployment::XPackage> & o_xParentPackageBundle)1103cdf0e10cSrcweir Reference< deployment::XPackage > ExtensionIteratorBase::implGetNextBundledHelpPackage
1104cdf0e10cSrcweir 	( Reference< deployment::XPackage >& o_xParentPackageBundle )
1105cdf0e10cSrcweir {
1106cdf0e10cSrcweir 	Reference< deployment::XPackage > xHelpPackage;
1107cdf0e10cSrcweir 
1108cdf0e10cSrcweir 	if( !m_bBundledPackagesLoaded )
1109cdf0e10cSrcweir 	{
1110cdf0e10cSrcweir 		Reference< XPackageManager > xBundledManager =
1111cdf0e10cSrcweir 			thePackageManagerFactory::get( m_xContext )->getPackageManager( rtl::OUString::createFromAscii("bundled") );
1112cdf0e10cSrcweir 		m_aBundledPackagesSeq = xBundledManager->getDeployedPackages
1113cdf0e10cSrcweir 			( Reference< task::XAbortChannel >(), Reference< ucb::XCommandEnvironment >() );
1114cdf0e10cSrcweir 
1115cdf0e10cSrcweir 		m_bBundledPackagesLoaded = true;
1116cdf0e10cSrcweir 	}
1117cdf0e10cSrcweir 
1118cdf0e10cSrcweir 	if( m_iBundledPackage == m_aBundledPackagesSeq.getLength() )
1119cdf0e10cSrcweir 	{
1120cdf0e10cSrcweir 		m_eState = END_REACHED;
1121cdf0e10cSrcweir 	}
1122cdf0e10cSrcweir 	else
1123cdf0e10cSrcweir 	{
1124cdf0e10cSrcweir 		const Reference< deployment::XPackage >* pBundledPackages = m_aBundledPackagesSeq.getConstArray();
1125cdf0e10cSrcweir 		Reference< deployment::XPackage > xPackage = pBundledPackages[ m_iBundledPackage++ ];
1126cdf0e10cSrcweir 		VOS_ENSURE( xPackage.is(), "ExtensionIteratorBase::implGetNextBundledHelpPackage(): Invalid package" );
1127cdf0e10cSrcweir 		xHelpPackage = implGetHelpPackageFromPackage( xPackage, o_xParentPackageBundle );
1128cdf0e10cSrcweir 	}
1129cdf0e10cSrcweir 
1130cdf0e10cSrcweir 	return xHelpPackage;
1131cdf0e10cSrcweir }
1132cdf0e10cSrcweir 
isLetter(sal_Unicode c)1133cdf0e10cSrcweir inline bool isLetter( sal_Unicode c )
1134cdf0e10cSrcweir {
1135cdf0e10cSrcweir 	bool bLetter = ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z'));
1136cdf0e10cSrcweir 	return bLetter;
1137cdf0e10cSrcweir }
1138cdf0e10cSrcweir 
implGetLanguageVectorFromPackage(::std::vector<::rtl::OUString> & rv,com::sun::star::uno::Reference<com::sun::star::deployment::XPackage> xPackage)1139cdf0e10cSrcweir void ExtensionIteratorBase::implGetLanguageVectorFromPackage( ::std::vector< ::rtl::OUString > &rv,
1140cdf0e10cSrcweir 	com::sun::star::uno::Reference< com::sun::star::deployment::XPackage > xPackage )
1141cdf0e10cSrcweir {
1142cdf0e10cSrcweir 	rv.clear();
1143cdf0e10cSrcweir 	rtl::OUString aExtensionPath = xPackage->getURL();
1144cdf0e10cSrcweir 	Sequence< rtl::OUString > aEntrySeq = m_xSFA->getFolderContents( aExtensionPath, true );
1145cdf0e10cSrcweir 
1146cdf0e10cSrcweir 	const rtl::OUString* pSeq = aEntrySeq.getConstArray();
1147cdf0e10cSrcweir     sal_Int32 nCount = aEntrySeq.getLength();
1148cdf0e10cSrcweir 	for( sal_Int32 i = 0 ; i < nCount ; ++i )
1149cdf0e10cSrcweir 	{
1150cdf0e10cSrcweir 		rtl::OUString aEntry = pSeq[i];
1151cdf0e10cSrcweir 		if( m_xSFA->isFolder( aEntry ) )
1152cdf0e10cSrcweir 		{
1153cdf0e10cSrcweir 			sal_Int32 nLastSlash = aEntry.lastIndexOf( '/' );
1154cdf0e10cSrcweir 			if( nLastSlash != -1 )
1155cdf0e10cSrcweir 			{
1156cdf0e10cSrcweir 				rtl::OUString aPureEntry = aEntry.copy( nLastSlash + 1 );
1157cdf0e10cSrcweir 
1158cdf0e10cSrcweir 				// Check language sceme
1159cdf0e10cSrcweir 				int nLen = aPureEntry.getLength();
1160cdf0e10cSrcweir 				const sal_Unicode* pc = aPureEntry.getStr();
1161cdf0e10cSrcweir 				bool bStartCanBeLanguage = ( nLen >= 2 && isLetter( pc[0] ) && isLetter( pc[1] ) );
1162cdf0e10cSrcweir 				bool bIsLanguage = bStartCanBeLanguage &&
1163cdf0e10cSrcweir 					( nLen == 2 || (nLen == 5 && pc[2] == '-' && isLetter( pc[3] ) && isLetter( pc[4] )) );
1164cdf0e10cSrcweir 				if( bIsLanguage )
1165cdf0e10cSrcweir 					rv.push_back( aPureEntry );
1166cdf0e10cSrcweir 			}
1167cdf0e10cSrcweir 		}
1168cdf0e10cSrcweir 	}
1169cdf0e10cSrcweir }
1170cdf0e10cSrcweir 
1171cdf0e10cSrcweir 
1172cdf0e10cSrcweir //===================================================================
1173cdf0e10cSrcweir // class TreeFileIterator
1174cdf0e10cSrcweir 
nextTreeFile(sal_Int32 & rnFileSize)1175cdf0e10cSrcweir rtl::OUString TreeFileIterator::nextTreeFile( sal_Int32& rnFileSize )
1176cdf0e10cSrcweir {
1177cdf0e10cSrcweir 	rtl::OUString aRetFile;
1178cdf0e10cSrcweir 
1179cdf0e10cSrcweir 	while( !aRetFile.getLength() && m_eState != END_REACHED )
1180cdf0e10cSrcweir 	{
1181cdf0e10cSrcweir 		switch( m_eState )
1182cdf0e10cSrcweir 		{
1183cdf0e10cSrcweir 			case USER_EXTENSIONS:
1184cdf0e10cSrcweir 			{
1185cdf0e10cSrcweir 				Reference< deployment::XPackage > xParentPackageBundle;
1186cdf0e10cSrcweir 				Reference< deployment::XPackage > xHelpPackage = implGetNextUserHelpPackage( xParentPackageBundle );
1187cdf0e10cSrcweir 				if( !xHelpPackage.is() )
1188cdf0e10cSrcweir 					break;
1189cdf0e10cSrcweir 
1190cdf0e10cSrcweir 				aRetFile = implGetTreeFileFromPackage( rnFileSize, xHelpPackage );
1191cdf0e10cSrcweir 				break;
1192cdf0e10cSrcweir 			}
1193cdf0e10cSrcweir 
1194cdf0e10cSrcweir 			case SHARED_EXTENSIONS:
1195cdf0e10cSrcweir 			{
1196cdf0e10cSrcweir 				Reference< deployment::XPackage > xParentPackageBundle;
1197cdf0e10cSrcweir 				Reference< deployment::XPackage > xHelpPackage = implGetNextSharedHelpPackage( xParentPackageBundle );
1198cdf0e10cSrcweir 				if( !xHelpPackage.is() )
1199cdf0e10cSrcweir 					break;
1200cdf0e10cSrcweir 
1201cdf0e10cSrcweir 				aRetFile = implGetTreeFileFromPackage( rnFileSize, xHelpPackage );
1202cdf0e10cSrcweir 				break;
1203cdf0e10cSrcweir 			}
1204cdf0e10cSrcweir 			case BUNDLED_EXTENSIONS:
1205cdf0e10cSrcweir 			{
1206cdf0e10cSrcweir 				Reference< deployment::XPackage > xParentPackageBundle;
1207cdf0e10cSrcweir 				Reference< deployment::XPackage > xHelpPackage = implGetNextBundledHelpPackage( xParentPackageBundle );
1208cdf0e10cSrcweir 				if( !xHelpPackage.is() )
1209cdf0e10cSrcweir 					break;
1210cdf0e10cSrcweir 
1211cdf0e10cSrcweir 				aRetFile = implGetTreeFileFromPackage( rnFileSize, xHelpPackage );
1212cdf0e10cSrcweir 				break;
1213cdf0e10cSrcweir 			}
1214cdf0e10cSrcweir 
1215cdf0e10cSrcweir         case END_REACHED:
1216cdf0e10cSrcweir 				VOS_ENSURE( false, "DataBaseIterator::nextTreeFile(): Invalid case END_REACHED" );
1217cdf0e10cSrcweir 				break;
1218cdf0e10cSrcweir 		}
1219cdf0e10cSrcweir 	}
1220cdf0e10cSrcweir 
1221cdf0e10cSrcweir 	return aRetFile;
1222cdf0e10cSrcweir }
1223cdf0e10cSrcweir 
expandURL(const rtl::OUString & aURL)1224cdf0e10cSrcweir rtl::OUString TreeFileIterator::expandURL( const rtl::OUString& aURL )
1225cdf0e10cSrcweir {
1226cdf0e10cSrcweir 	static Reference< util::XMacroExpander > xMacroExpander;
1227cdf0e10cSrcweir 	static Reference< uri::XUriReferenceFactory > xFac;
1228cdf0e10cSrcweir 
1229cdf0e10cSrcweir 	osl::MutexGuard aGuard( m_aMutex );
1230cdf0e10cSrcweir 
1231cdf0e10cSrcweir 	if( !xMacroExpander.is() || !xFac.is() )
1232cdf0e10cSrcweir 	{
1233cdf0e10cSrcweir 		Reference< XMultiComponentFactory > xSMgr( m_xContext->getServiceManager(), UNO_QUERY );
1234cdf0e10cSrcweir 
1235cdf0e10cSrcweir 		xFac = Reference< uri::XUriReferenceFactory >(
1236cdf0e10cSrcweir 			xSMgr->createInstanceWithContext( rtl::OUString::createFromAscii(
1237cdf0e10cSrcweir 			"com.sun.star.uri.UriReferenceFactory"), m_xContext ) , UNO_QUERY );
1238cdf0e10cSrcweir 		if( !xFac.is() )
1239cdf0e10cSrcweir 		{
1240cdf0e10cSrcweir 			throw RuntimeException(
1241cdf0e10cSrcweir 				::rtl::OUString::createFromAscii( "Databases::expand(), could not instatiate UriReferenceFactory." ),
1242cdf0e10cSrcweir 				Reference< XInterface >() );
1243cdf0e10cSrcweir 		}
1244cdf0e10cSrcweir 
1245cdf0e10cSrcweir 		xMacroExpander = Reference< util::XMacroExpander >(
1246cdf0e10cSrcweir 			m_xContext->getValueByName(
1247cdf0e10cSrcweir 			::rtl::OUString::createFromAscii( "/singletons/com.sun.star.util.theMacroExpander" ) ),
1248cdf0e10cSrcweir 			UNO_QUERY_THROW );
1249cdf0e10cSrcweir  	}
1250cdf0e10cSrcweir 
1251cdf0e10cSrcweir 	rtl::OUString aRetURL = aURL;
1252cdf0e10cSrcweir 	if( xMacroExpander.is() )
1253cdf0e10cSrcweir 	{
1254cdf0e10cSrcweir 		Reference< uri::XUriReference > uriRef;
1255cdf0e10cSrcweir 		for (;;)
1256cdf0e10cSrcweir 		{
1257cdf0e10cSrcweir 			uriRef = Reference< uri::XUriReference >( xFac->parse( aRetURL ), UNO_QUERY );
1258cdf0e10cSrcweir 			if ( uriRef.is() )
1259cdf0e10cSrcweir 			{
1260cdf0e10cSrcweir 				Reference < uri::XVndSunStarExpandUrl > sxUri( uriRef, UNO_QUERY );
1261cdf0e10cSrcweir 				if( !sxUri.is() )
1262cdf0e10cSrcweir 					break;
1263cdf0e10cSrcweir 
1264cdf0e10cSrcweir 				aRetURL = sxUri->expand( xMacroExpander );
1265cdf0e10cSrcweir 			}
1266cdf0e10cSrcweir 		}
1267cdf0e10cSrcweir  	}
1268cdf0e10cSrcweir 	return aRetURL;
1269cdf0e10cSrcweir }
1270cdf0e10cSrcweir 
implGetTreeFileFromPackage(sal_Int32 & rnFileSize,Reference<deployment::XPackage> xPackage)1271cdf0e10cSrcweir rtl::OUString TreeFileIterator::implGetTreeFileFromPackage
1272cdf0e10cSrcweir 	( sal_Int32& rnFileSize, Reference< deployment::XPackage > xPackage )
1273cdf0e10cSrcweir {
1274cdf0e10cSrcweir 	rtl::OUString aRetFile;
1275cdf0e10cSrcweir 	rtl::OUString aLanguage = m_aLanguage;
1276cdf0e10cSrcweir 	for( sal_Int32 iPass = 0 ; iPass < 2 ; ++iPass )
1277cdf0e10cSrcweir 	{
1278cdf0e10cSrcweir 		rtl::OUStringBuffer aStrBuf;
1279cdf0e10cSrcweir 		aStrBuf.append( xPackage->getURL() );
1280cdf0e10cSrcweir 		aStrBuf.append( aSlash );
1281cdf0e10cSrcweir 		aStrBuf.append( aLanguage );
1282cdf0e10cSrcweir 		aStrBuf.append( aSlash );
1283cdf0e10cSrcweir 		aStrBuf.append( aHelpFilesBaseName );
1284cdf0e10cSrcweir 		aStrBuf.appendAscii( ".tree" );
1285cdf0e10cSrcweir 
1286cdf0e10cSrcweir 		aRetFile = expandURL( aStrBuf.makeStringAndClear() );
1287cdf0e10cSrcweir 		if( iPass == 0 )
1288cdf0e10cSrcweir 		{
1289cdf0e10cSrcweir 			if( m_xSFA->exists( aRetFile ) )
1290cdf0e10cSrcweir 				break;
1291cdf0e10cSrcweir 
1292cdf0e10cSrcweir 			::std::vector< ::rtl::OUString > av;
1293cdf0e10cSrcweir 			implGetLanguageVectorFromPackage( av, xPackage );
1294cdf0e10cSrcweir 			::std::vector< ::rtl::OUString >::const_iterator pFound = av.end();
1295cdf0e10cSrcweir 			try
1296cdf0e10cSrcweir 			{
1297cdf0e10cSrcweir 				pFound = ::comphelper::Locale::getFallback( av, m_aLanguage );
1298cdf0e10cSrcweir 			}
1299cdf0e10cSrcweir 			catch( ::comphelper::Locale::MalFormedLocaleException& )
1300cdf0e10cSrcweir 			{}
1301cdf0e10cSrcweir 			if( pFound != av.end() )
1302cdf0e10cSrcweir 				aLanguage = *pFound;
1303cdf0e10cSrcweir 		}
1304cdf0e10cSrcweir 	}
1305cdf0e10cSrcweir 
1306cdf0e10cSrcweir 	rnFileSize = 0;
1307cdf0e10cSrcweir 	if( m_xSFA->exists( aRetFile ) )
1308cdf0e10cSrcweir 		rnFileSize = m_xSFA->getSize( aRetFile );
1309cdf0e10cSrcweir 	else
1310cdf0e10cSrcweir 		aRetFile = rtl::OUString();
1311cdf0e10cSrcweir 
1312cdf0e10cSrcweir 	return aRetFile;
1313cdf0e10cSrcweir }
1314cdf0e10cSrcweir 
1315cdf0e10cSrcweir 
1316cdf0e10cSrcweir 
1317