iterate on jabber callback when receiving more data than buffer size iterate-on-receiving-data-in-jabber-callback

Sun, 10 Nov 2019 16:32:53 +0100

author
Fabrice Bellet <fabrice@bellet.info>
date
Sun, 10 Nov 2019 16:32:53 +0100
branch
iterate-on-receiving-data-in-jabber-callback
changeset 40176
7de5610adb49
parent 40164
d3b870b30eb9
child 40177
c0c4ecb9bceb
child 40178
5b3f596d1947

iterate on jabber callback when receiving more data than buffer size

libpurple/protocols/jabber/jabber.c file | annotate | diff | comparison | revisions
--- a/libpurple/protocols/jabber/jabber.c	Sun Nov 10 09:52:48 2019 +0000
+++ b/libpurple/protocols/jabber/jabber.c	Sun Nov 10 16:32:53 2019 +0100
@@ -595,7 +595,7 @@
 	return PING_TIMEOUT;
 }
 
-static void
+static gboolean
 jabber_recv_cb(GObject *stream, gpointer data)
 {
 	PurpleConnection *gc = data;
@@ -610,7 +610,7 @@
 	        G_POLLABLE_INPUT_STREAM(stream), buf, sizeof(buf) - 1,
 	        js->cancellable, &error);
 
-	if (len > 0) {
+	while (len > 0) {
 		purple_connection_update_last_received(gc);
 #ifdef HAVE_CYRUS_SASL
 		if (js->sasl_maxbuf > 0) {
@@ -635,7 +635,7 @@
 				if (js->reinit)
 					jabber_stream_init(js);
 			}
-			return;
+			return G_SOURCE_CONTINUE;
 		}
 #endif
 		buf[len] = '\0';
@@ -644,15 +644,17 @@
 		jabber_parser_process(js, buf, len);
 		if(js->reinit)
 			jabber_stream_init(js);
-	} else if (len == 0) {
-		purple_connection_error(js->gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
-		                        _("Server closed the connection"));
-	} else if (error->code != G_IO_ERROR_WOULD_BLOCK &&
-	           error->code != G_IO_ERROR_CANCELLED) {
+		len = g_pollable_input_stream_read_nonblocking(
+			G_POLLABLE_INPUT_STREAM(stream), buf, sizeof(buf) - 1,
+			js->cancellable, &error);
+	}
+	if (error->code != G_IO_ERROR_WOULD_BLOCK &&
+	    error->code != G_IO_ERROR_CANCELLED) {
 		g_prefix_error(&error, "%s", _("Lost connection with server: "));
 		purple_connection_g_error(js->gc, error);
 	}
 	g_clear_error(&error);
+	return G_SOURCE_CONTINUE;
 }
 
 static void

mercurial