[libsoup/new-io] abstract SoupRequestBase out of SoupRequest{Data, File, Ftp}



commit 30cd15501c5f0c0fc054405106cf54d283f4b30b
Author: Dan Winship <danw gnome org>
Date:   Sun Dec 20 13:22:24 2009 +0100

    abstract SoupRequestBase out of SoupRequest{Data,File,Ftp}

 libsoup/Makefile.am         |    2 +
 libsoup/soup-request-base.c |  177 +++++++++++++++++++++++++++++++++++++++++++
 libsoup/soup-request-base.h |   39 ++++++++++
 libsoup/soup-request-data.c |  123 ++++--------------------------
 libsoup/soup-request-data.h |   13 +--
 libsoup/soup-request-file.c |  113 ++++++---------------------
 libsoup/soup-request-file.h |   10 +-
 libsoup/soup-request-ftp.c  |  117 ++++++----------------------
 libsoup/soup-request-ftp.h  |   10 +-
 libsoup/soup-request.c      |   17 ++--
 libsoup/soup-request.h      |    7 +-
 libsoup/soup-session.c      |    2 +
 12 files changed, 313 insertions(+), 317 deletions(-)
---
diff --git a/libsoup/Makefile.am b/libsoup/Makefile.am
index f2579b4..c8d51ef 100644
--- a/libsoup/Makefile.am
+++ b/libsoup/Makefile.am
@@ -76,6 +76,7 @@ soup_headers =			\
 	soup-proxy-resolver.h	\
 	soup-proxy-uri-resolver.h \
 	soup-request.h		\
+	soup-request-base.h	\
 	soup-server.h		\
 	soup-session.h		\
 	soup-session-async.h	\
@@ -165,6 +166,7 @@ libsoup_2_4_la_SOURCES =		\
 	soup-proxy-resolver-static.c	\
 	soup-proxy-uri-resolver.c	\
 	soup-request.c			\
+	soup-request-base.c		\
 	soup-request-data.h		\
 	soup-request-data.c		\
 	soup-request-file.h		\
