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