xref: /trunk/main/xmlhelp/source/cxxhelp/provider/databases.hxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
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