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