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