xref: /aoo4110/main/vcl/source/app/timer.cxx (revision b1cdbd2c)
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_vcl.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski #include <tools/time.hxx>
28*b1cdbd2cSJim Jagielski #include <tools/debug.hxx>
29*b1cdbd2cSJim Jagielski 
30*b1cdbd2cSJim Jagielski #include <vcl/svapp.hxx>
31*b1cdbd2cSJim Jagielski #include <vcl/timer.hxx>
32*b1cdbd2cSJim Jagielski 
33*b1cdbd2cSJim Jagielski #include <saltimer.hxx>
34*b1cdbd2cSJim Jagielski #include <svdata.hxx>
35*b1cdbd2cSJim Jagielski #include <salinst.hxx>
36*b1cdbd2cSJim Jagielski 
37*b1cdbd2cSJim Jagielski 
38*b1cdbd2cSJim Jagielski // =======================================================================
39*b1cdbd2cSJim Jagielski 
40*b1cdbd2cSJim Jagielski #define MAX_TIMER_PERIOD	((sal_uLong)0xFFFFFFFF)
41*b1cdbd2cSJim Jagielski 
42*b1cdbd2cSJim Jagielski // ---------------------
43*b1cdbd2cSJim Jagielski // - TimeManager-Types -
44*b1cdbd2cSJim Jagielski // ---------------------
45*b1cdbd2cSJim Jagielski 
46*b1cdbd2cSJim Jagielski struct ImplTimerData
47*b1cdbd2cSJim Jagielski {
48*b1cdbd2cSJim Jagielski 	ImplTimerData*	mpNext; 		// Pointer to the next Instance
49*b1cdbd2cSJim Jagielski 	Timer*			mpSVTimer;		// Pointer to SV Timer instance
50*b1cdbd2cSJim Jagielski 	sal_uLong			mnUpdateTime;	// Last Update Time
51*b1cdbd2cSJim Jagielski 	sal_uLong			mnTimerUpdate;	// TimerCallbackProcs on stack
52*b1cdbd2cSJim Jagielski 	sal_Bool			mbDelete;		// Wurde Timer waehren Update() geloescht
53*b1cdbd2cSJim Jagielski 	sal_Bool			mbInTimeout;	// Befinden wir uns im Timeout-Handler
54*b1cdbd2cSJim Jagielski };
55*b1cdbd2cSJim Jagielski 
56*b1cdbd2cSJim Jagielski // =======================================================================
57*b1cdbd2cSJim Jagielski 
ImplDeInitTimer()58*b1cdbd2cSJim Jagielski void Timer::ImplDeInitTimer()
59*b1cdbd2cSJim Jagielski {
60*b1cdbd2cSJim Jagielski 	ImplSVData* 	pSVData = ImplGetSVData();
61*b1cdbd2cSJim Jagielski 	ImplTimerData*	pTimerData = pSVData->mpFirstTimerData;
62*b1cdbd2cSJim Jagielski 
63*b1cdbd2cSJim Jagielski 	if ( pTimerData )
64*b1cdbd2cSJim Jagielski 	{
65*b1cdbd2cSJim Jagielski 		do
66*b1cdbd2cSJim Jagielski 		{
67*b1cdbd2cSJim Jagielski 			ImplTimerData* pTempTimerData = pTimerData;
68*b1cdbd2cSJim Jagielski 			if ( pTimerData->mpSVTimer )
69*b1cdbd2cSJim Jagielski 			{
70*b1cdbd2cSJim Jagielski 				pTimerData->mpSVTimer->mbActive = sal_False;
71*b1cdbd2cSJim Jagielski 				pTimerData->mpSVTimer->mpTimerData = NULL;
72*b1cdbd2cSJim Jagielski 			}
73*b1cdbd2cSJim Jagielski 			pTimerData = pTimerData->mpNext;
74*b1cdbd2cSJim Jagielski 			delete pTempTimerData;
75*b1cdbd2cSJim Jagielski 		}
76*b1cdbd2cSJim Jagielski 		while ( pTimerData );
77*b1cdbd2cSJim Jagielski 
78*b1cdbd2cSJim Jagielski 		pSVData->mpFirstTimerData	= NULL;
79*b1cdbd2cSJim Jagielski 		pSVData->mnTimerPeriod		= 0;
80*b1cdbd2cSJim Jagielski         delete pSVData->mpSalTimer;
81*b1cdbd2cSJim Jagielski         pSVData->mpSalTimer = NULL;
82*b1cdbd2cSJim Jagielski 	}
83*b1cdbd2cSJim Jagielski }
84*b1cdbd2cSJim Jagielski 
85*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
86*b1cdbd2cSJim Jagielski 
ImplStartTimer(ImplSVData * pSVData,sal_uLong nMS)87*b1cdbd2cSJim Jagielski static void ImplStartTimer( ImplSVData* pSVData, sal_uLong nMS )
88*b1cdbd2cSJim Jagielski {
89*b1cdbd2cSJim Jagielski 	if ( !nMS )
90*b1cdbd2cSJim Jagielski 		nMS = 1;
91*b1cdbd2cSJim Jagielski 
92*b1cdbd2cSJim Jagielski 	if ( nMS != pSVData->mnTimerPeriod )
93*b1cdbd2cSJim Jagielski 	{
94*b1cdbd2cSJim Jagielski 		pSVData->mnTimerPeriod = nMS;
95*b1cdbd2cSJim Jagielski 		pSVData->mpSalTimer->Start( nMS );
96*b1cdbd2cSJim Jagielski 	}
97*b1cdbd2cSJim Jagielski }
98*b1cdbd2cSJim Jagielski 
99*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
100*b1cdbd2cSJim Jagielski 
ImplTimerCallbackProc()101*b1cdbd2cSJim Jagielski void Timer::ImplTimerCallbackProc()
102*b1cdbd2cSJim Jagielski {
103*b1cdbd2cSJim Jagielski 	ImplSVData* 	pSVData = ImplGetSVData();
104*b1cdbd2cSJim Jagielski 	ImplTimerData*	pTimerData;
105*b1cdbd2cSJim Jagielski 	ImplTimerData*	pPrevTimerData;
106*b1cdbd2cSJim Jagielski 	sal_uLong			nMinPeriod = MAX_TIMER_PERIOD;
107*b1cdbd2cSJim Jagielski 	sal_uLong			nDeltaTime;
108*b1cdbd2cSJim Jagielski 	sal_uLong			nTime = Time::GetSystemTicks();
109*b1cdbd2cSJim Jagielski 
110*b1cdbd2cSJim Jagielski 	if ( pSVData->mbNoCallTimer )
111*b1cdbd2cSJim Jagielski 		return;
112*b1cdbd2cSJim Jagielski 
113*b1cdbd2cSJim Jagielski 	pSVData->mnTimerUpdate++;
114*b1cdbd2cSJim Jagielski 	pSVData->mbNotAllTimerCalled = sal_True;
115*b1cdbd2cSJim Jagielski 
116*b1cdbd2cSJim Jagielski 	// Suche Timer raus, wo der Timeout-Handler gerufen werden muss
117*b1cdbd2cSJim Jagielski 	pTimerData = pSVData->mpFirstTimerData;
118*b1cdbd2cSJim Jagielski 	while ( pTimerData )
119*b1cdbd2cSJim Jagielski 	{
120*b1cdbd2cSJim Jagielski 		// Wenn Timer noch nicht neu ist und noch nicht geloescht wurde
121*b1cdbd2cSJim Jagielski 		// und er sich nicht im Timeout-Handler befindet,
122*b1cdbd2cSJim Jagielski 		// dann den Handler rufen, wenn die Zeit abgelaufen ist
123*b1cdbd2cSJim Jagielski 		if ( (pTimerData->mnTimerUpdate < pSVData->mnTimerUpdate) &&
124*b1cdbd2cSJim Jagielski 			 !pTimerData->mbDelete && !pTimerData->mbInTimeout )
125*b1cdbd2cSJim Jagielski 		{
126*b1cdbd2cSJim Jagielski 			// Zeit abgelaufen
127*b1cdbd2cSJim Jagielski 			if ( (pTimerData->mnUpdateTime+pTimerData->mpSVTimer->mnTimeout) <= nTime )
128*b1cdbd2cSJim Jagielski 			{
129*b1cdbd2cSJim Jagielski 				// Neue Updatezeit setzen
130*b1cdbd2cSJim Jagielski 				pTimerData->mnUpdateTime = nTime;
131*b1cdbd2cSJim Jagielski 
132*b1cdbd2cSJim Jagielski 				// kein AutoTimer, dann anhalten
133*b1cdbd2cSJim Jagielski 				if ( !pTimerData->mpSVTimer->mbAuto )
134*b1cdbd2cSJim Jagielski 				{
135*b1cdbd2cSJim Jagielski 					pTimerData->mpSVTimer->mbActive = sal_False;
136*b1cdbd2cSJim Jagielski 					pTimerData->mbDelete = sal_True;
137*b1cdbd2cSJim Jagielski 				}
138*b1cdbd2cSJim Jagielski 
139*b1cdbd2cSJim Jagielski 				// call Timeout
140*b1cdbd2cSJim Jagielski 				pTimerData->mbInTimeout = sal_True;
141*b1cdbd2cSJim Jagielski 				pTimerData->mpSVTimer->Timeout();
142*b1cdbd2cSJim Jagielski 				pTimerData->mbInTimeout = sal_False;
143*b1cdbd2cSJim Jagielski 			}
144*b1cdbd2cSJim Jagielski 		}
145*b1cdbd2cSJim Jagielski 
146*b1cdbd2cSJim Jagielski 		pTimerData = pTimerData->mpNext;
147*b1cdbd2cSJim Jagielski 	}
148*b1cdbd2cSJim Jagielski 
149*b1cdbd2cSJim Jagielski 	// Neue Zeit ermitteln
150*b1cdbd2cSJim Jagielski 	sal_uLong nNewTime = Time::GetSystemTicks();
151*b1cdbd2cSJim Jagielski 	pPrevTimerData = NULL;
152*b1cdbd2cSJim Jagielski 	pTimerData = pSVData->mpFirstTimerData;
153*b1cdbd2cSJim Jagielski 	while ( pTimerData )
154*b1cdbd2cSJim Jagielski 	{
155*b1cdbd2cSJim Jagielski 		// Befindet sich Timer noch im Timeout-Handler, dann ignorieren
156*b1cdbd2cSJim Jagielski 		if ( pTimerData->mbInTimeout )
157*b1cdbd2cSJim Jagielski 		{
158*b1cdbd2cSJim Jagielski 			pPrevTimerData = pTimerData;
159*b1cdbd2cSJim Jagielski 			pTimerData = pTimerData->mpNext;
160*b1cdbd2cSJim Jagielski 		}
161*b1cdbd2cSJim Jagielski 		// Wurde Timer zwischenzeitlich zerstoert ?
162*b1cdbd2cSJim Jagielski 		else if ( pTimerData->mbDelete )
163*b1cdbd2cSJim Jagielski 		{
164*b1cdbd2cSJim Jagielski 			if ( pPrevTimerData )
165*b1cdbd2cSJim Jagielski 				pPrevTimerData->mpNext = pTimerData->mpNext;
166*b1cdbd2cSJim Jagielski 			else
167*b1cdbd2cSJim Jagielski 				pSVData->mpFirstTimerData = pTimerData->mpNext;
168*b1cdbd2cSJim Jagielski 			if ( pTimerData->mpSVTimer )
169*b1cdbd2cSJim Jagielski 				pTimerData->mpSVTimer->mpTimerData = NULL;
170*b1cdbd2cSJim Jagielski 			ImplTimerData* pTempTimerData = pTimerData;
171*b1cdbd2cSJim Jagielski 			pTimerData = pTimerData->mpNext;
172*b1cdbd2cSJim Jagielski 			delete pTempTimerData;
173*b1cdbd2cSJim Jagielski 		}
174*b1cdbd2cSJim Jagielski 		else
175*b1cdbd2cSJim Jagielski 		{
176*b1cdbd2cSJim Jagielski 			pTimerData->mnTimerUpdate = 0;
177*b1cdbd2cSJim Jagielski 			// kleinste Zeitspanne ermitteln
178*b1cdbd2cSJim Jagielski 			if ( pTimerData->mnUpdateTime == nTime )
179*b1cdbd2cSJim Jagielski 			{
180*b1cdbd2cSJim Jagielski 				nDeltaTime = pTimerData->mpSVTimer->mnTimeout;
181*b1cdbd2cSJim Jagielski 				if ( nDeltaTime < nMinPeriod )
182*b1cdbd2cSJim Jagielski 					nMinPeriod = nDeltaTime;
183*b1cdbd2cSJim Jagielski 			}
184*b1cdbd2cSJim Jagielski 			else
185*b1cdbd2cSJim Jagielski 			{
186*b1cdbd2cSJim Jagielski 				nDeltaTime = pTimerData->mnUpdateTime + pTimerData->mpSVTimer->mnTimeout;
187*b1cdbd2cSJim Jagielski 				if ( nDeltaTime < nNewTime )
188*b1cdbd2cSJim Jagielski 					nMinPeriod = 1;
189*b1cdbd2cSJim Jagielski 				else
190*b1cdbd2cSJim Jagielski 				{
191*b1cdbd2cSJim Jagielski 					nDeltaTime -= nNewTime;
192*b1cdbd2cSJim Jagielski 					if ( nDeltaTime < nMinPeriod )
193*b1cdbd2cSJim Jagielski 						nMinPeriod = nDeltaTime;
194*b1cdbd2cSJim Jagielski 				}
195*b1cdbd2cSJim Jagielski 			}
196*b1cdbd2cSJim Jagielski 			pPrevTimerData = pTimerData;
197*b1cdbd2cSJim Jagielski 			pTimerData = pTimerData->mpNext;
198*b1cdbd2cSJim Jagielski 		}
199*b1cdbd2cSJim Jagielski 	}
200*b1cdbd2cSJim Jagielski 
201*b1cdbd2cSJim Jagielski 	// Wenn keine Timer mehr existieren, dann Clock loeschen
202*b1cdbd2cSJim Jagielski 	if ( !pSVData->mpFirstTimerData )
203*b1cdbd2cSJim Jagielski 	{
204*b1cdbd2cSJim Jagielski         pSVData->mpSalTimer->Stop();
205*b1cdbd2cSJim Jagielski 		pSVData->mnTimerPeriod = MAX_TIMER_PERIOD;
206*b1cdbd2cSJim Jagielski 	}
207*b1cdbd2cSJim Jagielski 	else
208*b1cdbd2cSJim Jagielski 		ImplStartTimer( pSVData, nMinPeriod );
209*b1cdbd2cSJim Jagielski 
210*b1cdbd2cSJim Jagielski 	pSVData->mnTimerUpdate--;
211*b1cdbd2cSJim Jagielski 	pSVData->mbNotAllTimerCalled = sal_False;
212*b1cdbd2cSJim Jagielski }
213*b1cdbd2cSJim Jagielski 
214*b1cdbd2cSJim Jagielski // =======================================================================
215*b1cdbd2cSJim Jagielski 
Timer()216*b1cdbd2cSJim Jagielski Timer::Timer()
217*b1cdbd2cSJim Jagielski {
218*b1cdbd2cSJim Jagielski 	mpTimerData 	= NULL;
219*b1cdbd2cSJim Jagielski 	mnTimeout		= 1;
220*b1cdbd2cSJim Jagielski 	mbAuto			= sal_False;
221*b1cdbd2cSJim Jagielski 	mbActive		= sal_False;
222*b1cdbd2cSJim Jagielski }
223*b1cdbd2cSJim Jagielski 
224*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
225*b1cdbd2cSJim Jagielski 
Timer(const Timer & rTimer)226*b1cdbd2cSJim Jagielski Timer::Timer( const Timer& rTimer )
227*b1cdbd2cSJim Jagielski {
228*b1cdbd2cSJim Jagielski 	mpTimerData 	= NULL;
229*b1cdbd2cSJim Jagielski 	mnTimeout		= rTimer.mnTimeout;
230*b1cdbd2cSJim Jagielski 	mbAuto			= sal_False;
231*b1cdbd2cSJim Jagielski 	mbActive		= sal_False;
232*b1cdbd2cSJim Jagielski 	maTimeoutHdl	= rTimer.maTimeoutHdl;
233*b1cdbd2cSJim Jagielski 
234*b1cdbd2cSJim Jagielski 	if ( rTimer.IsActive() )
235*b1cdbd2cSJim Jagielski 		Start();
236*b1cdbd2cSJim Jagielski }
237*b1cdbd2cSJim Jagielski 
238*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
239*b1cdbd2cSJim Jagielski 
~Timer()240*b1cdbd2cSJim Jagielski Timer::~Timer()
241*b1cdbd2cSJim Jagielski {
242*b1cdbd2cSJim Jagielski 	if ( mpTimerData )
243*b1cdbd2cSJim Jagielski 	{
244*b1cdbd2cSJim Jagielski 		mpTimerData->mbDelete = sal_True;
245*b1cdbd2cSJim Jagielski 		mpTimerData->mpSVTimer = NULL;
246*b1cdbd2cSJim Jagielski 	}
247*b1cdbd2cSJim Jagielski }
248*b1cdbd2cSJim Jagielski 
249*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
250*b1cdbd2cSJim Jagielski 
Timeout()251*b1cdbd2cSJim Jagielski void Timer::Timeout()
252*b1cdbd2cSJim Jagielski {
253*b1cdbd2cSJim Jagielski 	maTimeoutHdl.Call( this );
254*b1cdbd2cSJim Jagielski }
255*b1cdbd2cSJim Jagielski 
256*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
257*b1cdbd2cSJim Jagielski 
SetTimeout(sal_uLong nNewTimeout)258*b1cdbd2cSJim Jagielski void Timer::SetTimeout( sal_uLong nNewTimeout )
259*b1cdbd2cSJim Jagielski {
260*b1cdbd2cSJim Jagielski 	mnTimeout = nNewTimeout;
261*b1cdbd2cSJim Jagielski 
262*b1cdbd2cSJim Jagielski 	// Wenn Timer aktiv, dann Clock erneuern
263*b1cdbd2cSJim Jagielski 	if ( mbActive )
264*b1cdbd2cSJim Jagielski 	{
265*b1cdbd2cSJim Jagielski 		ImplSVData* pSVData = ImplGetSVData();
266*b1cdbd2cSJim Jagielski 		if ( !pSVData->mnTimerUpdate && (mnTimeout < pSVData->mnTimerPeriod) )
267*b1cdbd2cSJim Jagielski 			ImplStartTimer( pSVData, mnTimeout );
268*b1cdbd2cSJim Jagielski 	}
269*b1cdbd2cSJim Jagielski }
270*b1cdbd2cSJim Jagielski 
271*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
272*b1cdbd2cSJim Jagielski 
Start()273*b1cdbd2cSJim Jagielski void Timer::Start()
274*b1cdbd2cSJim Jagielski {
275*b1cdbd2cSJim Jagielski 	mbActive = sal_True;
276*b1cdbd2cSJim Jagielski 
277*b1cdbd2cSJim Jagielski 	ImplSVData* pSVData = ImplGetSVData();
278*b1cdbd2cSJim Jagielski 	if ( !mpTimerData )
279*b1cdbd2cSJim Jagielski 	{
280*b1cdbd2cSJim Jagielski 		if ( !pSVData->mpFirstTimerData )
281*b1cdbd2cSJim Jagielski 		{
282*b1cdbd2cSJim Jagielski 			pSVData->mnTimerPeriod = MAX_TIMER_PERIOD;
283*b1cdbd2cSJim Jagielski             if( ! pSVData->mpSalTimer )
284*b1cdbd2cSJim Jagielski             {
285*b1cdbd2cSJim Jagielski                 pSVData->mpSalTimer = pSVData->mpDefInst->CreateSalTimer();
286*b1cdbd2cSJim Jagielski                 pSVData->mpSalTimer->SetCallback( ImplTimerCallbackProc );
287*b1cdbd2cSJim Jagielski             }
288*b1cdbd2cSJim Jagielski 		}
289*b1cdbd2cSJim Jagielski 
290*b1cdbd2cSJim Jagielski 		// insert timer and start
291*b1cdbd2cSJim Jagielski 		mpTimerData 				= new ImplTimerData;
292*b1cdbd2cSJim Jagielski 		mpTimerData->mpSVTimer		= this;
293*b1cdbd2cSJim Jagielski 		mpTimerData->mnUpdateTime	= Time::GetSystemTicks();
294*b1cdbd2cSJim Jagielski 		mpTimerData->mnTimerUpdate	= pSVData->mnTimerUpdate;
295*b1cdbd2cSJim Jagielski 		mpTimerData->mbDelete		= sal_False;
296*b1cdbd2cSJim Jagielski 		mpTimerData->mbInTimeout	= sal_False;
297*b1cdbd2cSJim Jagielski 
298*b1cdbd2cSJim Jagielski 		// !!!!! Wegen SFX hinten einordnen !!!!!
299*b1cdbd2cSJim Jagielski 		ImplTimerData* pPrev = NULL;
300*b1cdbd2cSJim Jagielski 		ImplTimerData* pData = pSVData->mpFirstTimerData;
301*b1cdbd2cSJim Jagielski 		while ( pData )
302*b1cdbd2cSJim Jagielski 		{
303*b1cdbd2cSJim Jagielski 			pPrev = pData;
304*b1cdbd2cSJim Jagielski 			pData = pData->mpNext;
305*b1cdbd2cSJim Jagielski 		}
306*b1cdbd2cSJim Jagielski 		mpTimerData->mpNext = NULL;
307*b1cdbd2cSJim Jagielski 		if ( pPrev )
308*b1cdbd2cSJim Jagielski 			pPrev->mpNext = mpTimerData;
309*b1cdbd2cSJim Jagielski 		else
310*b1cdbd2cSJim Jagielski 			pSVData->mpFirstTimerData = mpTimerData;
311*b1cdbd2cSJim Jagielski 
312*b1cdbd2cSJim Jagielski 		if ( mnTimeout < pSVData->mnTimerPeriod )
313*b1cdbd2cSJim Jagielski 			ImplStartTimer( pSVData, mnTimeout );
314*b1cdbd2cSJim Jagielski 	}
315*b1cdbd2cSJim Jagielski 	else if( !mpTimerData->mpSVTimer ) // TODO: remove when guilty found
316*b1cdbd2cSJim Jagielski 	{
317*b1cdbd2cSJim Jagielski 		DBG_ERROR( "Timer::Start() on a destroyed Timer!" );
318*b1cdbd2cSJim Jagielski 	}
319*b1cdbd2cSJim Jagielski 	else
320*b1cdbd2cSJim Jagielski 	{
321*b1cdbd2cSJim Jagielski 		mpTimerData->mnUpdateTime	 = Time::GetSystemTicks();
322*b1cdbd2cSJim Jagielski 		mpTimerData->mnTimerUpdate	 = pSVData->mnTimerUpdate;
323*b1cdbd2cSJim Jagielski 		mpTimerData->mbDelete		 = sal_False;
324*b1cdbd2cSJim Jagielski 	}
325*b1cdbd2cSJim Jagielski }
326*b1cdbd2cSJim Jagielski 
327*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
328*b1cdbd2cSJim Jagielski 
Stop()329*b1cdbd2cSJim Jagielski void Timer::Stop()
330*b1cdbd2cSJim Jagielski {
331*b1cdbd2cSJim Jagielski 	mbActive = sal_False;
332*b1cdbd2cSJim Jagielski 
333*b1cdbd2cSJim Jagielski 	if ( mpTimerData )
334*b1cdbd2cSJim Jagielski 		mpTimerData->mbDelete = sal_True;
335*b1cdbd2cSJim Jagielski }
336*b1cdbd2cSJim Jagielski 
337*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
338*b1cdbd2cSJim Jagielski 
operator =(const Timer & rTimer)339*b1cdbd2cSJim Jagielski Timer& Timer::operator=( const Timer& rTimer )
340*b1cdbd2cSJim Jagielski {
341*b1cdbd2cSJim Jagielski 	if ( IsActive() )
342*b1cdbd2cSJim Jagielski 		Stop();
343*b1cdbd2cSJim Jagielski 
344*b1cdbd2cSJim Jagielski 	mbActive		= sal_False;
345*b1cdbd2cSJim Jagielski 	mnTimeout		= rTimer.mnTimeout;
346*b1cdbd2cSJim Jagielski 	maTimeoutHdl	= rTimer.maTimeoutHdl;
347*b1cdbd2cSJim Jagielski 
348*b1cdbd2cSJim Jagielski 	if ( rTimer.IsActive() )
349*b1cdbd2cSJim Jagielski 		Start();
350*b1cdbd2cSJim Jagielski 
351*b1cdbd2cSJim Jagielski 	return *this;
352*b1cdbd2cSJim Jagielski }
353*b1cdbd2cSJim Jagielski 
354*b1cdbd2cSJim Jagielski // =======================================================================
355*b1cdbd2cSJim Jagielski 
AutoTimer()356*b1cdbd2cSJim Jagielski AutoTimer::AutoTimer()
357*b1cdbd2cSJim Jagielski {
358*b1cdbd2cSJim Jagielski 	mbAuto = sal_True;
359*b1cdbd2cSJim Jagielski }
360*b1cdbd2cSJim Jagielski 
361*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
362*b1cdbd2cSJim Jagielski 
AutoTimer(const AutoTimer & rTimer)363*b1cdbd2cSJim Jagielski AutoTimer::AutoTimer( const AutoTimer& rTimer ) : Timer( rTimer )
364*b1cdbd2cSJim Jagielski {
365*b1cdbd2cSJim Jagielski 	mbAuto = sal_True;
366*b1cdbd2cSJim Jagielski }
367*b1cdbd2cSJim Jagielski 
368*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
369*b1cdbd2cSJim Jagielski 
operator =(const AutoTimer & rTimer)370*b1cdbd2cSJim Jagielski AutoTimer& AutoTimer::operator=( const AutoTimer& rTimer )
371*b1cdbd2cSJim Jagielski {
372*b1cdbd2cSJim Jagielski 	Timer::operator=( rTimer );
373*b1cdbd2cSJim Jagielski 	return *this;
374*b1cdbd2cSJim Jagielski }
375