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