1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 #ifndef __FRAMEWORK_CLASSES_FILTERCACHEDATA_HXX_ 25 #define __FRAMEWORK_CLASSES_FILTERCACHEDATA_HXX_ 26 27 /** Attention: stl headers must(!) be included at first. Otherwise it can make trouble 28 with solaris headers ... 29 */ 30 #include <hash_map> 31 #include <vector> 32 #include <iterator> 33 34 //_________________________________________________________________________________________________________________ 35 // my own includes 36 //_________________________________________________________________________________________________________________ 37 #include <classes/checkediterator.hxx> 38 #include <classes/wildcard.hxx> 39 #include <classes/converter.hxx> 40 #include <threadhelp/threadhelpbase.hxx> 41 #include <macros/xinterface.hxx> 42 #include <macros/debug.hxx> 43 #include <general.h> 44 45 //_________________________________________________________________________________________________________________ 46 // interface includes 47 //_________________________________________________________________________________________________________________ 48 #include <com/sun/star/uno/Sequence.hxx> 49 #include <com/sun/star/uno/Any.hxx> 50 #include <com/sun/star/uno/Reference.hxx> 51 #include <com/sun/star/beans/PropertyValue.hpp> 52 #include <com/sun/star/lang/XMultiServiceFactory.hpp> 53 #include <com/sun/star/util/XChangesListener.hpp> 54 #include <com/sun/star/util/XChangesNotifier.hpp> 55 56 //_________________________________________________________________________________________________________________ 57 // other includes 58 //_________________________________________________________________________________________________________________ 59 #include <unotools/configitem.hxx> 60 #include <cppuhelper/weak.hxx> 61 #include <rtl/ustring.hxx> 62 #include <rtl/logfile.hxx> 63 64 //_________________________________________________________________________________________________________________ 65 // namespace 66 //_________________________________________________________________________________________________________________ 67 68 namespace framework{ 69 70 //_________________________________________________________________________________________________________________ 71 // exported const 72 //_________________________________________________________________________________________________________________ 73 74 #define PACKAGENAME_TYPEDETECTION_STANDARD DECLARE_ASCII("Office.TypeDetection" ) /// Names of our configuration files. 75 #define PACKAGENAME_TYPEDETECTION_ADDITIONAL DECLARE_ASCII("Office.TypeDetectionAdditional" ) 76 #define CFG_PATH_SEPERATOR DECLARE_ASCII("/" ) /// seperator for configuration paths 77 #define PROPERTY_SEPERATOR sal_Unicode(',') /// seperator for own formatted property strings of types and filters 78 #define LIST_SEPERATOR sal_Unicode(';') /// seperator for own formatted lists as part of our own formatted type- or filter-string 79 #define LOCALE_FALLBACK DECLARE_ASCII("en-US" ) /// fallback, if configuration can't give us current set locale ... 80 #define DEFAULT_FILTERCACHE_VERSION 6 /// these implmentation of FilterCache support different version of TypeDetection.xml! This define the current set default one. 81 82 #define DEFAULT_FILTERCACHE_MODE CONFIG_MODE_DELAYED_UPDATE | CONFIG_MODE_ALL_LOCALES /// ConfigItems could run in different modes: supported values are ... { CONFIG_MODE_IMMEDIATE_UPDATE, CONFIG_MODE_DELAYED_UPDATE, CONFIG_MODE_ALL_LOCALES } 83 //#define DEFAULT_FILTERCACHE_MODE CONFIG_MODE_DELAYED_UPDATE /// ConfigItems could run in different modes: supported values are ... { CONFIG_MODE_IMMEDIATE_UPDATE, CONFIG_MODE_DELAYED_UPDATE, CONFIG_MODE_ALL_LOCALES } 84 85 #define CFG_ENCODING_OPEN DECLARE_ASCII("[\'" ) /// used to start encoding of set names 86 #define CFG_ENCODING_CLOSE DECLARE_ASCII("\']" ) /// used to finish encoding of set names 87 88 //***************************************************************************************************************** 89 // We know some default values ... 90 //***************************************************************************************************************** 91 #define NAME_DEFAULTDETECTOR DECLARE_ASCII("com.sun.star.comp.office.FilterDetect" ) 92 #define NAME_GENERICLOADER DECLARE_ASCII("com.sun.star.comp.office.FrameLoader" ) 93 #define UINAME_GENERICLOADER DECLARE_ASCII("com.sun.star.comp.office.FrameLoader" ) 94 #define TYPELIST_DEFAULTDETECTOR DECLARE_ASCII("*" ) 95 #define TYPELIST_GENERICLOADER DECLARE_ASCII("*" ) 96 97 //***************************************************************************************************************** 98 // This are all supported set-names of our filter configuration. 99 //***************************************************************************************************************** 100 #define SUBLIST_TYPES DECLARE_ASCII("Types" ) 101 #define SUBLIST_FILTERS DECLARE_ASCII("Filters" ) 102 #define SUBLIST_DETECTSERVICES DECLARE_ASCII("DetectServices" ) 103 #define SUBLIST_FRAMELOADERS DECLARE_ASCII("FrameLoaders" ) 104 #define SUBLIST_CONTENTHANDLERS DECLARE_ASCII("ContentHandlers" ) 105 #define SUBLIST_DEFAULTS DECLARE_ASCII("Defaults" ) 106 107 #define TEMPLATENAME_TYPE DECLARE_ASCII("Type" ) 108 #define TEMPLATENAME_FILTER DECLARE_ASCII("Filter" ) 109 #define TEMPLATENAME_DETECTSERVICE DECLARE_ASCII("DetectService" ) 110 #define TEMPLATENAME_FRAMELOADER DECLARE_ASCII("FrameLoader" ) 111 #define TEMPLATENAME_CONTENTHANDLER DECLARE_ASCII("ContentHandler" ) 112 113 //***************************************************************************************************************** 114 // These defines declare all supported names of configuration key names. 115 // They are not sorted and could be shared by different base configuration items. 116 //***************************************************************************************************************** 117 #define SUBKEY_PREFERRED DECLARE_ASCII("Preferred" ) 118 #define SUBKEY_INSTALLED DECLARE_ASCII("Installed" ) 119 #define SUBKEY_NAME DECLARE_ASCII("Name" ) 120 #define SUBKEY_UINAME DECLARE_ASCII("UIName" ) 121 #define SUBKEY_MEDIATYPE DECLARE_ASCII("MediaType" ) 122 #define SUBKEY_CLIPBOARDFORMAT DECLARE_ASCII("ClipboardFormat" ) 123 #define SUBKEY_URLPATTERN DECLARE_ASCII("URLPattern" ) 124 #define SUBKEY_EXTENSIONS DECLARE_ASCII("Extensions" ) 125 #define SUBKEY_DOCUMENTICONID DECLARE_ASCII("DocumentIconID" ) 126 #define SUBKEY_TYPE DECLARE_ASCII("Type" ) 127 #define SUBKEY_DOCUMENTSERVICE DECLARE_ASCII("DocumentService" ) 128 #define SUBKEY_FILTERSERVICE DECLARE_ASCII("FilterService" ) 129 #define SUBKEY_FLAGS DECLARE_ASCII("Flags" ) 130 #define SUBKEY_USERDATA DECLARE_ASCII("UserData" ) 131 #define SUBKEY_FILEFORMATVERSION DECLARE_ASCII("FileFormatVersion" ) 132 #define SUBKEY_TEMPLATENAME DECLARE_ASCII("TemplateName" ) 133 #define SUBKEY_TYPES DECLARE_ASCII("Types" ) 134 #define SUBKEY_ORDER DECLARE_ASCII("Order" ) 135 #define SUBKEY_DEFAULTDETECTOR DECLARE_ASCII("DetectService" ) 136 #define SUBKEY_GENERICLOADER DECLARE_ASCII("FrameLoader" ) 137 #define SUBKEY_DATA DECLARE_ASCII("Data" ) 138 #define SUBKEY_UICOMPONENT DECLARE_ASCII("UIComponent" ) 139 140 //***************************************************************************************************************** 141 // These defines declare all supported property names for our name container interface. 142 // They are not sorted by using ... and could be shared by different methods and access operations. 143 //***************************************************************************************************************** 144 #define PROPERTY_NAME DECLARE_ASCII("Name" ) 145 #define PROPERTY_PREFERRED DECLARE_ASCII("Preferred" ) 146 #define PROPERTY_INSTALLED DECLARE_ASCII("Installed" ) 147 #define PROPERTY_UINAME DECLARE_ASCII("UIName" ) 148 #define PROPERTY_UINAMES DECLARE_ASCII("UINames" ) 149 #define PROPERTY_MEDIATYPE DECLARE_ASCII("MediaType" ) 150 #define PROPERTY_CLIPBOARDFORMAT DECLARE_ASCII("ClipboardFormat" ) 151 #define PROPERTY_URLPATTERN DECLARE_ASCII("URLPattern" ) 152 #define PROPERTY_EXTENSIONS DECLARE_ASCII("Extensions" ) 153 #define PROPERTY_DOCUMENTICONID DECLARE_ASCII("DocumentIconID" ) 154 #define PROPERTY_TYPE DECLARE_ASCII("Type" ) 155 #define PROPERTY_DOCUMENTSERVICE DECLARE_ASCII("DocumentService" ) 156 #define PROPERTY_FILTERSERVICE DECLARE_ASCII("FilterService" ) 157 #define PROPERTY_FLAGS DECLARE_ASCII("Flags" ) 158 #define PROPERTY_USERDATA DECLARE_ASCII("UserData" ) 159 #define PROPERTY_FILEFORMATVERSION DECLARE_ASCII("FileFormatVersion" ) 160 #define PROPERTY_TEMPLATENAME DECLARE_ASCII("TemplateName" ) 161 #define PROPERTY_TYPES DECLARE_ASCII("Types" ) 162 #define PROPERTY_ORDER DECLARE_ASCII("Order" ) 163 #define PROPERTY_UICOMPONENT DECLARE_ASCII("UIComponent" ) 164 165 //_________________________________________________________________________________________________________________ 166 // exported definitions 167 //_________________________________________________________________________________________________________________ 168 169 enum EModifyState 170 { 171 E_UNTOUCHED , 172 E_ADDED , 173 E_CHANGED , 174 E_REMOVED 175 }; 176 177 enum EFilterPackage 178 { 179 E_STANDARD , 180 E_ADDITIONAL 181 }; 182 183 //***************************************************************************************************************** 184 // These struct define a type, which present the type of a file. 185 // He is used for easy filter detection without file stream detection! 186 // The internal name is the keyname of an item with these structure in our hash map or our configuration set! 187 //***************************************************************************************************************** 188 struct FileType 189 { 190 //------------------------------------------------------------------------------------------------------------- 191 // public methods 192 //------------------------------------------------------------------------------------------------------------- 193 public: 194 FileTypeframework::FileType195 inline FileType ( ) { impl_clear(); } FileTypeframework::FileType196 inline FileType ( const FileType& rCopy ) { impl_copy( rCopy ); } ~FileTypeframework::FileType197 inline ~FileType ( ) { impl_clear(); } operator =framework::FileType198 inline FileType& operator= ( const FileType& rCopy ) { return impl_copy( rCopy ); } freeframework::FileType199 inline void free ( ) { impl_clear(); } 200 201 //------------------------------------------------------------------------------------------------------------- 202 // private methods 203 //------------------------------------------------------------------------------------------------------------- 204 private: 205 impl_clearframework::FileType206 inline void impl_clear() 207 { 208 bPreferred = sal_False ; 209 sName = ::rtl::OUString() ; 210 sMediaType = ::rtl::OUString() ; 211 sClipboardFormat = ::rtl::OUString() ; 212 nDocumentIconID = 0 ; 213 lUINames.free (); 214 lURLPattern.free(); 215 lExtensions.free(); 216 } 217 impl_copyframework::FileType218 inline FileType& impl_copy( const FileType& rCopy ) 219 { 220 bPreferred = rCopy.bPreferred ; 221 sName = rCopy.sName ; 222 lUINames = rCopy.lUINames ; 223 sMediaType = rCopy.sMediaType ; 224 sClipboardFormat = rCopy.sClipboardFormat; 225 nDocumentIconID = rCopy.nDocumentIconID ; 226 lURLPattern = rCopy.lURLPattern ; 227 lExtensions = rCopy.lExtensions ; 228 return (*this); 229 } 230 231 //------------------------------------------------------------------------------------------------------------- 232 // public member 233 //------------------------------------------------------------------------------------------------------------- 234 public: 235 236 sal_Bool bPreferred ; 237 ::rtl::OUString sName ; 238 OUStringHashMap lUINames ; 239 ::rtl::OUString sMediaType ; 240 ::rtl::OUString sClipboardFormat ; 241 sal_Int32 nDocumentIconID ; 242 OUStringList lURLPattern ; 243 OUStringList lExtensions ; 244 }; 245 246 //***************************************************************************************************************** 247 // These struct describe a filter which is registered for one type. 248 // He hold information about services which present the document himself (like a item) and a filter service which 249 // filter a file in these document. 250 // The internal name is the keyname of an item with these structure in our hash map or our configuration set! 251 //***************************************************************************************************************** 252 struct Filter 253 { 254 //------------------------------------------------------------------------------------------------------------- 255 // public methods 256 //------------------------------------------------------------------------------------------------------------- 257 public: 258 Filterframework::Filter259 inline Filter ( ) { impl_clear(); } Filterframework::Filter260 inline Filter ( const Filter& rCopy ) { impl_copy( rCopy ); } ~Filterframework::Filter261 inline ~Filter ( ) { impl_clear(); } operator =framework::Filter262 inline Filter& operator= ( const Filter& rCopy ) { return impl_copy( rCopy ); } freeframework::Filter263 inline void free ( ) { impl_clear(); } 264 265 //------------------------------------------------------------------------------------------------------------- 266 // private methods 267 //------------------------------------------------------------------------------------------------------------- 268 private: 269 impl_clearframework::Filter270 inline void impl_clear() 271 { 272 nOrder = 0 ; 273 sName = ::rtl::OUString(); 274 sType = ::rtl::OUString(); 275 sDocumentService = ::rtl::OUString(); 276 sFilterService = ::rtl::OUString(); 277 sUIComponent = ::rtl::OUString(); 278 nFlags = 0 ; 279 nFileFormatVersion = 0 ; 280 sTemplateName = ::rtl::OUString(); 281 lUINames.free (); 282 lUserData.free (); 283 } 284 impl_copyframework::Filter285 inline Filter& impl_copy( const Filter& rCopy ) 286 { 287 nOrder = rCopy.nOrder ; 288 sName = rCopy.sName ; 289 sType = rCopy.sType ; 290 lUINames = rCopy.lUINames ; 291 sDocumentService = rCopy.sDocumentService ; 292 sFilterService = rCopy.sFilterService ; 293 sUIComponent = rCopy.sUIComponent ; 294 nFlags = rCopy.nFlags ; 295 nFileFormatVersion = rCopy.nFileFormatVersion ; 296 sTemplateName = rCopy.sTemplateName ; 297 lUserData = rCopy.lUserData ; 298 return (*this); 299 } 300 301 //------------------------------------------------------------------------------------------------------------- 302 // public member 303 //------------------------------------------------------------------------------------------------------------- 304 public: 305 306 sal_Int32 nOrder ; 307 ::rtl::OUString sName ; 308 ::rtl::OUString sType ; 309 OUStringHashMap lUINames ; 310 ::rtl::OUString sDocumentService ; 311 ::rtl::OUString sFilterService ; 312 ::rtl::OUString sUIComponent ; 313 sal_Int32 nFlags ; 314 OUStringList lUserData ; 315 sal_Int32 nFileFormatVersion ; 316 ::rtl::OUString sTemplateName ; 317 }; 318 319 //***************************************************************************************************************** 320 // Programmer can register his own services for an content detection of different types. 321 // The implementation or service name of these is the keyname of an item with these structure 322 // in our hash map or our configuration set! 323 //***************************************************************************************************************** 324 struct Detector 325 { 326 //------------------------------------------------------------------------------------------------------------- 327 // public methods 328 //------------------------------------------------------------------------------------------------------------- 329 public: 330 Detectorframework::Detector331 inline Detector ( ) { impl_clear(); } Detectorframework::Detector332 inline Detector ( const Detector& rCopy ) { impl_copy( rCopy ); } ~Detectorframework::Detector333 inline ~Detector ( ) { impl_clear(); } operator =framework::Detector334 inline Detector& operator= ( const Detector& rCopy ) { return impl_copy( rCopy ); } freeframework::Detector335 inline void free ( ) { impl_clear(); } 336 337 //------------------------------------------------------------------------------------------------------------- 338 // private methods 339 //------------------------------------------------------------------------------------------------------------- 340 private: 341 impl_clearframework::Detector342 inline void impl_clear() 343 { 344 sName = ::rtl::OUString(); 345 lTypes.free(); 346 } 347 impl_copyframework::Detector348 inline Detector& impl_copy( const Detector& rCopy ) 349 { 350 sName = rCopy.sName ; 351 lTypes = rCopy.lTypes ; 352 return (*this); 353 } 354 355 //------------------------------------------------------------------------------------------------------------- 356 // public member 357 //------------------------------------------------------------------------------------------------------------- 358 public: 359 360 ::rtl::OUString sName ; 361 OUStringList lTypes ; 362 }; 363 364 //***************************************************************************************************************** 365 // Programmer can register his own services for loading documents in a frame. 366 // The implementation or service name of these is the keyname of an item with these structure 367 // in our hash map or our configuration set! 368 //***************************************************************************************************************** 369 struct Loader 370 { 371 //------------------------------------------------------------------------------------------------------------- 372 // public methods 373 //------------------------------------------------------------------------------------------------------------- 374 public: 375 Loaderframework::Loader376 inline Loader ( ) { impl_clear(); } Loaderframework::Loader377 inline Loader ( const Loader& rCopy ) { impl_copy( rCopy ); } ~Loaderframework::Loader378 inline ~Loader ( ) { impl_clear(); } operator =framework::Loader379 inline Loader& operator= ( const Loader& rCopy ) { return impl_copy( rCopy ); } freeframework::Loader380 inline void free ( ) { impl_clear(); } 381 382 //------------------------------------------------------------------------------------------------------------- 383 // private methods 384 //------------------------------------------------------------------------------------------------------------- 385 private: 386 impl_clearframework::Loader387 inline void impl_clear() 388 { 389 sName = ::rtl::OUString(); 390 lUINames.free (); 391 lTypes.free (); 392 } 393 impl_copyframework::Loader394 inline Loader& impl_copy( const Loader& rCopy ) 395 { 396 sName = rCopy.sName ; 397 lUINames = rCopy.lUINames ; 398 lTypes = rCopy.lTypes ; 399 return (*this); 400 } 401 402 //------------------------------------------------------------------------------------------------------------- 403 // public member 404 //------------------------------------------------------------------------------------------------------------- 405 public: 406 407 ::rtl::OUString sName ; 408 OUStringHashMap lUINames ; 409 OUStringList lTypes ; 410 }; 411 412 //***************************************************************************************************************** 413 // Programmer can register his own services to handle a FileType and intercept dispatches. 414 // Don't forget: It's not a FrameLoader - it's a ContentHandler! (normally without any UI) 415 //***************************************************************************************************************** 416 struct ContentHandler 417 { 418 //------------------------------------------------------------------------------------------------------------- 419 // public methods 420 //------------------------------------------------------------------------------------------------------------- 421 public: 422 ContentHandlerframework::ContentHandler423 inline ContentHandler( ) { impl_clear(); } ContentHandlerframework::ContentHandler424 inline ContentHandler( const ContentHandler& rCopy ) { impl_copy( rCopy ); } ~ContentHandlerframework::ContentHandler425 inline ~ContentHandler( ) { impl_clear(); } operator =framework::ContentHandler426 inline ContentHandler& operator= ( const ContentHandler& rCopy ) { return impl_copy( rCopy ); } freeframework::ContentHandler427 inline void free ( ) { impl_clear(); } 428 429 //------------------------------------------------------------------------------------------------------------- 430 // private methods 431 //------------------------------------------------------------------------------------------------------------- 432 private: 433 impl_clearframework::ContentHandler434 inline void impl_clear() 435 { 436 sName = ::rtl::OUString(); 437 lTypes.free(); 438 } 439 impl_copyframework::ContentHandler440 inline ContentHandler& impl_copy( const ContentHandler& rCopy ) 441 { 442 sName = rCopy.sName ; 443 lTypes = rCopy.lTypes; 444 return (*this); 445 } 446 447 //------------------------------------------------------------------------------------------------------------- 448 // public member 449 //------------------------------------------------------------------------------------------------------------- 450 public: 451 452 ::rtl::OUString sName ; 453 OUStringList lTypes ; 454 }; 455 456 //***************************************************************************************************************** 457 // We need different hash maps for different tables of our configuration management. 458 // Follow maps convert <names> to <properties> of type, filter, detector, loader ... 459 // and could be used in a generic way 460 //***************************************************************************************************************** 461 template< class HashType > 462 class SetNodeHash : public ::std::hash_map< ::rtl::OUString , 463 HashType , 464 rtl::OUStringHash , 465 ::std::equal_to< ::rtl::OUString > > 466 { 467 //------------------------------------------------------------------------------------------------------------- 468 // interface 469 //------------------------------------------------------------------------------------------------------------- 470 public: 471 //--------------------------------------------------------------------------------------------------------- 472 // The only way to free ALL memory really! 473 //--------------------------------------------------------------------------------------------------------- free()474 inline void free() 475 { 476 SetNodeHash().swap( *this ); 477 lAddedItems.free (); 478 lChangedItems.free(); 479 lRemovedItems.free(); 480 } 481 482 //--------------------------------------------------------------------------------------------------------- 483 // Append changed, added or removed items to special lists 484 // Necessary for saving changes 485 //--------------------------------------------------------------------------------------------------------- 486 void appendChange( const ::rtl::OUString& sName , 487 EModifyState eState ); 488 489 //------------------------------------------------------------------------------------------------------------- 490 // member 491 //------------------------------------------------------------------------------------------------------------- 492 public: 493 OUStringList lAddedItems ; 494 OUStringList lChangedItems ; 495 OUStringList lRemovedItems ; 496 }; 497 498 //***************************************************************************************************************** 499 // Use these hashes to implement different tables which assign types to frame loader or detect services. 500 // It's an optimism to find registered services faster! 501 // The preferred hash maps file extensions to preferred types to find these ones faster. 502 //***************************************************************************************************************** 503 class PerformanceHash : public ::std::hash_map< ::rtl::OUString , 504 OUStringList , 505 rtl::OUStringHash , 506 ::std::equal_to< ::rtl::OUString > > 507 { 508 public: 509 //--------------------------------------------------------------------------------------------------------- 510 // try to free all used memory REALLY! 511 //--------------------------------------------------------------------------------------------------------- free()512 inline void free() 513 { 514 PerformanceHash().swap( *this ); 515 } 516 517 //--------------------------------------------------------------------------------------------------------- 518 // Normally a complete string must match our hash key values ... 519 // But sometimes we need a search by using these key values as pattern! 520 // The in/out parameter "pStepper" is used to return a pointer to found element in hash ... 521 // and could be used for further searches again, which should be started at next element! 522 // We stop search at the end of hash. You can start it again by setting it to the begin by himself. 523 //--------------------------------------------------------------------------------------------------------- findPatternKey(const::rtl::OUString & sSearchValue,const_iterator & pStepper)524 inline sal_Bool findPatternKey( const ::rtl::OUString& sSearchValue , 525 const_iterator& pStepper ) 526 { 527 sal_Bool bFound = sal_False; 528 529 // If this is the forst call - start search on first element. 530 // Otherwise start search on further elements! 531 if( pStepper != begin() ) 532 { 533 ++pStepper; 534 } 535 536 while( 537 ( pStepper != end() ) && 538 ( bFound == sal_False ) 539 ) 540 { 541 bFound = Wildcard::match( sSearchValue, pStepper->first ); 542 // If element was found - break loop by setting right return value 543 // and don't change "pStepper". He must point to found element! 544 // Otherwise step to next one. 545 if( bFound == sal_False ) 546 ++pStepper; 547 } 548 return bFound; 549 } 550 }; 551 552 //***************************************************************************************************************** 553 // Define easy usable types 554 //***************************************************************************************************************** 555 typedef SetNodeHash< FileType > FileTypeHash ; 556 typedef SetNodeHash< Filter > FilterHash ; 557 typedef SetNodeHash< Detector > DetectorHash ; 558 typedef SetNodeHash< Loader > LoaderHash ; 559 typedef SetNodeHash< ContentHandler > ContentHandlerHash ; 560 typedef OUStringHashMap PreferredHash ; 561 typedef OUStringList OrderList ; 562 563 typedef CheckedIterator< OUStringList > CheckedStringListIterator ; 564 typedef CheckedIterator< FileTypeHash > CheckedTypeIterator ; 565 typedef CheckedIterator< PerformanceHash > CheckedPerformanceIterator ; 566 567 typedef ::std::vector< FilterHash::const_iterator > FilterQuery ; 568 569 //***************************************************************************************************************** 570 // Use private static data container to hold all values of configuration! 571 //***************************************************************************************************************** 572 class DataContainer : private ThreadHelpBase 573 { 574 public: 575 576 /** @short identifies different sets of the TypeDetection configuration package. 577 578 @descr Most functions on top of this configuration package are the same ... 579 but must be executed on different places inside this configuration structures. 580 These enum values can be used ate some interface methods to specify, which 581 configuration set should be used. 582 Further it must be possible to start the same action for more then one cfg type. 583 That's why these values must be interpreted as flags. Means: it's values must be 584 in range [2^n]! 585 */ 586 enum ECFGType 587 { 588 E_TYPE = 1, 589 E_FILTER = 2, 590 E_DETECTSERVICE = 4, 591 E_FRAMELOADER = 8, 592 E_CONTENTHANDLER = 16, 593 594 E_ALL = E_TYPE | E_FILTER | E_DETECTSERVICE | E_FRAMELOADER | E_CONTENTHANDLER 595 }; 596 597 public: 598 599 DataContainer(); 600 601 void startListener(); 602 void stopListener (); 603 604 sal_Bool isModified(); 605 606 LockHelper& getSyncronizer(); 607 void free(); 608 609 sal_Bool isValidOrRepairable () const; 610 sal_Bool validateAndRepair (); 611 sal_Bool validateAndRepairTypes (); 612 sal_Bool validateAndRepairFilter (); 613 sal_Bool validateAndRepairDetectors(); 614 sal_Bool validateAndRepairLoader (); 615 sal_Bool validateAndRepairHandler (); 616 617 sal_Bool existsType ( const ::rtl::OUString& sName ); 618 sal_Bool existsFilter ( const ::rtl::OUString& sName ); 619 sal_Bool existsDetector ( const ::rtl::OUString& sName ); 620 sal_Bool existsLoader ( const ::rtl::OUString& sName ); 621 sal_Bool existsContentHandler ( const ::rtl::OUString& sName ); 622 623 void addType ( const FileType& aType , sal_Bool bSetModified ); 624 void addFilter ( const Filter& aFilter , sal_Bool bSetModified ); 625 void addDetector ( const Detector& aDetector, sal_Bool bSetModified ); 626 void addLoader ( const Loader& aLoader , sal_Bool bSetModified ); 627 void addContentHandler ( const ContentHandler& aHandler , sal_Bool bSetModified ); 628 629 void replaceType ( const FileType& aType , sal_Bool bSetModified ); 630 void replaceFilter ( const Filter& aFilter , sal_Bool bSetModified ); 631 void replaceDetector ( const Detector& aDetector, sal_Bool bSetModified ); 632 void replaceLoader ( const Loader& aLoader , sal_Bool bSetModified ); 633 void replaceContentHandler( const ContentHandler& aHandler , sal_Bool bSetModified ); 634 635 void removeType ( const ::rtl::OUString& sName , sal_Bool bSetModified ); 636 void removeFilter ( const ::rtl::OUString& sName , sal_Bool bSetModified ); 637 void removeDetector ( const ::rtl::OUString& sName , sal_Bool bSetModified ); 638 void removeLoader ( const ::rtl::OUString& sName , sal_Bool bSetModified ); 639 void removeContentHandler ( const ::rtl::OUString& sName , sal_Bool bSetModified ); 640 641 static void convertFileTypeToPropertySequence ( const FileType& aSource , 642 css::uno::Sequence< css::beans::PropertyValue >& lDestination , 643 const ::rtl::OUString& sCurrentLocale ); 644 static void convertFilterToPropertySequence ( const Filter& aSource , 645 css::uno::Sequence< css::beans::PropertyValue >& lDestination , 646 const ::rtl::OUString& sCurrentLocale ); 647 static void convertDetectorToPropertySequence ( const Detector& aSource , 648 css::uno::Sequence< css::beans::PropertyValue >& lDestination ); 649 static void convertLoaderToPropertySequence ( const Loader& aSource , 650 css::uno::Sequence< css::beans::PropertyValue >& lDestination , 651 const ::rtl::OUString& sCurrentLocale ); 652 static void convertContentHandlerToPropertySequence ( const ContentHandler& aSource , 653 css::uno::Sequence< css::beans::PropertyValue >& lDestination ); 654 static void convertPropertySequenceToFilter ( const css::uno::Sequence< css::beans::PropertyValue >& lSource , 655 Filter& aDestination , 656 const ::rtl::OUString& sCurrentLocale ); 657 static void convertPropertySequenceToFileType ( const css::uno::Sequence< css::beans::PropertyValue >& lSource , 658 FileType& aDestination , 659 const ::rtl::OUString& sCurrentLocale ); 660 static void convertPropertySequenceToDetector ( const css::uno::Sequence< css::beans::PropertyValue >& lSource , 661 Detector& aDestination ); 662 static void convertPropertySequenceToLoader ( const css::uno::Sequence< css::beans::PropertyValue >& lSource , 663 Loader& aDestination , 664 const ::rtl::OUString& sCurrentLocale ); 665 static void convertPropertySequenceToContentHandler ( const css::uno::Sequence< css::beans::PropertyValue >& lSource , 666 ContentHandler& aDestination , 667 const ::rtl::OUString& sCurrentLocale ); 668 static void extractLocalizedStrings ( const ::rtl::OUString& sCurrentLocale , 669 const css::uno::Any& aCFGValue , 670 OUStringHashMap& lLocales ); 671 static void packLocalizedStrings ( sal_Int16 nMode , 672 const ::rtl::OUString& sCurrentLocale , 673 css::uno::Any& aCFGValue , 674 const OUStringHashMap& lLocales ); 675 static ::rtl::OUString getLocalelizedString ( const OUStringHashMap& lLocales , 676 const ::rtl::OUString& sLocale ); 677 static void setLocalelizedString ( OUStringHashMap& lLocales , 678 const ::rtl::OUString& sLocale , 679 const ::rtl::OUString& sValue ); 680 static void correctExtensions ( OUStringList& lExtensions ); 681 682 public: 683 684 FileTypeHash m_aTypeCache ; /// hold all informations about registered file types 685 FilterHash m_aFilterCache ; /// hold all informations about registered filters 686 DetectorHash m_aDetectorCache ; /// hold all informations about registered detect services 687 LoaderHash m_aLoaderCache ; /// hold all informations about registered loader services 688 ContentHandlerHash m_aContentHandlerCache ; /// hold all informations about registered content handler services 689 PerformanceHash m_aFastFilterCache ; /// hold all registered filter for a special file type 690 PerformanceHash m_aFastDetectorCache ; /// hold all registered detect services for a special file type 691 PerformanceHash m_aFastLoaderCache ; /// hold all registered loader services for a special file type 692 PerformanceHash m_aFastContentHandlerCache ; /// hold all registered content handler services for a special file type 693 PreferredHash m_aPreferredTypesCache ; /// assignment of extensions to preferred types for it 694 Loader m_aGenericLoader ; /// informations about our default frame loader 695 ::rtl::OUString m_sLocale ; /// current set locale of configuration to handle right UIName from set of all UINames! 696 sal_Bool m_bTypesModified ; 697 sal_Bool m_bFiltersModified ; 698 sal_Bool m_bDetectorsModified ; 699 sal_Bool m_bLoadersModified ; 700 sal_Bool m_bHandlersModified ; 701 }; 702 703 /*-************************************************************************************************************//** 704 @short capsulate configuration access for fiter configuration 705 @descr We use the ConfigItem mechanism to read/write values from/to configuration. 706 This implementation could be used to handle standard AND additional filter configurations in the same way. 707 We set a data container pointer for filling or reading ... this class use it temp. 708 After successfully calling of read(), we can use filled container directly or merge it with an existing one. 709 After successfully calling of write() all values of given data container are flushed to our configuration. 710 711 @implements - 712 @base ConfigItem 713 714 @devstatus ready to use 715 @threadsafe no 716 *//*-*************************************************************************************************************/ 717 class FilterCFGAccess : public ::utl::ConfigItem 718 { 719 //------------------------------------------------------------------------------------------------------------- 720 // interface 721 //------------------------------------------------------------------------------------------------------------- 722 public: 723 FilterCFGAccess ( const ::rtl::OUString& sPath , 724 sal_Int32 nVersion = DEFAULT_FILTERCACHE_VERSION , 725 sal_Int16 nMode = DEFAULT_FILTERCACHE_MODE ); // open configuration 726 virtual ~FilterCFGAccess( ); 727 728 void read ( DataContainer& rData , 729 DataContainer::ECFGType eType ); // read values from configuration into given struct 730 void write ( DataContainer& rData , 731 DataContainer::ECFGType eType ); // write values from given struct to configuration 732 733 static ::rtl::OUString encodeTypeData ( const FileType& aType ); // build own formatted string of type properties 734 static void decodeTypeData ( const ::rtl::OUString& sData , 735 FileType& aType ); 736 static ::rtl::OUString encodeFilterData( const Filter& aFilter ); // build own formatted string of filter properties 737 static void decodeFilterData( const ::rtl::OUString& sData , 738 Filter& aFilter ); 739 static ::rtl::OUString encodeStringList( const OUStringList& lList ); // build own formatted string of OUStringList 740 static OUStringList decodeStringList( const ::rtl::OUString& sValue ); 741 742 void setProductName ( OUStringHashMap& lUINames ); 743 void resetProductName ( OUStringHashMap& lUINames ); 744 745 //------------------------------------------------------------------------------------------------------------- 746 // internal helper 747 //------------------------------------------------------------------------------------------------------------- 748 private: 749 void impl_initKeyCounts ( ); // set right key counts, which are used at reading/writing of set node properties 750 void impl_removeNodes ( OUStringList& rChangesList , // helper to remove list of set nodes 751 const ::rtl::OUString& sTemplateType , 752 const ::rtl::OUString& sSetName ); 753 754 void impl_loadTypes ( DataContainer& rData ); // helper to load configuration parts 755 void impl_loadFilters ( DataContainer& rData ); 756 void impl_loadDetectors ( DataContainer& rData ); 757 void impl_loadLoaders ( DataContainer& rData ); 758 void impl_loadContentHandlers ( DataContainer& rData ); 759 void impl_loadDefaults ( DataContainer& rData ); 760 761 void impl_saveTypes ( DataContainer& rData ); // helper to save configuration parts 762 void impl_saveFilters ( DataContainer& rData ); 763 void impl_saveDetectors ( DataContainer& rData ); 764 void impl_saveLoaders ( DataContainer& rData ); 765 void impl_saveContentHandlers ( DataContainer& rData ); 766 767 //------------------------------------------------------------------------------------------------------------- 768 // debug checks 769 //------------------------------------------------------------------------------------------------------------- 770 private: 771 static sal_Bool implcp_ctor ( const ::rtl::OUString& sPath , // methods to check incoming parameter on our interface methods! 772 sal_Int32 nVersion , 773 sal_Int16 nMode ); 774 static sal_Bool implcp_read ( const DataContainer& rData ); 775 static sal_Bool implcp_write( const DataContainer& rData ); 776 777 //------------------------------------------------------------------------------------------------------------- 778 // member 779 //------------------------------------------------------------------------------------------------------------- 780 private: 781 EFilterPackage m_ePackage ; // ... not really used yet! should split configuration in STANDARD and ADDITIONAL filter 782 sal_Int32 m_nVersion ; // file format version of configuration! (necessary for "xml2xcd" transformation!) 783 sal_Int32 m_nKeyCountTypes ; // follow key counts present count of configuration properties for types/filters ... and depends from m_nVersion - must be set right! 784 sal_Int32 m_nKeyCountFilters ; 785 sal_Int32 m_nKeyCountDetectors ; 786 sal_Int32 m_nKeyCountLoaders ; 787 sal_Int32 m_nKeyCountContentHandlers ; 788 ::rtl::OUString m_sProductName ; 789 ::rtl::OUString m_sFormatVersion ; 790 }; 791 /*DRAFT 792 class FilterCFGListener : public css::util::XChangesListener 793 , private ThreadHelpBase 794 , public ::cppu::OWeakObject 795 { 796 public: 797 798 enum ECFGType 799 { 800 E_TYPE , 801 E_FILTER , 802 E_LOADER , 803 E_DETECTOR , 804 E_CONTENTHANDLER 805 }; 806 807 private: 808 809 // read only access to the configuration, where we are regsieterd as changes listener. 810 css::uno::Reference< css::uno::XInterface > m_xCFG; 811 812 // indicates, for which type of configuration item we listen. 813 ECFGType m_eType; 814 815 DataContainer* m_pData; 816 817 // we must know, if we are already registered as listener or not. 818 // That can be useful to suppress double registration calls ... 819 // which may will force double call backs in our disposing method! 820 // Such superflous calls can be dangerous. 821 sal_Bool m_bListening; 822 823 public: 824 825 DECLARE_XINTERFACE 826 827 FilterCFGListener( const css::uno::Reference< css::lang::XMultiServiceFactory >& xSMGR , 828 ECFGType eType , 829 DataContainer* pData ); 830 831 void startListening(); 832 void stopListening (); 833 834 virtual void SAL_CALL changesOccurred( const css::util::ChangesEvent& aEvent ) throw(css::uno::RuntimeException); 835 virtual void SAL_CALL disposing ( const css::lang::EventObject& aEvent ) throw(css::uno::RuntimeException); 836 837 private: 838 839 FileType impl_readType ( const css::uno::Reference< css::uno::XInterface >& xNode ); 840 Filter impl_readFilter ( const css::uno::Reference< css::uno::XInterface >& xNode ); 841 Detector impl_readDetector( const css::uno::Reference< css::uno::XInterface >& xNode ); 842 Loader impl_readLoader ( const css::uno::Reference< css::uno::XInterface >& xNode ); 843 ContentHandler impl_readHandler ( const css::uno::Reference< css::uno::XInterface >& xNode ); 844 }; 845 */ 846 847 } // namespace framework 848 849 #endif // #ifndef __FRAMEWORK_CLASSES_FILTERCACHEDATA_HXX_ 850