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 QtDeclarative 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 QDECLARATIVENOTIFIER_P_H
43 #define QDECLARATIVENOTIFIER_P_H
45 #include "qdeclarativedata_p.h"
46 #include "qdeclarativeguard_p.h"
50 class QDeclarativeNotifierEndpoint;
51 class Q_DECLARATIVE_EXPORT QDeclarativeNotifier
54 inline QDeclarativeNotifier();
55 inline ~QDeclarativeNotifier();
59 friend class QDeclarativeData;
60 friend class QDeclarativeNotifierEndpoint;
62 static void emitNotify(QDeclarativeNotifierEndpoint *);
63 QDeclarativeNotifierEndpoint *endpoints;
66 class QDeclarativeNotifierEndpoint
69 inline QDeclarativeNotifierEndpoint();
70 inline ~QDeclarativeNotifierEndpoint();
72 typedef void (*Callback)(QDeclarativeNotifierEndpoint *);
75 inline bool isConnected();
76 inline bool isConnected(QObject *source, int sourceSignal);
77 inline bool isConnected(QDeclarativeNotifier *);
79 void connect(QObject *source, int sourceSignal);
80 inline void connect(QDeclarativeNotifier *);
81 inline void disconnect();
83 inline bool isNotifying() const;
84 inline void cancelNotify();
86 void copyAndClear(QDeclarativeNotifierEndpoint &other);
89 friend class QDeclarativeData;
90 friend class QDeclarativeNotifier;
93 QDeclarativeNotifier *notifier;
96 unsigned int notifying : 1;
97 signed int sourceSignal : 31;
98 QDeclarativeNotifierEndpoint **disconnected;
99 QDeclarativeNotifierEndpoint *next;
100 QDeclarativeNotifierEndpoint **prev;
103 QDeclarativeNotifier::QDeclarativeNotifier()
108 QDeclarativeNotifier::~QDeclarativeNotifier()
110 QDeclarativeNotifierEndpoint *endpoint = endpoints;
112 QDeclarativeNotifierEndpoint *n = endpoint;
118 n->sourceSignal = -1;
119 if (n->disconnected) *n->disconnected = 0;
125 void QDeclarativeNotifier::notify()
127 if (endpoints) emitNotify(endpoints);
130 QDeclarativeNotifierEndpoint::QDeclarativeNotifierEndpoint()
131 : callback(0), notifier(0), notifying(0), sourceSignal(-1), disconnected(0), next(0), prev(0)
135 QDeclarativeNotifierEndpoint::~QDeclarativeNotifierEndpoint()
140 bool QDeclarativeNotifierEndpoint::isConnected()
145 bool QDeclarativeNotifierEndpoint::isConnected(QObject *source, int sourceSignal)
147 return this->sourceSignal != -1 && this->source == source && this->sourceSignal == sourceSignal;
150 bool QDeclarativeNotifierEndpoint::isConnected(QDeclarativeNotifier *notifier)
152 return sourceSignal == -1 && this->notifier == notifier;
155 void QDeclarativeNotifierEndpoint::connect(QDeclarativeNotifier *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 QDeclarativeNotifierEndpoint::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 QDeclarativeNotifier
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 QDeclarativeNotifierEndpoint::isNotifying() const
188 return notifying == 1;
192 Cancel any notifies that are in progress.
194 void QDeclarativeNotifierEndpoint::cancelNotify()
205 #endif // QDECLARATIVENOTIFIER_P_H