$NetBSD: patch-aa,v 1.5 2012/01/29 10:41:19 drochner Exp $

gnome bug #658743

--- libsoup/soup-http-input-stream.c.orig	2011-03-27 15:59:43.000000000 +0000
+++ libsoup/soup-http-input-stream.c
@@ -45,7 +45,7 @@ typedef struct {
 	goffset offset;
 
 	GCancellable *cancellable;
-	GSource *cancel_watch;
+	guint cancel_id;
 	SoupHTTPInputStreamCallback got_headers_cb;
 	SoupHTTPInputStreamCallback got_chunk_cb;
 	SoupHTTPInputStreamCallback finished_cb;
@@ -310,19 +310,19 @@ soup_http_input_stream_finished (SoupMes
 		priv->finished_cb (stream);
 }
 
-static gboolean
-soup_http_input_stream_cancelled (GIOChannel *chan, GIOCondition condition,
-					 gpointer stream)
+static void
+soup_http_input_stream_cancelled (GCancellable *cancellable,
+					 gpointer user_data)
 {
+	SoupHTTPInputStream *stream = user_data;
 	SoupHTTPInputStreamPrivate *priv = SOUP_HTTP_INPUT_STREAM_GET_PRIVATE (stream);
 
-	priv->cancel_watch = NULL;
+	g_signal_handler_disconnect (cancellable, priv->cancel_id);
+	priv->cancel_id = 0;
 
 	soup_session_pause_message (priv->session, priv->msg);
 	if (priv->cancelled_cb)
-		priv->cancelled_cb (stream);
-
-	return FALSE;
+		priv->cancelled_cb (G_INPUT_STREAM (stream));
 }
 
 static void
@@ -332,17 +332,12 @@ soup_http_input_stream_prepare_for_io (G
 				       gsize count)
 {
 	SoupHTTPInputStreamPrivate *priv = SOUP_HTTP_INPUT_STREAM_GET_PRIVATE (stream);
-	int cancel_fd;
 
 	priv->cancellable = cancellable;
-	cancel_fd = g_cancellable_get_fd (cancellable);
-	if (cancel_fd != -1) {
-		GIOChannel *chan = g_io_channel_unix_new (cancel_fd);
-		priv->cancel_watch = soup_add_io_watch (priv->async_context, chan,
-							G_IO_IN | G_IO_ERR | G_IO_HUP,
-							soup_http_input_stream_cancelled,
-							stream);
-		g_io_channel_unref (chan);
+	if (cancellable) {
+		priv->cancel_id = g_signal_connect (cancellable, "cancelled",
+				G_CALLBACK (soup_http_input_stream_cancelled),
+				stream);
 	}
 
 	priv->caller_buffer = buffer;
@@ -358,10 +353,9 @@ soup_http_input_stream_done_io (GInputSt
 {
 	SoupHTTPInputStreamPrivate *priv = SOUP_HTTP_INPUT_STREAM_GET_PRIVATE (stream);
 
-	if (priv->cancel_watch) {
-		g_source_destroy (priv->cancel_watch);
-		priv->cancel_watch = NULL;
-		g_cancellable_release_fd (priv->cancellable);
+	if (priv->cancel_id) {
+		g_signal_handler_disconnect (priv->cancellable, priv->cancel_id);
+		priv->cancel_id = 0;
 	}
 	priv->cancellable = NULL;
 
