--- a/libpurple/protocols/jabber/bosh.c Wed Jun 12 10:20:03 2013 +0530 +++ b/libpurple/protocols/jabber/bosh.c Wed Jun 12 18:58:24 2013 +0530 @@ -55,7 +55,7 @@ JabberStream *js; PurpleHTTPConnection *connections[NUM_HTTP_CONNECTIONS]; - PurpleCircBuffer *pending; + PurpleCircularBuffer *pending; PurpleBOSHConnectionConnectFunction connect_cb; PurpleBOSHConnectionReceiveFunction receive_cb; @@ -90,7 +90,7 @@ PurpleBOSHConnection *bosh; PurpleSslConnection *psc; - PurpleCircBuffer *write_buf; + PurpleCircularBuffer *write_buf; GString *read_buf; gsize handled_len; @@ -168,7 +168,7 @@ conn->fd = -1; conn->state = HTTP_CONN_OFFLINE; - conn->write_buf = purple_circ_buffer_new(0 /* default grow size */); + conn->write_buf = purple_circular_buffer_new(0 /* default grow size */); return conn; } @@ -180,7 +180,7 @@ g_string_free(conn->read_buf, TRUE); if (conn->write_buf) - purple_circ_buffer_destroy(conn->write_buf); + g_object_unref(G_OBJECT(conn->write_buf)); if (conn->readh) purple_input_remove(conn->readh); if (conn->writeh) @@ -238,7 +238,7 @@ conn->rid = ((guint64)g_random_int() << 32) | g_random_int(); conn->rid &= 0xFFFFFFFFFFFFFLL; - conn->pending = purple_circ_buffer_new(0 /* default grow size */); + conn->pending = purple_circular_buffer_new(0 /* default grow size */); conn->state = BOSH_CONN_OFFLINE; if (purple_strcasestr(url, "https://") != NULL) @@ -262,7 +262,7 @@ if (conn->send_timer) purple_timeout_remove(conn->send_timer); - purple_circ_buffer_destroy(conn->pending); + g_object_unref(G_OBJECT(conn->pending)); for (i = 0; i < NUM_HTTP_CONNECTIONS; ++i) { if (conn->connections[i]) @@ -349,11 +349,14 @@ * the buffer. */ if (data) - purple_circ_buffer_append(conn->pending, data, strlen(data)); + purple_circular_buffer_append(conn->pending, data, strlen(data)); - if (purple_debug_is_verbose()) + if (purple_debug_is_verbose()) { + gsize bufused = purple_circular_buffer_get_used(conn->pending); purple_debug_misc("jabber", "bosh: %p has %" G_GSIZE_FORMAT " bytes in " - "the buffer.\n", conn, conn->pending->bufused); + "the buffer.\n", conn, bufused); + } + if (conn->send_timer == 0) conn->send_timer = purple_timeout_add_seconds(BUFFER_SEND_IN_SECS, send_timer_cb, conn); @@ -408,9 +411,10 @@ packet = g_string_append_c(packet, '>'); - while ((read_amt = purple_circ_buffer_get_max_read(conn->pending)) > 0) { - packet = g_string_append_len(packet, conn->pending->outptr, read_amt); - purple_circ_buffer_mark_read(conn->pending, read_amt); + while ((read_amt = purple_circular_buffer_get_max_read(conn->pending)) > 0) { + const gchar *output = purple_circular_buffer_get_output(conn->pending); + packet = g_string_append_len(packet, output, read_amt); + purple_circular_buffer_mark_read(conn->pending, read_amt); } if (data) @@ -677,7 +681,7 @@ jabber_bosh_connection_send(conn->bosh, PACKET_NORMAL, NULL); else if (conn->bosh->state == BOSH_CONN_ONLINE) { purple_debug_info("jabber", "BOSH session already exists. Trying to reuse it.\n"); - if (conn->bosh->requests == 0 || conn->bosh->pending->bufused > 0) { + if (conn->bosh->requests == 0 || purple_circular_buffer_get_used(conn->bosh->pending) > 0) { /* Send the pending data */ jabber_bosh_connection_send(conn->bosh, PACKET_FLUSH, NULL); } @@ -831,7 +835,9 @@ } if (conn->bosh->state == BOSH_CONN_ONLINE && - (conn->bosh->requests == 0 || conn->bosh->pending->bufused > 0)) { + (conn->bosh->requests == 0 || + purple_circular_buffer_get_used(conn->bosh->pending) > 0)) + { purple_debug_misc("jabber", "BOSH: Sending an empty request\n"); jabber_bosh_connection_send(conn->bosh, PACKET_NORMAL, NULL); } @@ -1000,8 +1006,9 @@ http_connection_send_cb(gpointer data, gint source, PurpleInputCondition cond) { PurpleHTTPConnection *conn = data; + const gchar *output = NULL; int ret; - int writelen = purple_circ_buffer_get_max_read(conn->write_buf); + int writelen = purple_circular_buffer_get_max_read(conn->write_buf); if (writelen == 0) { purple_input_remove(conn->writeh); @@ -1009,7 +1016,8 @@ return; } - ret = http_connection_do_send(conn, conn->write_buf->outptr, writelen); + output = purple_circular_buffer_get_output(conn->write_buf); + ret = http_connection_do_send(conn, output, writelen); if (ret < 0 && errno == EAGAIN) return; @@ -1028,7 +1036,7 @@ return; } - purple_circ_buffer_mark_read(conn->write_buf, ret); + purple_circular_buffer_mark_read(conn->write_buf, ret); } static void @@ -1088,7 +1096,7 @@ if (conn->writeh == 0) conn->writeh = purple_input_add(conn->psc ? conn->psc->fd : conn->fd, PURPLE_INPUT_WRITE, http_connection_send_cb, conn); - purple_circ_buffer_append(conn->write_buf, data + ret, len - ret); + purple_circular_buffer_append(conn->write_buf, data + ret, len - ret); } }