1/*
2 * Copyright (C) 2006 George Staikos <staikos@kde.org>
3 * Copyright (C) 2006 Dirk Mueller <mueller@kde.org>
4 * Copyright (C) 2008 Holger Hans Peter Freyther
5 *
6 * All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 * 1. Redistributions of source code must retain the above copyright
12 *    notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 *    notice, this list of conditions and the following disclaimer in the
15 *    documentation and/or other materials provided with the distribution.
16 *
17 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
18 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
20 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
21 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
22 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
23 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
24 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
25 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 */
29
30
31#include "config.h"
32
33#include <wtf/CurrentTime.h>
34
35#include <QBasicTimer>
36#include <QCoreApplication>
37#include <QDebug>
38#include <QPointer>
39
40namespace WebCore {
41
42class SharedTimerQt : public QObject {
43    friend void setSharedTimerFiredFunction(void (*f)());
44public:
45    static SharedTimerQt* inst();
46
47    void start(double);
48    void stop();
49
50protected:
51    void timerEvent(QTimerEvent* ev);
52
53private:
54    SharedTimerQt(QObject* parent);
55    ~SharedTimerQt();
56    QBasicTimer m_timer;
57    void (*m_timerFunction)();
58};
59
60SharedTimerQt::SharedTimerQt(QObject* parent)
61    : QObject(parent)
62    , m_timerFunction(0)
63{}
64
65SharedTimerQt::~SharedTimerQt()
66{
67    if (m_timer.isActive())
68        (m_timerFunction)();
69}
70
71SharedTimerQt* SharedTimerQt::inst()
72{
73    static QPointer<SharedTimerQt> timer;
74    if (!timer)
75        timer = new SharedTimerQt(QCoreApplication::instance());
76
77    return timer;
78}
79
80void SharedTimerQt::start(double fireTime)
81{
82    double interval = fireTime - currentTime();
83    unsigned int intervalInMS;
84    if (interval < 0)
85        intervalInMS = 0;
86    else {
87        interval *= 1000;
88        intervalInMS = (unsigned int)interval;
89    }
90
91    m_timer.start(intervalInMS, this);
92}
93
94void SharedTimerQt::stop()
95{
96    m_timer.stop();
97}
98
99void SharedTimerQt::timerEvent(QTimerEvent* ev)
100{
101    if (!m_timerFunction || ev->timerId() != m_timer.timerId())
102        return;
103
104    m_timer.stop();
105    (m_timerFunction)();
106}
107
108void setSharedTimerFiredFunction(void (*f)())
109{
110    if (!QCoreApplication::instance())
111        return;
112
113    SharedTimerQt::inst()->m_timerFunction = f;
114}
115
116void setSharedTimerFireTime(double fireTime)
117{
118    if (!QCoreApplication::instance())
119        return;
120
121    SharedTimerQt::inst()->start(fireTime);
122}
123
124void stopSharedTimer()
125{
126    if (!QCoreApplication::instance())
127        return;
128
129    SharedTimerQt::inst()->stop();
130}
131
132}
133
134// vim: ts=4 sw=4 et
135