Allow overriding of socket handling methods
[quassel.git] / src / common / protocol.h
1 /***************************************************************************
2  *   Copyright (C) 2005-2014 by the Quassel Project                        *
3  *   devel@quassel-irc.org                                                 *
4  *                                                                         *
5  *   This program is free software; you can redistribute it and/or modify  *
6  *   it under the terms of the GNU General Public License as published by  *
7  *   the Free Software Foundation; either version 2 of the License, or     *
8  *   (at your option) version 3.                                           *
9  *                                                                         *
10  *   This program is distributed in the hope that it will be useful,       *
11  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
12  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
13  *   GNU General Public License for more details.                          *
14  *                                                                         *
15  *   You should have received a copy of the GNU General Public License     *
16  *   along with this program; if not, write to the                         *
17  *   Free Software Foundation, Inc.,                                       *
18  *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.         *
19  ***************************************************************************/
20
21 #ifndef PROTOCOL_H_
22 #define PROTOCOL_H_
23
24 #include <QByteArray>
25 #include <QDateTime>
26 #include <QVariantList>
27
28 namespace Protocol {
29
30 enum Type {
31     LegacyProtocol = 1
32 };
33
34 enum Handler {
35     SignalProxy,
36     AuthHandler
37 };
38
39 /*** Handshake, handled by AuthHandler ***/
40
41
42 struct HandshakeMessage {
43     inline Handler handler() const { return AuthHandler; }
44 };
45
46
47 struct RegisterClient : public HandshakeMessage
48 {
49     inline RegisterClient(const QString &clientVersion, bool sslSupported = false)
50     : clientVersion(clientVersion)
51     , sslSupported(sslSupported) {}
52
53     QString clientVersion;
54
55     // this is only used by the LegacyProtocol in compat mode
56     bool sslSupported;
57 };
58
59
60 struct ClientDenied : public HandshakeMessage
61 {
62     inline ClientDenied(const QString &errorString)
63     : errorString(errorString) {}
64
65     QString errorString;
66 };
67
68
69 struct ClientRegistered : public HandshakeMessage
70 {
71     inline ClientRegistered(quint32 coreFeatures, bool coreConfigured, const QVariantList &backendInfo, bool sslSupported, const QDateTime &coreStartTime)
72     : coreFeatures(coreFeatures)
73     , coreConfigured(coreConfigured)
74     , backendInfo(backendInfo)
75     , sslSupported(sslSupported)
76     , coreStartTime(coreStartTime)
77     {}
78
79     quint32 coreFeatures;
80     bool coreConfigured;
81     QVariantList backendInfo; // TODO: abstract this better
82
83     // this is only used by the LegacyProtocol in compat mode
84     bool sslSupported;
85     QDateTime coreStartTime;
86 };
87
88
89 struct SetupData : public HandshakeMessage
90 {
91     inline SetupData(const QString &adminUser, const QString &adminPassword, const QString &backend, const QVariantMap &setupData)
92     : adminUser(adminUser), adminPassword(adminPassword), backend(backend), setupData(setupData) {}
93
94     QString adminUser;
95     QString adminPassword;
96     QString backend;
97     QVariantMap setupData;
98 };
99
100
101 struct SetupFailed : public HandshakeMessage
102 {
103     inline SetupFailed(const QString &errorString)
104     : errorString(errorString) {}
105
106     QString errorString;
107 };
108
109
110 struct SetupDone : public HandshakeMessage
111 {
112     inline SetupDone() {}
113 };
114
115
116 struct Login : public HandshakeMessage
117 {
118     inline Login(const QString &user, const QString &password)
119     : user(user), password(password) {}
120
121     QString user;
122     QString password;
123 };
124
125
126 struct LoginFailed : public HandshakeMessage
127 {
128     inline LoginFailed(const QString &errorString)
129     : errorString(errorString) {}
130
131     QString errorString;
132 };
133
134
135 struct LoginSuccess : public HandshakeMessage
136 {
137     inline LoginSuccess() {}
138 };
139
140
141 // TODO: more generic format
142 struct SessionState : public HandshakeMessage
143 {
144     inline SessionState() {} // needed for QMetaType (for the mono client)
145     inline SessionState(const QVariantList &identities, const QVariantList &bufferInfos, const QVariantList &networkIds)
146     : identities(identities), bufferInfos(bufferInfos), networkIds(networkIds) {}
147
148     QVariantList identities;
149     QVariantList bufferInfos;
150     QVariantList networkIds;
151 };
152
153 /*** handled by SignalProxy ***/
154
155 struct SignalProxyMessage
156 {
157     inline Handler handler() const { return SignalProxy; }
158 };
159
160
161 struct SyncMessage : public SignalProxyMessage
162 {
163     inline SyncMessage(const QByteArray &className, const QString &objectName, const QByteArray &slotName, const QVariantList &params)
164     : className(className), objectName(objectName), slotName(slotName), params(params) {}
165
166     QByteArray className;
167     QString objectName;
168     QByteArray slotName;
169     QVariantList params;
170 };
171
172
173 struct RpcCall : public SignalProxyMessage
174 {
175     inline RpcCall(const QByteArray &slotName, const QVariantList &params)
176     : slotName(slotName), params(params) {}
177
178     QByteArray slotName;
179     QVariantList params;
180 };
181
182
183 struct InitRequest : public SignalProxyMessage
184 {
185     inline InitRequest(const QByteArray &className, const QString &objectName)
186     : className(className), objectName(objectName) {}
187
188     QByteArray className;
189     QString objectName;
190 };
191
192
193 struct InitData : public SignalProxyMessage
194 {
195     inline InitData(const QByteArray &className, const QString &objectName, const QVariantMap &initData)
196     : className(className), objectName(objectName), initData(initData) {}
197
198     QByteArray className;
199     QString objectName;
200     QVariantMap initData;
201 };
202
203
204 /*** handled by RemoteConnection ***/
205
206 struct HeartBeat
207 {
208     inline HeartBeat(const QDateTime &timestamp) : timestamp(timestamp) {}
209
210     QDateTime timestamp;
211 };
212
213
214 struct HeartBeatReply
215 {
216     inline HeartBeatReply(const QDateTime &timestamp) : timestamp(timestamp) {}
217
218     QDateTime timestamp;
219 };
220
221
222 };
223
224 #endif