1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 #ifndef _DATABASES_HXX_
29 #define _DATABASES_HXX_
30 
31 #ifndef INCLUDED_STL_SET
32 #include <set>
33 #define INCLUDED_STL_SET
34 #endif
35 #ifndef INCLUDED_STL_VECTOR
36 #include <vector>
37 #define INCLUDED_STL_VECTOR
38 #endif
39 #include <hash_map>
40 #include <hash_set>
41 #include <osl/mutex.hxx>
42 #include <rtl/ustring.hxx>
43 #include <rtl/string.hxx>
44 #include <com/sun/star/uno/Sequence.hxx>
45 #include <com/sun/star/ucb/XContent.hpp>
46 #include <com/sun/star/container/XHierarchicalNameAccess.hpp>
47 #include <com/sun/star/io/XInputStream.hpp>
48 #include <com/sun/star/lang/XMultiComponentFactory.hpp>
49 #include <com/sun/star/uno/XComponentContext.hpp>
50 #include <com/sun/star/i18n/XCollator.hpp>
51 #include <com/sun/star/deployment/XPackage.hpp>
52 #include "com/sun/star/ucb/XSimpleFileAccess.hpp"
53 
54 // Forward declaration
55 
56 
57 namespace berkeleydbproxy {
58 
59     class Db;
60 
61 }
62 
63 
64 namespace chelp {
65 
66 
67 	class Databases;
68 	class URLParameter;
69 
70 	class StaticModuleInformation
71 	{
72 	private:
73 
74 		rtl::OUString m_aStartId;
75 		rtl::OUString m_aProgramSwitch;
76 		rtl::OUString m_aTitle;
77 		rtl::OUString m_aHeading;
78 		rtl::OUString m_aFulltext;
79 		int m_nOrder;
80 
81 
82 	public:
83 
84 		StaticModuleInformation( rtl::OUString aTitle,
85 								 rtl::OUString aStartId,
86 								 rtl::OUString aProgramSwitch,
87 								 rtl::OUString aHeading,
88 								 rtl::OUString aFulltext,
89                                  rtl::OUString aOrder )
90 			: m_aStartId( aStartId ),
91 			  m_aProgramSwitch( aProgramSwitch ),
92 			  m_aTitle( aTitle ),
93 			  m_aHeading( aHeading ),
94 			  m_aFulltext( aFulltext ),
95               m_nOrder( aOrder.toInt32() )
96 		{
97 		}
98 
99 		~StaticModuleInformation() { }
100 
101 		rtl::OUString get_title()     { return m_aTitle; }
102 		rtl::OUString get_id()        { return m_aStartId; }
103 		rtl::OUString get_program()   { return m_aProgramSwitch; }
104 		rtl::OUString get_heading()   { return m_aHeading; }
105 		rtl::OUString get_fulltext()  { return m_aFulltext; }
106         int get_order() { return m_nOrder; }
107 	};  // end class StaticModuleInformation
108 
109 
110 
111 	class KeywordInfo
112 	{
113 	public:
114 
115 		class KeywordElement
116 		{
117             friend struct KeywordElementComparator;
118             friend class KeywordInfo;
119 
120 		public:
121 
122 			KeywordElement( Databases* pDatabases,
123 							berkeleydbproxy::Db* pDb,
124 							rtl::OUString& key,
125 							rtl::OUString& ids );
126 
127 		private:
128 
129 			rtl::OUString key;
130 			com::sun::star::uno::Sequence< rtl::OUString > listId;
131 			com::sun::star::uno::Sequence< rtl::OUString > listAnchor;
132 			com::sun::star::uno::Sequence< rtl::OUString > listTitle;
133 
134 			void init( Databases *pDatabases,berkeleydbproxy::Db* pDb,const rtl::OUString& ids );
135 		};
136 
137 
138 		KeywordInfo( const std::vector< KeywordElement >& aVector );
139 
140         ~KeywordInfo() { };
141 
142 		com::sun::star::uno::Sequence< rtl::OUString >&
143 		getKeywordList() { return listKey; }
144 
145 		com::sun::star::uno::Sequence< com::sun::star::uno::Sequence< rtl::OUString > >&
146 		getIdList() { return listId; }
147 
148 		com::sun::star::uno::Sequence< com::sun::star::uno::Sequence< rtl::OUString > >&
149 		getAnchorList() { return listAnchor; }
150 
151 		com::sun::star::uno::Sequence< com::sun::star::uno::Sequence< rtl::OUString > >&
152 		getTitleList() { return listTitle; }
153 
154 	private:
155 
156 		com::sun::star::uno::Sequence< rtl::OUString > listKey;
157 		com::sun::star::uno::Sequence< com::sun::star::uno::Sequence< rtl::OUString > > listId,listAnchor,listTitle;
158 	};  // end class KeywordInfo
159 
160 
161 
162 	class Databases
163 	{
164 	public:
165 
166 		struct eq
167 		{
168 			bool operator()( const rtl::OUString& rKey1, const rtl::OUString& rKey2 ) const
169 			{
170 				return rKey1.compareTo( rKey2 ) == 0;
171 			}
172 		};
173 
174 		struct ha
175 		{
176 			size_t operator()( const rtl::OUString& rName ) const
177 			{
178 				return rName.hashCode();
179 			}
180 		};
181 
182 
183 		/**
184 		 *  Input is the installdirectory in system dependent notation
185 		 */
186 
187 		Databases( sal_Bool showBasic,
188 				 const rtl::OUString& instPath,
189 				 const com::sun::star::uno::Sequence< rtl::OUString >& imagesZipPaths,
190 				 const rtl::OUString& productName,
191 				 const rtl::OUString& productVersion,
192 				 const rtl::OUString& styleSheet,
193 				 com::sun::star::uno::Reference< com::sun::star::uno::XComponentContext > xContext );
194 
195 		~Databases();
196 
197         rtl::OString getImagesZipFileURL();
198 
199 		rtl::OUString getInstallPathAsSystemPath();
200 
201 		rtl::OUString getInstallPathAsURL();
202 
203 		const std::vector< rtl::OUString >& getModuleList( const rtl::OUString& Language );
204 
205 		StaticModuleInformation* getStaticInformationForModule( const rtl::OUString& Module,
206 																const rtl::OUString& Language );
207 
208 		bool checkModuleMatchForExtension( const rtl::OUString& Database, const rtl::OUString& doclist );
209 		KeywordInfo* getKeyword( const rtl::OUString& Module,
210 								 const rtl::OUString& Language );
211 
212 		berkeleydbproxy::Db* getBerkeley( const rtl::OUString& Module,
213 						 const rtl::OUString& Language, bool helpText = false,
214 						 const rtl::OUString* pExtensionPath = NULL );
215 
216 
217 		/**
218 		 *  The following method returns the Collator for the given language-country combination
219 		 */
220 
221 		com::sun::star::uno::Reference< com::sun::star::i18n::XCollator >
222 		getCollator( const rtl::OUString& Language,
223 					 const rtl::OUString& System );   // System not used by current implementation
224 		//                                            // of XCollator
225 
226 		/**
227 		 *  Returns a copy of the popupfile
228 		 */
229 
230 		void popupDocument( URLParameter* urlPar,char **buffer,int *byteCount );
231 
232 
233 		/**
234 		 *  Returns the cascading stlye sheet used to format the HTML-output.
235 		 *  First try is language directory, second try is main installation directory.
236 		 */
237 
238 		void cascadingStylesheet( const rtl::OUString& Language,
239 								  char** buffer,
240 								  int* byteCount );
241 
242 
243 		/**
244 		 *  Changes the the stylesheet for further reads.
245 		 */
246 
247 		void changeCSS(const rtl::OUString& newStyleSheet);
248 
249 
250 		/**
251 		 *  Returns the active help text for the given module, language and id.
252 		 */
253 
254 		void setActiveText( const rtl::OUString& Module,
255 							const rtl::OUString& Language,
256 							const rtl::OUString& Id,
257 							char** buffer,
258 							int* byteCount );
259 
260 		/**
261 		 *  Has the purpose of forcing the the jarfile to stay open
262 		 */
263 
264 		com::sun::star::uno::Reference< com::sun::star::container::XHierarchicalNameAccess >
265 		jarFile( const rtl::OUString& jar,
266 				 const rtl::OUString& Language );
267 
268 		com::sun::star::uno::Reference< com::sun::star::container::XHierarchicalNameAccess >
269 		findJarFileForPath( const rtl::OUString& jar, const rtl::OUString& Language,
270 			const rtl::OUString& path, rtl::OUString* o_pExtensionPath = NULL,
271             rtl::OUString* o_pExtensionRegistryPath = NULL );
272 
273 		/**
274 		 *  Maps a given language-locale combination to language.
275 		 */
276 
277 		rtl::OUString processLang( const rtl::OUString& Language );
278 
279 
280 		/**
281 		 *  Maps a given language-locale combination to locale.
282 		 *  The returned string maybe empty
283 		 */
284 
285 		rtl::OUString country( const rtl::OUString& Language );
286 
287 
288 		void replaceName( rtl::OUString& oustring ) const;
289 
290 		rtl::OUString getProductName() const { return m_vReplacement[0]; }
291 		rtl::OUString getProductVersion() const { return m_vReplacement[1]; }
292 
293 		rtl::OUString expandURL( const rtl::OUString& aURL );
294 
295 		static rtl::OUString expandURL( const rtl::OUString& aURL,
296 			com::sun::star::uno::Reference< com::sun::star::uno::XComponentContext > xContext );
297 
298 	private:
299 
300 		osl::Mutex                                                                     m_aMutex;
301 		com::sun::star::uno::Reference< com::sun::star::uno::XComponentContext >       m_xContext;
302 		com::sun::star::uno::Reference< com::sun::star::lang::XMultiComponentFactory > m_xSMgr;
303 		com::sun::star::uno::Reference< com::sun::star::ucb::XSimpleFileAccess >	   m_xSFA;
304 
305 	    sal_Bool m_bShowBasic;
306 		int    m_nErrorDocLength;
307 		char*  m_pErrorDoc;
308 
309 		int    m_nCustomCSSDocLength;
310 		char*  m_pCustomCSSDoc;
311 		rtl::OUString m_aCSS;
312 
313 #define PRODUCTNAME    0
314 #define PRODUCTVERSION 1
315 #define VENDORNAME     2
316 #define VENDORVERSION  3
317 #define VENDORSHORT    4
318 #define NEWPRODUCTNAME    5
319 #define NEWPRODUCTVERSION 6
320 
321 		int                    m_vAdd[7];
322 		rtl::OUString          m_vReplacement[7];
323 		rtl::OUString          newProdName,newProdVersion,
324             prodName,prodVersion,vendName,vendVersion,vendShort;
325 
326 		rtl::OUString          m_aInstallDirectory;                // Installation directory
327 		com::sun::star::uno::Sequence< rtl::OUString > m_aImagesZipPaths;
328         rtl::OString           m_aImagesZipFileURL;
329 		sal_Int16              m_nSymbolsStyle;
330 		rtl::OUString          m_aInstallDirectoryWithoutEncoding; // a work around for a Sablot bug.
331 		rtl::OUString          m_aInstallDirectoryAsSystemPath;    // Installation directory
332 
333 		std::vector< rtl::OUString >	m_avModules;
334 
335 		typedef std::hash_map< rtl::OUString,berkeleydbproxy::Db*,ha,eq >   DatabasesTable;
336 		DatabasesTable m_aDatabases;         // Language and module dependent databases
337 
338 		typedef  std::hash_map< rtl::OUString,rtl::OUString,ha,eq > LangSetTable;
339 		LangSetTable m_aLangSet;   // Mapping to of lang-country to lang
340 
341 		typedef std::hash_map< rtl::OUString,StaticModuleInformation*,ha,eq > ModInfoTable;
342 		ModInfoTable m_aModInfo;   // Module information
343 
344 		typedef std::hash_map< rtl::OUString,KeywordInfo*,ha,eq > KeywordInfoTable;
345 		KeywordInfoTable m_aKeywordInfo;   // Module information
346 
347 		typedef
348 		std::hash_map<
349 		rtl::OUString,
350 			 ::com::sun::star::uno::Reference< com::sun::star::container::XHierarchicalNameAccess >,
351 			ha,
352 			eq >         ZipFileTable;
353 		ZipFileTable m_aZipFileTable;   // No closing of an once opened jarfile
354 
355 		typedef
356 		std::hash_map<
357 		rtl::OUString,
358 			 ::com::sun::star::uno::Reference< com::sun::star::i18n::XCollator >,
359 			ha,
360 			eq >      CollatorTable;
361 		CollatorTable    m_aCollatorTable;
362 
363 
364 		struct ostring_eq
365 		{
366 			bool operator()( const rtl::OString& rKey1, const rtl::OString& rKey2 ) const
367 			{
368 				return rKey1.compareTo( rKey2 ) == 0;
369 			}
370 		};
371 
372 		struct ostring_ha
373 		{
374 			size_t operator()( const rtl::OString& rName ) const
375 			{
376 				return rName.hashCode();
377 			}
378 		};
379 
380 		typedef
381 		std::hash_set<
382 			rtl::OString,
383 			ostring_ha,
384 			ostring_eq >      EmptyActiveTextSet;
385 		EmptyActiveTextSet	m_aEmptyActiveTextSet;
386 
387 
388 		// methods
389 
390 		void setInstallPath( const rtl::OUString& aInstallDirectory );
391 
392 	}; // end class Databases
393 
394 
395 	//===================================================================
396 	enum IteratorState
397 	{
398 		INITIAL_MODULE,
399 		//SHARED_MODULE,		// Later, avoids redundancies in help compiling
400 		USER_EXTENSIONS,
401 		SHARED_EXTENSIONS,
402         BUNDLED_EXTENSIONS,
403 		END_REACHED
404 	};
405 
406 	// Hashtable to cache extension help status
407 	typedef std::hash_map
408 	<
409 		::rtl::OUString,
410 		bool,
411 		Databases::ha,
412 		Databases::eq
413 	>
414 	ExtensionHelpExistanceMap;
415 
416 
417 	class ExtensionIteratorBase
418 	{
419 		static ExtensionHelpExistanceMap	aHelpExistanceMap;
420 
421 	public:
422 		ExtensionIteratorBase( com::sun::star::uno::Reference< com::sun::star::uno::XComponentContext > xContext,
423 			Databases& rDatabases, const rtl::OUString& aInitialModule, const rtl::OUString& aLanguage );
424 		ExtensionIteratorBase( Databases& rDatabases, const rtl::OUString& aInitialModule,
425 			const rtl::OUString& aLanguage );
426 		void init( void );
427 
428 	private:
429 		com::sun::star::uno::Reference< com::sun::star::deployment::XPackage > implGetHelpPackageFromPackage
430 			( const com::sun::star::uno::Reference< com::sun::star::deployment::XPackage > xPackage,
431 			  com::sun::star::uno::Reference< com::sun::star::deployment::XPackage >& o_xParentPackageBundle );
432 
433 	protected:
434 		com::sun::star::uno::Reference< com::sun::star::deployment::XPackage > implGetNextUserHelpPackage
435 			( com::sun::star::uno::Reference< com::sun::star::deployment::XPackage >& o_xParentPackageBundle );
436 		com::sun::star::uno::Reference< com::sun::star::deployment::XPackage > implGetNextSharedHelpPackage
437 			( com::sun::star::uno::Reference< com::sun::star::deployment::XPackage >& o_xParentPackageBundle );
438         com::sun::star::uno::Reference< com::sun::star::deployment::XPackage > implGetNextBundledHelpPackage
439         ( com::sun::star::uno::Reference< com::sun::star::deployment::XPackage >& o_xParentPackageBundle );
440 		rtl::OUString implGetFileFromPackage( const rtl::OUString& rFileExtension,
441 			com::sun::star::uno::Reference< com::sun::star::deployment::XPackage > xPackage );
442 		void implGetLanguageVectorFromPackage( ::std::vector< ::rtl::OUString > &rv,
443 			com::sun::star::uno::Reference< com::sun::star::deployment::XPackage > xPackage );
444 
445 		com::sun::star::uno::Reference< com::sun::star::uno::XComponentContext >	m_xContext;
446 		com::sun::star::uno::Reference< com::sun::star::ucb::XSimpleFileAccess >	m_xSFA;
447 		Databases&																	m_rDatabases;
448 
449 		IteratorState																m_eState;
450 		rtl::OUString																m_aExtensionPath;
451 
452 		rtl::OUString																m_aInitialModule;
453 		rtl::OUString																m_aLanguage;
454 
455 		com::sun::star::uno::Sequence< com::sun::star::uno::Reference
456 			< com::sun::star::deployment::XPackage > >								m_aUserPackagesSeq;
457 		bool																		m_bUserPackagesLoaded;
458 
459 		com::sun::star::uno::Sequence< com::sun::star::uno::Reference
460 			< com::sun::star::deployment::XPackage > >								m_aSharedPackagesSeq;
461 		bool																		m_bSharedPackagesLoaded;
462 
463         com::sun::star::uno::Sequence< com::sun::star::uno::Reference
464             < com::sun::star::deployment::XPackage > >                              m_aBundledPackagesSeq;
465 		bool																		m_bBundledPackagesLoaded;
466 
467 		int																			m_iUserPackage;
468 		int																			m_iSharedPackage;
469         int																			m_iBundledPackage;
470 
471 	}; // end class ExtensionIteratorBase
472 
473 
474 	//===================================================================
475 	class DataBaseIterator : public ExtensionIteratorBase
476 	{
477 	public:
478 		DataBaseIterator( com::sun::star::uno::Reference< com::sun::star::uno::XComponentContext > xContext,
479 			Databases& rDatabases, const rtl::OUString& aInitialModule, const rtl::OUString& aLanguage, bool bHelpText )
480 				: ExtensionIteratorBase( xContext, rDatabases, aInitialModule, aLanguage )
481 				, m_bHelpText( bHelpText )
482 		{}
483 		DataBaseIterator( Databases& rDatabases, const rtl::OUString& aInitialModule,
484 			const rtl::OUString& aLanguage, bool bHelpText )
485 				: ExtensionIteratorBase( rDatabases, aInitialModule, aLanguage )
486 				, m_bHelpText( bHelpText )
487 		{}
488 
489 		berkeleydbproxy::Db* nextDb( rtl::OUString* o_pExtensionPath = NULL, rtl::OUString* o_pExtensionRegistryPath = NULL );
490 
491 
492 	private:
493 		berkeleydbproxy::Db* implGetDbFromPackage(
494 			com::sun::star::uno::Reference< com::sun::star::deployment::XPackage > xPackage,
495 			rtl::OUString* o_pExtensionPath, rtl::OUString* o_pExtensionRegistryPath );
496 
497 		bool																		m_bHelpText;
498 
499 	}; // end class DataBaseIterator
500 
501 	//===================================================================
502 	class KeyDataBaseFileIterator : public ExtensionIteratorBase
503 	{
504 	public:
505 		KeyDataBaseFileIterator( com::sun::star::uno::Reference< com::sun::star::uno::XComponentContext > xContext,
506 			Databases& rDatabases, const rtl::OUString& aInitialModule, const rtl::OUString& aLanguage )
507 				: ExtensionIteratorBase( xContext, rDatabases, aInitialModule, aLanguage )
508 		{}
509         //Returns a file URL
510 		rtl::OUString nextDbFile( bool& o_rbExtension );
511 
512 	private:
513 		rtl::OUString implGetDbFileFromPackage(
514 			com::sun::star::uno::Reference< com::sun::star::deployment::XPackage > xPackage );
515 
516 	}; // end class KeyDataBaseFileIterator
517 
518 	//===================================================================
519 	class JarFileIterator : public ExtensionIteratorBase
520 	{
521 	public:
522 		JarFileIterator( com::sun::star::uno::Reference< com::sun::star::uno::XComponentContext > xContext,
523 			Databases& rDatabases, const rtl::OUString& aInitialModule, const rtl::OUString& aLanguage )
524 				: ExtensionIteratorBase( xContext, rDatabases, aInitialModule, aLanguage )
525 		{}
526 
527 		com::sun::star::uno::Reference< com::sun::star::container::XHierarchicalNameAccess >
528 			nextJarFile( com::sun::star::uno::Reference< com::sun::star::deployment::XPackage >& o_xParentPackageBundle,
529 							rtl::OUString* o_pExtensionPath = NULL, rtl::OUString* o_pExtensionRegistryPath = NULL );
530 
531 	private:
532 		com::sun::star::uno::Reference< com::sun::star::container::XHierarchicalNameAccess >
533 			implGetJarFromPackage(com::sun::star::uno::Reference< com::sun::star::deployment::XPackage > xPackage,
534 				rtl::OUString* o_pExtensionPath = NULL, rtl::OUString* o_pExtensionRegistryPath = NULL );
535 
536 	}; // end class JarFileIterator
537 
538 	//===================================================================
539 	class IndexFolderIterator : public ExtensionIteratorBase
540 	{
541 	public:
542 		IndexFolderIterator( Databases& rDatabases, const rtl::OUString& aInitialModule, const rtl::OUString& aLanguage )
543 			: ExtensionIteratorBase( rDatabases, aInitialModule, aLanguage )
544 		{}
545 
546 		rtl::OUString nextIndexFolder( bool& o_rbExtension, bool& o_rbTemporary );
547 		void deleteTempIndexFolder( const rtl::OUString& aIndexFolder );
548 
549 	private:
550 		rtl::OUString implGetIndexFolderFromPackage( bool& o_rbTemporary,
551 			com::sun::star::uno::Reference< com::sun::star::deployment::XPackage > xPackage );
552 
553 	}; // end class KeyDataBaseFileIterator
554 
555 	//===================================================================
556 
557 }      // end namespace chelp
558 
559 
560 #endif
561