diff --git a/libsoup/soup-request-base.c b/libsoup/soup-request-base.c
new file mode 100644
index 0000000..e3e1634
--- /dev/null
+++ b/libsoup/soup-request-base.c
@@ -0,0 +1,177 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * soup-request-base.c: base: URI request object
+ *
+ * Copyright (C) 2009 Red Hat, Inc.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <glib/gi18n.h>
+
+#include "soup-request-base.h"
+#include "soup-session-feature.h"
+#include "soup-session.h"
+#include "soup-uri.h"
+
+static void soup_request_base_initable_interface_init (GInitableIface *initable_interface);
+
+G_DEFINE_TYPE_WITH_CODE (SoupRequestBase, soup_request_base, G_TYPE_OBJECT,
+			 G_IMPLEMENT_INTERFACE (SOUP_TYPE_REQUEST, NULL)
+			 G_IMPLEMENT_INTERFACE (G_TYPE_INITABLE,
+						soup_request_base_initable_interface_init))
+
+struct _SoupRequestBasePrivate {
+	SoupURI *uri;
+	SoupSession *session;
+
+};
+
+enum {
+	PROP_0,
+
+	PROP_URI,
+	PROP_SESSION
+};
+
+static void soup_request_base_set_property (GObject *object, guint prop_id,
+					    const GValue *value, GParamSpec *pspec);
+static void soup_request_base_get_property (GObject *object, guint prop_id,
+					    GValue *value, GParamSpec *pspec);
+static void soup_request_base_finalize (GObject *object);
+
+static gboolean soup_request_base_initable_init (GInitable     *initable,
+						 GCancellable  *cancellable,
+						 GError       **error);
+
+static gboolean soup_request_base_validate_uri (SoupRequestBase  *req_base,
+						SoupURI          *uri,
+						GError          **error);
+
+static void
+soup_request_base_class_init (SoupRequestBaseClass *request_base_class)
+{
+	GObjectClass *object_class = G_OBJECT_CLASS (request_base_class);
+
+	g_type_class_add_private (request_base_class, sizeof (SoupRequestBasePrivate));
+
+	request_base_class->validate_uri = soup_request_base_validate_uri;
+
+	object_class->finalize = soup_request_base_finalize;
+	object_class->set_property = soup_request_base_set_property;
+	object_class->get_property = soup_request_base_get_property;
+
+	g_object_class_override_property (object_class, PROP_URI, "uri");
+	g_object_class_override_property (object_class, PROP_SESSION, "session");
+}
+
+static void
+soup_request_base_initable_interface_init (GInitableIface *initable_interface)
+{
+	initable_interface->init = soup_request_base_initable_init;
+}
+
+static void
+soup_request_base_init (SoupRequestBase *req_base)
+{
+	req_base->priv = G_TYPE_INSTANCE_GET_PRIVATE (req_base, SOUP_TYPE_REQUEST_BASE, SoupRequestBasePrivate);
+}
+
+static gboolean
+soup_request_base_initable_init (GInitable     *initable,
+				 GCancellable  *cancellable,
+				 GError       **error)
+{
+	SoupRequestBase *req_base = SOUP_REQUEST_BASE (initable);
+	gboolean ok;
+
+	ok = SOUP_REQUEST_BASE_GET_CLASS (initable)->
+		validate_uri (req_base, req_base->priv->uri, error);
+
+	if (!ok && error) {
+		char *uri_string = soup_uri_to_string (req_base->priv->uri, FALSE);
+		g_set_error (error, SOUP_ERROR, SOUP_ERROR_BAD_URI,
+			     _("Invalid '%s' URI: %s"),
+			     req_base->priv->uri->scheme,
+			     uri_string);
+		g_free (uri_string);
+	}
+
+	return ok;
+}
+
+static gboolean
+soup_request_base_validate_uri (SoupRequestBase  *req_base,
+				SoupURI          *uri,
+				GError          **error)
+{
+	return TRUE;
+}
+
+static void
+soup_request_base_finalize (GObject *object)
+{
+	SoupRequestBase *req_base = SOUP_REQUEST_BASE (object);
+
+	if (req_base->priv->uri)
+		soup_uri_free (req_base->priv->uri);
+
+	G_OBJECT_CLASS (soup_request_base_parent_class)->finalize (object);
+}
+
+static void
+soup_request_base_set_property (GObject *object, guint prop_id,
+				const GValue *value, GParamSpec *pspec)
+{
+	SoupRequestBase *req_base = SOUP_REQUEST_BASE (object);
+
+	switch (prop_id) {
+	case PROP_URI:
+		if (req_base->priv->uri)
+			soup_uri_free (req_base->priv->uri);
+		req_base->priv->uri = g_value_dup_boxed (value);
+		break;
+	case PROP_SESSION:
+		if (req_base->priv->session)
+			g_object_unref (req_base->priv->session);
+		req_base->priv->session = g_value_dup_object (value);
+		break;
+	default:
+		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+		break;
+	}
+}
+
+static void
+soup_request_base_get_property (GObject *object, guint prop_id,
+				GValue *value, GParamSpec *pspec)
+{
+	SoupRequestBase *req_base = SOUP_REQUEST_BASE (object);
+
+	switch (prop_id) {
+	case PROP_URI:
+		g_value_set_boxed (value, req_base->priv->uri);
+		break;
+	case PROP_SESSION:
+		g_value_set_object (value, req_base->priv->session);
+		break;
+	default:
+		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+		break;
+	}
+}
+
+SoupURI *
+soup_request_base_get_uri (SoupRequestBase *req_base)
+{
+	return req_base->priv->uri;
+}
+
+SoupSession *
+soup_request_base_get_session (SoupRequestBase *req_base)
+{
+	return req_base->priv->session;
+}
+
diff --git a/libsoup/soup-request-base.h b/libsoup/soup-request-base.h
new file mode 100644
index 0000000..2f031de
--- /dev/null
+++ b/libsoup/soup-request-base.h
@@ -0,0 +1,39 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * Copyright (C) 2009 Red Hat, Inc.
+ */
+
+#ifndef SOUP_REQUEST_BASE_H
+#define SOUP_REQUEST_BASE_H 1
+
+#include <libsoup/soup-request.h>
+
+#define SOUP_TYPE_REQUEST_BASE            (soup_request_base_get_type ())
+#define SOUP_REQUEST_BASE(object)         (G_TYPE_CHECK_INSTANCE_CAST ((object), SOUP_TYPE_REQUEST_BASE, SoupRequestBase))
+#define SOUP_REQUEST_BASE_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), SOUP_TYPE_REQUEST_BASE, SoupRequestBaseClass))
+#define SOUP_IS_REQUEST_BASE(object)      (G_TYPE_CHECK_INSTANCE_TYPE ((object), SOUP_TYPE_REQUEST_BASE))
+#define SOUP_IS_REQUEST_BASE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SOUP_TYPE_REQUEST_BASE))
+#define SOUP_REQUEST_BASE_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), SOUP_TYPE_REQUEST_BASE, SoupRequestBaseClass))
+
+typedef struct _SoupRequestBasePrivate SoupRequestBasePrivate;
+
+typedef struct {
+	GObject parent;
+
+	SoupRequestBasePrivate *priv;
+} SoupRequestBase;
+
+typedef struct {
+	GObjectClass parent;
+
+	gboolean (*validate_uri) (SoupRequestBase  *req_base,
+				  SoupURI          *uri,
+				  GError          **error);
+} SoupRequestBaseClass;
+
+GType soup_request_base_get_type (void);
+
+SoupURI     *soup_request_base_get_uri     (SoupRequestBase *req_base);
+SoupSession *soup_request_base_get_session (SoupRequestBase *req_base);
+
+#endif /* SOUP_REQUEST_BASE_H */
diff --git a/libsoup/soup-request-data.c b/libsoup/soup-request-data.c
index 1cd309f..48c604e 100644
--- a/libsoup/soup-request-data.c
+++ b/libsoup/soup-request-data.c
@@ -17,51 +17,26 @@
 #include "soup-uri.h"
 
 static void soup_request_data_request_interface_init (SoupRequestInterface *request_interface);
