/***************************************************************************
- * Copyright (C) 2005-2014 by the Quassel Project *
+ * Copyright (C) 2005-2018 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 <QByteArray>
#include <QDateTime>
#include <QVariantList>
+#include "quassel.h"
+
namespace Protocol {
const quint32 magic = 0x42b33f00;
enum Type {
+ InternalProtocol = 0x00,
LegacyProtocol = 0x01,
DataStreamProtocol = 0x02
};
};
-enum Handler {
+enum class Handler {
SignalProxy,
AuthHandler
};
/*** Handshake, handled by AuthHandler ***/
struct HandshakeMessage {
- inline Handler handler() const { return AuthHandler; }
+ inline Handler handler() const { return Handler::AuthHandler; }
};
struct RegisterClient : public HandshakeMessage
{
- inline RegisterClient(const QString &clientVersion, const QString &buildDate, bool sslSupported = false)
- : clientVersion(clientVersion)
- , buildDate(buildDate)
- , sslSupported(sslSupported) {}
+ inline RegisterClient(Quassel::Features clientFeatures, const QString &clientVersion, const QString &buildDate, bool sslSupported = false)
+ : features(std::move(clientFeatures))
+ , clientVersion(clientVersion)
+ , buildDate(buildDate)
+ , sslSupported(sslSupported)
+ {}
+ Quassel::Features features;
QString clientVersion;
QString buildDate;
struct ClientRegistered : public HandshakeMessage
{
- inline ClientRegistered(quint32 coreFeatures, bool coreConfigured, const QVariantList &backendInfo, bool sslSupported, const QString &coreInfo)
- : coreFeatures(coreFeatures)
- , coreConfigured(coreConfigured)
- , backendInfo(backendInfo)
- , sslSupported(sslSupported)
- , coreInfo(coreInfo)
+ inline ClientRegistered(Quassel::Features coreFeatures, bool coreConfigured, const QVariantList &backendInfo, const QVariantList &authenticatorInfo, bool sslSupported)
+ : features(std::move(coreFeatures))
+ , coreConfigured(coreConfigured)
+ , backendInfo(backendInfo)
+ , authenticatorInfo(authenticatorInfo)
+ , sslSupported(sslSupported)
{}
- quint32 coreFeatures;
+ 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;
- QString coreInfo;
};
struct SetupData : public HandshakeMessage
{
- inline SetupData(const QString &adminUser, const QString &adminPassword, const QString &backend, const QVariantMap &setupData)
- : adminUser(adminUser), adminPassword(adminPassword), backend(backend), setupData(setupData) {}
+ inline SetupData(const QString &adminUser, const QString &adminPassword, const QString &backend,
+ const QVariantMap &setupData, const QString &authenticator = QString(),
+ const QVariantMap &authSetupData = QVariantMap())
+ : adminUser(adminUser)
+ , adminPassword(adminPassword)
+ , backend(backend)
+ , setupData(setupData)
+ , authenticator(authenticator)
+ , authSetupData(authSetupData)
+ {}
QString adminUser;
QString adminPassword;
QString backend;
QVariantMap setupData;
+ QString authenticator;
+ QVariantMap authSetupData;
};
struct SignalProxyMessage
{
- inline Handler handler() const { return SignalProxy; }
+ inline Handler handler() const { return Handler::SignalProxy; }
};
struct SyncMessage : public SignalProxyMessage
{
- inline SyncMessage(const QByteArray &className, const QString &objectName, const QByteArray &slotName, const QVariantList ¶ms)
- : className(className), objectName(objectName), slotName(slotName), params(params) {}
+ SyncMessage() = default;
+ SyncMessage(const QByteArray &className, const QString &objectName, const QByteArray &slotName, const QVariantList ¶ms)
+ : className(className), objectName(objectName), slotName(slotName), params(params) {}
QByteArray className;
QString objectName;
struct RpcCall : public SignalProxyMessage
{
- inline RpcCall(const QByteArray &slotName, const QVariantList ¶ms)
- : slotName(slotName), params(params) {}
+ RpcCall() = default;
+ RpcCall(const QByteArray &slotName, const QVariantList ¶ms)
+ : slotName(slotName), params(params) {}
QByteArray slotName;
QVariantList params;
struct InitRequest : public SignalProxyMessage
{
- inline InitRequest(const QByteArray &className, const QString &objectName)
- : className(className), objectName(objectName) {}
+ InitRequest() = default;
+ InitRequest(const QByteArray &className, const QString &objectName)
+ : className(className), objectName(objectName) {}
QByteArray className;
QString objectName;
struct InitData : public SignalProxyMessage
{
- inline InitData(const QByteArray &className, const QString &objectName, const QVariantMap &initData)
- : className(className), objectName(objectName), initData(initData) {}
+ InitData() = default;
+ InitData(const QByteArray &className, const QString &objectName, const QVariantMap &initData)
+ : className(className), objectName(objectName), initData(initData) {}
QByteArray className;
QString objectName;
};
-};
+}
-#endif
+// Required for InternalPeer
+Q_DECLARE_METATYPE(Protocol::SyncMessage)
+Q_DECLARE_METATYPE(Protocol::RpcCall)
+Q_DECLARE_METATYPE(Protocol::InitRequest)
+Q_DECLARE_METATYPE(Protocol::InitData)