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 // MARKER(update_precomp.py): autogen include statement, do not remove 29 #include "precompiled_unotools.hxx" 30 #ifndef GCC 31 #endif 32 33 //_________________________________________________________________________________________________________________ 34 // includes 35 //_________________________________________________________________________________________________________________ 36 37 #include <unotools/cacheoptions.hxx> 38 #include <unotools/configmgr.hxx> 39 #include <unotools/configitem.hxx> 40 #include <tools/debug.hxx> 41 #include <com/sun/star/uno/Any.hxx> 42 #include <com/sun/star/uno/Sequence.hxx> 43 44 //_________________________________________________________________________________________________________________ 45 // namespaces 46 //_________________________________________________________________________________________________________________ 47 48 using namespace ::utl; 49 using namespace ::rtl; 50 using namespace ::osl; 51 using namespace ::com::sun::star::uno; 52 53 //_________________________________________________________________________________________________________________ 54 // const 55 //_________________________________________________________________________________________________________________ 56 57 #define ROOTNODE_START OUString(RTL_CONSTASCII_USTRINGPARAM("Office.Common/Cache" )) 58 #define DEFAULT_WRITEROLE 20 59 #define DEFAULT_DRAWINGOLE 20 60 #define DEFAULT_GRFMGR_TOTALSIZE 10000000 61 #define DEFAULT_GRFMGR_OBJECTSIZE 2400000 62 #define DEFAULT_GRFMGR_OBJECTRELEASE 600 63 64 #define PROPERTYNAME_WRITEROLE OUString(RTL_CONSTASCII_USTRINGPARAM("Writer/OLE_Objects")) 65 #define PROPERTYNAME_DRAWINGOLE OUString(RTL_CONSTASCII_USTRINGPARAM("DrawingEngine/OLE_Objects")) 66 #define PROPERTYNAME_GRFMGR_TOTALSIZE OUString(RTL_CONSTASCII_USTRINGPARAM("GraphicManager/TotalCacheSize")) 67 #define PROPERTYNAME_GRFMGR_OBJECTSIZE OUString(RTL_CONSTASCII_USTRINGPARAM("GraphicManager/ObjectCacheSize")) 68 #define PROPERTYNAME_GRFMGR_OBJECTRELEASE OUString(RTL_CONSTASCII_USTRINGPARAM("GraphicManager/ObjectReleaseTime")) 69 70 #define PROPERTYHANDLE_WRITEROLE 0 71 #define PROPERTYHANDLE_DRAWINGOLE 1 72 #define PROPERTYHANDLE_GRFMGR_TOTALSIZE 2 73 #define PROPERTYHANDLE_GRFMGR_OBJECTSIZE 3 74 #define PROPERTYHANDLE_GRFMGR_OBJECTRELEASE 4 75 76 #define PROPERTYCOUNT 5 77 78 class SvtCacheOptions_Impl : public ConfigItem 79 { 80 public: 81 82 //--------------------------------------------------------------------------------------------------------- 83 // constructor / destructor 84 //--------------------------------------------------------------------------------------------------------- 85 86 SvtCacheOptions_Impl(); 87 ~SvtCacheOptions_Impl(); 88 89 //--------------------------------------------------------------------------------------------------------- 90 // overloaded methods of baseclass 91 //--------------------------------------------------------------------------------------------------------- 92 93 virtual void Commit(); 94 virtual void Notify( const com::sun::star::uno::Sequence< rtl::OUString >& aPropertyNames ); 95 96 //--------------------------------------------------------------------------------------------------------- 97 // public interface 98 //--------------------------------------------------------------------------------------------------------- 99 100 sal_Int32 GetWriterOLE_Objects() const; 101 sal_Int32 GetDrawingEngineOLE_Objects() const; 102 sal_Int32 GetGraphicManagerTotalCacheSize() const; 103 sal_Int32 GetGraphicManagerObjectCacheSize() const; 104 sal_Int32 GetGraphicManagerObjectReleaseTime() const; 105 106 void SetWriterOLE_Objects( sal_Int32 nObjects ); 107 void SetDrawingEngineOLE_Objects( sal_Int32 nObjects ); 108 void SetGraphicManagerTotalCacheSize( sal_Int32 nTotalCacheSize ); 109 void SetGraphicManagerObjectCacheSize( sal_Int32 nObjectCacheSize ); 110 void SetGraphicManagerObjectReleaseTime( sal_Int32 nReleaseTimeSeconds ); 111 112 //------------------------------------------------------------------------------------------------------------- 113 // private methods 114 //------------------------------------------------------------------------------------------------------------- 115 116 private: 117 118 static Sequence< OUString > impl_GetPropertyNames(); 119 120 //------------------------------------------------------------------------------------------------------------- 121 // private member 122 //------------------------------------------------------------------------------------------------------------- 123 124 private: 125 126 sal_Int32 mnWriterOLE; 127 sal_Int32 mnDrawingOLE; 128 sal_Int32 mnGrfMgrTotalSize; 129 sal_Int32 mnGrfMgrObjectSize; 130 sal_Int32 mnGrfMgrObjectRelease; 131 }; 132 133 //_________________________________________________________________________________________________________________ 134 // definitions 135 //_________________________________________________________________________________________________________________ 136 137 //***************************************************************************************************************** 138 // constructor 139 //***************************************************************************************************************** 140 SvtCacheOptions_Impl::SvtCacheOptions_Impl() : 141 ConfigItem( ROOTNODE_START ), 142 mnWriterOLE( DEFAULT_WRITEROLE ), 143 mnDrawingOLE( DEFAULT_DRAWINGOLE ), 144 mnGrfMgrTotalSize( DEFAULT_GRFMGR_TOTALSIZE ), 145 mnGrfMgrObjectSize( DEFAULT_GRFMGR_OBJECTSIZE ), 146 mnGrfMgrObjectRelease( DEFAULT_GRFMGR_OBJECTRELEASE ) 147 { 148 Sequence< OUString > seqNames( impl_GetPropertyNames() ); 149 Sequence< Any > seqValues = GetProperties( seqNames ) ; 150 151 DBG_ASSERT( !(seqNames.getLength()!=seqValues.getLength()), "SvtCacheOptions_Impl::SvtCacheOptions_Impl()\nI miss some values of configuration keys!\n" ); 152 153 // Copy values from list in right order to ouer internal member. 154 sal_Int32 nPropertyCount = seqValues.getLength(); 155 sal_Int32 nProperty = 0; 156 157 for( nProperty=0; nProperty<nPropertyCount; ++nProperty ) 158 { 159 if( seqValues[ nProperty ].hasValue() ) 160 { 161 switch( nProperty ) 162 { 163 case PROPERTYHANDLE_WRITEROLE: 164 { 165 if( seqValues[ nProperty ].getValueTypeClass() == TypeClass_LONG ) 166 seqValues[nProperty] >>= mnWriterOLE; 167 } 168 break; 169 170 case PROPERTYHANDLE_DRAWINGOLE: 171 { 172 if( seqValues[ nProperty ].getValueTypeClass() == TypeClass_LONG ) 173 seqValues[nProperty] >>= mnDrawingOLE; 174 } 175 break; 176 177 case PROPERTYHANDLE_GRFMGR_TOTALSIZE: 178 { 179 if( seqValues[ nProperty ].getValueTypeClass() == TypeClass_LONG ) 180 seqValues[nProperty] >>= mnGrfMgrTotalSize; 181 } 182 break; 183 184 case PROPERTYHANDLE_GRFMGR_OBJECTSIZE: 185 { 186 if( seqValues[ nProperty ].getValueTypeClass() == TypeClass_LONG ) 187 seqValues[nProperty] >>= mnGrfMgrObjectSize; 188 } 189 break; 190 191 case PROPERTYHANDLE_GRFMGR_OBJECTRELEASE: 192 { 193 if( seqValues[ nProperty ].getValueTypeClass() == TypeClass_LONG ) 194 seqValues[nProperty] >>= mnGrfMgrObjectRelease; 195 } 196 break; 197 } 198 } 199 } 200 } 201 202 //***************************************************************************************************************** 203 // destructor 204 //***************************************************************************************************************** 205 SvtCacheOptions_Impl::~SvtCacheOptions_Impl() 206 { 207 if( IsModified() ) 208 Commit(); 209 } 210 211 //***************************************************************************************************************** 212 // Commit 213 //***************************************************************************************************************** 214 void SvtCacheOptions_Impl::Commit() 215 { 216 Sequence< OUString > aSeqNames( impl_GetPropertyNames() ); 217 Sequence< Any > aSeqValues( aSeqNames.getLength() ); 218 219 for( sal_Int32 nProperty = 0, nCount = aSeqNames.getLength(); nProperty < nCount; ++nProperty ) 220 { 221 switch( nProperty ) 222 { 223 case PROPERTYHANDLE_WRITEROLE: 224 aSeqValues[nProperty] <<= mnWriterOLE; 225 break; 226 227 case PROPERTYHANDLE_DRAWINGOLE: 228 aSeqValues[nProperty] <<= mnDrawingOLE; 229 break; 230 231 case PROPERTYHANDLE_GRFMGR_TOTALSIZE: 232 aSeqValues[nProperty] <<= mnGrfMgrTotalSize; 233 break; 234 235 case PROPERTYHANDLE_GRFMGR_OBJECTSIZE: 236 aSeqValues[nProperty] <<= mnGrfMgrObjectSize; 237 break; 238 239 case PROPERTYHANDLE_GRFMGR_OBJECTRELEASE: 240 aSeqValues[nProperty] <<= mnGrfMgrObjectRelease; 241 break; 242 } 243 } 244 245 PutProperties( aSeqNames, aSeqValues ); 246 } 247 248 void SvtCacheOptions_Impl::Notify( const Sequence< rtl::OUString >& ) 249 { 250 } 251 252 //***************************************************************************************************************** 253 // public method 254 //***************************************************************************************************************** 255 sal_Int32 SvtCacheOptions_Impl::GetWriterOLE_Objects() const 256 { 257 return mnWriterOLE; 258 } 259 260 //***************************************************************************************************************** 261 // public method 262 //***************************************************************************************************************** 263 sal_Int32 SvtCacheOptions_Impl::GetDrawingEngineOLE_Objects() const 264 { 265 return mnDrawingOLE; 266 } 267 268 //***************************************************************************************************************** 269 // public method 270 //***************************************************************************************************************** 271 sal_Int32 SvtCacheOptions_Impl::GetGraphicManagerTotalCacheSize() const 272 { 273 return mnGrfMgrTotalSize; 274 } 275 276 //***************************************************************************************************************** 277 // public method 278 //***************************************************************************************************************** 279 sal_Int32 SvtCacheOptions_Impl::GetGraphicManagerObjectCacheSize() const 280 { 281 return mnGrfMgrObjectSize; 282 } 283 284 //***************************************************************************************************************** 285 // public method 286 //***************************************************************************************************************** 287 sal_Int32 SvtCacheOptions_Impl::GetGraphicManagerObjectReleaseTime() const 288 { 289 return mnGrfMgrObjectRelease; 290 } 291 292 //***************************************************************************************************************** 293 // public method 294 //***************************************************************************************************************** 295 void SvtCacheOptions_Impl::SetWriterOLE_Objects( sal_Int32 nWriterOLE ) 296 { 297 mnWriterOLE = nWriterOLE; 298 SetModified(); 299 } 300 301 //***************************************************************************************************************** 302 // public method 303 //***************************************************************************************************************** 304 void SvtCacheOptions_Impl::SetDrawingEngineOLE_Objects( sal_Int32 nDrawingOLE ) 305 { 306 mnDrawingOLE = nDrawingOLE; 307 SetModified(); 308 } 309 310 //***************************************************************************************************************** 311 // public method 312 //***************************************************************************************************************** 313 void SvtCacheOptions_Impl::SetGraphicManagerTotalCacheSize( sal_Int32 nGrfMgrTotalSize ) 314 { 315 mnGrfMgrTotalSize = nGrfMgrTotalSize; 316 SetModified(); 317 } 318 319 //***************************************************************************************************************** 320 // public method 321 //***************************************************************************************************************** 322 void SvtCacheOptions_Impl::SetGraphicManagerObjectCacheSize( sal_Int32 nGrfMgrObjectSize ) 323 { 324 mnGrfMgrObjectSize = nGrfMgrObjectSize; 325 SetModified(); 326 } 327 328 //***************************************************************************************************************** 329 // public method 330 //***************************************************************************************************************** 331 void SvtCacheOptions_Impl::SetGraphicManagerObjectReleaseTime( sal_Int32 nGrfMgrObjectReleaseTime ) 332 { 333 mnGrfMgrObjectRelease = nGrfMgrObjectReleaseTime; 334 SetModified(); 335 } 336 337 //***************************************************************************************************************** 338 // private method 339 //***************************************************************************************************************** 340 Sequence< OUString > SvtCacheOptions_Impl::impl_GetPropertyNames() 341 { 342 // Build static list of configuration key names. 343 static const OUString pProperties[] = 344 { 345 PROPERTYNAME_WRITEROLE, 346 PROPERTYNAME_DRAWINGOLE, 347 PROPERTYNAME_GRFMGR_TOTALSIZE, 348 PROPERTYNAME_GRFMGR_OBJECTSIZE, 349 PROPERTYNAME_GRFMGR_OBJECTRELEASE 350 }; 351 // Initialize return sequence with these list ... 352 static const Sequence< OUString > seqPropertyNames( pProperties, PROPERTYCOUNT ); 353 // ... and return it. 354 return seqPropertyNames; 355 } 356 357 //***************************************************************************************************************** 358 // initialize static member 359 // DON'T DO IT IN YOUR HEADER! 360 // see definition for further informations 361 //***************************************************************************************************************** 362 SvtCacheOptions_Impl* SvtCacheOptions::m_pDataContainer = NULL; 363 sal_Int32 SvtCacheOptions::m_nRefCount = 0; 364 365 //***************************************************************************************************************** 366 // constructor 367 //***************************************************************************************************************** 368 SvtCacheOptions::SvtCacheOptions() 369 { 370 // Global access, must be guarded (multithreading!). 371 MutexGuard aGuard( GetOwnStaticMutex() ); 372 // Increase ouer refcount ... 373 ++m_nRefCount; 374 // ... and initialize ouer data container only if it not already! 375 if( m_pDataContainer == NULL ) 376 { 377 m_pDataContainer = new SvtCacheOptions_Impl(); 378 } 379 } 380 381 //***************************************************************************************************************** 382 // destructor 383 //***************************************************************************************************************** 384 SvtCacheOptions::~SvtCacheOptions() 385 { 386 // Global access, must be guarded (multithreading!) 387 MutexGuard aGuard( GetOwnStaticMutex() ); 388 // Decrease ouer refcount. 389 --m_nRefCount; 390 // If last instance was deleted ... 391 // we must destroy ouer static data container! 392 if( m_nRefCount <= 0 ) 393 { 394 delete m_pDataContainer; 395 m_pDataContainer = NULL; 396 } 397 } 398 399 //***************************************************************************************************************** 400 // public method 401 //***************************************************************************************************************** 402 sal_Int32 SvtCacheOptions::GetWriterOLE_Objects() const 403 { 404 MutexGuard aGuard( GetOwnStaticMutex() ); 405 return m_pDataContainer->GetWriterOLE_Objects(); 406 } 407 408 //***************************************************************************************************************** 409 // public method 410 //***************************************************************************************************************** 411 sal_Int32 SvtCacheOptions::GetDrawingEngineOLE_Objects() const 412 { 413 MutexGuard aGuard( GetOwnStaticMutex() ); 414 return m_pDataContainer->GetDrawingEngineOLE_Objects(); 415 } 416 417 //***************************************************************************************************************** 418 // public method 419 //***************************************************************************************************************** 420 sal_Int32 SvtCacheOptions::GetGraphicManagerTotalCacheSize() const 421 { 422 MutexGuard aGuard( GetOwnStaticMutex() ); 423 return m_pDataContainer->GetGraphicManagerTotalCacheSize(); 424 } 425 426 //***************************************************************************************************************** 427 // public method 428 //***************************************************************************************************************** 429 sal_Int32 SvtCacheOptions::GetGraphicManagerObjectCacheSize() const 430 { 431 MutexGuard aGuard( GetOwnStaticMutex() ); 432 return m_pDataContainer->GetGraphicManagerObjectCacheSize(); 433 } 434 435 //***************************************************************************************************************** 436 // public method 437 //***************************************************************************************************************** 438 sal_Int32 SvtCacheOptions::GetGraphicManagerObjectReleaseTime() const 439 { 440 MutexGuard aGuard( GetOwnStaticMutex() ); 441 return m_pDataContainer->GetGraphicManagerObjectReleaseTime(); 442 } 443 444 //***************************************************************************************************************** 445 // public method 446 //***************************************************************************************************************** 447 void SvtCacheOptions::SetWriterOLE_Objects( sal_Int32 nWriterOLE ) 448 { 449 MutexGuard aGuard( GetOwnStaticMutex() ); 450 m_pDataContainer->SetWriterOLE_Objects( nWriterOLE ); 451 } 452 453 //***************************************************************************************************************** 454 // public method 455 //***************************************************************************************************************** 456 void SvtCacheOptions::SetDrawingEngineOLE_Objects( sal_Int32 nDrawingOLE ) 457 { 458 MutexGuard aGuard( GetOwnStaticMutex() ); 459 m_pDataContainer->SetDrawingEngineOLE_Objects( nDrawingOLE ); 460 } 461 462 //***************************************************************************************************************** 463 // public method 464 //***************************************************************************************************************** 465 void SvtCacheOptions::SetGraphicManagerTotalCacheSize( sal_Int32 nGrfMgrTotalSize ) 466 { 467 MutexGuard aGuard( GetOwnStaticMutex() ); 468 m_pDataContainer->SetGraphicManagerTotalCacheSize( nGrfMgrTotalSize ); 469 } 470 471 //***************************************************************************************************************** 472 // public method 473 //***************************************************************************************************************** 474 void SvtCacheOptions::SetGraphicManagerObjectCacheSize( sal_Int32 nGrfMgrObjectSize ) 475 { 476 MutexGuard aGuard( GetOwnStaticMutex() ); 477 m_pDataContainer->SetGraphicManagerObjectCacheSize( nGrfMgrObjectSize ); 478 } 479 480 //***************************************************************************************************************** 481 // public method 482 //***************************************************************************************************************** 483 void SvtCacheOptions::SetGraphicManagerObjectReleaseTime( sal_Int32 nGrfMgrObjectReleaseTime ) 484 { 485 MutexGuard aGuard( GetOwnStaticMutex() ); 486 m_pDataContainer->SetGraphicManagerObjectReleaseTime( nGrfMgrObjectReleaseTime ); 487 } 488 489 //***************************************************************************************************************** 490 // private method 491 //***************************************************************************************************************** 492 Mutex& SvtCacheOptions::GetOwnStaticMutex() 493 { 494 // Initialize static mutex only for one time! 495 static Mutex* pMutex = NULL; 496 // If these method first called (Mutex not already exist!) ... 497 if( pMutex == NULL ) 498 { 499 // ... we must create a new one. Protect follow code with the global mutex - 500 // It must be - we create a static variable! 501 MutexGuard aGuard( Mutex::getGlobalMutex() ); 502 // We must check our pointer again - because it can be that another instance of ouer class will be fastr then these! 503 if( pMutex == NULL ) 504 { 505 // Create the new mutex and set it for return on static variable. 506 static Mutex aMutex; 507 pMutex = &aMutex; 508 } 509 } 510 // Return new created or already existing mutex object. 511 return *pMutex; 512 } 513