core should fallback to v4 if v6 isn't available
[quassel.git] / src / core / core.cpp
index 6f20174..13a7fd9 100644 (file)
@@ -340,12 +340,23 @@ QHash<BufferId, MsgId> Core::bufferLastSeenMsgIds(UserId user) {
 /*** Network Management ***/
 
 bool Core::startListening(uint port) {
-  if(!server.listen(QHostAddress::Any, port)) {
+  bool success = false;
+
+  // let's see if ipv6 is available
+  success = server.listen(QHostAddress::AnyIPv6, port);
+
+  if(!success && server.serverError() == QAbstractSocket::UnsupportedSocketOperationError) {
+    // fall back to v4
+    success = server.listen(QHostAddress::Any, port);
+  }
+
+  if(!success) {
     qWarning("%s", qPrintable(QString("Could not open GUI client port %1: %2").arg(port).arg(server.errorString())));
-    return false;
+  } else {
+    qDebug() << "Listening for GUI clients on port" << server.serverPort();
   }
-  qDebug() << "Listening for GUI clients on port" << server.serverPort();
-  return true;
+  
+  return success;
 }
 
 void Core::stopListening() {
@@ -394,8 +405,10 @@ void Core::processClientMessage(QTcpSocket *socket, const QVariantMap &msg) {
     QVariantMap reply;
 
     // Just version information -- check it!
-    if((msg.contains("ClientBuild") && msg["ClientBuild"].toUInt() < 732)
-       || (!msg.contains("ClientBuild") && msg["ProtocolVersion"].toUInt() < Global::coreNeedsProtocol)) {
+    uint ver = 0;
+    if(!msg.contains("ProtocolVersion") && msg["ClientBuild"].toUInt() >= 732) ver = 1; // FIXME legacy
+    if(msg.contains("ProtocolVersion")) ver = msg["ProtocolVersion"].toUInt();
+    if(ver < Global::coreNeedsProtocol) {
       reply["MsgType"] = "ClientInitReject";
       reply["Error"] = tr("<b>Your Quassel Client is too old!</b><br>"
       "This core needs at least client/core protocol version %1.<br>"