diff options
author | dequis <dx@dxzone.com.ar> | 2015-11-28 12:59:34 -0300 |
---|---|---|
committer | dequis <dx@dxzone.com.ar> | 2015-11-28 12:59:34 -0300 |
commit | 4e4616aa427fb5185b1540014c8d5130c18c790d (patch) | |
tree | f6c784cb12317de2183218da746125e42b2368ce | |
parent | 31d993029df984445ee54c2321976f370bc05460 (diff) |
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.
-rw-r--r-- | protocols/msn/gw.c | 28 | ||||
-rw-r--r-- | protocols/msn/msn.h | 1 |
2 files changed, 27 insertions, 2 deletions
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; |