diff libpurple/protocols/jabber/bosh.c @ 25999:c605e5f2fc99

Use a PurpleCircBuffer for the queued stanzas
author Paul Aurich <paul@darkrain42.org>
date Sat, 21 Mar 2009 03:03:18 +0000
parents 349e411da2ce
children 31bb0d6e7f7e
line wrap: on
line diff
--- a/libpurple/protocols/jabber/bosh.c	Mon Mar 16 06:38:24 2009 +0000
+++ b/libpurple/protocols/jabber/bosh.c	Sat Mar 21 03:03:18 2009 +0000
@@ -19,6 +19,7 @@
  *
  */
 #include "internal.h"
+#include "circbuffer.h"
 #include "core.h"
 #include "cipher.h"
 #include "debug.h"
@@ -63,7 +64,7 @@
 	int max_inactivity;
 	int wait;
 
-	GString *pending;
+	PurpleCircBuffer *pending;
 	int max_requests;
 	int requests;
 
@@ -177,7 +178,7 @@
 	/* FIXME: This doesn't seem very random */
 	conn->rid = rand() % 100000 + 1728679472;
 
-	conn->pending = g_string_new("");
+	conn->pending = purple_circ_buffer_new(0 /* default grow size */);
 
 	conn->ready = FALSE;
 
@@ -197,8 +198,7 @@
 	if (conn->inactivity_timer)
 		purple_timeout_remove(conn->inactivity_timer);
 
-	if (conn->pending)
-		g_string_free(conn->pending, TRUE);
+	purple_circ_buffer_destroy(conn->pending);
 
 	for (i = 0; i < MAX_HTTP_CONNECTIONS; ++i) {
 		if (conn->connections[i])
@@ -462,6 +462,7 @@
 	PurpleHTTPConnection *chosen;
 	GString *packet = NULL;
 	char *buf = NULL;
+	int len;
 
 	chosen = find_available_http_connection(conn);
 
@@ -478,7 +479,7 @@
 	}
 
 	if (node)
-		buf = xmlnode_to_str(node, NULL);
+		buf = xmlnode_to_str(node, &len);
 
 	if (type == PACKET_NORMAL && (!chosen ||
 	        (conn->max_requests > 0 && conn->requests == conn->max_requests))) {
@@ -488,7 +489,7 @@
 		 * will send these packets when connected).
 		 */
 		if (buf) {
-			conn->pending = g_string_append(conn->pending, buf);
+			purple_circ_buffer_append(conn->pending, buf, len); 
 			g_free(buf);
 		}
 		return;
@@ -510,12 +511,20 @@
 	if (type == PACKET_STREAM_RESTART)
 		packet = g_string_append(packet, " xmpp:restart='true'/>");
 	else {
+		gsize read_amt;
 		if (type == PACKET_TERMINATE)
 			packet = g_string_append(packet, " type='terminate'");
 
-		g_string_append_printf(packet, ">%s%s</body>", conn->pending->str,
-		                       buf ? buf : "");
-		g_string_truncate(conn->pending, 0);
+		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);
+		}
+
+		if (buf)
+			packet = g_string_append_len(packet, buf, len);
+		packet = g_string_append(packet, "</body>");
 	}
 
 	g_free(buf);
@@ -537,7 +546,7 @@
 
 	if (conn->bosh->ready) {
 		purple_debug_info("jabber", "BOSH session already exists. Trying to reuse it.\n");
-		if (conn->bosh->pending && conn->bosh->pending->len > 0) {
+		if (conn->bosh->pending->bufused > 0) {
 			/* Send the pending data */
 			jabber_bosh_connection_send_native(conn->bosh, PACKET_NORMAL, NULL);
 		}
@@ -625,7 +634,7 @@
 	                 conn->bosh);
 
 	if (conn->bosh->ready &&
-			(conn->bosh->requests == 0 || conn->bosh->pending->len)) {
+			(conn->bosh->requests == 0 || conn->bosh->pending->bufused > 0)) {
 		jabber_bosh_connection_send(conn->bosh, NULL);
 		purple_debug_misc("jabber", "BOSH: Sending an empty request\n");
 	}