-static void soup_request_data_initable_interface_init (GInitableIface *initable_interface);
 
-G_DEFINE_TYPE_WITH_CODE (SoupRequestData, soup_request_data, G_TYPE_OBJECT,
+G_DEFINE_TYPE_WITH_CODE (SoupRequestData, soup_request_data, SOUP_TYPE_REQUEST_BASE,
 			 G_IMPLEMENT_INTERFACE (SOUP_TYPE_REQUEST,
-						soup_request_data_request_interface_init)
-			 G_IMPLEMENT_INTERFACE (G_TYPE_INITABLE,
-						soup_request_data_initable_interface_init))
+						soup_request_data_request_interface_init))
 
-struct _SoupRequestDataPrivate {
-	SoupURI *uri;
+static gboolean soup_request_data_validate_uri (SoupRequestBase  *req_base,
+						SoupURI          *uri,
+						GError          **error);
 
-};
-
-enum {
-	PROP_0,
-
-	PROP_URI
-};
-
-static void soup_request_data_set_property (GObject *object, guint prop_id,
-					    const GValue *value, GParamSpec *pspec);
-static void soup_request_data_get_property (GObject *object, guint prop_id,
-					    GValue *value, GParamSpec *pspec);
-static void soup_request_data_finalize (GObject *object);
-
-static gboolean soup_request_data_initable_init (GInitable     *initable,
-						 GCancellable  *cancellable,
-						 GError       **error);
-
-static GInputStream *soup_request_data_send        (SoupRequest          *request,
-						    GCancellable         *cancellable,
-						    GError              **error);
+static GInputStream *soup_request_data_send (SoupRequest   *request,
+					     GCancellable  *cancellable,
+					     GError       **error);
 
 static void
 soup_request_data_class_init (SoupRequestDataClass *request_data_class)
 {
-	GObjectClass *object_class = G_OBJECT_CLASS (request_data_class);
-
-	g_type_class_add_private (request_data_class, sizeof (SoupRequestDataPrivate));
+	SoupRequestBaseClass *request_base_class =
+		SOUP_REQUEST_BASE_CLASS (request_data_class);
 
-	object_class->finalize = soup_request_data_finalize;
-	object_class->set_property = soup_request_data_set_property;
-	object_class->get_property = soup_request_data_get_property;
-
-	g_object_class_override_property (object_class, PROP_URI, "uri");
+	request_base_class->validate_uri = soup_request_data_validate_uri;
 }
 
 static void
@@ -71,80 +46,16 @@ soup_request_data_request_interface_init (SoupRequestInterface *request_interfac
 }
 
 static void
-soup_request_data_initable_interface_init (GInitableIface *initable_interface)
-{
-	initable_interface->init = soup_request_data_initable_init;
-}
-
-static void
 soup_request_data_init (SoupRequestData *data)
 {
-	data->priv = G_TYPE_INSTANCE_GET_PRIVATE (data, SOUP_TYPE_REQUEST_DATA, SoupRequestDataPrivate);
 }
 
 static gboolean
-soup_request_data_initable_init (GInitable     *initable,
-				 GCancellable  *cancellable,
-				 GError       **error)
-{
-	SoupRequestData *data = SOUP_REQUEST_DATA (initable);
-
-	if (data->priv->uri->host) {
-		if (error) {
-			char *uri_string = soup_uri_to_string (data->priv->uri, FALSE);
-			g_set_error (error, SOUP_ERROR, SOUP_ERROR_BAD_URI,
-				     _("Invalid 'data' URI: %s"), uri_string);
-			g_free (uri_string);
-		}
-		return FALSE;
-	}
-
-	return TRUE;
-}
-
-static void
-soup_request_data_finalize (GObject *object)
+soup_request_data_validate_uri (SoupRequestBase  *req_base,
+				SoupURI          *uri,
+				GError          **error)
 {
-	SoupRequestData *data = SOUP_REQUEST_DATA (object);
-
-	if (data->priv->uri)
-		soup_uri_free (data->priv->uri);
-
-	G_OBJECT_CLASS (soup_request_data_parent_class)->finalize (object);
-}
-
-static void
-soup_request_data_set_property (GObject *object, guint prop_id,
-				const GValue *value, GParamSpec *pspec)
-{
-	SoupRequestData *data = SOUP_REQUEST_DATA (object);
-
-	switch (prop_id) {
-	case PROP_URI:
-		if (data->priv->uri)
-			soup_uri_free (data->priv->uri);
-		data->priv->uri = g_value_dup_boxed (value);
-		break;
-	default:
-		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
-		break;
-	}
-}
-
-static void
-soup_request_data_get_property (GObject *object, guint prop_id,
-				GValue *value, GParamSpec *pspec)
-{
-	SoupRequestData *data = SOUP_REQUEST_DATA (object);
-
-	switch (prop_id) {
-	case PROP_URI:
-		g_value_set_boxed (value, data->priv->uri);
-		break;
-	default:
-		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
-		break;
-	}
+	return uri->host == NULL;
 }
 
 static GInputStream *
