/***************************************************************************
- * Copyright (C) 2005-2013 by the Quassel Project *
+ * Copyright (C) 2005-2020 by the Quassel Project *
* devel@quassel-irc.org *
* *
* This program is free software; you can redistribute it and/or modify *
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
***************************************************************************/
-#ifndef PROTOCOL_H_
-#define PROTOCOL_H_
+#pragma once
+
+#include <utility>
#include <QByteArray>
#include <QDateTime>
#include <QVariantList>
+#include "quassel.h"
+
namespace Protocol {
-/*** handled by SignalProxy ***/
+const quint32 magic = 0x42b33f00;
-class SyncMessage
-{
-public:
- inline SyncMessage(const QByteArray &className, const QString &objectName, const QByteArray &slotName, const QVariantList ¶ms)
- : _className(className), _objectName(objectName), _slotName(slotName), _params(params) {}
+const quint32 proxyMagic = 0x50524f58;
- inline QByteArray className() const { return _className; }
- inline QString objectName() const { return _objectName; }
- inline QByteArray slotName() const { return _slotName; }
+enum Type
+{
+ InternalProtocol = 0x00,
+ LegacyProtocol = 0x01,
+ DataStreamProtocol = 0x02
+};
- inline QVariantList params() const { return _params; }
+enum Feature
+{
+ Encryption = 0x01,
+ Compression = 0x02
+};
-private:
- QByteArray _className;
- QString _objectName;
- QByteArray _slotName;
- QVariantList _params;
+enum class Handler
+{
+ SignalProxy,
+ AuthHandler
};
+/*** Handshake, handled by AuthHandler ***/
-class RpcCall
+struct HandshakeMessage
{
-public:
- inline RpcCall(const QByteArray &slotName, const QVariantList ¶ms)
- : _slotName(slotName), _params(params) {}
+ inline Handler handler() const { return Handler::AuthHandler; }
+};
- inline QByteArray slotName() const { return _slotName; }
- inline QVariantList params() const { return _params; }
+struct RegisterClient : public HandshakeMessage
+{
+ inline RegisterClient(Quassel::Features clientFeatures, QString clientVersion, QString buildDate, bool sslSupported = false)
+ : features(std::move(clientFeatures))
+ , clientVersion(std::move(clientVersion))
+ , buildDate(std::move(buildDate))
+ , sslSupported(sslSupported)
+ {}
+
+ Quassel::Features features;
+ QString clientVersion;
+ QString buildDate;
+
+ // this is only used by the LegacyProtocol in compat mode
+ bool sslSupported;
+};
-private:
- QByteArray _slotName;
- QVariantList _params;
+struct ClientDenied : public HandshakeMessage
+{
+ inline ClientDenied(QString errorString)
+ : errorString(std::move(errorString))
+ {}
+
+ QString errorString;
};
+struct ClientRegistered : public HandshakeMessage
+{
+ inline ClientRegistered(
+ Quassel::Features coreFeatures, bool coreConfigured, QVariantList backendInfo, QVariantList authenticatorInfo, bool sslSupported)
+ : features(std::move(coreFeatures))
+ , coreConfigured(coreConfigured)
+ , backendInfo(std::move(backendInfo))
+ , authenticatorInfo(std::move(authenticatorInfo))
+ , sslSupported(sslSupported)
+ {}
+
+ Quassel::Features features;
+ bool coreConfigured;
+ QVariantList backendInfo; // TODO: abstract this better
+
+ // The authenticatorInfo should be optional!
+ QVariantList authenticatorInfo;
+
+ // this is only used by the LegacyProtocol in compat mode
+ bool sslSupported;
+};
-class InitRequest
+struct SetupData : public HandshakeMessage
{
-public:
- inline InitRequest(const QByteArray &className, const QString &objectName)
- : _className(className), _objectName(objectName) {}
+ inline SetupData(QString adminUser,
+ QString adminPassword,
+ QString backend,
+ QVariantMap setupData,
+ QString authenticator = QString(),
+ QVariantMap authSetupData = QVariantMap())
+ : adminUser(std::move(adminUser))
+ , adminPassword(std::move(adminPassword))
+ , backend(std::move(backend))
+ , setupData(std::move(setupData))
+ , authenticator(std::move(authenticator))
+ , authSetupData(std::move(authSetupData))
+ {}
+
+ QString adminUser;
+ QString adminPassword;
+ QString backend;
+ QVariantMap setupData;
+ QString authenticator;
+ QVariantMap authSetupData;
+};
- inline QByteArray className() const { return _className; }
- inline QString objectName() const { return _objectName; }
+struct SetupFailed : public HandshakeMessage
+{
+ inline SetupFailed(QString errorString)
+ : errorString(std::move(errorString))
+ {}
-private:
- QByteArray _className;
- QString _objectName;
+ QString errorString;
};
+struct SetupDone : public HandshakeMessage
+{};
-class InitData
+struct Login : public HandshakeMessage
{
-public:
- inline InitData(const QByteArray &className, const QString &objectName, const QVariantMap &initData)
- : _className(className), _objectName(objectName), _initData(initData) {}
+ inline Login(QString user, QString password)
+ : user(std::move(user))
+ , password(std::move(password))
+ {}
- inline QByteArray className() const { return _className; }
- inline QString objectName() const { return _objectName; }
+ QString user;
+ QString password;
+};
- inline QVariantMap initData() const { return _initData; }
+struct LoginFailed : public HandshakeMessage
+{
+ inline LoginFailed(QString errorString)
+ : errorString(std::move(errorString))
+ {}
-private:
- QByteArray _className;
- QString _objectName;
- QVariantMap _initData;
+ QString errorString;
};
+struct LoginSuccess : public HandshakeMessage
+{};
-/*** handled by RemoteConnection ***/
+// TODO: more generic format
+struct SessionState : public HandshakeMessage
+{
+ inline SessionState() = default; // needed for QMetaType (for the mono client)
+ inline SessionState(QVariantList identities, QVariantList bufferInfos, QVariantList networkIds)
+ : identities(std::move(identities))
+ , bufferInfos(std::move(bufferInfos))
+ , networkIds(std::move(networkIds))
+ {}
+
+ QVariantList identities;
+ QVariantList bufferInfos;
+ QVariantList networkIds;
+};
-class HeartBeat
+/*** handled by SignalProxy ***/
+
+struct SignalProxyMessage
{
-public:
- inline HeartBeat(const QDateTime ×tamp) : _timestamp(timestamp) {}
+ inline Handler handler() const { return Handler::SignalProxy; }
+};
- inline QDateTime timestamp() const { return _timestamp; }
+struct SyncMessage : public SignalProxyMessage
+{
+ SyncMessage() = default;
+ SyncMessage(QByteArray className, QString objectName, QByteArray slotName, QVariantList params)
+ : className(std::move(className))
+ , objectName(std::move(objectName))
+ , slotName(std::move(slotName))
+ , params(std::move(params))
+ {}
+
+ QByteArray className;
+ QString objectName;
+ QByteArray slotName;
+ QVariantList params;
+};
-private:
- QDateTime _timestamp;
+struct RpcCall : public SignalProxyMessage
+{
+ RpcCall() = default;
+ RpcCall(QByteArray signalName, QVariantList params)
+ : signalName(std::move(signalName))
+ , params(std::move(params))
+ {}
+
+ QByteArray signalName;
+ QVariantList params;
};
+struct InitRequest : public SignalProxyMessage
+{
+ InitRequest() = default;
+ InitRequest(QByteArray className, QString objectName)
+ : className(std::move(className))
+ , objectName(std::move(objectName))
+ {}
+
+ QByteArray className;
+ QString objectName;
+};
-class HeartBeatReply
+struct InitData : public SignalProxyMessage
{
-public:
- inline HeartBeatReply(const QDateTime ×tamp) : _timestamp(timestamp) {}
+ InitData() = default;
+ InitData(QByteArray className, QString objectName, QVariantMap initData)
+ : className(std::move(className))
+ , objectName(std::move(objectName))
+ , initData(std::move(initData))
+ {}
+
+ QByteArray className;
+ QString objectName;
+ QVariantMap initData;
+};
- inline QDateTime timestamp() const { return _timestamp; }
+/*** handled by RemoteConnection ***/
-private:
- QDateTime _timestamp;
+struct HeartBeat
+{
+ inline HeartBeat(QDateTime timestamp)
+ : timestamp(std::move(timestamp))
+ {}
+
+ QDateTime timestamp;
};
+struct HeartBeatReply
+{
+ inline HeartBeatReply(QDateTime timestamp)
+ : timestamp(std::move(timestamp))
+ {}
+ QDateTime timestamp;
};
-#endif
+} // namespace Protocol
+
+// Required for InternalPeer
+Q_DECLARE_METATYPE(Protocol::SyncMessage)
+Q_DECLARE_METATYPE(Protocol::RpcCall)
+Q_DECLARE_METATYPE(Protocol::InitRequest)
+Q_DECLARE_METATYPE(Protocol::InitData)