1 /****************************************************************************
3 ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
4 ** Contact: http://www.qt-project.org/
6 ** This file is part of the QtQml module of the Qt Toolkit.
8 ** $QT_BEGIN_LICENSE:LGPL$
9 ** GNU Lesser General Public License Usage
10 ** This file may be used under the terms of the GNU Lesser General Public
11 ** License version 2.1 as published by the Free Software Foundation and
12 ** appearing in the file LICENSE.LGPL included in the packaging of this
13 ** file. Please review the following information to ensure the GNU Lesser
14 ** General Public License version 2.1 requirements will be met:
15 ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
17 ** In addition, as a special exception, Nokia gives you certain additional
18 ** rights. These rights are described in the Nokia Qt LGPL Exception
19 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
21 ** GNU General Public License Usage
22 ** Alternatively, this file may be used under the terms of the GNU General
23 ** Public License version 3.0 as published by the Free Software Foundation
24 ** and appearing in the file LICENSE.GPL included in the packaging of this
25 ** file. Please review the following information to ensure the GNU General
26 ** Public License version 3.0 requirements will be met:
27 ** http://www.gnu.org/copyleft/gpl.html.
30 ** Alternatively, this file may be used in accordance with the terms and
31 ** conditions contained in a signed written agreement between you and Nokia.
40 ****************************************************************************/
42 #ifndef QQMLNOTIFIER_P_H
43 #define QQMLNOTIFIER_P_H
45 #include "qqmldata_p.h"
46 #include "qqmlguard_p.h"
50 class QQmlNotifierEndpoint;
51 class Q_QML_EXPORT QQmlNotifier
54 inline QQmlNotifier();
55 inline ~QQmlNotifier();
59 friend class QQmlData;
60 friend class QQmlNotifierEndpoint;
62 static void emitNotify(QQmlNotifierEndpoint *);
63 QQmlNotifierEndpoint *endpoints;
66 class QQmlNotifierEndpoint
69 inline QQmlNotifierEndpoint();
70 inline ~QQmlNotifierEndpoint();
72 typedef void (*Callback)(QQmlNotifierEndpoint *);
75 inline bool isConnected();
76 inline bool isConnected(QObject *source, int sourceSignal);
77 inline bool isConnected(QQmlNotifier *);
79 void connect(QObject *source, int sourceSignal);
80 inline void connect(QQmlNotifier *);
81 inline void disconnect();
83 inline bool isNotifying() const;
84 inline void cancelNotify();
86 void copyAndClear(QQmlNotifierEndpoint &other);
89 friend class QQmlData;
90 friend class QQmlNotifier;
93 QQmlNotifier *notifier;
96 unsigned int notifying : 1;
97 signed int sourceSignal : 31;
98 QQmlNotifierEndpoint **disconnected;
99 QQmlNotifierEndpoint *next;
100 QQmlNotifierEndpoint **prev;
103 QQmlNotifier::QQmlNotifier()
108 QQmlNotifier::~QQmlNotifier()
110 QQmlNotifierEndpoint *endpoint = endpoints;
112 QQmlNotifierEndpoint *n = endpoint;
118 n->sourceSignal = -1;
119 if (n->disconnected) *n->disconnected = 0;
125 void QQmlNotifier::notify()
127 if (endpoints) emitNotify(endpoints);
130 QQmlNotifierEndpoint::QQmlNotifierEndpoint()
131 : callback(0), notifier(0), notifying(0), sourceSignal(-1), disconnected(0), next(0), prev(0)
135 QQmlNotifierEndpoint::~QQmlNotifierEndpoint()
140 bool QQmlNotifierEndpoint::isConnected()
145 bool QQmlNotifierEndpoint::isConnected(QObject *source, int sourceSignal)
147 return this->sourceSignal != -1 && this->source == source && this->sourceSignal == sourceSignal;
150 bool QQmlNotifierEndpoint::isConnected(QQmlNotifier *notifier)
152 return sourceSignal == -1 && this->notifier == notifier;
155 void QQmlNotifierEndpoint::connect(QQmlNotifier *notifier)
159 next = notifier->endpoints;
160 if (next) { next->prev = &next; }
161 notifier->endpoints = this;
162 prev = ¬ifier->endpoints;
163 this->notifier = notifier;
166 void QQmlNotifierEndpoint::disconnect()
168 if (next) next->prev = prev;
169 if (prev) *prev = next;
170 if (disconnected) *disconnected = 0;
180 Returns true if a notify is in progress. This means that the signal or QQmlNotifier
181 that this endpoing is connected to has been triggered, but this endpoint's callback has not
184 An in progress notify can be cancelled by calling cancelNotify.
186 bool QQmlNotifierEndpoint::isNotifying() const
188 return notifying == 1;
192 Cancel any notifies that are in progress.
194 void QQmlNotifierEndpoint::cancelNotify()
205 #endif // QQMLNOTIFIER_P_H