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