@@ -229,7 +140,7 @@ soup_request_data_send (SoupRequest          *request,
 			GCancellable         *cancellable,
 			GError              **error)
 {
-	SoupRequestData *data = SOUP_REQUEST_DATA (request);
+	SoupURI *uri = soup_request_base_get_uri (SOUP_REQUEST_BASE (request));
 
-	return data_uri_decode (data->priv->uri->path, NULL);
+	return data_uri_decode (uri->path, NULL);
 }
diff --git a/libsoup/soup-request-data.h b/libsoup/soup-request-data.h
index b584f0a..db5cb00 100644
--- a/libsoup/soup-request-data.h
+++ b/libsoup/soup-request-data.h
@@ -6,25 +6,22 @@
 #ifndef SOUP_REQUEST_DATA_H
 #define SOUP_REQUEST_DATA_H 1
 
-#include "soup-request.h"
+#include "soup-request-base.h"
 
 #define SOUP_TYPE_REQUEST_DATA            (soup_request_data_get_type ())
 #define SOUP_REQUEST_DATA(object)         (G_TYPE_CHECK_INSTANCE_CAST ((object), SOUP_TYPE_REQUEST_DATA, SoupRequestData))
-#define SOUP_REQUEST_DATA_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), SOUP_TYPE_REQUEST_DATA, SoupRequestDataInterface))
+#define SOUP_REQUEST_DATA_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), SOUP_TYPE_REQUEST_DATA, SoupRequestDataClass))
 #define SOUP_IS_REQUEST_DATA(object)      (G_TYPE_CHECK_INSTANCE_TYPE ((object), SOUP_TYPE_REQUEST_DATA))
 #define SOUP_IS_REQUEST_DATA_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SOUP_TYPE_REQUEST_DATA))
-#define SOUP_REQUEST_DATA_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_INTERFACE ((obj), SOUP_TYPE_REQUEST_DATA, SoupRequestDataInterface))
-
-typedef struct _SoupRequestDataPrivate SoupRequestDataPrivate;
+#define SOUP_REQUEST_DATA_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), SOUP_TYPE_REQUEST_DATA, SoupRequestDataClass))
 
 typedef struct {
-	GObject parent;
+	SoupRequestBase parent;
 
-	SoupRequestDataPrivate *priv;
 } SoupRequestData;
 
 typedef struct {
-	GObjectClass parent;
+	SoupRequestBaseClass parent;
 
 } SoupRequestDataClass;
 
diff --git a/libsoup/soup-request-file.c b/libsoup/soup-request-file.c
index 55168af..7acac68 100644
--- a/libsoup/soup-request-file.c
+++ b/libsoup/soup-request-file.c
@@ -17,34 +17,20 @@
 #include "soup-uri.h"
 
 static void soup_request_file_request_interface_init (SoupRequestInterface *request_interface);
-static void soup_request_file_initable_interface_init (GInitableIface *initable_interface);
 
-G_DEFINE_TYPE_WITH_CODE (SoupRequestFile, soup_request_file, G_TYPE_OBJECT,
+G_DEFINE_TYPE_WITH_CODE (SoupRequestFile, soup_request_file, SOUP_TYPE_REQUEST_BASE,
 			 G_IMPLEMENT_INTERFACE (SOUP_TYPE_REQUEST,
-						soup_request_file_request_interface_init)
-			 G_IMPLEMENT_INTERFACE (G_TYPE_INITABLE,
-						soup_request_file_initable_interface_init))
+						soup_request_file_request_interface_init))
 
 struct _SoupRequestFilePrivate {
-	SoupURI *uri;
 	GFile *gfile;
 };
 
-enum {
-	PROP_0,
-
-	PROP_URI
-};
-
-static void soup_request_file_set_property (GObject *object, guint prop_id,
-					    const GValue *value, GParamSpec *pspec);
-static void soup_request_file_get_property (GObject *object, guint prop_id,
-					    GValue *value, GParamSpec *pspec);
 static void soup_request_file_finalize (GObject *object);
 
