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