From 4e4616aa427fb5185b1540014c8d5130c18c790d Mon Sep 17 00:00:00 2001 From: dequis Date: Sat, 28 Nov 2015 12:59:34 -0300 Subject: msn: Buffer writes a bit to send several commands with a single request Just a 1msec timeout, so that it will run in the next main loop iteration. The official clients send the first few commands in the same request, which reduces roundtrips during login. This commit doesn't do that. --- protocols/msn/gw.c | 28 ++++++++++++++++++++++++++-- protocols/msn/msn.h | 1 + 2 files changed, 27 insertions(+), 2 deletions(-) (limited to 'protocols') diff --git a/protocols/msn/gw.c b/protocols/msn/gw.c index 5f285f8d..f9cc74fd 100644 --- a/protocols/msn/gw.c +++ b/protocols/msn/gw.c @@ -21,6 +21,7 @@ struct msn_gw *msn_gw_new(struct im_connection *ic) gw->port = GATEWAY_PORT; gw->ssl = (GATEWAY_PORT == 443); gw->poll_timeout = -1; + gw->write_timeout = -1; gw->ic = ic; gw->md = ic->proto_data; gw->in = g_byte_array_new(); @@ -33,6 +34,11 @@ void msn_gw_free(struct msn_gw *gw) if (gw->poll_timeout != -1) { b_event_remove(gw->poll_timeout); } + + if (gw->write_timeout != -1) { + b_event_remove(gw->write_timeout); + } + g_byte_array_free(gw->in, TRUE); g_byte_array_free(gw->out, TRUE); g_free(gw->session_id); @@ -188,12 +194,30 @@ ssize_t msn_gw_read(struct msn_gw *gw, char **buf) return bodylen; } -void msn_gw_write(struct msn_gw *gw, char *buf, size_t len) +static gboolean msn_gw_write_cb(gpointer data, gint source, b_input_condition cond) { - g_byte_array_append(gw->out, (const guint8 *) buf, len); + struct msn_gw *gw; + + if (!(gw = msn_gw_from_ic(data))) { + return FALSE; + } + if (!gw->open) { msn_gw_open(gw); } else if (gw->polling || !gw->waiting) { msn_gw_dorequest(gw, NULL); } + + gw->write_timeout = -1; + return FALSE; +} + +void msn_gw_write(struct msn_gw *gw, char *buf, size_t len) +{ + g_byte_array_append(gw->out, (const guint8 *) buf, len); + + /* do a bit of buffering here to send several commands with a single request */ + if (gw->write_timeout == -1) { + gw->write_timeout = b_timeout_add(1, msn_gw_write_cb, gw->ic); + } } diff --git a/protocols/msn/msn.h b/protocols/msn/msn.h index 02ba7a0d..b2e7995d 100644 --- a/protocols/msn/msn.h +++ b/protocols/msn/msn.h @@ -111,6 +111,7 @@ struct msn_gw { GByteArray *out; int poll_timeout; + int write_timeout; b_event_handler callback; -- cgit v1.2.3