/****************************************************************************
*
* Copyright (C) 2000-2001 RealNetworks, Inc. All rights reserved.
*
* This program is free software. It may be distributed under the terms
* in the file LICENSE, found in the top level of the source distribution.
*
*/
#include "timer.h"
#include "app.h"
#include "dbg.h"
#define TVNORM(tv) while( tv.tv_usec > 1000*1000 ) { tv.tv_usec -= 1000*1000; tv.tv_sec++; }
CTimer::CTimer( CTimerResponse* pResponse ) :
m_pResponse(pResponse),
m_mode(Disabled),
m_next(0),
m_interval(0)
{
// Empty
}
CTimer::~CTimer( void )
{
Disable();
}
void CTimer::SetResponse( CTimerResponse* pResponse )
{
m_pResponse = pResponse;
}
CTimer::Mode CTimer::GetMode( void )
{
return m_mode;
}
UINT32 CTimer::GetTimeout( void )
{
return m_next;
}
void CTimer::SetRelative( UINT32 msec )
{
Set( CurrentTime() + msec );
m_mode = SingleShot;
}
void CTimer::SetAbsolute( UINT32 t )
{
Set( t );
m_mode = SingleShot;
}
void CTimer::SetRepeating( UINT32 msec )
{
Set( CurrentTime() + msec );
m_interval = msec;
m_mode = Repeating;
}
void CTimer::Disable( void )
{
if( m_mode != Disabled )
{
CEventThread* pSelf;
m_mode = Disabled;
#ifdef NO_RTTI
pSelf = (CEventThread*)CThread::This(); //XXX: very bad, upgrade compiler
#else
pSelf = dynamic_cast<CEventThread*>(CThread::This());
#endif
assert_or_ret( pSelf );
pSelf->DelTimer( this );
}
}
UINT32 CTimer::CurrentTime( void )
{
#ifdef _UNIX
timeval tv;
gettimeofday( &tv, NULL );
return (tv.tv_sec*1000 + tv.tv_usec/1000);
#endif
#ifdef _WIN32
return ::GetTickCount();
#endif
}
void CTimer::Set( UINT32 t )
{
m_next = t;
CEventThread* pSelf;
#ifdef NO_RTTI
pSelf = (CEventThread*)CThread::This(); //XXX: very bad, upgrade compiler
#else
pSelf = dynamic_cast<CEventThread*>(CThread::This());
#endif
assert_or_ret( pSelf );
if( m_mode != Disabled ) pSelf->DelTimer( this );
pSelf->AddTimer( this );
}
CTimerResponse* CTimer::GetResponse( void )
{
assert( m_pResponse );
return m_pResponse;
}
syntax highlighted by Code2HTML, v. 0.9.1