Add 'soup_server_disconnect' method
authorAndreas Rottmann <a.rottmann@gmx.at>
Sat, 12 Mar 2011 19:28:03 +0000 (20:28 +0100)
committerAndreas Rottmann <a.rottmann@gmx.at>
Sat, 12 Mar 2011 19:28:59 +0000 (20:28 +0100)
This is primarily useful for language bindings, where you don't have
explicit control over reference counts, and hence cannot just use
'g_object_unref' on the server object.

See https://bugzilla.gnome.org/show_bug.cgi?id=638576

libsoup/soup-server.c
libsoup/soup-server.h

index 80ad546..43c0f04 100644 (file)
@@ -991,6 +991,38 @@ soup_server_quit (SoupServer *server)
 }
 
 /**
+ * soup_server_disconnect:
+ * @server: a #SoupServer
+ *
+ * Stops processing for @server and closes its socket. This implies
+ * the effects of soup_server_quit(), but additionally closes the
+ * listening socket.  Note that messages currently in progress will
+ * continue to be handled, if the main loop associated with the
+ * server is resumed or kept running.
+ *
+ * After calling this function, @server is no longer functional, so it
+ * has nearly the same effect as destroying @server entirely. The
+ * function is thus useful mainly for language bindings without
+ * explicit control over object lifetime.
+ **/
+void
+soup_server_disconnect (SoupServer *server)
+{
+       SoupServerPrivate *priv;
+
+       g_return_if_fail (SOUP_IS_SERVER (server));
+       priv = SOUP_SERVER_GET_PRIVATE (server);
+
+       soup_server_quit (server);
+
+       if (priv->listen_sock) {
+               soup_socket_disconnect (priv->listen_sock);
+               g_object_unref (priv->listen_sock);
+               priv->listen_sock = NULL;
+       }
+}
+
+/**
  * soup_server_get_async_context:
  * @server: a #SoupServer
  *
index 88c1570..4ea17ad 100644 (file)
@@ -75,6 +75,7 @@ SoupSocket        *soup_server_get_listener   (SoupServer            *server);
 void               soup_server_run            (SoupServer            *server);
 void               soup_server_run_async      (SoupServer            *server);
 void               soup_server_quit           (SoupServer            *server);
+void               soup_server_disconnect     (SoupServer            *server);
 
 GMainContext      *soup_server_get_async_context (SoupServer         *server);