1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_unotools.hxx"
26*b1cdbd2cSJim Jagielski #ifndef GCC
27*b1cdbd2cSJim Jagielski #endif
28*b1cdbd2cSJim Jagielski 
29*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
30*b1cdbd2cSJim Jagielski //	includes
31*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
32*b1cdbd2cSJim Jagielski 
33*b1cdbd2cSJim Jagielski #include <unotools/startoptions.hxx>
34*b1cdbd2cSJim Jagielski #include <unotools/configmgr.hxx>
35*b1cdbd2cSJim Jagielski #include <unotools/configitem.hxx>
36*b1cdbd2cSJim Jagielski #include <tools/debug.hxx>
37*b1cdbd2cSJim Jagielski #include <com/sun/star/uno/Any.hxx>
38*b1cdbd2cSJim Jagielski #include <com/sun/star/uno/Sequence.hxx>
39*b1cdbd2cSJim Jagielski 
40*b1cdbd2cSJim Jagielski #include <rtl/logfile.hxx>
41*b1cdbd2cSJim Jagielski #include "itemholder1.hxx"
42*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
43*b1cdbd2cSJim Jagielski //	namespaces
44*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
45*b1cdbd2cSJim Jagielski 
46*b1cdbd2cSJim Jagielski using namespace ::utl					;
47*b1cdbd2cSJim Jagielski using namespace ::rtl					;
48*b1cdbd2cSJim Jagielski using namespace ::osl					;
49*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::uno	;
50*b1cdbd2cSJim Jagielski 
51*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
52*b1cdbd2cSJim Jagielski //	const
53*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
54*b1cdbd2cSJim Jagielski 
55*b1cdbd2cSJim Jagielski #define	DEFAULT_SHOWINTRO				sal_True
56*b1cdbd2cSJim Jagielski #define	DEFAULT_CONNECTIONURL			OUString()
57*b1cdbd2cSJim Jagielski 
58*b1cdbd2cSJim Jagielski #define	ROOTNODE_START			   		OUString(RTL_CONSTASCII_USTRINGPARAM("Setup/Office"	))
59*b1cdbd2cSJim Jagielski #define	PROPERTYNAME_SHOWINTRO			OUString(RTL_CONSTASCII_USTRINGPARAM("ooSetupShowIntro"	))
60*b1cdbd2cSJim Jagielski #define	PROPERTYNAME_CONNECTIONURL		OUString(RTL_CONSTASCII_USTRINGPARAM("ooSetupConnectionURL"	))
61*b1cdbd2cSJim Jagielski 
62*b1cdbd2cSJim Jagielski #define	PROPERTYHANDLE_SHOWINTRO		0
63*b1cdbd2cSJim Jagielski #define	PROPERTYHANDLE_CONNECTIONURL	1
64*b1cdbd2cSJim Jagielski 
65*b1cdbd2cSJim Jagielski #define	PROPERTYCOUNT					2
66*b1cdbd2cSJim Jagielski 
67*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
68*b1cdbd2cSJim Jagielski //	private declarations!
69*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
70*b1cdbd2cSJim Jagielski 
71*b1cdbd2cSJim Jagielski class SvtStartOptions_Impl : public ConfigItem
72*b1cdbd2cSJim Jagielski {
73*b1cdbd2cSJim Jagielski 	//-------------------------------------------------------------------------------------------------------------
74*b1cdbd2cSJim Jagielski 	//	public methods
75*b1cdbd2cSJim Jagielski 	//-------------------------------------------------------------------------------------------------------------
76*b1cdbd2cSJim Jagielski 
77*b1cdbd2cSJim Jagielski 	public:
78*b1cdbd2cSJim Jagielski 
79*b1cdbd2cSJim Jagielski 		//---------------------------------------------------------------------------------------------------------
80*b1cdbd2cSJim Jagielski 		//	constructor / destructor
81*b1cdbd2cSJim Jagielski 		//---------------------------------------------------------------------------------------------------------
82*b1cdbd2cSJim Jagielski 
83*b1cdbd2cSJim Jagielski 		 SvtStartOptions_Impl();
84*b1cdbd2cSJim Jagielski 		~SvtStartOptions_Impl();
85*b1cdbd2cSJim Jagielski 
86*b1cdbd2cSJim Jagielski 		//---------------------------------------------------------------------------------------------------------
87*b1cdbd2cSJim Jagielski 		//	overloaded methods of baseclass
88*b1cdbd2cSJim Jagielski 		//---------------------------------------------------------------------------------------------------------
89*b1cdbd2cSJim Jagielski 
90*b1cdbd2cSJim Jagielski 		/*-****************************************************************************************************//**
91*b1cdbd2cSJim Jagielski 			@short		called for notify of configmanager
92*b1cdbd2cSJim Jagielski 			@descr		These method is called from the ConfigManager before application ends or from the
93*b1cdbd2cSJim Jagielski 			 			PropertyChangeListener if the sub tree broadcasts changes. You must update your
94*b1cdbd2cSJim Jagielski 						internal values.
95*b1cdbd2cSJim Jagielski 
96*b1cdbd2cSJim Jagielski 			@ATTENTION	We don't implement these method - because we support readonly values at runtime only!
97*b1cdbd2cSJim Jagielski 
98*b1cdbd2cSJim Jagielski 			@seealso	baseclass ConfigItem
99*b1cdbd2cSJim Jagielski 
100*b1cdbd2cSJim Jagielski 			@param		"seqPropertyNames" is the list of properties which should be updated.
101*b1cdbd2cSJim Jagielski 			@return		-
102*b1cdbd2cSJim Jagielski 
103*b1cdbd2cSJim Jagielski 			@onerror	-
104*b1cdbd2cSJim Jagielski 		*//*-*****************************************************************************************************/
105*b1cdbd2cSJim Jagielski 
106*b1cdbd2cSJim Jagielski     	virtual void Notify( const Sequence< OUString >& seqPropertyNames );
107*b1cdbd2cSJim Jagielski 
108*b1cdbd2cSJim Jagielski 		/*-****************************************************************************************************//**
109*b1cdbd2cSJim Jagielski 			@short		write changes to configuration
110*b1cdbd2cSJim Jagielski 			@descr		These method writes the changed values into the sub tree
111*b1cdbd2cSJim Jagielski 						and should always called in our destructor to guarantee consistency of config data.
112*b1cdbd2cSJim Jagielski 
113*b1cdbd2cSJim Jagielski 			@ATTENTION	We don't implement these method - because we support readonly values at runtime only!
114*b1cdbd2cSJim Jagielski 
115*b1cdbd2cSJim Jagielski 			@seealso	baseclass ConfigItem
116*b1cdbd2cSJim Jagielski 
117*b1cdbd2cSJim Jagielski 			@param		-
118*b1cdbd2cSJim Jagielski 			@return		-
119*b1cdbd2cSJim Jagielski 
120*b1cdbd2cSJim Jagielski 			@onerror	-
121*b1cdbd2cSJim Jagielski 		*//*-*****************************************************************************************************/
122*b1cdbd2cSJim Jagielski 
123*b1cdbd2cSJim Jagielski     	virtual void Commit();
124*b1cdbd2cSJim Jagielski 
125*b1cdbd2cSJim Jagielski 		//---------------------------------------------------------------------------------------------------------
126*b1cdbd2cSJim Jagielski 		//	public interface
127*b1cdbd2cSJim Jagielski 		//---------------------------------------------------------------------------------------------------------
128*b1cdbd2cSJim Jagielski 
129*b1cdbd2cSJim Jagielski 		/*-****************************************************************************************************//**
130*b1cdbd2cSJim Jagielski 			@short		access method to get internal values
131*b1cdbd2cSJim Jagielski 			@descr		These method give us a chance to regulate acces to ouer internal values.
132*b1cdbd2cSJim Jagielski 						It's not used in the moment - but it's possible for the feature!
133*b1cdbd2cSJim Jagielski 
134*b1cdbd2cSJim Jagielski 			@seealso	-
135*b1cdbd2cSJim Jagielski 
136*b1cdbd2cSJim Jagielski 			@param		-
137*b1cdbd2cSJim Jagielski 			@return		-
138*b1cdbd2cSJim Jagielski 
139*b1cdbd2cSJim Jagielski 			@onerror	-
140*b1cdbd2cSJim Jagielski 		*//*-*****************************************************************************************************/
141*b1cdbd2cSJim Jagielski 
142*b1cdbd2cSJim Jagielski 		sal_Bool	IsIntroEnabled	(						) const	;
143*b1cdbd2cSJim Jagielski 		void		EnableIntro		( sal_Bool bState		)		;
144*b1cdbd2cSJim Jagielski 		OUString	GetConnectionURL(						) const	;
145*b1cdbd2cSJim Jagielski 		void		SetConnectionURL( const OUString& sURL	)		;
146*b1cdbd2cSJim Jagielski 
147*b1cdbd2cSJim Jagielski 	//-------------------------------------------------------------------------------------------------------------
148*b1cdbd2cSJim Jagielski 	//	private methods
149*b1cdbd2cSJim Jagielski 	//-------------------------------------------------------------------------------------------------------------
150*b1cdbd2cSJim Jagielski 
151*b1cdbd2cSJim Jagielski 	private:
152*b1cdbd2cSJim Jagielski 
153*b1cdbd2cSJim Jagielski 		/*-****************************************************************************************************//**
154*b1cdbd2cSJim Jagielski 			@short		return list of fix key names of ouer configuration management which represent oue module tree
155*b1cdbd2cSJim Jagielski 			@descr		These methods return a static const list of key names. We need it to get needed values from our
156*b1cdbd2cSJim Jagielski 						configuration management. We return well known key names only - because the "UserData" node
157*b1cdbd2cSJim Jagielski 						is handled in a special way!
158*b1cdbd2cSJim Jagielski 
159*b1cdbd2cSJim Jagielski 			@seealso	-
160*b1cdbd2cSJim Jagielski 
161*b1cdbd2cSJim Jagielski 			@param		-
162*b1cdbd2cSJim Jagielski 			@return		A list of needed configuration keys is returned.
163*b1cdbd2cSJim Jagielski 
164*b1cdbd2cSJim Jagielski 			@onerror	-
165*b1cdbd2cSJim Jagielski 		*//*-*****************************************************************************************************/
166*b1cdbd2cSJim Jagielski 
167*b1cdbd2cSJim Jagielski 		static Sequence< OUString > impl_GetPropertyNames();
168*b1cdbd2cSJim Jagielski 
169*b1cdbd2cSJim Jagielski 	//-------------------------------------------------------------------------------------------------------------
170*b1cdbd2cSJim Jagielski 	//	private member
171*b1cdbd2cSJim Jagielski 	//-------------------------------------------------------------------------------------------------------------
172*b1cdbd2cSJim Jagielski 
173*b1cdbd2cSJim Jagielski 	private:
174*b1cdbd2cSJim Jagielski 
175*b1cdbd2cSJim Jagielski 		sal_Bool	m_bShowIntro		;	/// cache "ShowIntro" of Start section
176*b1cdbd2cSJim Jagielski 		OUString	m_sConnectionURL	;	/// cache "Connection" of Start section
177*b1cdbd2cSJim Jagielski };
178*b1cdbd2cSJim Jagielski 
179*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
180*b1cdbd2cSJim Jagielski //	definitions
181*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
182*b1cdbd2cSJim Jagielski 
183*b1cdbd2cSJim Jagielski //*****************************************************************************************************************
184*b1cdbd2cSJim Jagielski //	constructor
185*b1cdbd2cSJim Jagielski //*****************************************************************************************************************
SvtStartOptions_Impl()186*b1cdbd2cSJim Jagielski SvtStartOptions_Impl::SvtStartOptions_Impl()
187*b1cdbd2cSJim Jagielski 	// Init baseclasses first
188*b1cdbd2cSJim Jagielski     :	ConfigItem			( ROOTNODE_START	)
189*b1cdbd2cSJim Jagielski 	// Init member then.
190*b1cdbd2cSJim Jagielski 	,	m_bShowIntro		( DEFAULT_SHOWINTRO	)
191*b1cdbd2cSJim Jagielski {
192*b1cdbd2cSJim Jagielski 	// Use our static list of configuration keys to get his values.
193*b1cdbd2cSJim Jagielski 	Sequence< OUString >	seqNames	= impl_GetPropertyNames();
194*b1cdbd2cSJim Jagielski 	Sequence< Any >			seqValues	= GetProperties( seqNames )	;
195*b1cdbd2cSJim Jagielski 
196*b1cdbd2cSJim Jagielski 	// Safe impossible cases.
197*b1cdbd2cSJim Jagielski 	// We need values from ALL configuration keys.
198*b1cdbd2cSJim Jagielski 	// Follow assignment use order of values in relation to our list of key names!
199*b1cdbd2cSJim Jagielski 	DBG_ASSERT( !(seqNames.getLength()!=seqValues.getLength()), "SvtStartOptions_Impl::SvtStartOptions_Impl()\nI miss some values of configuration keys!\n" );
200*b1cdbd2cSJim Jagielski 
201*b1cdbd2cSJim Jagielski 	// Copy values from list in right order to ouer internal member.
202*b1cdbd2cSJim Jagielski 	sal_Int32 nPropertyCount	=	seqValues.getLength()	;
203*b1cdbd2cSJim Jagielski 	sal_Int32 nProperty			=	0						;
204*b1cdbd2cSJim Jagielski 	for( nProperty=0; nProperty<nPropertyCount; ++nProperty )
205*b1cdbd2cSJim Jagielski 	{
206*b1cdbd2cSJim Jagielski 		// Safe impossible cases.
207*b1cdbd2cSJim Jagielski 		// Check any for valid value.
208*b1cdbd2cSJim Jagielski 		DBG_ASSERT( !(seqValues[nProperty].hasValue()==sal_False), "SvtStartOptions_Impl::SvtStartOptions_Impl()\nInvalid property value for property detected!\n" );
209*b1cdbd2cSJim Jagielski         switch( nProperty )
210*b1cdbd2cSJim Jagielski         {
211*b1cdbd2cSJim Jagielski             case PROPERTYHANDLE_SHOWINTRO		:	{
212*b1cdbd2cSJim Jagielski 										 	   			DBG_ASSERT(!(seqValues[nProperty].getValueTypeClass()!=TypeClass_BOOLEAN), "SvtStartOptions_Impl::SvtStartOptions_Impl()\nWho has changed the value type of \"Office.Common\\Start\\ShowIntro\"?" );
213*b1cdbd2cSJim Jagielski 														seqValues[nProperty] >>= m_bShowIntro;
214*b1cdbd2cSJim Jagielski 													}
215*b1cdbd2cSJim Jagielski 													break;
216*b1cdbd2cSJim Jagielski 
217*b1cdbd2cSJim Jagielski             case PROPERTYHANDLE_CONNECTIONURL	:	{
218*b1cdbd2cSJim Jagielski 										 				DBG_ASSERT(!(seqValues[nProperty].getValueTypeClass()!=TypeClass_STRING), "SvtStartOptions_Impl::SvtStartOptions_Impl()\nWho has changed the value type of \"Office.Common\\Start\\Connection\"?" );
219*b1cdbd2cSJim Jagielski 														seqValues[nProperty] >>= m_sConnectionURL;
220*b1cdbd2cSJim Jagielski 													}
221*b1cdbd2cSJim Jagielski 													break;
222*b1cdbd2cSJim Jagielski         }
223*b1cdbd2cSJim Jagielski 	}
224*b1cdbd2cSJim Jagielski 
225*b1cdbd2cSJim Jagielski 	// Don't enable notification mechanism of ouer baseclass!
226*b1cdbd2cSJim Jagielski 	// We support readonly variables in the moment.
227*b1cdbd2cSJim Jagielski }
228*b1cdbd2cSJim Jagielski 
229*b1cdbd2cSJim Jagielski //*****************************************************************************************************************
230*b1cdbd2cSJim Jagielski //	destructor
231*b1cdbd2cSJim Jagielski //*****************************************************************************************************************
~SvtStartOptions_Impl()232*b1cdbd2cSJim Jagielski SvtStartOptions_Impl::~SvtStartOptions_Impl()
233*b1cdbd2cSJim Jagielski {
234*b1cdbd2cSJim Jagielski 	// We must save our current values .. if user forget it!
235*b1cdbd2cSJim Jagielski 	if( IsModified() == sal_True )
236*b1cdbd2cSJim Jagielski 	{
237*b1cdbd2cSJim Jagielski 		Commit();
238*b1cdbd2cSJim Jagielski 	}
239*b1cdbd2cSJim Jagielski }
240*b1cdbd2cSJim Jagielski 
241*b1cdbd2cSJim Jagielski //*****************************************************************************************************************
242*b1cdbd2cSJim Jagielski //	public method
243*b1cdbd2cSJim Jagielski //*****************************************************************************************************************
Notify(const Sequence<OUString> & seqPropertyNames)244*b1cdbd2cSJim Jagielski void SvtStartOptions_Impl::Notify( const Sequence< OUString >& seqPropertyNames )
245*b1cdbd2cSJim Jagielski {
246*b1cdbd2cSJim Jagielski 	// Use given list of updated properties to get his values from configuration directly!
247*b1cdbd2cSJim Jagielski 	Sequence< Any > seqValues = GetProperties( seqPropertyNames );
248*b1cdbd2cSJim Jagielski 	// Safe impossible cases.
249*b1cdbd2cSJim Jagielski 	// We need values from ALL notified configuration keys.
250*b1cdbd2cSJim Jagielski 	DBG_ASSERT( !(seqPropertyNames.getLength()!=seqValues.getLength()), "SvtStartOptions_Impl::Notify()\nI miss some values of configuration keys!\n" );
251*b1cdbd2cSJim Jagielski 	// Step over list of property names and get right value from coreesponding value list to set it on internal members!
252*b1cdbd2cSJim Jagielski 	sal_Int32 nCount = seqPropertyNames.getLength();
253*b1cdbd2cSJim Jagielski 	for( sal_Int32 nProperty=0; nProperty<nCount; ++nProperty )
254*b1cdbd2cSJim Jagielski 	{
255*b1cdbd2cSJim Jagielski 		if( seqPropertyNames[nProperty] == PROPERTYNAME_SHOWINTRO )
256*b1cdbd2cSJim Jagielski 		{
257*b1cdbd2cSJim Jagielski 			DBG_ASSERT(!(seqValues[nProperty].getValueTypeClass()!=TypeClass_BOOLEAN), "SvtStartOptions_Impl::Notify()\nWho has changed the value type of \"Office.Common\\Start\\ShowIntro\"?" );
258*b1cdbd2cSJim Jagielski 			seqValues[nProperty] >>= m_bShowIntro;
259*b1cdbd2cSJim Jagielski 		}
260*b1cdbd2cSJim Jagielski 		else
261*b1cdbd2cSJim Jagielski 		if( seqPropertyNames[nProperty] == PROPERTYNAME_CONNECTIONURL )
262*b1cdbd2cSJim Jagielski 		{
263*b1cdbd2cSJim Jagielski 			DBG_ASSERT(!(seqValues[nProperty].getValueTypeClass()!=TypeClass_STRING), "SvtStartOptions_Impl::Notify()\nWho has changed the value type of \"Office.Common\\Start\\Connection\"?" );
264*b1cdbd2cSJim Jagielski 			seqValues[nProperty] >>= m_sConnectionURL;
265*b1cdbd2cSJim Jagielski 		}
266*b1cdbd2cSJim Jagielski         #if OSL_DEBUG_LEVEL > 1
267*b1cdbd2cSJim Jagielski 		else DBG_ASSERT( sal_False, "SvtStartOptions_Impl::Notify()\nUnkown property detected ... I can't handle these!\n" );
268*b1cdbd2cSJim Jagielski 		#endif
269*b1cdbd2cSJim Jagielski 	}
270*b1cdbd2cSJim Jagielski }
271*b1cdbd2cSJim Jagielski 
272*b1cdbd2cSJim Jagielski //*****************************************************************************************************************
273*b1cdbd2cSJim Jagielski //	public method
274*b1cdbd2cSJim Jagielski //*****************************************************************************************************************
Commit()275*b1cdbd2cSJim Jagielski void SvtStartOptions_Impl::Commit()
276*b1cdbd2cSJim Jagielski {
277*b1cdbd2cSJim Jagielski 	// Get names of supported properties, create a list for values and copy current values to it.
278*b1cdbd2cSJim Jagielski 	Sequence< OUString >	seqNames	= impl_GetPropertyNames();
279*b1cdbd2cSJim Jagielski 	sal_Int32				nCount		= seqNames.getLength();
280*b1cdbd2cSJim Jagielski 	Sequence< Any >			seqValues	( nCount );
281*b1cdbd2cSJim Jagielski 	for( sal_Int32 nProperty=0; nProperty<nCount; ++nProperty )
282*b1cdbd2cSJim Jagielski 	{
283*b1cdbd2cSJim Jagielski         switch( nProperty )
284*b1cdbd2cSJim Jagielski         {
285*b1cdbd2cSJim Jagielski             case PROPERTYHANDLE_SHOWINTRO		:	{
286*b1cdbd2cSJim Jagielski                 						 				seqValues[nProperty] <<= m_bShowIntro;
287*b1cdbd2cSJim Jagielski 										 			}
288*b1cdbd2cSJim Jagielski                 						 			break;
289*b1cdbd2cSJim Jagielski             case PROPERTYHANDLE_CONNECTIONURL	:	{
290*b1cdbd2cSJim Jagielski 	                						 			seqValues[nProperty] <<= m_sConnectionURL;
291*b1cdbd2cSJim Jagielski 											 		}
292*b1cdbd2cSJim Jagielski         	        						 		break;
293*b1cdbd2cSJim Jagielski         }
294*b1cdbd2cSJim Jagielski 	}
295*b1cdbd2cSJim Jagielski 	// Set properties in configuration.
296*b1cdbd2cSJim Jagielski 	PutProperties( seqNames, seqValues );
297*b1cdbd2cSJim Jagielski }
298*b1cdbd2cSJim Jagielski 
299*b1cdbd2cSJim Jagielski //*****************************************************************************************************************
300*b1cdbd2cSJim Jagielski //	public method
301*b1cdbd2cSJim Jagielski //*****************************************************************************************************************
IsIntroEnabled() const302*b1cdbd2cSJim Jagielski sal_Bool SvtStartOptions_Impl::IsIntroEnabled() const
303*b1cdbd2cSJim Jagielski {
304*b1cdbd2cSJim Jagielski 	return m_bShowIntro;
305*b1cdbd2cSJim Jagielski }
306*b1cdbd2cSJim Jagielski 
307*b1cdbd2cSJim Jagielski //*****************************************************************************************************************
308*b1cdbd2cSJim Jagielski //	public method
309*b1cdbd2cSJim Jagielski //*****************************************************************************************************************
EnableIntro(sal_Bool bState)310*b1cdbd2cSJim Jagielski void SvtStartOptions_Impl::EnableIntro( sal_Bool bState )
311*b1cdbd2cSJim Jagielski {
312*b1cdbd2cSJim Jagielski 	m_bShowIntro = bState;
313*b1cdbd2cSJim Jagielski 	SetModified();
314*b1cdbd2cSJim Jagielski }
315*b1cdbd2cSJim Jagielski 
316*b1cdbd2cSJim Jagielski //*****************************************************************************************************************
317*b1cdbd2cSJim Jagielski //	public method
318*b1cdbd2cSJim Jagielski //*****************************************************************************************************************
GetConnectionURL() const319*b1cdbd2cSJim Jagielski OUString SvtStartOptions_Impl::GetConnectionURL() const
320*b1cdbd2cSJim Jagielski {
321*b1cdbd2cSJim Jagielski 	return m_sConnectionURL;
322*b1cdbd2cSJim Jagielski }
323*b1cdbd2cSJim Jagielski 
324*b1cdbd2cSJim Jagielski //*****************************************************************************************************************
325*b1cdbd2cSJim Jagielski //	public method
326*b1cdbd2cSJim Jagielski //*****************************************************************************************************************
SetConnectionURL(const OUString & sURL)327*b1cdbd2cSJim Jagielski void SvtStartOptions_Impl::SetConnectionURL( const OUString& sURL )
328*b1cdbd2cSJim Jagielski {
329*b1cdbd2cSJim Jagielski 	m_sConnectionURL = sURL;
330*b1cdbd2cSJim Jagielski 	SetModified();
331*b1cdbd2cSJim Jagielski }
332*b1cdbd2cSJim Jagielski 
333*b1cdbd2cSJim Jagielski //*****************************************************************************************************************
334*b1cdbd2cSJim Jagielski //	private method
335*b1cdbd2cSJim Jagielski //*****************************************************************************************************************
impl_GetPropertyNames()336*b1cdbd2cSJim Jagielski Sequence< OUString > SvtStartOptions_Impl::impl_GetPropertyNames()
337*b1cdbd2cSJim Jagielski {
338*b1cdbd2cSJim Jagielski 	// Build static list of configuration key names.
339*b1cdbd2cSJim Jagielski 	static const OUString pProperties[] =
340*b1cdbd2cSJim Jagielski 	{
341*b1cdbd2cSJim Jagielski 		PROPERTYNAME_SHOWINTRO		,
342*b1cdbd2cSJim Jagielski 		PROPERTYNAME_CONNECTIONURL	,
343*b1cdbd2cSJim Jagielski 	};
344*b1cdbd2cSJim Jagielski 	// Initialize return sequence with these list ...
345*b1cdbd2cSJim Jagielski 	static const Sequence< OUString > seqPropertyNames( pProperties, PROPERTYCOUNT );
346*b1cdbd2cSJim Jagielski 	// ... and return it.
347*b1cdbd2cSJim Jagielski 	return seqPropertyNames;
348*b1cdbd2cSJim Jagielski }
349*b1cdbd2cSJim Jagielski 
350*b1cdbd2cSJim Jagielski //*****************************************************************************************************************
351*b1cdbd2cSJim Jagielski //	initialize static member
352*b1cdbd2cSJim Jagielski //	DON'T DO IT IN YOUR HEADER!
353*b1cdbd2cSJim Jagielski //	see definition for further informations
354*b1cdbd2cSJim Jagielski //*****************************************************************************************************************
355*b1cdbd2cSJim Jagielski SvtStartOptions_Impl*	SvtStartOptions::m_pDataContainer	= NULL	;
356*b1cdbd2cSJim Jagielski sal_Int32				SvtStartOptions::m_nRefCount		= 0		;
357*b1cdbd2cSJim Jagielski 
358*b1cdbd2cSJim Jagielski //*****************************************************************************************************************
359*b1cdbd2cSJim Jagielski //	constructor
360*b1cdbd2cSJim Jagielski //*****************************************************************************************************************
SvtStartOptions()361*b1cdbd2cSJim Jagielski SvtStartOptions::SvtStartOptions()
362*b1cdbd2cSJim Jagielski {
363*b1cdbd2cSJim Jagielski     // Global access, must be guarded (multithreading!).
364*b1cdbd2cSJim Jagielski     MutexGuard aGuard( GetOwnStaticMutex() );
365*b1cdbd2cSJim Jagielski 	// Increase ouer refcount ...
366*b1cdbd2cSJim Jagielski 	++m_nRefCount;
367*b1cdbd2cSJim Jagielski 	// ... and initialize ouer data container only if it not already!
368*b1cdbd2cSJim Jagielski     if( m_pDataContainer == NULL )
369*b1cdbd2cSJim Jagielski 	{
370*b1cdbd2cSJim Jagielski         RTL_LOGFILE_CONTEXT(aLog, "unotools ( ??? ) ::SvtStartOptions_Impl::ctor()");
371*b1cdbd2cSJim Jagielski         m_pDataContainer = new SvtStartOptions_Impl();
372*b1cdbd2cSJim Jagielski 
373*b1cdbd2cSJim Jagielski         ItemHolder1::holdConfigItem(E_STARTOPTIONS);
374*b1cdbd2cSJim Jagielski 	}
375*b1cdbd2cSJim Jagielski }
376*b1cdbd2cSJim Jagielski 
377*b1cdbd2cSJim Jagielski //*****************************************************************************************************************
378*b1cdbd2cSJim Jagielski //	destructor
379*b1cdbd2cSJim Jagielski //*****************************************************************************************************************
~SvtStartOptions()380*b1cdbd2cSJim Jagielski SvtStartOptions::~SvtStartOptions()
381*b1cdbd2cSJim Jagielski {
382*b1cdbd2cSJim Jagielski     // Global access, must be guarded (multithreading!)
383*b1cdbd2cSJim Jagielski     MutexGuard aGuard( GetOwnStaticMutex() );
384*b1cdbd2cSJim Jagielski 	// Decrease ouer refcount.
385*b1cdbd2cSJim Jagielski 	--m_nRefCount;
386*b1cdbd2cSJim Jagielski 	// If last instance was deleted ...
387*b1cdbd2cSJim Jagielski 	// we must destroy ouer static data container!
388*b1cdbd2cSJim Jagielski     if( m_nRefCount <= 0 )
389*b1cdbd2cSJim Jagielski 	{
390*b1cdbd2cSJim Jagielski 		delete m_pDataContainer;
391*b1cdbd2cSJim Jagielski 		m_pDataContainer = NULL;
392*b1cdbd2cSJim Jagielski 	}
393*b1cdbd2cSJim Jagielski }
394*b1cdbd2cSJim Jagielski 
395*b1cdbd2cSJim Jagielski //*****************************************************************************************************************
396*b1cdbd2cSJim Jagielski //	public method
397*b1cdbd2cSJim Jagielski //*****************************************************************************************************************
IsIntroEnabled() const398*b1cdbd2cSJim Jagielski sal_Bool SvtStartOptions::IsIntroEnabled() const
399*b1cdbd2cSJim Jagielski {
400*b1cdbd2cSJim Jagielski     MutexGuard aGuard( GetOwnStaticMutex() );
401*b1cdbd2cSJim Jagielski 	return m_pDataContainer->IsIntroEnabled();
402*b1cdbd2cSJim Jagielski }
403*b1cdbd2cSJim Jagielski 
404*b1cdbd2cSJim Jagielski //*****************************************************************************************************************
405*b1cdbd2cSJim Jagielski //	public method
406*b1cdbd2cSJim Jagielski //*****************************************************************************************************************
EnableIntro(sal_Bool bState)407*b1cdbd2cSJim Jagielski void SvtStartOptions::EnableIntro( sal_Bool bState )
408*b1cdbd2cSJim Jagielski {
409*b1cdbd2cSJim Jagielski     MutexGuard aGuard( GetOwnStaticMutex() );
410*b1cdbd2cSJim Jagielski 	m_pDataContainer->EnableIntro( bState );
411*b1cdbd2cSJim Jagielski }
412*b1cdbd2cSJim Jagielski 
413*b1cdbd2cSJim Jagielski //*****************************************************************************************************************
414*b1cdbd2cSJim Jagielski //	public method
415*b1cdbd2cSJim Jagielski //*****************************************************************************************************************
GetConnectionURL() const416*b1cdbd2cSJim Jagielski OUString SvtStartOptions::GetConnectionURL() const
417*b1cdbd2cSJim Jagielski {
418*b1cdbd2cSJim Jagielski     MutexGuard aGuard( GetOwnStaticMutex() );
419*b1cdbd2cSJim Jagielski 	return m_pDataContainer->GetConnectionURL();
420*b1cdbd2cSJim Jagielski }
421*b1cdbd2cSJim Jagielski 
422*b1cdbd2cSJim Jagielski //*****************************************************************************************************************
423*b1cdbd2cSJim Jagielski //	public method
424*b1cdbd2cSJim Jagielski //*****************************************************************************************************************
SetConnectionURL(const OUString & sURL)425*b1cdbd2cSJim Jagielski void SvtStartOptions::SetConnectionURL( const OUString& sURL )
426*b1cdbd2cSJim Jagielski {
427*b1cdbd2cSJim Jagielski     MutexGuard aGuard( GetOwnStaticMutex() );
428*b1cdbd2cSJim Jagielski 	m_pDataContainer->SetConnectionURL( sURL );
429*b1cdbd2cSJim Jagielski }
430*b1cdbd2cSJim Jagielski 
431*b1cdbd2cSJim Jagielski //*****************************************************************************************************************
432*b1cdbd2cSJim Jagielski //	private method
433*b1cdbd2cSJim Jagielski //*****************************************************************************************************************
GetOwnStaticMutex()434*b1cdbd2cSJim Jagielski Mutex& SvtStartOptions::GetOwnStaticMutex()
435*b1cdbd2cSJim Jagielski {
436*b1cdbd2cSJim Jagielski 	// Initialize static mutex only for one time!
437*b1cdbd2cSJim Jagielski     static Mutex* pMutex = NULL;
438*b1cdbd2cSJim Jagielski 	// If these method first called (Mutex not already exist!) ...
439*b1cdbd2cSJim Jagielski     if( pMutex == NULL )
440*b1cdbd2cSJim Jagielski     {
441*b1cdbd2cSJim Jagielski 		// ... we must create a new one. Protect follow code with the global mutex -
442*b1cdbd2cSJim Jagielski 		// It must be - we create a static variable!
443*b1cdbd2cSJim Jagielski         MutexGuard aGuard( Mutex::getGlobalMutex() );
444*b1cdbd2cSJim Jagielski 		// We must check our pointer again - because it can be that another instance of ouer class will be fastr then these!
445*b1cdbd2cSJim Jagielski         if( pMutex == NULL )
446*b1cdbd2cSJim Jagielski         {
447*b1cdbd2cSJim Jagielski 			// Create the new mutex and set it for return on static variable.
448*b1cdbd2cSJim Jagielski             static Mutex aMutex;
449*b1cdbd2cSJim Jagielski             pMutex = &aMutex;
450*b1cdbd2cSJim Jagielski         }
451*b1cdbd2cSJim Jagielski     }
452*b1cdbd2cSJim Jagielski 	// Return new created or already existing mutex object.
453*b1cdbd2cSJim Jagielski     return *pMutex;
454*b1cdbd2cSJim Jagielski }
455