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