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