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