Clean up declarative includes
[profile/ivi/qtdeclarative.git] / src / declarative / qml / qdeclarativenotifier_p.h
1 /****************************************************************************
2 **
3 ** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
4 ** All rights reserved.
5 ** Contact: Nokia Corporation (qt-info@nokia.com)
6 **
7 ** This file is part of the QtDeclarative module of the Qt Toolkit.
8 **
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.
17 **
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.
21 **
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.
29 **
30 ** Other Usage
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.
33 **
34 **
35 **
36 **
37 **
38 ** $QT_END_LICENSE$
39 **
40 ****************************************************************************/
41
42 #ifndef QDECLARATIVENOTIFIER_P_H
43 #define QDECLARATIVENOTIFIER_P_H
44
45 #include "qdeclarativedata_p.h"
46 #include "qdeclarativeguard_p.h"
47
48 QT_BEGIN_NAMESPACE
49
50 class QDeclarativeNotifierEndpoint;
51 class Q_DECLARATIVE_EXPORT QDeclarativeNotifier
52 {
53 public:
54     inline QDeclarativeNotifier();
55     inline ~QDeclarativeNotifier();
56     inline void notify();
57
58 private:
59     friend class QDeclarativeData;
60     friend class QDeclarativeNotifierEndpoint;
61
62     static void emitNotify(QDeclarativeNotifierEndpoint *);
63     QDeclarativeNotifierEndpoint *endpoints;
64 };
65
66 class QDeclarativeNotifierEndpoint
67 {
68 public:
69     inline QDeclarativeNotifierEndpoint();
70     inline ~QDeclarativeNotifierEndpoint();
71
72     typedef void (*Callback)(QDeclarativeNotifierEndpoint *);
73     Callback callback;
74
75     inline bool isConnected();
76     inline bool isConnected(QObject *source, int sourceSignal);
77     inline bool isConnected(QDeclarativeNotifier *);
78
79     void connect(QObject *source, int sourceSignal);
80     inline void connect(QDeclarativeNotifier *);
81     inline void disconnect();
82
83     void copyAndClear(QDeclarativeNotifierEndpoint &other);
84
85 private:
86     friend class QDeclarativeData;
87     friend class QDeclarativeNotifier;
88
89     union {
90         QDeclarativeNotifier *notifier;
91         QObject *source;
92     };
93     int sourceSignal;
94     QDeclarativeNotifierEndpoint **disconnected;
95     QDeclarativeNotifierEndpoint  *next;
96     QDeclarativeNotifierEndpoint **prev;
97 };
98
99 QDeclarativeNotifier::QDeclarativeNotifier()
100 : endpoints(0)
101 {
102 }
103
104 QDeclarativeNotifier::~QDeclarativeNotifier()
105 {    
106     QDeclarativeNotifierEndpoint *endpoint = endpoints;
107     while (endpoint) {
108         QDeclarativeNotifierEndpoint *n = endpoint;
109         endpoint = n->next;
110
111         n->next = 0;
112         n->prev = 0;
113         n->notifier = 0;
114         n->sourceSignal = -1;
115         if (n->disconnected) *n->disconnected = 0;
116         n->disconnected = 0;
117     }
118     endpoints = 0;
119 }
120
121 void QDeclarativeNotifier::notify()
122 {
123     if (endpoints) emitNotify(endpoints);
124 }
125
126 QDeclarativeNotifierEndpoint::QDeclarativeNotifierEndpoint()
127 : callback(0), notifier(0), sourceSignal(-1), disconnected(0), next(0), prev(0)
128 {
129 }
130
131 QDeclarativeNotifierEndpoint::~QDeclarativeNotifierEndpoint()
132 {
133     disconnect();
134 }
135
136 bool QDeclarativeNotifierEndpoint::isConnected()
137 {
138     return prev != 0;
139 }
140
141 bool QDeclarativeNotifierEndpoint::isConnected(QObject *source, int sourceSignal)
142 {
143     return sourceSignal != -1 && this->source == source && this->sourceSignal == sourceSignal;
144 }
145
146 bool QDeclarativeNotifierEndpoint::isConnected(QDeclarativeNotifier *notifier)
147 {
148     return sourceSignal == -1 && this->notifier == notifier;
149 }
150
151 void QDeclarativeNotifierEndpoint::connect(QDeclarativeNotifier *notifier)
152 {
153     disconnect();
154
155     next = notifier->endpoints;
156     if (next) { next->prev = &next; }
157     notifier->endpoints = this;
158     prev = &notifier->endpoints;
159     this->notifier = notifier;
160 }
161
162 void QDeclarativeNotifierEndpoint::disconnect()
163 {
164     if (next) next->prev = prev;
165     if (prev) *prev = next;
166     if (disconnected) *disconnected = 0;
167     next = 0;
168     prev = 0;
169     disconnected = 0;
170     notifier = 0;
171     sourceSignal = -1;
172 }
173
174 QT_END_NAMESPACE
175
176 #endif // QDECLARATIVENOTIFIER_P_H
177