[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    [konversation] src/irc: Improve capability negotiation
From:       Peter Simonsson <peter.simonsson () gmail ! com>
Date:       2016-11-26 16:55:59
Message-ID: E1cAgGd-0008Cx-6G () code ! kde ! org
[Download RAW message or body]

Git commit 122d82d754acfb6e63a3d189fe4e4f97b9117f85 by Peter Simonsson.
Committed on 26/11/2016 at 16:53.
Pushed by psn into branch 'master'.

Improve capability negotiation

Do CAP LS first to see which capabilities that is available
instead of requesting all and let the server ack or nack them.
This improves the connection speed considerably.

M  +9    -1    src/irc/inputfilter.cpp
M  +53   -31   src/irc/server.cpp
M  +2    -1    src/irc/server.h

https://commits.kde.org/konversation/122d82d754acfb6e63a3d189fe4e4f97b9117f85

diff --git a/src/irc/inputfilter.cpp b/src/irc/inputfilter.cpp
index fa68587..afd3b06 100644
--- a/src/irc/inputfilter.cpp
+++ b/src/irc/inputfilter.cpp
@@ -841,7 +841,15 @@ void InputFilter::parseServerCommand(const QString &prefix, \
const QString &comma  }
             else if (command == "ls" || command == "list")
             {
-                m_server->appendStatusMessage(i18n("Capabilities"), \
parameterList.mid(2).join(QStringLiteral(" ")), messageTags); +                if \
(getAutomaticRequest(QStringLiteral("CAP LS"), QString()) == 0) +                {
+                    m_server->appendStatusMessage(i18n("Capabilities"), \
parameterList.mid(2).join(QStringLiteral(" ")), messageTags); +                }
+                else
+                {
+                    setAutomaticRequest (QStringLiteral("CAP LS"), QString (), \
false); +                    m_server->capInitiateNegotiation \
(parameterList.mid(2).join(QStringLiteral(" "))); +                }
             }
         }
         else if (command == QStringLiteral("authenticate") && plHas(1))
diff --git a/src/irc/server.cpp b/src/irc/server.cpp
index 750f712..bf8d9d9 100644
--- a/src/irc/server.cpp
+++ b/src/irc/server.cpp
@@ -673,8 +673,7 @@ void Server::socketConnected()
     emit sslConnected(this);
     getConnectionSettings().setReconnectCount(0);
 
-    capInitiateNegotiation(getIdentity() && getIdentity()->getAuthType() == \
                QStringLiteral("saslplain")
-                           && !getIdentity()->getSaslAccount().isEmpty() && \
!getIdentity()->getAuthPassword().isEmpty()); +    requestAvailableCapabilies();
 
     QStringList ql;
 
@@ -695,42 +694,66 @@ void Server::socketConnected()
     setNickname(getNickname());
 }
 
-void Server::capInitiateNegotiation(bool useSASL)
+void Server::requestAvailableCapabilies ()
 {
+    getStatusView()->appendServerMessage(i18n("Info"),i18n("Negotiating capabilities \
with server...")); +    m_inputFilter.setAutomaticRequest(QStringLiteral("CAP LS"), \
QString(), true); +    queue(QStringLiteral("CAP LS"), HighPriority);
+}
+
+void Server::capInitiateNegotiation(const QString &availableCaps)
+{
+    bool useSASL = getIdentity() && getIdentity()->getAuthType() == \
QStringLiteral("saslplain") +            && \
!getIdentity()->getSaslAccount().isEmpty() && \
!getIdentity()->getAuthPassword().isEmpty();  m_capRequested = 0;
     m_capAnswered = 0;
     m_capEndDelayed = false;
-    getStatusView()->appendServerMessage(i18n("Info"),i18n("Negotiating capabilities \
                with server..."));
-
-    if(useSASL)
-    {
-        getStatusView()->appendServerMessage(i18n("Info"),i18n("Requesting SASL \
                capability..."));
-        queue(QStringLiteral("CAP REQ :sasl"), HighPriority);
-        m_capRequested++;
-    }
-
-    queue(QStringLiteral("CAP REQ :multi-prefix"), HighPriority);
-    m_capRequested++;
-
-    queue(QStringLiteral("CAP REQ :away-notify"), HighPriority);
     m_hasAwayNotify = false;
-    m_capRequested++;
-
-    queue(QStringLiteral("CAP REQ :account-notify"), HighPriority);
-    m_capRequested++;
-
-    queue(QStringLiteral("CAP REQ :extended-join"), HighPriority);
     m_hasExtendedJoin = false;
-    m_capRequested++;
-
-    queue(QStringLiteral("CAP REQ :server-time"), HighPriority);
     m_hasServerTime = false;
-    m_capRequested++;
-    queue(QStringLiteral("CAP REQ :znc.in/server-time-iso"), HighPriority);
-    m_capRequested++;
-
-    queue(QStringLiteral("CAP REQ :userhost-in-names"), HighPriority);
     m_hasUserHostInNames = false;
+    QStringList requestCaps;
+    QStringList capsList = availableCaps.split (QChar(' '), \
QString::SkipEmptyParts); +
+    foreach(const QString &cap, capsList)
+    {
+        if(useSASL && cap == QStringLiteral("sasl"))
+        {
+            requestCaps.append ("sasl");
+        }
+        else if(cap == QStringLiteral("multi-prefix"))
+        {
+            requestCaps.append ("multi-prefix");
+        }
+        else if(cap == QStringLiteral("away-notify"))
+        {
+            requestCaps.append ("away-notify");
+        }
+        else if(cap == QStringLiteral("account-notify"))
+        {
+            requestCaps.append ("account-notify");
+        }
+        else if(cap == QStringLiteral("extended-join"))
+        {
+            requestCaps.append ("extended-join");
+        }
+        else if(cap == QStringLiteral("server-time"))
+        {
+            requestCaps.append ("server-time");
+        }
+        else if(cap == QStringLiteral("znc.in/server-time-iso"))
+        {
+            requestCaps.append ("server-time-iso");
+        }
+        else if(cap == QStringLiteral("userhost-in-names"))
+        {
+            requestCaps.append ("userhost-in-names");
+        }
+    }
+
+    QString capsString = requestCaps.join (QStringLiteral(" "));
+    getStatusView()->appendServerMessage(i18n("Info"),i18n("Requesting capabilities: \
%1").arg(capsString)); +    queue(QStringLiteral("CAP REQ :") + capsString, \
HighPriority);  m_capRequested++;
 }
 
@@ -745,7 +768,6 @@ void Server::capEndNegotiation()
     {
         getStatusView()->appendServerMessage(i18n("Info"),i18n("Closing capabilities \
negotiation."));  queue(QStringLiteral("CAP END"), HighPriority);
-        m_capAnswered = 0;
     }
 }
 
diff --git a/src/irc/server.h b/src/irc/server.h
index 6466871..278d094 100644
--- a/src/irc/server.h
+++ b/src/irc/server.h
@@ -542,7 +542,8 @@ class Server : public QObject
         /// Will only reconnect if the connection state is involuntary disconnected.
         void reconnectInvoluntary();
 
-        void capInitiateNegotiation(bool useSASL);
+        void requestAvailableCapabilies ();
+        void capInitiateNegotiation(const QString &availableCaps);
         void capReply();
         void capEndNegotiation();
         void capCheckIgnored();


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic