common: Represent core/client features as string list in the protocol
[quassel.git] / src / common / protocols / datastream / datastreampeer.cpp
index e91c977..6709c69 100644 (file)
@@ -24,6 +24,7 @@
 #include <QTcpSocket>
 
 #include "datastreampeer.h"
+#include "quassel.h"
 
 using namespace Protocol;
 
@@ -116,7 +117,11 @@ void DataStreamPeer::handleHandshakeMessage(const QVariantList &mapData)
     }
 
     if (msgType == "ClientInit") {
-        handle(RegisterClient(m["ClientVersion"].toString(), m["ClientDate"].toString(), false, m["Features"].toInt())); // UseSsl obsolete
+        handle(RegisterClient{Quassel::Features{m["FeatureList"].toStringList(), Quassel::LegacyFeatures(m["Features"].toUInt())},
+                              m["ClientVersion"].toString(),
+                              m["ClientDate"].toString(),
+                              false  // UseSsl obsolete
+               });
     }
 
     else if (msgType == "ClientInitReject") {
@@ -124,7 +129,12 @@ void DataStreamPeer::handleHandshakeMessage(const QVariantList &mapData)
     }
 
     else if (msgType == "ClientInitAck") {
-        handle(ClientRegistered(m["CoreFeatures"].toUInt(), m["Configured"].toBool(), m["StorageBackends"].toList(), false, m["Authenticators"].toList())); // SupportsSsl obsolete
+        handle(ClientRegistered{Quassel::Features{m["FeatureList"].toStringList(), Quassel::LegacyFeatures(m["CoreFeatures"].toUInt())},
+                                m["Configured"].toBool(),
+                                m["StorageBackends"].toList(),
+                                m["Authenticators"].toList(),
+                                false  // SupportsSsl obsolete
+               });
     }
 
     else if (msgType == "CoreSetupData") {
@@ -166,9 +176,10 @@ void DataStreamPeer::handleHandshakeMessage(const QVariantList &mapData)
 void DataStreamPeer::dispatch(const RegisterClient &msg) {
     QVariantMap m;
     m["MsgType"] = "ClientInit";
+    m["Features"] = static_cast<quint32>(msg.features.toLegacyFeatures());
+    m["FeatureList"] = msg.features.toStringList();
     m["ClientVersion"] = msg.clientVersion;
     m["ClientDate"] = msg.buildDate;
-    m["Features"] = msg.clientFeatures;
 
     writeMessage(m);
 }
@@ -186,10 +197,17 @@ void DataStreamPeer::dispatch(const ClientDenied &msg) {
 void DataStreamPeer::dispatch(const ClientRegistered &msg) {
     QVariantMap m;
     m["MsgType"] = "ClientInitAck";
-    m["CoreFeatures"] = msg.coreFeatures;
-    m["StorageBackends"] = msg.backendInfo;
-    m["Authenticators"] = msg.authenticatorInfo;
+    if (hasFeature(Quassel::Feature::ExtendedFeatures)) {
+        m["FeatureList"] = msg.features.toStringList();
+    }
+    else {
+        m["CoreFeatures"] = static_cast<quint32>(msg.features.toLegacyFeatures());
+    }
     m["LoginEnabled"] = m["Configured"] = msg.coreConfigured;
+    m["StorageBackends"] = msg.backendInfo;
+    if (hasFeature(Quassel::Feature::Authenticators)) {
+        m["Authenticators"] = msg.authenticatorInfo;
+    }
 
     writeMessage(m);
 }