qstmgesturelib/uitimer.h
changeset 16 3c88a81ff781
--- /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 <QDateTime>
+#include <QDebug>
+#include "qstmfilelogger.h"
+
+#define TIMESTAMP() QDateTime::currentDateTime().toString("hh:mm:ss:zzz")
+
+#ifdef Q_OS_SYMBIAN
+#include <e32base.h>
+#include <e32const.h>
+
+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<UiTimer*>(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<TTimerLockSpec>(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_ */