[libsoup/new-io] abstract SoupRequestBase out of SoupRequest{Data, File, Ftp}
- From: Dan Winship <danw src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [libsoup/new-io] abstract SoupRequestBase out of SoupRequest{Data, File, Ftp}
- Date: Sun, 20 Dec 2009 12:24:06 +0000 (UTC)
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]