-static gboolean soup_request_file_initable_init (GInitable     *initable,
-						 GCancellable  *cancellable,
-						 GError       **error);
+static gboolean soup_request_file_validate_uri (SoupRequestBase  *req_base,
+						SoupURI          *uri,
+						GError          **error);
 
 static GInputStream *soup_request_file_send        (SoupRequest          *request,
 						    GCancellable         *cancellable,
@@ -61,14 +47,14 @@ static void
 soup_request_file_class_init (SoupRequestFileClass *request_file_class)
 {
 	GObjectClass *object_class = G_OBJECT_CLASS (request_file_class);
+	SoupRequestBaseClass *request_base_class =
+		SOUP_REQUEST_BASE_CLASS (request_file_class);
 
 	g_type_class_add_private (request_file_class, sizeof (SoupRequestFilePrivate));
 
 	object_class->finalize = soup_request_file_finalize;
-	object_class->set_property = soup_request_file_set_property;
-	object_class->get_property = soup_request_file_get_property;
 
-	g_object_class_override_property (object_class, PROP_URI, "uri");
+	request_base_class->validate_uri = soup_request_file_validate_uri;
 }
 
 static void
@@ -80,89 +66,43 @@ soup_request_file_request_interface_init (SoupRequestInterface *request_interfac
 }
 
 static void
-soup_request_file_initable_interface_init (GInitableIface *initable_interface)
-{
-	initable_interface->init = soup_request_file_initable_init;
-}
-
-static void
 soup_request_file_init (SoupRequestFile *file)
 {
 	file->priv = G_TYPE_INSTANCE_GET_PRIVATE (file, SOUP_TYPE_REQUEST_FILE, SoupRequestFilePrivate);
 }
 
-static gboolean
-soup_request_file_initable_init (GInitable     *initable,
-				 GCancellable  *cancellable,
-				 GError       **error)
-{
-	SoupRequestFile *file = SOUP_REQUEST_FILE (initable);
-	const char *host;
-	char *path_decoded;
-
-	host = file->priv->uri->host;
-	if (!host || (*host && strcmp (host, "localhost") != 0)) {
-		if (error) {
-			char *uri_string = soup_uri_to_string (file->priv->uri, FALSE);
-			g_set_error (error, SOUP_ERROR, SOUP_ERROR_BAD_URI,
-				     _("Invalid 'file' URI: %s"), uri_string);
-			g_free (uri_string);
-		}
-		return FALSE;
-	}
-
-	path_decoded = soup_uri_decode (file->priv->uri->path);
-	file->priv->gfile = g_file_new_for_path (path_decoded);
-	g_free (path_decoded);
-
-	return TRUE;
-}
-
 static void
 soup_request_file_finalize (GObject *object)
 {
 	SoupRequestFile *file = SOUP_REQUEST_FILE (object);
 
-	if (file->priv->uri)
-		soup_uri_free (file->priv->uri);
 	if (file->priv->gfile)
 		g_object_unref (file->priv->gfile);
 
 	G_OBJECT_CLASS (soup_request_file_parent_class)->finalize (object);
 }
 
-static void
-soup_request_file_set_property (GObject *object, guint prop_id,
-				const GValue *value, GParamSpec *pspec)
+static gboolean
+soup_request_file_validate_uri (SoupRequestBase  *req_base,
+				SoupURI          *uri,
+				GError          **error)
 {
-	SoupRequestFile *file = SOUP_REQUEST_FILE (object);
+	SoupRequestFile *file = SOUP_REQUEST_FILE (req_base);
+	char *path_decoded;
 
-	switch (prop_id) {
-	case PROP_URI:
-		if (file->priv->uri)
-			soup_uri_free (file->priv->uri);
-		file->priv->uri = g_value_dup_boxed (value);
-		break;
-	default:
-		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
-		break;
-	}
-}
+	/* "file:/foo" is not valid */
+	if (!uri->host)
+		return FALSE;
 
-static void
-soup_request_file_get_property (GObject *object, guint prop_id,
-				GValue *value, GParamSpec *pspec)
-{
-	SoupRequestFile *file = SOUP_REQUEST_FILE (object);
+	/* but it must be "file:///..." or "file://localhost/..." */
+	if (*uri->host && g_ascii_strcasecmp (uri->host, "localhost") != 0)
+		return FALSE;
 
-	switch (prop_id) {
-	case PROP_URI:
-		g_value_set_boxed (value, file->priv->uri);
-		break;
-	default:
-		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
-		break;
-	}
+	path_decoded = soup_uri_decode (uri->path);
+	file->priv->gfile = g_file_new_for_path (path_decoded);
+	g_free (path_decoded);
+
+	return TRUE;
 }
 
 static GInputStream *
@@ -172,8 +112,7 @@ soup_request_file_send (SoupRequest          *request,
 {
 	SoupRequestFile *file = SOUP_REQUEST_FILE (request);
 
-	return (GInputStream *)g_file_read (file->priv->gfile,
-					    cancellable, error);
+	return (GInputStream *)g_file_read (file->priv->gfile, cancellable, error);
 }
 
 static void
diff --git a/libsoup/soup-request-file.h b/libsoup/soup-request-file.h
index 0507132..7745436 100644
--- a/libsoup/soup-request-file.h
+++ b/libsoup/soup-request-file.h
@@ -6,25 +6,25 @@
 #ifndef SOUP_REQUEST_FILE_H
 #define SOUP_REQUEST_FILE_H 1
 
-#include "soup-request.h"
+#include "soup-request-base.h"
 
 #define SOUP_TYPE_REQUEST_FILE            (soup_request_file_get_type ())
 #define SOUP_REQUEST_FILE(object)         (G_TYPE_CHECK_INSTANCE_CAST ((object), SOUP_TYPE_REQUEST_FILE, SoupRequestFile))
-#define SOUP_REQUEST_FILE_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), SOUP_TYPE_REQUEST_FILE, SoupRequestFileInterface))
+#define SOUP_REQUEST_FILE_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), SOUP_TYPE_REQUEST_FILE, SoupRequestFileClass))
 #define SOUP_IS_REQUEST_FILE(object)      (G_TYPE_CHECK_INSTANCE_TYPE ((object), SOUP_TYPE_REQUEST_FILE))
 #define SOUP_IS_REQUEST_FILE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SOUP_TYPE_REQUEST_FILE))
-#define SOUP_REQUEST_FILE_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_INTERFACE ((obj), SOUP_TYPE_REQUEST_FILE, SoupRequestFileInterface))
+#define SOUP_REQUEST_FILE_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), SOUP_TYPE_REQUEST_FILE, SoupRequestFileClass))
 
 typedef struct _SoupRequestFilePrivate SoupRequestFilePrivate;
 
 typedef struct {
-	GObject parent;
+	SoupRequestBase parent;
 
 	SoupRequestFilePrivate *priv;
 } SoupRequestFile;
 
 typedef struct {
-	GObjectClass parent;
+	SoupRequestBaseClass parent;
 
 } SoupRequestFileClass;
 
diff --git a/libsoup/soup-request-ftp.c b/libsoup/soup-request-ftp.c
index 45442bd..7b1a741 100644
--- a/libsoup/soup-request-ftp.c
+++ b/libsoup/soup-request-ftp.c
@@ -18,58 +18,44 @@
 #include "soup-uri.h"
 
 static void soup_request_ftp_request_interface_init (SoupRequestInterface *request_interface);
-static void soup_request_ftp_initable_interface_init (GInitableIface *initable_interface);
 
-G_DEFINE_TYPE_WITH_CODE (SoupRequestFtp, soup_request_ftp, G_TYPE_OBJECT,
+G_DEFINE_TYPE_WITH_CODE (SoupRequestFtp, soup_request_ftp, SOUP_TYPE_REQUEST_BASE,
 			 G_IMPLEMENT_INTERFACE (SOUP_TYPE_REQUEST,
-						soup_request_ftp_request_interface_init)
-			 G_IMPLEMENT_INTERFACE (G_TYPE_INITABLE,
-						soup_request_ftp_initable_interface_init))
+						soup_request_ftp_request_interface_init))
 
 struct _SoupRequestFtpPrivate {
-	SoupURI *uri;
 	SoupFTPConnection *conn;
 };
 
-enum {
-	PROP_0,
-
-	PROP_URI
-};
-
-static void soup_request_ftp_set_property (GObject *object, guint prop_id,
-					    const GValue *value, GParamSpec *pspec);
-static void soup_request_ftp_get_property (GObject *object, guint prop_id,
-					    GValue *value, GParamSpec *pspec);
 static void soup_request_ftp_finalize (GObject *object);
 
-static gboolean soup_request_ftp_initable_init (GInitable     *initable,
-						 GCancellable  *cancellable,
-						 GError       **error);
+static gboolean soup_request_ftp_validate_uri (SoupRequestBase  *req_base,
+					       SoupURI          *uri,
+					       GError          **error);
 
 static GInputStream *soup_request_ftp_send        (SoupRequest          *request,
-						    GCancellable         *cancellable,
-						    GError              **error);
+						   GCancellable         *cancellable,
+						   GError              **error);
 static void          soup_request_ftp_send_async  (SoupRequest          *request,
-						    GCancellable         *cancellable,
-						    GAsyncReadyCallback   callback,
-						    gpointer              user_data);
+						   GCancellable         *cancellable,
+						   GAsyncReadyCallback   callback,
+						   gpointer              user_data);
 static GInputStream *soup_request_ftp_send_finish (SoupRequest          *request,
-						    GAsyncResult         *result,
-						    GError              **error);
+						   GAsyncResult         *result,
+						   GError              **error);
 
 static void
 soup_request_ftp_class_init (SoupRequestFtpClass *request_ftp_class)
 {
 	GObjectClass *object_class = G_OBJECT_CLASS (request_ftp_class);
+	SoupRequestBaseClass *request_base_class =
+		SOUP_REQUEST_BASE_CLASS (request_ftp_class);
 
 	g_type_class_add_private (request_ftp_class, sizeof (SoupRequestFtpPrivate));
 
 	object_class->finalize = soup_request_ftp_finalize;
-	object_class->set_property = soup_request_ftp_set_property;
-	object_class->get_property = soup_request_ftp_get_property;
 
-	g_object_class_override_property (object_class, PROP_URI, "uri");
+	request_base_class->validate_uri = soup_request_ftp_validate_uri;
 }
 
 static void
