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 // MARKER(update_precomp.py): autogen include statement, do not remove 25 #include "precompiled_unotools.hxx" 26 #ifndef GCC 27 #endif 28 29 //_________________________________________________________________________________________________________________ 30 // includes 31 //_________________________________________________________________________________________________________________ 32 33 #include <deque> 34 35 #include <unotools/internaloptions.hxx> 36 #include <unotools/configmgr.hxx> 37 #include <unotools/configitem.hxx> 38 #include <tools/debug.hxx> 39 #include <com/sun/star/uno/Any.hxx> 40 #include <com/sun/star/uno/Sequence.hxx> 41 #include <com/sun/star/beans/PropertyValue.hpp> 42 43 #include <rtl/logfile.hxx> 44 #include "itemholder1.hxx" 45 46 //_________________________________________________________________________________________________________________ 47 // namespaces 48 //_________________________________________________________________________________________________________________ 49 50 using namespace ::utl ; 51 using namespace ::rtl ; 52 using namespace ::osl ; 53 using namespace ::std ; 54 using namespace ::com::sun::star::uno ; 55 using namespace ::com::sun::star::beans ; 56 57 //_________________________________________________________________________________________________________________ 58 // const 59 //_________________________________________________________________________________________________________________ 60 61 #define ROOTNODE_INTERNAL OUString(RTL_CONSTASCII_USTRINGPARAM("Office.Common/Internal" )) 62 #define DEFAULT_SLOTCFG sal_False 63 #define DEFAULT_SENDCRASHMAIL sal_False 64 #define DEFAULT_USEMAILUI sal_True 65 #define DEFAULT_CURRENTTEMPURL OUString(RTL_CONSTASCII_USTRINGPARAM("")) 66 67 #define FIXPROPERTYNAME_SLOTCFG OUString(RTL_CONSTASCII_USTRINGPARAM("Slot" )) 68 #define FIXPROPERTYNAME_SENDCRASHMAIL OUString(RTL_CONSTASCII_USTRINGPARAM("SendCrashMail" )) 69 #define FIXPROPERTYNAME_USEMAILUI OUString(RTL_CONSTASCII_USTRINGPARAM("UseMailUI" )) 70 #define FIXPROPERTYNAME_CURRENTTEMPURL OUString(RTL_CONSTASCII_USTRINGPARAM("CurrentTempURL" )) 71 //#define FIXPROPERTYNAME_REMOVEMENUENTRYCLOSE OUString(RTL_CONSTASCII_USTRINGPARAM("RemoveMenuEntryClose")) 72 //#define FIXPROPERTYNAME_REMOVEMENUENTRYBACKTOWEBTOP OUString(RTL_CONSTASCII_USTRINGPARAM("RemoveMenuEntryBackToWebtop")) 73 //#define FIXPROPERTYNAME_REMOVEMENUENTRYNEWWEBTOP OUString(RTL_CONSTASCII_USTRINGPARAM("RemoveMenuEntryNewWebtop")) 74 //#define FIXPROPERTYNAME_REMOVEMENUENTRYLOGOUT OUString(RTL_CONSTASCII_USTRINGPARAM("RemoveMenuEntryLogout")) 75 76 #define FIXPROPERTYHANDLE_SLOTCFG 0 77 #define FIXPROPERTYHANDLE_SENDCRASHMAIL 1 78 #define FIXPROPERTYHANDLE_USEMAILUI 2 79 #define FIXPROPERTYHANDLE_CURRENTTEMPURL 3 80 //#define FIXPROPERTYHANDLE_REMOVEMENUENTRYCLOSE 3 81 //#define FIXPROPERTYHANDLE_REMOVEMENUENTRYBACKTOWEBTOP 4 82 //#define FIXPROPERTYHANDLE_REMOVEMENUENTRYNEWWEBTOP 5 83 //#define FIXPROPERTYHANDLE_REMOVEMENUENTRYLOGOUT 6 84 85 #define FIXPROPERTYCOUNT 4 86 /* 87 #define PROPERTYNAME_RECOVERYLIST OUString(RTL_CONSTASCII_USTRINGPARAM("RecoveryList" )) 88 #define PROPERTYNAME_URL OUString(RTL_CONSTASCII_USTRINGPARAM("OrgURL" )) 89 #define PROPERTYNAME_FILTER OUString(RTL_CONSTASCII_USTRINGPARAM("FilterName" )) 90 #define PROPERTYNAME_TEMPNAME OUString(RTL_CONSTASCII_USTRINGPARAM("TempURL" )) 91 92 #define OFFSET_URL 0 93 #define OFFSET_FILTER 1 94 #define OFFSET_TEMPNAME 2 95 */ 96 #define PATHDELIMITER OUString(RTL_CONSTASCII_USTRINGPARAM("/" )) 97 #define FIXR OUString(RTL_CONSTASCII_USTRINGPARAM("r" )) 98 99 //_________________________________________________________________________________________________________________ 100 // private declarations! 101 //_________________________________________________________________________________________________________________ 102 /* 103 struct tIMPL_RecoveryEntry 104 { 105 OUString sURL ; 106 OUString sFilter ; 107 OUString sTempName ; 108 109 tIMPL_RecoveryEntry() 110 { 111 sURL = OUString(); 112 sFilter = OUString(); 113 sTempName = OUString(); 114 } 115 116 tIMPL_RecoveryEntry( const OUString& sNewURL , 117 const OUString& sNewFilter , 118 const OUString& sNewTempName ) 119 { 120 sURL = sNewURL ; 121 sFilter = sNewFilter ; 122 sTempName = sNewTempName ; 123 } 124 }; 125 126 typedef deque< tIMPL_RecoveryEntry > tIMPL_RecoveryStack; 127 */ 128 class SvtInternalOptions_Impl : public ConfigItem 129 { 130 //------------------------------------------------------------------------------------------------------------- 131 // private member 132 //------------------------------------------------------------------------------------------------------------- 133 134 private: 135 136 sal_Bool m_bRemoveMenuEntryClose; 137 sal_Bool m_bRemoveMenuEntryBackToWebtop; 138 sal_Bool m_bRemoveMenuEntryNewWebtop; 139 sal_Bool m_bRemoveMenuEntryLogout; 140 sal_Bool m_bSlotCFG ; /// cache "Slot" of Internal section 141 sal_Bool m_bSendCrashMail ; /// cache "SendCrashMail" of Internal section 142 sal_Bool m_bUseMailUI; 143 OUString m_aCurrentTempURL ; 144 // tIMPL_RecoveryStack m_aRecoveryList ; /// cache "RecoveryList" of Internal section 145 //------------------------------------------------------------------------------------------------------------- 146 // public methods 147 //------------------------------------------------------------------------------------------------------------- 148 149 public: 150 151 //--------------------------------------------------------------------------------------------------------- 152 // constructor / destructor 153 //--------------------------------------------------------------------------------------------------------- 154 155 SvtInternalOptions_Impl(); 156 ~SvtInternalOptions_Impl(); 157 158 //--------------------------------------------------------------------------------------------------------- 159 // overloaded methods of baseclass 160 //--------------------------------------------------------------------------------------------------------- 161 162 /*-****************************************************************************************************//** 163 @short called for notify of configmanager 164 @descr These method is called from the ConfigManager before application ends or from the 165 PropertyChangeListener if the sub tree broadcasts changes. You must update your 166 internal values. 167 168 @seealso baseclass ConfigItem 169 170 @param "seqPropertyNames" is the list of properties which should be updated. 171 @return - 172 173 @onerror - 174 *//*-*****************************************************************************************************/ 175 176 virtual void Notify( const Sequence< OUString >& ) 177 { 178 DBG_ASSERT( sal_False, "SvtInternalOptions::Notify()\nNot used yet ... but called!?\n" ); 179 } 180 181 /*-****************************************************************************************************//** 182 @short write changes to configuration 183 @descr These method writes the changed values into the sub tree 184 and should always called in our destructor to guarantee consistency of config data. 185 186 @seealso baseclass ConfigItem 187 188 @param - 189 @return - 190 191 @onerror - 192 *//*-*****************************************************************************************************/ 193 194 virtual void Commit(); 195 196 //--------------------------------------------------------------------------------------------------------- 197 // public interface 198 //--------------------------------------------------------------------------------------------------------- 199 200 /*-****************************************************************************************************//** 201 @short access method to get internal values 202 @descr These method give us a chance to regulate acces to ouer internal values. 203 It's not used in the moment - but it's possible for the feature! 204 205 @seealso - 206 207 @param - 208 @return - 209 210 @onerror - 211 *//*-*****************************************************************************************************/ 212 213 sal_Bool IsRemoveMenuEntryClose() const { return m_bRemoveMenuEntryClose; } 214 sal_Bool IsRemoveMenuEntryBackToWebtop() const { return m_bRemoveMenuEntryBackToWebtop; } 215 sal_Bool IsRemoveMenuEntryNewWebtop() const { return m_bRemoveMenuEntryNewWebtop; } 216 sal_Bool IsRemoveMenuEntryLogout() const { return m_bRemoveMenuEntryLogout; } 217 sal_Bool SlotCFGEnabled () const { return m_bSlotCFG; } 218 sal_Bool CrashMailEnabled () const { return m_bSendCrashMail; } 219 sal_Bool MailUIEnabled () const { return m_bUseMailUI; } 220 221 OUString GetCurrentTempURL() const { return m_aCurrentTempURL; } 222 void SetCurrentTempURL( const OUString& aNewCurrentTempURL ); 223 /* 224 void PushRecoveryItem ( const OUString& sURL , 225 const OUString& sFilter , 226 const OUString& sTempName ); 227 void PopRecoveryItem ( OUString& sURL , 228 OUString& sFilter , 229 OUString& sTempName ); 230 sal_Bool IsRecoveryListEmpty ( ) const; 231 */ 232 //------------------------------------------------------------------------------------------------------------- 233 // private methods 234 //------------------------------------------------------------------------------------------------------------- 235 236 private: 237 238 /*-****************************************************************************************************//** 239 @short return list of fix key names of ouer configuration management which represent oue module tree 240 @descr These methods return a static const list of key names. We need it to get needed values from our 241 configuration management. We return well known key names only - because the "UserData" node 242 is handled in a special way! 243 244 @seealso - 245 246 @param - 247 @return A list of needed configuration keys is returned. 248 249 @onerror - 250 *//*-*****************************************************************************************************/ 251 252 Sequence< OUString > impl_GetPropertyNames(); 253 }; 254 255 //_________________________________________________________________________________________________________________ 256 // definitions 257 //_________________________________________________________________________________________________________________ 258 259 //***************************************************************************************************************** 260 // constructor 261 //***************************************************************************************************************** 262 SvtInternalOptions_Impl::SvtInternalOptions_Impl() 263 // Init baseclasses first 264 : ConfigItem ( ROOTNODE_INTERNAL, CONFIG_MODE_IMMEDIATE_UPDATE ) 265 // Init member then. 266 , m_bRemoveMenuEntryClose ( sal_False ) 267 , m_bRemoveMenuEntryBackToWebtop ( sal_False ) 268 , m_bRemoveMenuEntryNewWebtop ( sal_False ) 269 , m_bRemoveMenuEntryLogout ( sal_False ) 270 , m_bSlotCFG ( DEFAULT_SLOTCFG ) 271 , m_bSendCrashMail ( DEFAULT_SENDCRASHMAIL ) 272 , m_bUseMailUI ( DEFAULT_USEMAILUI ) 273 , m_aCurrentTempURL ( DEFAULT_CURRENTTEMPURL ) 274 { 275 // Use our list of configuration keys to get his values. 276 // structure of internal section: (first 2 entries are fixed - all other are member of a set!) 277 // "Slot" 278 // "SendCrashMail" 279 // "RecoveryList/r1/URL" 280 // "RecoveryList/r1/Filter" 281 // "RecoveryList/r1/TempName" 282 // "RecoveryList/r2/URL" 283 // "RecoveryList/r2/Filter" 284 // "RecoveryList/r2/TempName" 285 // "RecoveryList/.." 286 Sequence< OUString > seqNames = impl_GetPropertyNames() ; 287 Sequence< Any > seqValues = GetProperties( seqNames ) ; 288 289 // Safe impossible cases. 290 // We need values from ALL configuration keys. 291 // Follow assignment use order of values in relation to our list of key names! 292 DBG_ASSERT( !(seqNames.getLength()!=seqValues.getLength()), "SvtInternalOptions_Impl::SvtInternalOptions_Impl()\nI miss some values of configuration keys!\n" ); 293 294 // Read fixed values first! 295 DBG_ASSERT(!(seqValues[FIXPROPERTYHANDLE_SLOTCFG].getValueTypeClass()!=TypeClass_BOOLEAN) , "SvtInternalOptions_Impl::SvtInternalOptions_Impl()\nWho has changed the value type of \"Office.Common\\Internal\\Slot\"?" ); 296 DBG_ASSERT(!(seqValues[FIXPROPERTYHANDLE_SENDCRASHMAIL].getValueTypeClass()!=TypeClass_BOOLEAN) , "SvtInternalOptions_Impl::SvtInternalOptions_Impl()\nWho has changed the value type of \"Office.Common\\Internal\\SendCrashMail\"?" ); 297 seqValues[FIXPROPERTYHANDLE_SLOTCFG ] >>= m_bSlotCFG ; 298 seqValues[FIXPROPERTYHANDLE_SENDCRASHMAIL ] >>= m_bSendCrashMail ; 299 seqValues[FIXPROPERTYHANDLE_USEMAILUI ] >>= m_bUseMailUI ; 300 seqValues[FIXPROPERTYHANDLE_CURRENTTEMPURL ] >>= m_aCurrentTempURL ; 301 // seqValues[FIXPROPERTYHANDLE_REMOVEMENUENTRYCLOSE ] >>= m_bRemoveMenuEntryClose ; 302 // seqValues[FIXPROPERTYHANDLE_REMOVEMENUENTRYBACKTOWEBTOP ] >>= m_bRemoveMenuEntryBackToWebtop ; 303 // seqValues[FIXPROPERTYHANDLE_REMOVEMENUENTRYNEWWEBTOP ] >>= m_bRemoveMenuEntryNewWebtop ; 304 // seqValues[FIXPROPERTYHANDLE_REMOVEMENUENTRYLOGOUT ] >>= m_bRemoveMenuEntryLogout ; 305 /* 306 // Read dynamical set "RecoveryList" then. 307 // 3 subkeys for every item! 308 // Attention: Start at next element after last fixed entry! We must ignore "Slot" and "SendCrashMail" ... 309 tIMPL_RecoveryEntry aEntry; 310 sal_uInt32 nCount = seqValues.getLength() ; 311 sal_uInt32 nPosition = FIXPROPERTYCOUNT ; 312 313 while( nPosition<nCount ) 314 { 315 seqValues[nPosition] >>= aEntry.sURL ; 316 ++nPosition; 317 seqValues[nPosition] >>= aEntry.sFilter ; 318 ++nPosition; 319 seqValues[nPosition] >>= aEntry.sTempName ; 320 ++nPosition; 321 m_aRecoveryList.push_front( aEntry ); 322 } 323 */ 324 // We don't need any notifications here. 325 // "Slot" and "SendCrashMail" are readonly(!) and our recovery list should not modified during runtime - it's used 326 // by our crash guard only ... otherwise we have a big problem. 327 } 328 329 //***************************************************************************************************************** 330 // destructor 331 //***************************************************************************************************************** 332 SvtInternalOptions_Impl::~SvtInternalOptions_Impl() 333 { 334 if( IsModified() == sal_True ) 335 { 336 Commit(); 337 } 338 } 339 340 //***************************************************************************************************************** 341 // public method 342 //***************************************************************************************************************** 343 void SvtInternalOptions_Impl::Commit() 344 { 345 // We have to write our current temp URL 346 Sequence< OUString > aNames( 1 ); 347 OUString* pNames = aNames.getArray(); 348 Sequence< Any > aValues( 1 ); 349 Any* pValues = aValues.getArray(); 350 351 pNames[0] = FIXPROPERTYNAME_CURRENTTEMPURL; 352 pValues[0] <<= m_aCurrentTempURL; 353 354 PutProperties( aNames, aValues ); 355 356 /* 357 // Write set of dynamic properties then. 358 ClearNodeSet( PROPERTYNAME_RECOVERYLIST ); 359 360 tIMPL_RecoveryEntry aItem ; 361 OUString sNode ; 362 Sequence< PropertyValue > seqPropertyValues( 3 ) ; // Every node in set has 3 sub-nodes!( url, filter, tempname ) 363 364 // Copy list entries to save-list and write it to configuration. 365 366 sal_uInt32 nCount = m_aRecoveryList.size(); 367 for( sal_uInt32 nItem=0; nItem<nCount; ++nItem ) 368 { 369 aItem = m_aRecoveryList.top(); 370 m_aRecoveryList.pop(); 371 sNode = PROPERTYNAME_RECOVERYLIST + PATHDELIMITER + FIXR + OUString::valueOf( (sal_Int32)nItem ) + PATHDELIMITER; 372 seqPropertyValues[OFFSET_URL ].Name = sNode + PROPERTYNAME_URL ; 373 seqPropertyValues[OFFSET_FILTER ].Name = sNode + PROPERTYNAME_FILTER ; 374 seqPropertyValues[OFFSET_TEMPNAME ].Name = sNode + PROPERTYNAME_TEMPNAME ; 375 seqPropertyValues[OFFSET_URL ].Value <<= aItem.sURL ; 376 seqPropertyValues[OFFSET_FILTER ].Value <<= aItem.sFilter ; 377 seqPropertyValues[OFFSET_TEMPNAME ].Value <<= aItem.sTempName ; 378 379 SetSetProperties( PROPERTYNAME_RECOVERYLIST, seqPropertyValues ); 380 } 381 382 tIMPL_RecoveryStack::iterator iRecovery = m_aRecoveryList.begin(); 383 for ( sal_uInt32 nItem=0; iRecovery != m_aRecoveryList.end(); ++nItem, ++iRecovery) 384 { 385 aItem = *iRecovery; 386 sNode = PROPERTYNAME_RECOVERYLIST + PATHDELIMITER + FIXR + 387 OUString::valueOf( (sal_Int32)nItem ) + PATHDELIMITER; 388 seqPropertyValues[OFFSET_URL ].Name = sNode + PROPERTYNAME_URL ; 389 seqPropertyValues[OFFSET_FILTER ].Name = sNode + PROPERTYNAME_FILTER ; 390 seqPropertyValues[OFFSET_TEMPNAME ].Name = sNode + PROPERTYNAME_TEMPNAME ; 391 seqPropertyValues[OFFSET_URL ].Value <<= iRecovery->sURL ; 392 seqPropertyValues[OFFSET_FILTER ].Value <<= iRecovery->sFilter ; 393 seqPropertyValues[OFFSET_TEMPNAME ].Value <<= iRecovery->sTempName ; 394 SetSetProperties( PROPERTYNAME_RECOVERYLIST, seqPropertyValues ); 395 } 396 397 */ 398 } 399 400 //***************************************************************************************************************** 401 // public method 402 //***************************************************************************************************************** 403 void SvtInternalOptions_Impl::SetCurrentTempURL( const OUString& aNewCurrentTempURL ) 404 { 405 m_aCurrentTempURL = aNewCurrentTempURL; 406 SetModified(); 407 Commit(); 408 } 409 410 #if 0 411 //***************************************************************************************************************** 412 // public method 413 //***************************************************************************************************************** 414 void SvtInternalOptions_Impl::PushRecoveryItem( const OUString& sURL , 415 const OUString& sFilter , 416 const OUString& sTempName ) 417 { 418 tIMPL_RecoveryEntry aEntry( sURL, sFilter, sTempName ); 419 m_aRecoveryList.push_front( aEntry ); 420 SetModified(); 421 } 422 423 //***************************************************************************************************************** 424 // public method 425 //***************************************************************************************************************** 426 void SvtInternalOptions_Impl::PopRecoveryItem( OUString& sURL , 427 OUString& sFilter , 428 OUString& sTempName ) 429 { 430 tIMPL_RecoveryEntry aEntry = m_aRecoveryList.front(); 431 m_aRecoveryList.pop_front(); 432 SetModified(); // Don't forget it - we delete an entry here! 433 sURL = aEntry.sURL ; 434 sFilter = aEntry.sFilter ; 435 sTempName = aEntry.sTempName ; 436 } 437 438 //***************************************************************************************************************** 439 // public method 440 //***************************************************************************************************************** 441 sal_Bool SvtInternalOptions_Impl::IsRecoveryListEmpty() const 442 { 443 return ( m_aRecoveryList.empty() ); 444 } 445 #endif 446 447 //***************************************************************************************************************** 448 // private method 449 //***************************************************************************************************************** 450 Sequence< OUString > SvtInternalOptions_Impl::impl_GetPropertyNames() 451 { 452 /* 453 // First get ALL names of current existing list items in configuration! 454 Sequence< OUString > seqRecoveryItems = GetNodeNames( PROPERTYNAME_RECOVERYLIST ); 455 // Get information about list counts ... 456 sal_Int32 nRecoveryCount = seqRecoveryItems.getLength(); 457 // ... and create a property list with right size! (+2...for fix properties!) (*3 ... = sub nodes for every set node!) 458 Sequence< OUString > seqProperties( FIXPROPERTYCOUNT + (nRecoveryCount*3) ); 459 */ 460 Sequence< OUString > seqProperties(4); 461 462 // Add names of fix properties to list. 463 seqProperties[FIXPROPERTYHANDLE_SLOTCFG ] = FIXPROPERTYNAME_SLOTCFG ; 464 seqProperties[FIXPROPERTYHANDLE_SENDCRASHMAIL ] = FIXPROPERTYNAME_SENDCRASHMAIL ; 465 seqProperties[FIXPROPERTYHANDLE_USEMAILUI ] = FIXPROPERTYNAME_USEMAILUI ; 466 seqProperties[FIXPROPERTYHANDLE_CURRENTTEMPURL ] = FIXPROPERTYNAME_CURRENTTEMPURL ; 467 // seqProperties[FIXPROPERTYHANDLE_REMOVEMENUENTRYCLOSE ] = FIXPROPERTYNAME_REMOVEMENUENTRYCLOSE; 468 // seqProperties[FIXPROPERTYHANDLE_REMOVEMENUENTRYBACKTOWEBTOP ] = FIXPROPERTYNAME_REMOVEMENUENTRYBACKTOWEBTOP; 469 // seqProperties[FIXPROPERTYHANDLE_REMOVEMENUENTRYNEWWEBTOP ] = FIXPROPERTYNAME_REMOVEMENUENTRYNEWWEBTOP; 470 // seqProperties[FIXPROPERTYHANDLE_REMOVEMENUENTRYLOGOUT ] = FIXPROPERTYNAME_REMOVEMENUENTRYLOGOUT; 471 /* 472 sal_uInt32 nPosition = FIXPROPERTYCOUNT; 473 // Add names for recovery list to list. 474 // 3 subkeys for every item! 475 // nPosition is the start point of an list item, nItem an index into right list of node names! 476 for( sal_Int32 nItem=0; nItem<nRecoveryCount; ++nItem ) 477 { 478 seqProperties[nPosition] = PROPERTYNAME_RECOVERYLIST + PATHDELIMITER + seqRecoveryItems[nItem] + PATHDELIMITER + PROPERTYNAME_URL ; 479 ++nPosition; 480 seqProperties[nPosition] = PROPERTYNAME_RECOVERYLIST + PATHDELIMITER + seqRecoveryItems[nItem] + PATHDELIMITER + PROPERTYNAME_FILTER ; 481 ++nPosition; 482 seqProperties[nPosition] = PROPERTYNAME_RECOVERYLIST + PATHDELIMITER + seqRecoveryItems[nItem] + PATHDELIMITER + PROPERTYNAME_TEMPNAME ; 483 ++nPosition; 484 } 485 */ 486 // Return result. 487 return seqProperties; 488 } 489 490 //***************************************************************************************************************** 491 // initialize static member 492 // DON'T DO IT IN YOUR HEADER! 493 // see definition for further informations 494 //***************************************************************************************************************** 495 SvtInternalOptions_Impl* SvtInternalOptions::m_pDataContainer = NULL ; 496 sal_Int32 SvtInternalOptions::m_nRefCount = 0 ; 497 498 //***************************************************************************************************************** 499 // constructor 500 //***************************************************************************************************************** 501 SvtInternalOptions::SvtInternalOptions() 502 { 503 // Global access, must be guarded (multithreading!). 504 MutexGuard aGuard( GetOwnStaticMutex() ); 505 // Increase ouer refcount ... 506 ++m_nRefCount; 507 // ... and initialize ouer data container only if it not already! 508 if( m_pDataContainer == NULL ) 509 { 510 RTL_LOGFILE_CONTEXT(aLog, "unotools ( ??? ) ::SvtInternalOptions_Impl::ctor()"); 511 m_pDataContainer = new SvtInternalOptions_Impl(); 512 513 ItemHolder1::holdConfigItem(E_INTERNALOPTIONS); 514 } 515 } 516 517 //***************************************************************************************************************** 518 // destructor 519 //***************************************************************************************************************** 520 SvtInternalOptions::~SvtInternalOptions() 521 { 522 // Global access, must be guarded (multithreading!) 523 MutexGuard aGuard( GetOwnStaticMutex() ); 524 // Decrease ouer refcount. 525 --m_nRefCount; 526 // If last instance was deleted ... 527 // we must destroy ouer static data container! 528 if( m_nRefCount <= 0 ) 529 { 530 delete m_pDataContainer; 531 m_pDataContainer = NULL; 532 } 533 } 534 535 //***************************************************************************************************************** 536 // public method 537 //***************************************************************************************************************** 538 sal_Bool SvtInternalOptions::SlotCFGEnabled() const 539 { 540 MutexGuard aGuard( GetOwnStaticMutex() ); 541 return m_pDataContainer->SlotCFGEnabled(); 542 } 543 544 //***************************************************************************************************************** 545 // public method 546 //***************************************************************************************************************** 547 sal_Bool SvtInternalOptions::CrashMailEnabled() const 548 { 549 MutexGuard aGuard( GetOwnStaticMutex() ); 550 return m_pDataContainer->CrashMailEnabled(); 551 } 552 553 //***************************************************************************************************************** 554 // public method 555 //***************************************************************************************************************** 556 sal_Bool SvtInternalOptions::MailUIEnabled() const 557 { 558 MutexGuard aGuard( GetOwnStaticMutex() ); 559 return m_pDataContainer->MailUIEnabled(); 560 } 561 562 //***************************************************************************************************************** 563 // public methods 564 //***************************************************************************************************************** 565 sal_Bool SvtInternalOptions::IsRemoveMenuEntryClose() const 566 { 567 MutexGuard aGuard( GetOwnStaticMutex() ); 568 return m_pDataContainer->IsRemoveMenuEntryClose(); 569 } 570 571 sal_Bool SvtInternalOptions::IsRemoveMenuEntryBackToWebtop() const 572 { 573 MutexGuard aGuard( GetOwnStaticMutex() ); 574 return m_pDataContainer->IsRemoveMenuEntryBackToWebtop(); 575 } 576 577 sal_Bool SvtInternalOptions::IsRemoveMenuEntryNewWebtop() const 578 { 579 MutexGuard aGuard( GetOwnStaticMutex() ); 580 return m_pDataContainer->IsRemoveMenuEntryNewWebtop(); 581 } 582 583 sal_Bool SvtInternalOptions::IsRemoveMenuEntryLogout() const 584 { 585 MutexGuard aGuard( GetOwnStaticMutex() ); 586 return m_pDataContainer->IsRemoveMenuEntryLogout(); 587 } 588 589 OUString SvtInternalOptions::GetCurrentTempURL() const 590 { 591 MutexGuard aGuard( GetOwnStaticMutex() ); 592 return m_pDataContainer->GetCurrentTempURL(); 593 } 594 595 void SvtInternalOptions::SetCurrentTempURL( const OUString& aNewCurrentTempURL ) 596 { 597 MutexGuard aGuard( GetOwnStaticMutex() ); 598 m_pDataContainer->SetCurrentTempURL( aNewCurrentTempURL ); 599 } 600 601 //***************************************************************************************************************** 602 // private method 603 //***************************************************************************************************************** 604 Mutex& SvtInternalOptions::GetOwnStaticMutex() 605 { 606 // Initialize static mutex only for one time! 607 static Mutex* pMutex = NULL; 608 // If these method first called (Mutex not already exist!) ... 609 if( pMutex == NULL ) 610 { 611 // ... we must create a new one. Protect follow code with the global mutex - 612 // It must be - we create a static variable! 613 MutexGuard aGuard( Mutex::getGlobalMutex() ); 614 // We must check our pointer again - because it can be that another instance of ouer class will be fastr then these! 615 if( pMutex == NULL ) 616 { 617 // Create the new mutex and set it for return on static variable. 618 static Mutex aMutex; 619 pMutex = &aMutex; 620 } 621 } 622 // Return new created or already existing mutex object. 623 return *pMutex; 624 } 625