diff -r 6aeb7a756187 -r 3c88a81ff781 qstmgesturelib/uitimer.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qstmgesturelib/uitimer.h Fri Oct 15 17:30:59 2010 -0400 @@ -0,0 +1,248 @@ +#ifndef UITIMER_H_ +#define UITIMER_H_ + +#include +#include +#include "qstmfilelogger.h" + +#define TIMESTAMP() QDateTime::currentDateTime().toString("hh:mm:ss:zzz") + +#ifdef Q_OS_SYMBIAN +#include +#include + +class CUiTimer : public CTimer +{ +public: + enum CUiTimerType + { + AfterType, + HighResType, + LockType + }; + + CUiTimer(int priority) : CTimer(priority), m_timerType(AfterType) + { + } + + + + static CUiTimer* New(int priority) + { + CUiTimer* uitao = new CUiTimer(priority); + if (uitao) { + TRAPD(r, uitao->ConstructL()); + if (r == KErrNone) { + CActiveScheduler::Add(uitao); + } + else { + delete uitao; + uitao = NULL; + } + } + return uitao; + } + + ~CUiTimer() {} + + void Start(TTimeIntervalMicroSeconds32 delay,TTimeIntervalMicroSeconds32 interval,TCallBack callBack) + { + __ASSERT_ALWAYS(interval.Int()>=0,User::Panic(_L("Interval < 0"), -1)); + __ASSERT_ALWAYS(delay.Int()>=0,User::Panic(_L("Delay < 0"), -2)); + m_interval = interval.Int(); + m_callback = callBack; + m_timerType = AfterType; + After(delay); + } + + void StartHighRes(TTimeIntervalMicroSeconds32 delay,TTimeIntervalMicroSeconds32 interval,TCallBack callBack) + { + __ASSERT_ALWAYS(interval.Int()>=0,User::Panic(_L("Interval < 0"), -1)); + __ASSERT_ALWAYS(delay.Int()>=0,User::Panic(_L("Delay < 0"), -2)); + m_interval = interval.Int(); + m_callback = callBack; + m_timerType = HighResType; + HighRes(delay); + } + + void StartLock(TTimerLockSpec lockSpec,TCallBack callBack) + { + m_lockSpec = lockSpec; + m_callback = callBack; + m_timerType = LockType; + Lock(m_lockSpec); + } + + + void RunL() + { + switch (m_timerType) { + case HighResType: + HighRes(m_interval); + m_callback.CallBack(); + break; + case LockType: + Lock(m_lockSpec); + m_callback.CallBack(); + break; + case AfterType: + After(m_interval); + m_callback.CallBack(); + break; + } + } + +private: + uint m_interval; + TCallBack m_callback; + CUiTimerType m_timerType; + TTimerLockSpec m_lockSpec; +}; + +class UiTimer : QObject +{ + enum UiTimerType + { + AfterType, + HighResType, + LockType + }; + +public: + static UiTimer* New() + { + return new UiTimer(); + } + + inline UiTimer(): QObject(), m_id(0), m_requestedTicks(-1), + m_ticksCount(0), m_cbName("uiTimerCallback") + { + m_timer = CUiTimer::New(20); + } + + inline void setPriority(int priority) { m_timer->SetPriority(priority); } + inline ~UiTimer() { m_timer->Cancel(); delete m_timer;} + + inline int timerId() const { return m_id; } + + static int timercallback(TAny* ptr) + { + UiTimer* uitimer = static_cast(ptr); + uitimer->doTimerCallback(); + return 0; + } + + void doTimerCallback() + { + if (isActive() && (m_requestedTicks < 0 || m_ticksCount++ < m_requestedTicks)) { + + QMetaObject::invokeMethod(m_obj, m_cbName, Qt::DirectConnection); + if (m_ticksCount == m_requestedTicks) { + stop(); + } + } + return; + } + + void start(int msec, QObject *obj, UiTimerType timerType = HighResType) + { + m_delay = msec; + m_obj = obj; + m_ticksCount = 0; + switch (timerType) + { + case HighResType: + m_timer->StartHighRes((msec + 1) * 1000, (msec + 1) * 1000, TCallBack(timercallback, this)); + break; + case AfterType: + m_timer->Start(msec * 1000, msec * 1000, TCallBack(timercallback, this)); + break; + case LockType: + TTimerLockSpec lockSpec = static_cast(msec); + m_timer->StartLock(lockSpec, TCallBack(timercallback, this)); + break; + } + } + + void stop() + { + m_timer->Cancel(); + } + + bool isActive() { return m_timer->IsActive(); } + + void setRequestedTicks(int ticksCount) { m_requestedTicks = ticksCount; } + int ticksCount() { return m_ticksCount; } + + void setSingleShot(bool isOneShot) { isOneShot ? m_requestedTicks = 1 : m_requestedTicks = -1; } + bool isSingleShot() { return m_requestedTicks == 1; } + + void setTimerCallback(char* cbName) { m_cbName = cbName; } + +private: + int m_id; + int m_delay; + QObject* m_obj; + CUiTimer* m_timer; + int m_requestedTicks; + int m_ticksCount; + char* m_cbName; + +}; +#else +class UiTimer : public QObject +{ +public: + static UiTimer* New() { return new UiTimer(); } + UiTimer() : QObject(), m_requestedTicks(-1), m_cbName(0) + { + } + inline void setPriority(int priority) {} + inline void start(int msec, QObject *obj) + { + m_delay = msec; + m_obj = obj; + m_ticksCount = 0; + m_timer.start(msec, this); + } + inline ~UiTimer() {} + + inline int timerId() const { return m_timer.timerId(); } + + inline void timerEvent(QTimerEvent *event) + { + if (m_requestedTicks < 0 || m_ticksCount++ < m_requestedTicks) { + QMetaObject::invokeMethod(m_obj, m_cbName ? m_cbName : "uiTimerCallback", Qt::DirectConnection); + } + else { + stop(); + } + return; + } + + inline void stop() { m_timer.stop(); } + + inline bool isActive() { return m_timer.isActive(); } + + void setRequestedTicks(int ticksCount) { m_requestedTicks = ticksCount; } + int ticksCount() { return m_ticksCount; } + + void setSingleShot(bool isOneShot) { isOneShot ? m_requestedTicks = 1 : m_requestedTicks = -1; } + bool isSingleShot() { return m_requestedTicks == 1; } + void setTimerCallback(char* cbName) { m_cbName = cbName; } + +private: + QBasicTimer m_timer; + int m_delay; + QObject* m_obj; + int m_requestedTicks; + int m_ticksCount; + char* m_cbName; +}; + +#endif + + + + +#endif /* UITIMER_H_ */