modernize: Pass arguments by value and move in constructors
[quassel.git] / src / common / protocol.h
index af98b8b..47dabd9 100644 (file)
@@ -1,5 +1,5 @@
 /***************************************************************************
- *   Copyright (C) 2005-2013 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 <utility>
+
+#include "quassel.h"
 
 namespace Protocol {
 
-/*** handled by SignalProxy ***/
+const quint32 magic = 0x42b33f00;
+
+enum Type {
+    InternalProtocol = 0x00,
+    LegacyProtocol = 0x01,
+    DataStreamProtocol = 0x02
+};
+
+
+enum Feature {
+    Encryption = 0x01,
+    Compression = 0x02
+};
+
+
+enum class Handler {
+    SignalProxy,
+    AuthHandler
+};
+
+
+/*** Handshake, handled by AuthHandler ***/
+
+struct HandshakeMessage {
+    inline Handler handler() const { return Handler::AuthHandler; }
+};
+
 
-class SyncMessage
+struct RegisterClient : public HandshakeMessage
 {
-public:
-    inline SyncMessage(const QByteArray &className, const QString &objectName, const QByteArray &slotName, const QVariantList &params)
-    : _className(className), _objectName(objectName), _slotName(slotName), _params(params) {}
+    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;
+};
 
-    inline QByteArray className() const { return _className; }
-    inline QString objectName() const { return _objectName; }
-    inline QByteArray slotName() const { return _slotName; }
 
-    inline QVariantList params() const { return _params; }
+struct ClientDenied : public HandshakeMessage
+{
+    inline ClientDenied(QString errorString)
+    : errorString(std::move(errorString)) {}
 
-private:
-    QByteArray _className;
-    QString _objectName;
-    QByteArray _slotName;
-    QVariantList _params;
+    QString errorString;
 };
 
 
-class RpcCall
+struct ClientRegistered : public HandshakeMessage
 {
-public:
-    inline RpcCall(const QByteArray &slotName, const QVariantList &params)
-    : _slotName(slotName), _params(params) {}
+    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;
+};
 
-    inline QByteArray slotName() const { return _slotName; }
-    inline QVariantList params() const { return _params; }
 
-private:
-    QByteArray _slotName;
-    QVariantList _params;
+struct SetupData : public HandshakeMessage
+{
+    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;
 };
 
 
-class InitRequest
+struct SetupFailed : public HandshakeMessage
 {
-public:
-    inline InitRequest(const QByteArray &className, const QString &objectName)
-    : _className(className), _objectName(objectName) {}
+    inline SetupFailed(QString errorString)
+    : errorString(std::move(errorString)) {}
+
+    QString errorString;
+};
 
-    inline QByteArray className() const { return _className; }
-    inline QString objectName() const { return _objectName; }
 
-private:
-    QByteArray _className;
-    QString _objectName;
+struct SetupDone : public HandshakeMessage
+{
+    inline SetupDone() {}
 };
 
 
-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)) {}
+
+    QString user;
+    QString password;
+};
 
-    inline QByteArray className() const { return _className; }
-    inline QString objectName() const { return _objectName; }
 
-    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;
 };
 
 
-/*** handled by RemoteConnection ***/
+struct LoginSuccess : public HandshakeMessage
+{
+    inline LoginSuccess() {}
+};
+
 
-class HeartBeat
+// TODO: more generic format
+struct SessionState : public HandshakeMessage
 {
-public:
-    inline HeartBeat(const QDateTime &timestamp) : _timestamp(timestamp) {}
+    inline SessionState() {} // 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)) {}
 
-    inline QDateTime timestamp() const { return _timestamp; }
+    QVariantList identities;
+    QVariantList bufferInfos;
+    QVariantList networkIds;
+};
+
+/*** handled by SignalProxy ***/
+
+struct SignalProxyMessage
+{
+    inline Handler handler() const { return Handler::SignalProxy; }
+};
+
+
+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;
+};
+
+
+struct RpcCall : public SignalProxyMessage
+{
+    RpcCall() = default;
+    RpcCall(QByteArray slotName, QVariantList params)
+        : slotName(std::move(slotName)), params(std::move(params)) {}
+
+    QByteArray slotName;
+    QVariantList params;
+};
+
+
+struct InitRequest : public SignalProxyMessage
+{
+    InitRequest() = default;
+    InitRequest(QByteArray className, QString objectName)
+        : className(std::move(className)), objectName(std::move(objectName)) {}
 
-private:
-    QDateTime _timestamp;
+    QByteArray className;
+    QString objectName;
 };
 
 
-class HeartBeatReply
+struct InitData : public SignalProxyMessage
 {
-public:
-    inline HeartBeatReply(const QDateTime &timestamp) : _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 ***/
+
+struct HeartBeat
+{
+    inline HeartBeat(QDateTime timestamp) : timestamp(std::move(timestamp)) {}
 
-private:
-    QDateTime _timestamp;
+    QDateTime timestamp;
 };
 
 
+struct HeartBeatReply
+{
+    inline HeartBeatReply(QDateTime timestamp) : timestamp(std::move(timestamp)) {}
+
+    QDateTime timestamp;
 };
 
-#endif
+
+}
+
+// Required for InternalPeer
+Q_DECLARE_METATYPE(Protocol::SyncMessage)
+Q_DECLARE_METATYPE(Protocol::RpcCall)
+Q_DECLARE_METATYPE(Protocol::InitRequest)
+Q_DECLARE_METATYPE(Protocol::InitData)