@@ -81,39 +67,18 @@ soup_request_ftp_request_interface_init (SoupRequestInterface *request_interface
 }
 
 static void
-soup_request_ftp_initable_interface_init (GInitableIface *initable_interface)
-{
-	initable_interface->init = soup_request_ftp_initable_init;
-}
-
-static void
 soup_request_ftp_init (SoupRequestFtp *ftp)
 {
 	ftp->priv = G_TYPE_INSTANCE_GET_PRIVATE (ftp, SOUP_TYPE_REQUEST_FTP, SoupRequestFtpPrivate);
+	ftp->priv->conn = soup_ftp_connection_new ();
 }
 
 static gboolean
-soup_request_ftp_initable_init (GInitable     *initable,
-				GCancellable  *cancellable,
-				GError       **error)
+soup_request_ftp_validate_uri (SoupRequestBase  *req_base,
+			       SoupURI          *uri,
+			       GError          **error)
 {
-	SoupRequestFtp *ftp = SOUP_REQUEST_FTP (initable);
-	const char *host;
-
-	host = ftp->priv->uri->host;
-	if (!host) {
-		if (error) {
-			char *uri_string = soup_uri_to_string (ftp->priv->uri, FALSE);
-			g_set_error (error, SOUP_ERROR, SOUP_ERROR_BAD_URI,
-				     _("Invalid 'ftp' URI: %s"), uri_string);
-			g_free (uri_string);
-		}
-		return FALSE;
-	}
-
-	ftp->priv->conn = soup_ftp_connection_new ();
-
-	return TRUE;
+	return uri->host != NULL;
 }
 
 static void
