telepathy-idle: Disable keepalive pings if server doesn't support PING.

Will Thompson wjt at kemper.freedesktop.org
Fri Nov 2 04:56:49 PDT 2012


Module: telepathy-idle
Branch: master
Commit: f7766957dbb4ea80ac86d65b83f361b8c82aab45
URL:    http://cgit.freedesktop.org/telepathy/telepathy-idle/commit/?id=f7766957dbb4ea80ac86d65b83f361b8c82aab45

Author: Will Thompson <will.thompson at collabora.co.uk>
Date:   Tue Oct 30 16:56:48 2012 +0000

Disable keepalive pings if server doesn't support PING.

I don't know which servers don't support PING, but irssi does this, so I
figure we may as well do it too.

I tested this by making Idle send and check for PNNING, which Freenode
doesn't support. It's not obvious how to write a good automated test for
this.

---

 src/idle-connection.c |   19 +++++++++++++++++++
 src/idle-parser.c     |    1 +
 src/idle-parser.h     |    1 +
 3 files changed, 21 insertions(+), 0 deletions(-)

diff --git a/src/idle-connection.c b/src/idle-connection.c
index a7c4f73..07adc92 100644
--- a/src/idle-connection.c
+++ b/src/idle-connection.c
@@ -214,6 +214,7 @@ static IdleParserHandlerResult _nick_handler(IdleParser *parser, IdleParserMessa
 static IdleParserHandlerResult _nickname_in_use_handler(IdleParser *parser, IdleParserMessageCode code, GValueArray *args, gpointer user_data);
 static IdleParserHandlerResult _ping_handler(IdleParser *parser, IdleParserMessageCode code, GValueArray *args, gpointer user_data);
 static IdleParserHandlerResult _pong_handler(IdleParser *parser, IdleParserMessageCode code, GValueArray *args, gpointer user_data);
+static IdleParserHandlerResult _unknown_command_handler(IdleParser *parser, IdleParserMessageCode code, GValueArray *args, gpointer user_data);
 static IdleParserHandlerResult _version_privmsg_handler(IdleParser *parser, IdleParserMessageCode code, GValueArray *args, gpointer user_data);
 static IdleParserHandlerResult _welcome_handler(IdleParser *parser, IdleParserMessageCode code, GValueArray *args, gpointer user_data);
 static IdleParserHandlerResult _whois_user_handler(IdleParser *parser, IdleParserMessageCode code, GValueArray *args, gpointer user_data);
@@ -713,6 +714,7 @@ static void _connection_connect_ready(GObject *source_object, GAsyncResult *res,
 
 	idle_parser_add_handler(conn->parser, IDLE_PARSER_CMD_PING, _ping_handler, conn);
 	idle_parser_add_handler(conn->parser, IDLE_PARSER_PREFIXCMD_PONG, _pong_handler, conn);
+	idle_parser_add_handler(conn->parser, IDLE_PARSER_NUMERIC_UNKNOWNCOMMAND, _unknown_command_handler, conn);
 
 	idle_parser_add_handler_with_priority(conn->parser, IDLE_PARSER_PREFIXCMD_NICK, _nick_handler, conn, IDLE_PARSER_HANDLER_PRIORITY_FIRST);
 	idle_parser_add_handler(conn->parser, IDLE_PARSER_PREFIXCMD_PRIVMSG_USER, _version_privmsg_handler, conn);
@@ -1105,6 +1107,23 @@ static IdleParserHandlerResult _pong_handler(IdleParser *parser, IdleParserMessa
 	return IDLE_PARSER_HANDLER_RESULT_HANDLED;
 }
 
+static IdleParserHandlerResult _unknown_command_handler(IdleParser *parser, IdleParserMessageCode code, GValueArray *args, gpointer user_data) {
+	IdleConnection *conn = IDLE_CONNECTION(user_data);
+	IdleConnectionPrivate *priv = conn->priv;
+	const gchar *command = g_value_get_string(g_value_array_get_nth(args, 0));
+
+	if (!tp_strdiff(command, "PING")) {
+		IDLE_DEBUG("PING not supported, disabling keepalive.");
+		g_source_remove(priv->keepalive_timeout);
+		priv->keepalive_timeout = 0;
+		priv->ping_time = 0;
+
+		return IDLE_PARSER_HANDLER_RESULT_HANDLED;
+	}
+
+	return IDLE_PARSER_HANDLER_RESULT_NOT_HANDLED;
+}
+
 static IdleParserHandlerResult _version_privmsg_handler(IdleParser *parser, IdleParserMessageCode code, GValueArray *args, gpointer user_data) {
 	IdleConnection *conn = IDLE_CONNECTION(user_data);
 	const gchar *msg = g_value_get_string(g_value_array_get_nth(args, 2));
diff --git a/src/idle-parser.c b/src/idle-parser.c
index 47ac0e5..1699774 100644
--- a/src/idle-parser.c
+++ b/src/idle-parser.c
@@ -122,6 +122,7 @@ static const MessageSpec message_specs[] = {
 	{"317", "IIIcd", IDLE_PARSER_NUMERIC_WHOISIDLE},
 	{"322", "IIIrd.", IDLE_PARSER_NUMERIC_LIST},
 	{"323", "I", IDLE_PARSER_NUMERIC_LISTEND},
+	{"421", "IIIs:", IDLE_PARSER_NUMERIC_UNKNOWNCOMMAND},
 
 	{NULL, NULL, IDLE_PARSER_LAST_MESSAGE_CODE}
 };
diff --git a/src/idle-parser.h b/src/idle-parser.h
index 1216054..7ba333e 100644
--- a/src/idle-parser.h
+++ b/src/idle-parser.h
@@ -97,6 +97,7 @@ typedef enum {
 	IDLE_PARSER_NUMERIC_WHOISIDLE,
 	IDLE_PARSER_NUMERIC_LIST,
 	IDLE_PARSER_NUMERIC_LISTEND,
+	IDLE_PARSER_NUMERIC_UNKNOWNCOMMAND,
 
 	IDLE_PARSER_LAST_MESSAGE_CODE
 } IdleParserMessageCode;



More information about the telepathy-commits mailing list