# HG changeset patch # User Ka-Hing Cheung # Date 1248025298 0 # Node ID 4fb5e292de752c168b79be007c8bd60b049a4fa2 # Parent 5299547556ae3cdc35e3c672f16f0e6b03908310 Timeout switchboard connections at 60 seconds, should Fixes #3330 for most people. diff -r 5299547556ae -r 4fb5e292de75 ChangeLog --- a/ChangeLog Sun Jul 19 17:35:06 2009 +0000 +++ b/ChangeLog Sun Jul 19 17:41:38 2009 +0000 @@ -130,6 +130,7 @@ from you on MSN. * Support sending an invite message to buddies when requesting authorization from them on MSN. + * Timeout switchboard connections aggressively Pidgin: * Added -f command line option to tell Pidgin to ignore NetworkManager diff -r 5299547556ae -r 4fb5e292de75 libpurple/protocols/msn/servconn.c --- a/libpurple/protocols/msn/servconn.c Sun Jul 19 17:35:06 2009 +0000 +++ b/libpurple/protocols/msn/servconn.c Sun Jul 19 17:41:38 2009 +0000 @@ -26,6 +26,7 @@ #include "error.h" static void read_cb(gpointer data, gint source, PurpleInputCondition cond); +static void servconn_timeout_renew(MsnServConn *servconn); /************************************************************************** * Main @@ -52,6 +53,8 @@ servconn->tx_buf = purple_circ_buffer_new(MSN_BUF_LEN); servconn->tx_handler = 0; + servconn->timeout_sec = 0; + servconn->timeout_handle = 0; servconn->fd = -1; @@ -82,6 +85,8 @@ purple_circ_buffer_destroy(servconn->tx_buf); if (servconn->tx_handler > 0) purple_input_remove(servconn->tx_handler); + if (servconn->timeout_handle > 0) + purple_input_remove(servconn->timeout_handle); msn_cmdproc_destroy(servconn->cmdproc); g_free(servconn); @@ -184,6 +189,7 @@ servconn->connect_cb(servconn); servconn->inpa = purple_input_add(servconn->fd, PURPLE_INPUT_READ, read_cb, data); + servconn_timeout_renew(servconn); } else { @@ -219,6 +225,7 @@ servconn->connected = TRUE; servconn->httpconn->virgin = TRUE; + servconn_timeout_renew(servconn); /* Someone wants to know we connected. */ servconn->connect_cb(servconn); @@ -267,6 +274,12 @@ servconn->inpa = 0; } + if (servconn->timeout_handle > 0) + { + purple_input_remove(servconn->timeout_handle); + servconn->timeout_handle = 0; + } + close(servconn->fd); servconn->rx_buf = NULL; @@ -279,6 +292,35 @@ servconn->disconnect_cb(servconn); } +static gboolean +servconn_idle_timeout_cb(MsnServConn *servconn) +{ + msn_servconn_disconnect(servconn); + return FALSE; +} + +static void +servconn_timeout_renew(MsnServConn *servconn) +{ + if (servconn->timeout_handle) { + purple_input_remove(servconn->timeout_handle); + servconn->timeout_handle = 0; + } + + if (servconn->connected && servconn->timeout_sec) { + servconn->timeout_handle = purple_timeout_add_seconds( + servconn->timeout_sec, servconn_idle_timeout_cb, servconn); + } +} + +void +msn_servconn_set_idle_timeout(MsnServConn *servconn, guint seconds) +{ + servconn->timeout_sec = seconds; + if (servconn->connected) + servconn_timeout_renew(servconn); +} + static void servconn_write_cb(gpointer data, gint source, PurpleInputCondition cond) { @@ -304,6 +346,7 @@ } purple_circ_buffer_mark_read(servconn->tx_buf, ret); + servconn_timeout_renew(servconn); } gssize @@ -358,6 +401,7 @@ msn_servconn_got_error(servconn, MSN_SERVCONN_ERROR_WRITE); } + servconn_timeout_renew(servconn); return ret; } @@ -392,6 +436,7 @@ servconn->rx_len += len; msn_servconn_process_data(servconn); + servconn_timeout_renew(servconn); } void msn_servconn_process_data(MsnServConn *servconn) diff -r 5299547556ae -r 4fb5e292de75 libpurple/protocols/msn/servconn.h --- a/libpurple/protocols/msn/servconn.h Sun Jul 19 17:35:06 2009 +0000 +++ b/libpurple/protocols/msn/servconn.h Sun Jul 19 17:41:38 2009 +0000 @@ -88,6 +88,8 @@ PurpleCircBuffer *tx_buf; guint tx_handler; + guint timeout_sec; + guint timeout_handle; void (*connect_cb)(MsnServConn *); /**< The callback to call when connecting. */ void (*disconnect_cb)(MsnServConn *); /**< The callback to call when disconnecting. */ @@ -178,4 +180,12 @@ */ void msn_servconn_process_data(MsnServConn *servconn); +/** + * Set a idle timeout fot this servconn + * + * @param servconn The servconn + * @param seconds The idle timeout in seconds + */ +void msn_servconn_set_idle_timeout(MsnServConn *servconn, guint seconds); + #endif /* _MSN_SERVCONN_H_ */ diff -r 5299547556ae -r 4fb5e292de75 libpurple/protocols/msn/switchboard.c --- a/libpurple/protocols/msn/switchboard.c Sun Jul 19 17:35:06 2009 +0000 +++ b/libpurple/protocols/msn/switchboard.c Sun Jul 19 17:41:38 2009 +0000 @@ -42,15 +42,15 @@ msn_switchboard_new(MsnSession *session) { MsnSwitchBoard *swboard; - MsnServConn *servconn; g_return_val_if_fail(session != NULL, NULL); swboard = g_new0(MsnSwitchBoard, 1); swboard->session = session; - swboard->servconn = servconn = msn_servconn_new(session, MSN_SERVCONN_SB); - swboard->cmdproc = servconn->cmdproc; + swboard->servconn = msn_servconn_new(session, MSN_SERVCONN_SB); + msn_servconn_set_idle_timeout(swboard->servconn, 60); + swboard->cmdproc = swboard->servconn->cmdproc; swboard->msg_queue = g_queue_new(); swboard->empty = TRUE;