1 /****************************************************************************
3 ** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
4 ** All rights reserved.
5 ** Contact: Nokia Corporation (qt-info@nokia.com)
7 ** This file is part of the QtDeclarative module of the Qt Toolkit.
9 ** $QT_BEGIN_LICENSE:LGPL$
10 ** GNU Lesser General Public License Usage
11 ** This file may be used under the terms of the GNU Lesser General Public
12 ** License version 2.1 as published by the Free Software Foundation and
13 ** appearing in the file LICENSE.LGPL included in the packaging of this
14 ** file. Please review the following information to ensure the GNU Lesser
15 ** General Public License version 2.1 requirements will be met:
16 ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
18 ** In addition, as a special exception, Nokia gives you certain additional
19 ** rights. These rights are described in the Nokia Qt LGPL Exception
20 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
22 ** GNU General Public License Usage
23 ** Alternatively, this file may be used under the terms of the GNU General
24 ** Public License version 3.0 as published by the Free Software Foundation
25 ** and appearing in the file LICENSE.GPL included in the packaging of this
26 ** file. Please review the following information to ensure the GNU General
27 ** Public License version 3.0 requirements will be met:
28 ** http://www.gnu.org/copyleft/gpl.html.
31 ** Alternatively, this file may be used in accordance with the terms and
32 ** 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 void copyAndClear(QDeclarativeNotifierEndpoint &other);
86 friend class QDeclarativeData;
87 friend class QDeclarativeNotifier;
90 QDeclarativeNotifier *notifier;
94 QDeclarativeNotifierEndpoint **disconnected;
95 QDeclarativeNotifierEndpoint *next;
96 QDeclarativeNotifierEndpoint **prev;
99 QDeclarativeNotifier::QDeclarativeNotifier()
104 QDeclarativeNotifier::~QDeclarativeNotifier()
106 QDeclarativeNotifierEndpoint *endpoint = endpoints;
108 QDeclarativeNotifierEndpoint *n = endpoint;
114 n->sourceSignal = -1;
115 if (n->disconnected) *n->disconnected = 0;
121 void QDeclarativeNotifier::notify()
123 if (endpoints) emitNotify(endpoints);
126 QDeclarativeNotifierEndpoint::QDeclarativeNotifierEndpoint()
127 : callback(0), notifier(0), sourceSignal(-1), disconnected(0), next(0), prev(0)
131 QDeclarativeNotifierEndpoint::~QDeclarativeNotifierEndpoint()
136 bool QDeclarativeNotifierEndpoint::isConnected()
141 bool QDeclarativeNotifierEndpoint::isConnected(QObject *source, int sourceSignal)
143 return sourceSignal != -1 && this->source == source && this->sourceSignal == sourceSignal;
146 bool QDeclarativeNotifierEndpoint::isConnected(QDeclarativeNotifier *notifier)
148 return sourceSignal == -1 && this->notifier == notifier;
151 void QDeclarativeNotifierEndpoint::connect(QDeclarativeNotifier *notifier)
155 next = notifier->endpoints;
156 if (next) { next->prev = &next; }
157 notifier->endpoints = this;
158 prev = ¬ifier->endpoints;
159 this->notifier = notifier;
162 void QDeclarativeNotifierEndpoint::disconnect()
164 if (next) next->prev = prev;
165 if (prev) *prev = next;
166 if (disconnected) *disconnected = 0;
176 #endif // QDECLARATIVENOTIFIER_P_H