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