1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3  * This file is part of the LibreOffice project.
4  *
5  * This Source Code Form is subject to the terms of the Mozilla Public
6  * License, v. 2.0. If a copy of the MPL was not distributed with this
7  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8  *
9  * This file incorporates work covered by the following license notice:
10  *
11  *   Licensed to the Apache Software Foundation (ASF) under one or more
12  *   contributor license agreements. See the NOTICE file distributed
13  *   with this work for additional information regarding copyright
14  *   ownership. The ASF licenses this file to you under the Apache
15  *   License, Version 2.0 (the "License"); you may not use this file
16  *   except in compliance with the License. You may obtain a copy of
17  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
18  */
19 
20 #ifndef INCLUDED_XMLHELP_SOURCE_CXXHELP_PROVIDER_DATABASES_HXX
21 #define INCLUDED_XMLHELP_SOURCE_CXXHELP_PROVIDER_DATABASES_HXX
22 
23 #include <sal/config.h>
24 
25 #include <memory>
26 #include <unordered_map>
27 #include <unordered_set>
28 #include <vector>
29 #include <osl/mutex.hxx>
30 #include <rtl/ustring.hxx>
31 #include <rtl/string.hxx>
32 #include <com/sun/star/uno/Sequence.hxx>
33 #include <com/sun/star/container/XHierarchicalNameAccess.hpp>
34 #include <com/sun/star/lang/XMultiComponentFactory.hpp>
35 #include <com/sun/star/uno/XComponentContext.hpp>
36 #include <com/sun/star/i18n/XCollator.hpp>
37 #include <com/sun/star/deployment/XPackage.hpp>
38 #include <com/sun/star/ucb/XSimpleFileAccess3.hpp>
39 
40 // Forward declaration
41 
42 namespace helpdatafileproxy {
43 
44     class Hdf;
45 
46 }
47 
48 namespace chelp {
49 
50     class Databases;
51     class URLParameter;
52 
53     class StaticModuleInformation
54     {
55     private:
56 
57         OUString const m_aStartId;
58         OUString const m_aProgramSwitch;
59         OUString const m_aTitle;
60         int const m_nOrder;
61 
62     public:
63 
StaticModuleInformation(const OUString & aTitle,const OUString & aStartId,const OUString & aProgramSwitch,const OUString & aOrder)64         StaticModuleInformation( const OUString& aTitle,
65                                  const OUString& aStartId,
66                                  const OUString& aProgramSwitch,
67                                  const OUString& aOrder )
68             : m_aStartId( aStartId ),
69               m_aProgramSwitch( aProgramSwitch ),
70               m_aTitle( aTitle ),
71               m_nOrder( aOrder.toInt32() )
72         {
73         }
74 
get_title() const75         const OUString& get_title() const { return m_aTitle; }
get_id() const76         const OUString& get_id() const { return m_aStartId; }
get_program() const77         const OUString& get_program() const { return m_aProgramSwitch; }
get_order() const78         int get_order() const { return m_nOrder; }
79     };  // end class StaticModuleInformation
80 
81     class KeywordInfo
82     {
83     public:
84 
85         class KeywordElement
86         {
87             friend struct KeywordElementComparator;
88             friend class KeywordInfo;
89 
90         public:
91 
92             KeywordElement( Databases const * pDatabases,
93                             helpdatafileproxy::Hdf* pHdf,
94                             OUString const & key,
95                             OUString const & ids );
96 
97         private:
98 
99             OUString key;
100             css::uno::Sequence< OUString > listId;
101             css::uno::Sequence< OUString > listAnchor;
102             css::uno::Sequence< OUString > listTitle;
103 
104             void init( Databases const *pDatabases,helpdatafileproxy::Hdf* pHdf,const OUString& ids );
105         };
106 
107         explicit KeywordInfo( const std::vector< KeywordElement >& aVector );
108 
109         css::uno::Sequence< OUString >&
getKeywordList()110         getKeywordList() { return listKey; }
111 
112         css::uno::Sequence< css::uno::Sequence< OUString > >&
getIdList()113         getIdList() { return listId; }
114 
115         css::uno::Sequence< css::uno::Sequence< OUString > >&
getAnchorList()116         getAnchorList() { return listAnchor; }
117 
118         css::uno::Sequence< css::uno::Sequence< OUString > >&
getTitleList()119         getTitleList() { return listTitle; }
120 
121     private:
122 
123         css::uno::Sequence< OUString > listKey;
124         css::uno::Sequence< css::uno::Sequence< OUString > > listId,listAnchor,listTitle;
125     };  // end class KeywordInfo
126 
127     class Databases
128     {
129     public:
130 
131         /**
132          *  Input is the installdirectory in system dependent notation
133          */
134 
135         Databases( bool showBasic,
136                  const OUString& instPath,
137                  const OUString& productName,
138                  const OUString& productVersion,
139                  const OUString& styleSheet,
140                  css::uno::Reference< css::uno::XComponentContext > const & xContext );
141 
142         ~Databases();
143 
144         OString getImageTheme() const;
145 
146         OUString getInstallPathAsURL();
147 
148         const std::vector< OUString >& getModuleList( const OUString& Language );
149 
150         StaticModuleInformation* getStaticInformationForModule( const OUString& Module,
151                                                                 const OUString& Language );
152 
153         bool checkModuleMatchForExtension( const OUString& Database, const OUString& doclist );
154         KeywordInfo* getKeyword( const OUString& Module,
155                                  const OUString& Language );
156 
157         helpdatafileproxy::Hdf* getHelpDataFile( const OUString& Module,
158                          const OUString& Language, bool helpText = false,
159                          const OUString* pExtensionPath = nullptr );
160 
161         /**
162          *  The following method returns the Collator for the given language-country combination
163          */
164         css::uno::Reference< css::i18n::XCollator >
165         getCollator( const OUString& Language );
166 
167         /**
168          *  Returns the cascading style sheet used to format the HTML-output.
169          *  First try is language directory, second try is main installation directory.
170          */
171 
172         void cascadingStylesheet( const OUString& Language,
173                                   OStringBuffer& buffer );
174 
175         /**
176          *  Changes the stylesheet for further reads.
177          */
178 
179         void changeCSS(const OUString& newStyleSheet);
180 
181         /**
182          *  Returns the active help text for the given module, language and id.
183          */
184 
185         void setActiveText( const OUString& Module,
186                             const OUString& Language,
187                             const OUString& Id,
188                             OStringBuffer& buffer );
189 
190         /**
191          *  Has the purpose of forcing the jarfile to stay open
192          */
193 
194         css::uno::Reference< css::container::XHierarchicalNameAccess >
195         jarFile( const OUString& jar,
196                  const OUString& Language );
197 
198         css::uno::Reference< css::container::XHierarchicalNameAccess >
199         findJarFileForPath( const OUString& jar, const OUString& Language,
200             const OUString& path, OUString* o_pExtensionPath = nullptr,
201             OUString* o_pExtensionRegistryPath = nullptr );
202 
203         /**
204          *  Maps a given language-locale combination to language or locale.
205          */
206 
207         OUString processLang( const OUString& Language );
208 
209         void replaceName( OUString& oustring ) const;
210 
getProductName() const211         const OUString& getProductName() const { return m_vReplacement[0]; }
getProductVersion() const212         const OUString& getProductVersion() const { return m_vReplacement[1]; }
213 
214         OUString expandURL( const OUString& aURL );
215 
216         static OUString expandURL( const OUString& aURL,
217             const css::uno::Reference< css::uno::XComponentContext >& xContext );
218 
219     private:
220 
221         osl::Mutex                                               m_aMutex;
222         css::uno::Reference< css::uno::XComponentContext >       m_xContext;
223         css::uno::Reference< css::lang::XMultiComponentFactory > m_xSMgr;
224         css::uno::Reference< css::ucb::XSimpleFileAccess3 >      m_xSFA;
225 
226         bool const   m_bShowBasic;
227 
228         std::vector<char> m_vCustomCSSDoc;
229         OUString m_aCSS;
230 
231         enum {
232             PRODUCTNAME = 0,
233             PRODUCTVERSION,
234             VENDORNAME,
235             VENDORVERSION,
236             VENDORSHORT,
237             NEWPRODUCTNAME,
238             NEWPRODUCTVERSION
239         };
240 
241         int                    m_vAdd[7];
242         OUString          m_vReplacement[7];
243         OUString          newProdName,newProdVersion,
244             prodName,prodVersion,vendName,vendVersion,vendShort;
245 
246         OUString          m_aInstallDirectory;                // Installation directory
247 
248         std::vector< OUString >    m_avModules;
249 
250         typedef std::unordered_map< OUString, std::unique_ptr<helpdatafileproxy::Hdf> >   DatabasesTable;
251         DatabasesTable m_aDatabases;         // Language and module dependent databases
252 
253         typedef std::unordered_map< OUString,OUString > LangSetTable;
254         LangSetTable m_aLangSet;   // Mapping to of lang-country to lang
255 
256         typedef std::unordered_map< OUString, std::unique_ptr<StaticModuleInformation> > ModInfoTable;
257         ModInfoTable m_aModInfo;   // Module information
258 
259         typedef std::unordered_map< OUString, std::unique_ptr<KeywordInfo> > KeywordInfoTable;
260         KeywordInfoTable m_aKeywordInfo;   // Module information
261 
262         typedef
263         std::unordered_map<
264              OUString,
265              css::uno::Reference< css::container::XHierarchicalNameAccess > > ZipFileTable;
266         ZipFileTable m_aZipFileTable;   // No closing of an once opened jarfile
267 
268         typedef
269         std::unordered_map<
270              OUString,
271              css::uno::Reference< css::i18n::XCollator > > CollatorTable;
272         CollatorTable    m_aCollatorTable;
273 
274 
275         typedef
276         std::unordered_set<
277             OString >       EmptyActiveTextSet;
278         EmptyActiveTextSet  m_aEmptyActiveTextSet;
279 
280         // methods
281 
282         void setInstallPath( const OUString& aInstallDirectory );
283 
284     }; // end class Databases
285 
286     enum class IteratorState
287     {
288         InitialModule,
289         //SHARED_MODULE,        // Later, avoids redundancies in help compiling
290         UserExtensions,
291         SharedExtensions,
292         BundledExtensions,
293         EndReached
294     };
295 
296     // Hashtable to cache extension help status
297     typedef std::unordered_map
298     <
299         OUString,
300         bool
301     >
302     ExtensionHelpExistenceMap;
303 
304     class ExtensionIteratorBase
305     {
306         static ExtensionHelpExistenceMap    aHelpExistenceMap;
307 
308     public:
309         ExtensionIteratorBase( css::uno::Reference< css::uno::XComponentContext > const & xContext,
310             Databases& rDatabases, const OUString& aInitialModule, const OUString& aLanguage );
311         ExtensionIteratorBase( Databases& rDatabases, const OUString& aInitialModule,
312             const OUString& aLanguage );
313         void init();
314 
315     private:
316         static css::uno::Reference< css::deployment::XPackage > implGetHelpPackageFromPackage
317             ( const css::uno::Reference< css::deployment::XPackage >& xPackage,
318               css::uno::Reference< css::deployment::XPackage >& o_xParentPackageBundle );
319 
320     protected:
321         css::uno::Reference< css::deployment::XPackage > implGetNextUserHelpPackage
322             ( css::uno::Reference< css::deployment::XPackage >& o_xParentPackageBundle );
323         css::uno::Reference< css::deployment::XPackage > implGetNextSharedHelpPackage
324             ( css::uno::Reference< css::deployment::XPackage >& o_xParentPackageBundle );
325         css::uno::Reference< css::deployment::XPackage > implGetNextBundledHelpPackage
326         ( css::uno::Reference< css::deployment::XPackage >& o_xParentPackageBundle );
327         OUString implGetFileFromPackage( const OUString& rFileExtension,
328             const css::uno::Reference< css::deployment::XPackage >& xPackage );
329         void implGetLanguageVectorFromPackage( ::std::vector< OUString > &rv,
330             const css::uno::Reference< css::deployment::XPackage >& xPackage );
331 
332         css::uno::Reference< css::uno::XComponentContext >    m_xContext;
333         css::uno::Reference< css::ucb::XSimpleFileAccess3 >   m_xSFA;
334         Databases&                                            m_rDatabases;
335 
336         IteratorState                                         m_eState;
337 
338         OUString                                              m_aInitialModule;
339         OUString                                              m_aLanguage;
340 
341         css::uno::Sequence< css::uno::Reference
342             < css::deployment::XPackage > >                   m_aUserPackagesSeq;
343         bool                                                  m_bUserPackagesLoaded;
344 
345         css::uno::Sequence< css::uno::Reference
346             < css::deployment::XPackage > >                   m_aSharedPackagesSeq;
347         bool                                                  m_bSharedPackagesLoaded;
348 
349         css::uno::Sequence< css::uno::Reference
350             < css::deployment::XPackage > >                   m_aBundledPackagesSeq;
351         bool                                                  m_bBundledPackagesLoaded;
352 
353         int                                                   m_iUserPackage;
354         int                                                   m_iSharedPackage;
355         int                                                   m_iBundledPackage;
356 
357     }; // end class ExtensionIteratorBase
358 
359     class DataBaseIterator : public ExtensionIteratorBase
360     {
361     public:
DataBaseIterator(css::uno::Reference<css::uno::XComponentContext> const & xContext,Databases & rDatabases,const OUString & aInitialModule,const OUString & aLanguage,bool bHelpText)362         DataBaseIterator( css::uno::Reference< css::uno::XComponentContext > const & xContext,
363             Databases& rDatabases, const OUString& aInitialModule, const OUString& aLanguage, bool bHelpText )
364                 : ExtensionIteratorBase( xContext, rDatabases, aInitialModule, aLanguage )
365                 , m_bHelpText( bHelpText )
366         {}
DataBaseIterator(Databases & rDatabases,const OUString & aInitialModule,const OUString & aLanguage,bool bHelpText)367         DataBaseIterator( Databases& rDatabases, const OUString& aInitialModule,
368             const OUString& aLanguage, bool bHelpText )
369                 : ExtensionIteratorBase( rDatabases, aInitialModule, aLanguage )
370                 , m_bHelpText( bHelpText )
371         {}
372 
373         helpdatafileproxy::Hdf* nextHdf( OUString* o_pExtensionPath = nullptr, OUString* o_pExtensionRegistryPath = nullptr );
374 
375     private:
376         helpdatafileproxy::Hdf* implGetHdfFromPackage(
377             const css::uno::Reference< css::deployment::XPackage >& xPackage,
378             OUString* o_pExtensionPath, OUString* o_pExtensionRegistryPath );
379 
380         bool const                                                                        m_bHelpText;
381 
382     }; // end class DataBaseIterator
383 
384     class KeyDataBaseFileIterator : public ExtensionIteratorBase
385     {
386     public:
KeyDataBaseFileIterator(css::uno::Reference<css::uno::XComponentContext> const & xContext,Databases & rDatabases,const OUString & aInitialModule,const OUString & aLanguage)387         KeyDataBaseFileIterator( css::uno::Reference< css::uno::XComponentContext > const & xContext,
388             Databases& rDatabases, const OUString& aInitialModule, const OUString& aLanguage )
389                 : ExtensionIteratorBase( xContext, rDatabases, aInitialModule, aLanguage )
390         {}
391         //Returns a file URL
392         OUString nextDbFile( bool& o_rbExtension );
393 
394     private:
395         OUString implGetDbFileFromPackage(
396             const css::uno::Reference< css::deployment::XPackage >& xPackage );
397 
398     }; // end class KeyDataBaseFileIterator
399 
400     class JarFileIterator : public ExtensionIteratorBase
401     {
402     public:
JarFileIterator(css::uno::Reference<css::uno::XComponentContext> const & xContext,Databases & rDatabases,const OUString & aInitialModule,const OUString & aLanguage)403         JarFileIterator( css::uno::Reference< css::uno::XComponentContext > const & xContext,
404             Databases& rDatabases, const OUString& aInitialModule, const OUString& aLanguage )
405                 : ExtensionIteratorBase( xContext, rDatabases, aInitialModule, aLanguage )
406         {}
407 
408         css::uno::Reference< css::container::XHierarchicalNameAccess >
409             nextJarFile( css::uno::Reference< css::deployment::XPackage >& o_xParentPackageBundle,
410                             OUString* o_pExtensionPath, OUString* o_pExtensionRegistryPath );
411 
412     private:
413         css::uno::Reference< css::container::XHierarchicalNameAccess >
414             implGetJarFromPackage(const css::uno::Reference< css::deployment::XPackage >& xPackage,
415                 OUString* o_pExtensionPath, OUString* o_pExtensionRegistryPath );
416 
417     }; // end class JarFileIterator
418 
419     class IndexFolderIterator : public ExtensionIteratorBase
420     {
421     public:
IndexFolderIterator(Databases & rDatabases,const OUString & aInitialModule,const OUString & aLanguage)422         IndexFolderIterator( Databases& rDatabases, const OUString& aInitialModule, const OUString& aLanguage )
423             : ExtensionIteratorBase( rDatabases, aInitialModule, aLanguage )
424         {}
425 
426         OUString nextIndexFolder( bool& o_rbExtension, bool& o_rbTemporary );
427         void deleteTempIndexFolder( const OUString& aIndexFolder );
428 
429     private:
430         OUString implGetIndexFolderFromPackage( bool& o_rbTemporary,
431             const css::uno::Reference< css::deployment::XPackage >& xPackage );
432 
433     }; // end class KeyDataBaseFileIterator
434 
435 }      // end namespace chelp
436 
437 #endif
438 
439 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
440