# HG changeset patch # User Sean Egan # Date 1201130918 0 # Node ID 252b96b6a32ceafd8382070a2e2b140f34a8a028 # Parent 80e5eaa8f58064d2cf0453d660057aefedae0327 Don't send keep-alives if we've received data since in the last KEEPALIVE_INTERVAL seconds diff -r 80e5eaa8f580 -r 252b96b6a32c ChangeLog.API --- a/ChangeLog.API Thu Jan 17 21:08:20 2008 +0000 +++ b/ChangeLog.API Wed Jan 23 23:28:38 2008 +0000 @@ -30,6 +30,8 @@ * purple_attention_type_get_outgoing_desc * purple_attention_type_get_icon_name * purple_attention_type_get_unlocalized_name + * last_received to PurpleAccount, the time_t of the last + received packet Pidgin: Added: diff -r 80e5eaa8f580 -r 252b96b6a32c libpurple/connection.c --- a/libpurple/connection.c Thu Jan 17 21:08:20 2008 +0000 +++ b/libpurple/connection.c Wed Jan 23 23:28:38 2008 +0000 @@ -52,8 +52,19 @@ PurpleConnection *gc = data; PurplePluginProtocolInfo *prpl_info = NULL; - if (gc != NULL && gc->prpl != NULL) - prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl); + if (gc == NULL) + return; + + /* Only send keep-alives if we haven't heard from the + * server in a while. + */ + if ((time(NULL) - gc->last_received) < KEEPALIVE_INTERVAL) + return; + + if (gc->prpl == NULL) + return; + + prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl); if (prpl_info && prpl_info->keepalive) prpl_info->keepalive(gc); diff -r 80e5eaa8f580 -r 252b96b6a32c libpurple/connection.h --- a/libpurple/connection.h Thu Jan 17 21:08:20 2008 +0000 +++ b/libpurple/connection.h Wed Jan 23 23:28:38 2008 +0000 @@ -251,6 +251,8 @@ gboolean wants_to_die; guint disconnect_timeout; /**< Timer used for nasty stack tricks */ + time_t last_received; /**< When we last received a packet. Set by the + prpl to avoid sending unneeded keepalives */ }; #ifdef __cplusplus diff -r 80e5eaa8f580 -r 252b96b6a32c libpurple/protocols/gg/gg.c --- a/libpurple/protocols/gg/gg.c Thu Jan 17 21:08:20 2008 +0000 +++ b/libpurple/protocols/gg/gg.c Wed Jan 23 23:28:38 2008 +0000 @@ -1314,7 +1314,7 @@ _("Unable to read socket")); return; } - + gc->last_received = time(NULL); switch (ev->type) { case GG_EVENT_NONE: /* Nothing happened. */ diff -r 80e5eaa8f580 -r 252b96b6a32c libpurple/protocols/irc/irc.c --- a/libpurple/protocols/irc/irc.c Thu Jan 17 21:08:20 2008 +0000 +++ b/libpurple/protocols/irc/irc.c Wed Jan 23 23:28:38 2008 +0000 @@ -572,6 +572,7 @@ { char *cur, *end; + irc->account->gc->last_received = time(NULL); irc->inbufused += len; irc->inbuf[irc->inbufused] = '\0'; diff -r 80e5eaa8f580 -r 252b96b6a32c libpurple/protocols/jabber/jabber.c --- a/libpurple/protocols/jabber/jabber.c Thu Jan 17 21:08:20 2008 +0000 +++ b/libpurple/protocols/jabber/jabber.c Wed Jan 23 23:28:38 2008 +0000 @@ -432,6 +432,7 @@ } while((len = purple_ssl_read(gsc, buf, sizeof(buf) - 1)) > 0) { + gc->last_received = time(NULL); buf[len] = '\0'; purple_debug(PURPLE_DEBUG_INFO, "jabber", "Recv (ssl)(%d): %s\n", len, buf); jabber_parser_process(js, buf, len); @@ -459,6 +460,7 @@ return; if((len = read(js->fd, buf, sizeof(buf) - 1)) > 0) { + gc->last_received = time(NULL); #ifdef HAVE_CYRUS_SASL if (js->sasl_maxbuf>0) { const char *out; diff -r 80e5eaa8f580 -r 252b96b6a32c libpurple/protocols/msn/servconn.c --- a/libpurple/protocols/msn/servconn.c Thu Jan 17 21:08:20 2008 +0000 +++ b/libpurple/protocols/msn/servconn.c Wed Jan 23 23:28:38 2008 +0000 @@ -391,6 +391,7 @@ session = servconn->session; len = read(servconn->fd, buf, sizeof(buf) - 1); + servconn->session->account->gc->last_connected = time(NULL); if (len <= 0) { switch (errno) { diff -r 80e5eaa8f580 -r 252b96b6a32c libpurple/protocols/msnp9/servconn.c --- a/libpurple/protocols/msnp9/servconn.c Thu Jan 17 21:08:20 2008 +0000 +++ b/libpurple/protocols/msnp9/servconn.c Wed Jan 23 23:28:38 2008 +0000 @@ -387,6 +387,7 @@ session = servconn->session; len = read(servconn->fd, buf, sizeof(buf) - 1); + servconn->session->account->gc->last_received = time(NULL); if (len < 0 && errno == EAGAIN) return; diff -r 80e5eaa8f580 -r 252b96b6a32c libpurple/protocols/myspace/myspace.c --- a/libpurple/protocols/myspace/myspace.c Thu Jan 17 21:08:20 2008 +0000 +++ b/libpurple/protocols/myspace/myspace.c Wed Jan 23 23:28:38 2008 +0000 @@ -2452,6 +2452,7 @@ * the file descriptor, but it sometimes differs from the 'source' parameter. */ n = recv(session->fd, session->rxbuf + session->rxoff, MSIM_READ_BUF_SIZE - session->rxoff, 0); + gc->last_received = time(NULL); if (n < 0 && errno == EAGAIN) { return; diff -r 80e5eaa8f580 -r 252b96b6a32c libpurple/protocols/oscar/flap_connection.c --- a/libpurple/protocols/oscar/flap_connection.c Thu Jan 17 21:08:20 2008 +0000 +++ b/libpurple/protocols/oscar/flap_connection.c Wed Jan 23 23:28:38 2008 +0000 @@ -817,6 +817,7 @@ OSCAR_DISCONNECT_LOST_CONNECTION, g_strerror(errno)); break; } + conn->od->gc->last_received = time(NULL); /* If we don't even have a complete FLAP header then do nothing */ conn->header_received += read; diff -r 80e5eaa8f580 -r 252b96b6a32c libpurple/protocols/sametime/sametime.c --- a/libpurple/protocols/sametime/sametime.c Thu Jan 17 21:08:20 2008 +0000 +++ b/libpurple/protocols/sametime/sametime.c Wed Jan 23 23:28:38 2008 +0000 @@ -1695,7 +1695,9 @@ int len; len = read(sock, buf, BUF_LEN); - if(len > 0) mwSession_recv(session, buf, len); + if(len > 0) { + mwSession_recv(session, buf, len); + } return len; } diff -r 80e5eaa8f580 -r 252b96b6a32c libpurple/protocols/simple/simple.c --- a/libpurple/protocols/simple/simple.c Thu Jan 17 21:08:20 2008 +0000 +++ b/libpurple/protocols/simple/simple.c Wed Jan 23 23:28:38 2008 +0000 @@ -1675,7 +1675,7 @@ if(sip->fd == source) sip->fd = -1; return; } - + gc->last_received = time(NULL); conn->inbufused += len; conn->inbuf[conn->inbufused] = '\0'; diff -r 80e5eaa8f580 -r 252b96b6a32c libpurple/protocols/yahoo/yahoo.c --- a/libpurple/protocols/yahoo/yahoo.c Thu Jan 17 21:08:20 2008 +0000 +++ b/libpurple/protocols/yahoo/yahoo.c Wed Jan 23 23:28:38 2008 +0000 @@ -2506,7 +2506,7 @@ _("Server closed the connection.")); return; } - + gc->last_received = time(NULL); yd->rxqueue = g_realloc(yd->rxqueue, len + yd->rxlen); memcpy(yd->rxqueue + yd->rxlen, buf, len); yd->rxlen += len;