@@ -121,46 +86,12 @@ soup_request_ftp_finalize (GObject *object)
 {
 	SoupRequestFtp *ftp = SOUP_REQUEST_FTP (object);
 
-	if (ftp->priv->uri)
-		soup_uri_free (ftp->priv->uri);
+	if (ftp->priv->conn)
+		g_object_unref (ftp->priv->conn);
 
 	G_OBJECT_CLASS (soup_request_ftp_parent_class)->finalize (object);
 }
 
-static void
-soup_request_ftp_set_property (GObject *object, guint prop_id,
-				const GValue *value, GParamSpec *pspec)
-{
-	SoupRequestFtp *ftp = SOUP_REQUEST_FTP (object);
-
-	switch (prop_id) {
-	case PROP_URI:
-		if (ftp->priv->uri)
-			soup_uri_free (ftp->priv->uri);
-		ftp->priv->uri = g_value_dup_boxed (value);
-		break;
-	default:
-		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
-		break;
-	}
-}
-
-static void
-soup_request_ftp_get_property (GObject *object, guint prop_id,
-				GValue *value, GParamSpec *pspec)
-{
-	SoupRequestFtp *ftp = SOUP_REQUEST_FTP (object);
-
-	switch (prop_id) {
-	case PROP_URI:
-		g_value_set_boxed (value, ftp->priv->uri);
-		break;
-	default:
-		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
-		break;
-	}
-}
-
 /* FIXME: cache SoupFTPConnection objects! */
 
 static GInputStream *
@@ -171,7 +102,7 @@ soup_request_ftp_send (SoupRequest          *request,
 	SoupRequestFtp *ftp = SOUP_REQUEST_FTP (request);
 
 	return soup_ftp_connection_load_uri (ftp->priv->conn,
-					     ftp->priv->uri,
+					     soup_request_base_get_uri (SOUP_REQUEST_BASE (request)),
 					     cancellable,
 					     error);
 }
