#include "config.h"
#include <QBasicTimer>
#include <QCoreApplication>
#include <QDebug>
#include <QWeakPointer>
#include <wtf/CurrentTime.h>
namespace WebCore {
class SharedTimerQt : public QObject {
Q_OBJECT
friend void setSharedTimerFiredFunction(void (*f)());
public:
static SharedTimerQt* inst();
void start(double);
void stop();
protected:
void timerEvent(QTimerEvent* ev);
private slots:
void destroy();
private:
SharedTimerQt();
~SharedTimerQt();
QBasicTimer m_timer;
void (*m_timerFunction)();
};
SharedTimerQt::SharedTimerQt()
: QObject()
, m_timerFunction(0)
{}
SharedTimerQt::~SharedTimerQt()
{
if (m_timer.isActive()) {
if (m_timerFunction) {
(m_timerFunction)();
m_timerFunction = 0;
}
}
}
void SharedTimerQt::destroy()
{
delete this;
}
SharedTimerQt* SharedTimerQt::inst()
{
static QWeakPointer<SharedTimerQt> timer;
if (!timer) {
timer = new SharedTimerQt();
timer.data()->connect(QCoreApplication::instance(), SIGNAL(aboutToQuit()), SLOT(destroy()));
}
return timer.data();
}
void SharedTimerQt::start(double interval)
{
unsigned int intervalInMS = static_cast<unsigned int>(interval * 1000);
m_timer.start(intervalInMS, this);
}
void SharedTimerQt::stop()
{
m_timer.stop();
}
void SharedTimerQt::timerEvent(QTimerEvent* ev)
{
if (!m_timerFunction || ev->timerId() != m_timer.timerId())
return;
m_timer.stop();
(m_timerFunction)();
}
void setSharedTimerFiredFunction(void (*f)())
{
if (!QCoreApplication::instance())
return;
SharedTimerQt::inst()->m_timerFunction = f;
}
void setSharedTimerFireInterval(double interval)
{
if (!QCoreApplication::instance())
return;
SharedTimerQt::inst()->start(interval);
}
void stopSharedTimer()
{
if (!QCoreApplication::instance())
return;
SharedTimerQt::inst()->stop();
}
#include "SharedTimerQt.moc"
}