Mercurial > pidgin.yaz
changeset 21964:eaaac273d80c
Keep track of the keepalive timeout source so it can be removed when the account disconnects. This prevents a possible crash if the timeout fired after the account disconnected.
author | Evan Schoenberg <evan.s@dreskin.net> |
---|---|
date | Wed, 02 Jan 2008 06:36:35 +0000 |
parents | 02153fd5a092 |
children | 27d665278485 |
files | libpurple/protocols/jabber/jabber.c libpurple/protocols/jabber/jabber.h |
diffstat | 2 files changed, 15 insertions(+), 6 deletions(-) [+] |
line wrap: on
line diff
--- a/libpurple/protocols/jabber/jabber.c Sun Dec 30 10:07:50 2007 +0000 +++ b/libpurple/protocols/jabber/jabber.c Wed Jan 02 06:36:35 2008 +0000 @@ -391,25 +391,27 @@ static void jabber_pong_cb(JabberStream *js, xmlnode *packet, gpointer timeout) { purple_timeout_remove(GPOINTER_TO_INT(timeout)); + js->keepalive_timeout = -1; } static gboolean jabber_pong_timeout(PurpleConnection *gc) { purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, _("Ping timeout")); + js->keepalive_timeout = -1; return FALSE; } void jabber_keepalive(PurpleConnection *gc) { - JabberIq *iq = jabber_iq_new(gc->proto_data, JABBER_IQ_GET); - guint timeout; + JabberStream *js = gc->proto_data; + JabberIq *iq = jabber_iq_new(js, JABBER_IQ_GET); - xmlnode *ping = xmlnode_new_child(iq->node, "ping"); - xmlnode_set_namespace(ping, "urn:xmpp:ping"); + xmlnode *ping = xmlnode_new_child(iq->node, "ping"); + xmlnode_set_namespace(ping, "urn:xmpp:ping"); - timeout = purple_timeout_add_seconds(20, (GSourceFunc)(jabber_pong_timeout), gc); - jabber_iq_set_callback(iq, jabber_pong_cb, GINT_TO_POINTER(timeout)); + js->keepalive_timeout = purple_timeout_add_seconds(20, (GSourceFunc)(jabber_pong_timeout), gc); + jabber_iq_set_callback(iq, jabber_pong_cb, GINT_TO_POINTER(js->keepalive_timeout)); jabber_iq_send(iq); } @@ -612,6 +614,7 @@ js->next_id = g_random_int(); js->write_buffer = purple_circ_buffer_new(512); js->old_length = -1; + js->keepalive_timeout = -1; if(!js->user) { purple_connection_error_reason (gc, @@ -1311,6 +1314,9 @@ g_free(js->old_uri); g_free(js->old_track); + if (js->keepalive_timeout != -1) + purple_timeout_remove(js->keepalive_timeout); + g_free(js); gc->proto_data = NULL;
--- a/libpurple/protocols/jabber/jabber.h Sun Dec 30 10:07:50 2007 +0000 +++ b/libpurple/protocols/jabber/jabber.h Wed Jan 02 06:36:35 2008 +0000 @@ -193,6 +193,9 @@ char *old_track; char *host; + + /* A purple timeout tag for the keepalive */ + int keepalive_timeout; }; typedef gboolean (JabberFeatureEnabled)(JabberStream *js, const gchar *shortname, const gchar *namespace);