@@ -185,7 +116,7 @@ soup_request_ftp_send_async (SoupRequest          *request,
 	SoupRequestFtp *ftp = SOUP_REQUEST_FTP (request);
 
 	soup_ftp_connection_load_uri_async (ftp->priv->conn,
-					    ftp->priv->uri,
+					    soup_request_base_get_uri (SOUP_REQUEST_BASE (request)),
 					    cancellable,
 					    callback,
 					    user_data);
diff --git a/libsoup/soup-request-ftp.h b/libsoup/soup-request-ftp.h
index a69a856..5d2a8aa 100644
--- a/libsoup/soup-request-ftp.h
+++ b/libsoup/soup-request-ftp.h
@@ -6,25 +6,25 @@
 #ifndef SOUP_REQUEST_FTP_H
 #define SOUP_REQUEST_FTP_H 1
 
-#include "soup-request.h"
+#include "soup-request-base.h"
 
 #define SOUP_TYPE_REQUEST_FTP            (soup_request_ftp_get_type ())
 #define SOUP_REQUEST_FTP(object)         (G_TYPE_CHECK_INSTANCE_CAST ((object), SOUP_TYPE_REQUEST_FTP, SoupRequestFtp))
-#define SOUP_REQUEST_FTP_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), SOUP_TYPE_REQUEST_FTP, SoupRequestFtpInterface))
+#define SOUP_REQUEST_FTP_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), SOUP_TYPE_REQUEST_FTP, SoupRequestFtpClass))
 #define SOUP_IS_REQUEST_FTP(object)      (G_TYPE_CHECK_INSTANCE_TYPE ((object), SOUP_TYPE_REQUEST_FTP))
 #define SOUP_IS_REQUEST_FTP_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SOUP_TYPE_REQUEST_FTP))
-#define SOUP_REQUEST_FTP_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_INTERFACE ((obj), SOUP_TYPE_REQUEST_FTP, SoupRequestFtpInterface))
+#define SOUP_REQUEST_FTP_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), SOUP_TYPE_REQUEST_FTP, SoupRequestFtpClass))
 
 typedef struct _SoupRequestFtpPrivate SoupRequestFtpPrivate;
 
 typedef struct {
-	GObject parent;
+	SoupRequestBase parent;
 
 	SoupRequestFtpPrivate *priv;
 } SoupRequestFtp;
 
 typedef struct {
-	GObjectClass parent;
+	SoupRequestBaseClass parent;
 
 } SoupRequestFtpClass;
 
diff --git a/libsoup/soup-request.c b/libsoup/soup-request.c
index 06d9810..a969c9d 100644
--- a/libsoup/soup-request.c
+++ b/libsoup/soup-request.c
@@ -10,6 +10,7 @@
 #endif
 
 #include "soup-request.h"
+#include "soup-session.h"
 #include "soup-uri.h"
 
 /**
@@ -82,15 +83,13 @@ soup_request_interface_init (SoupRequestInterface *interface)
 				    "The request URI",
 				    SOUP_TYPE_URI,
 				    G_PARAM_READWRITE));
-}
-
-SoupURI *
-soup_request_get_uri (SoupRequest *request)
-{
-	SoupURI *uri;
-
-	g_object_get (G_OBJECT (request), "uri", &uri, NULL);
-	return uri;
+	g_object_interface_install_property (
+		interface,
+		g_param_spec_object (SOUP_REQUEST_SESSION,
+				     "Session",
+				     "The request's session",
+				     SOUP_TYPE_SESSION,
+				     G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
 }
 
 /* Default implementation: assume the sync implementation doesn't block */
diff --git a/libsoup/soup-request.h b/libsoup/soup-request.h
index 6dd3c63..7fda09d 100644
--- a/libsoup/soup-request.h
+++ b/libsoup/soup-request.h
@@ -13,7 +13,7 @@ G_BEGIN_DECLS
 
 #define SOUP_TYPE_REQUEST            (soup_request_get_type ())
 #define SOUP_REQUEST(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), SOUP_TYPE_REQUEST, SoupRequest))
-#define SOUP_REQUEST_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), SOUP_TYPE_REQUEST, SoupRequestInterface))
+#define SOUP_REQUEST_CLASS(klass)    (G_TYPE_CHECK_INTERFACE_CAST ((klass), SOUP_TYPE_REQUEST, SoupRequestInterface))
 #define SOUP_IS_REQUEST(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SOUP_TYPE_REQUEST))
 #define SOUP_IS_REQUEST_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SOUP_TYPE_REQUEST))
 #define SOUP_REQUEST_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_INTERFACE ((obj), SOUP_TYPE_REQUEST, SoupRequestInterface))
@@ -36,9 +36,8 @@ typedef struct {
 
 GType soup_request_get_type (void);
 
-#define SOUP_REQUEST_URI "uri"
-
-SoupURI      *soup_request_get_uri     (SoupRequest          *request);
+#define SOUP_REQUEST_URI     "uri"
+#define SOUP_REQUEST_SESSION "session"
 
 GInputStream *soup_request_send        (SoupRequest          *request,
 					GCancellable         *cancellable,
diff --git a/libsoup/soup-session.c b/libsoup/soup-session.c
index ae43d2b..bfa2cbe 100644
--- a/libsoup/soup-session.c
+++ b/libsoup/soup-session.c
@@ -2079,10 +2079,12 @@ soup_session_request_uri (SoupSession        *session,
 	if (g_type_is_a (request_type, G_TYPE_INITABLE)) {
 		return g_initable_new (request_type, NULL, error,
 				       "uri", uri,
+				       "session", session,
 				       NULL);
 	} else {
 		return g_object_new (request_type,
 				     "uri", uri,
+				     "session", session,
 				     NULL);
 	}
 }



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]