aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGuido Günther <agx@sigxcpu.org>2014-03-02 15:52:14 +0100
committerGuido Günther <agx@sigxcpu.org>2014-03-02 22:09:44 +0100
commitb0ba2fa850d6f7278796cac9d13b2617f0e2c4d2 (patch)
tree69ad5ef5574f0f568698bf381c0e71a150214ed3
parent9a4888952c10655b752a9e45a9907813c646d972 (diff)
Make LpfProvider an interface
This allows us to have different base classes for different providers
-rw-r--r--src/lpf-provider.c102
-rw-r--r--src/lpf-provider.h24
-rw-r--r--src/providers/de-db.c87
-rw-r--r--src/providers/de-db.h6
4 files changed, 105 insertions, 114 deletions
diff --git a/src/lpf-provider.c b/src/lpf-provider.c
index 18a6789..9333303 100644
--- a/src/lpf-provider.c
+++ b/src/lpf-provider.c
@@ -20,14 +20,11 @@
#include "lpf-provider.h"
-G_DEFINE_TYPE (LpfProvider, lpf_provider, G_TYPE_OBJECT)
-
-#define GET_PRIVATE(o) \
- (G_TYPE_INSTANCE_GET_PRIVATE ((o), LPF_TYPE_PROVIDER, LpfProviderPrivate))
+G_DEFINE_INTERFACE (LpfProvider, lpf_provider, G_TYPE_OBJECT)
/**
* SECTION:lpf-provider
- * @short_description: Public transport information provider
+ * @short_description: Public transport information provider interface
* @see_also: #LpfProvider
*
* A #LpfProvider represents a provider of public transport
@@ -52,16 +49,6 @@ G_DEFINE_TYPE (LpfProvider, lpf_provider, G_TYPE_OBJECT)
* received. In case of an error @trips is #NULL.
*/
-enum {
- PROP_0,
- PROP_NAME,
- LAST_PROP
-};
-
-typedef struct _LpfProviderPrivate LpfProviderPrivate;
-struct _LpfProviderPrivate {
- char *name;
-};
GQuark
lpf_provider_error_quark (void)
@@ -79,68 +66,25 @@ const char*
lpf_provider_get_name (LpfProvider *self)
{
g_return_val_if_fail (LPF_IS_PROVIDER (self), NULL);
- LpfProviderPrivate *priv = GET_PRIVATE (self);
-
- return priv->name;
-}
-
-static void
-set_property (GObject *object, guint prop_id,
- const GValue *value, GParamSpec *pspec)
-{
- LpfProviderPrivate *priv = GET_PRIVATE (object);
-
- switch (prop_id) {
- case PROP_NAME:
- /* construct only */
- priv->name = g_value_dup_string (value);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
-}
-
-
-static void
-get_property (GObject *object, guint prop_id,
- GValue *value, GParamSpec *pspec)
-{
- LpfProviderPrivate *priv = GET_PRIVATE (object);
- switch (prop_id) {
- case PROP_NAME:
- g_value_set_string (value, priv->name);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
+ return LPF_PROVIDER_GET_INTERFACE (self)->get_name (self);
}
-static void
-finalize (GObject *object)
-{
- LpfProviderPrivate *priv = GET_PRIVATE (object);
-
- g_free (priv->name);
-}
-
/* invoked by LprManager to activate the provider */
void
lpf_provider_activate (LpfProvider *self, GObject *obj)
{
- LpfProviderPrivate *priv = GET_PRIVATE (self);
gchar *cache_dir = NULL;
+ LpfProviderInterface *iface = LPF_PROVIDER_GET_INTERFACE (self);
g_return_if_fail (LPF_IS_PROVIDER (self));
- cache_dir = g_strdup_printf("%s/%s/%s/", g_get_user_cache_dir (), PACKAGE_NAME, priv->name);
+ cache_dir = g_strdup_printf("%s/%s/%s/", g_get_user_cache_dir (), PACKAGE_NAME, iface->get_name(self));
if (cache_dir)
g_mkdir_with_parents (cache_dir, 0700);
- LPF_PROVIDER_GET_CLASS (self)->activate (self, obj);
+ iface->activate (self, obj);
g_free (cache_dir);
}
@@ -151,7 +95,7 @@ lpf_provider_deactivate (LpfProvider *self, GObject *obj)
{
g_return_if_fail (LPF_IS_PROVIDER (self));
- LPF_PROVIDER_GET_CLASS (self)->deactivate (self, obj);
+ LPF_PROVIDER_GET_INTERFACE (self)->deactivate (self, obj);
}
/**
@@ -176,7 +120,7 @@ lpf_provider_get_locs (LpfProvider *self, const char* match, LpfProviderGotLocsN
g_return_val_if_fail (match, -1);
g_return_val_if_fail (callback, -1);
- return LPF_PROVIDER_GET_CLASS (self)->get_locs (self, match, callback, user_data);
+ return LPF_PROVIDER_GET_INTERFACE (self)->get_locs (self, match, callback, user_data);
}
/**
@@ -221,35 +165,21 @@ lpf_provider_get_trips (LpfProvider *self, LpfLoc *start, LpfLoc *end, GDateTime
g_return_val_if_fail (date, -1);
g_return_val_if_fail (callback, -1);
- return LPF_PROVIDER_GET_CLASS (self)->get_trips (self, start, end, date, flags, callback, user_data);
+ return LPF_PROVIDER_GET_INTERFACE (self)->get_trips (self, start, end, date, flags, callback, user_data);
}
static void
-lpf_provider_class_init (LpfProviderClass *klass)
+lpf_provider_default_init (LpfProviderInterface *iface)
{
- GObjectClass *object_class = G_OBJECT_CLASS (klass);
-
- g_type_class_add_private (klass, sizeof (LpfProviderPrivate));
-
- object_class->get_property = get_property;
- object_class->set_property = set_property;
- object_class->finalize = finalize;
-
- g_object_class_install_property
- (object_class, PROP_NAME,
- g_param_spec_string (LPF_PROVIDER_PROP_NAME,
- "Name",
- "Provider Name",
- NULL,
- G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
+ g_object_interface_install_property
+ (iface, g_param_spec_string (LPF_PROVIDER_PROP_NAME,
+ "Name",
+ "Provider Name",
+ NULL,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
}
-static void
-lpf_provider_init (LpfProvider *self G_GNUC_UNUSED)
-{
-}
-
/**
* lpf_provider_create: (skip)
*
diff --git a/src/lpf-provider.h b/src/lpf-provider.h
index 4f6b07b..aa810f9 100644
--- a/src/lpf-provider.h
+++ b/src/lpf-provider.h
@@ -46,46 +46,38 @@ typedef enum {
LPF_PROVIDER_ERROR_PARSE_FAILED,
} LpfProviderError;
-#define LPF_TYPE_PROVIDER lpf_provider_get_type()
+#define LPF_TYPE_PROVIDER (lpf_provider_get_type())
#define LPF_PROVIDER(obj) \
(G_TYPE_CHECK_INSTANCE_CAST ((obj), LPF_TYPE_PROVIDER, LpfProvider))
-#define LPF_PROVIDER_CLASS(klass) \
- (G_TYPE_CHECK_CLASS_CAST ((klass), LPF_TYPE_PROVIDER, LpfProviderClass))
-
#define LPF_IS_PROVIDER(obj) \
(G_TYPE_CHECK_INSTANCE_TYPE ((obj), LPF_TYPE_PROVIDER))
-#define LPF_IS_PROVIDER_CLASS(klass) \
- (G_TYPE_CHECK_CLASS_TYPE ((klass), LPF_TYPE_PROVIDER))
-
-#define LPF_PROVIDER_GET_CLASS(obj) \
- (G_TYPE_INSTANCE_GET_CLASS ((obj), LPF_TYPE_PROVIDER, LpfProviderClass))
+#define LPF_PROVIDER_GET_INTERFACE(obj) \
+ (G_TYPE_INSTANCE_GET_INTERFACE ((obj), LPF_TYPE_PROVIDER, LpfProviderInterface))
#define LPF_PROVIDER_PROP_NAME "name"
typedef void (*LpfProviderGotLocsNotify) (GSList *locs, gpointer user_data, GError *err);
typedef void (*LpfProviderGotTripsNotify) (GSList *trips, gpointer user_data, GError *err);
-typedef struct {
- GObject parent;
-} LpfProvider;
+typedef struct _LpfProvider LpfProvider;
typedef struct {
- GObjectClass parent_class;
+ GTypeInterface parent;
void (*activate) (LpfProvider *self, GObject *obj);
void (*deactivate) (LpfProvider *self, GObject *obj);
+ const gchar* (*get_name) (LpfProvider *self);
+
gint (*get_locs) (LpfProvider *self, const gchar *match, LpfProviderGotLocsNotify callback, gpointer user_data);
gint (*get_trips) (LpfProvider *self, LpfLoc *start, LpfLoc *end, GDateTime *date, guint64 flags, LpfProviderGotLocsNotify callback, gpointer user_data);
-} LpfProviderClass;
+} LpfProviderInterface;
GType lpf_provider_get_type (void);
-LpfProvider *lpf_provider_new (void);
-
typedef LpfProvider *(*LpfProviderCreateFunc) (void);
LpfProvider *lpf_provider_create (void);
diff --git a/src/providers/de-db.c b/src/providers/de-db.c
index 8ac9bd9..72e8baa 100644
--- a/src/providers/de-db.c
+++ b/src/providers/de-db.c
@@ -31,6 +31,7 @@ n */
#include "lpf-priv.h"
#include "lpf-loc.h"
+#include "lpf-provider.h"
#include "lpf-trip.h"
#include "lpf-trip-part.h"
#include "lpf-stop.h"
@@ -42,6 +43,12 @@ n */
#define PROVIDER_NAME "de_db"
+enum {
+ PROP_0,
+ PROP_NAME,
+ LAST_PROP
+};
+
/* transfers data between invocation and passed in callback */
typedef struct _LpfProviderGotItUserData {
LpfProvider *self;
@@ -49,7 +56,11 @@ typedef struct _LpfProviderGotItUserData {
gpointer user_data;
} LpfProviderGotItUserData;
-G_DEFINE_TYPE (LpfProviderDeDb, lpf_provider_de_db, LPF_TYPE_PROVIDER)
+static void lpf_provider_de_db_interface_init (LpfProviderInterface *iface);
+
+G_DEFINE_TYPE_WITH_CODE (LpfProviderDeDb, lpf_provider_de_db, G_TYPE_OBJECT,
+ G_IMPLEMENT_INTERFACE (LPF_TYPE_PROVIDER, lpf_provider_de_db_interface_init));
+
#define GET_PRIVATE(o) \
(G_TYPE_INSTANCE_GET_PRIVATE ((o), LPF_TYPE_PROVIDER_DE_DB, LpfProviderDeDbPrivate))
@@ -65,15 +76,64 @@ lpf_provider_create (void)
typedef struct _LpfProviderDeDbPrivate LpfProviderDeDbPrivate;
struct _LpfProviderDeDbPrivate {
+ gchar *name;
SoupSession *session;
char *logdir;
gboolean debug;
};
+
+static const char*
+lpf_provider_de_db_get_name (LpfProvider *self)
+{
+ LpfProviderDeDbPrivate *priv = GET_PRIVATE (self);
+
+ return priv->name;
+}
+
+
static void
-lpf_provider_de_db_finalize (GObject *object)
+set_property (GObject *object, guint prop_id,
+ const GValue *value, GParamSpec *pspec)
{
- G_OBJECT_CLASS (lpf_provider_de_db_parent_class)->finalize (object);
+ LpfProviderDeDbPrivate *priv = GET_PRIVATE (object);
+
+ switch (prop_id) {
+ case PROP_NAME:
+ /* construct only */
+ priv->name = g_value_dup_string (value);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+
+static void
+get_property (GObject *object, guint prop_id,
+ GValue *value, GParamSpec *pspec)
+{
+ LpfProviderDeDbPrivate *priv = GET_PRIVATE (object);
+
+ switch (prop_id) {
+ case PROP_NAME:
+ g_value_set_string (value, priv->name);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+
+static void
+lpf_provider_de_db_finalize (GObject *self)
+{
+ LpfProviderDeDbPrivate *priv = GET_PRIVATE(self);
+
+ g_free (priv->name);
+ G_OBJECT_CLASS (lpf_provider_de_db_parent_class)->finalize (self);
}
static void
@@ -733,15 +793,26 @@ static void
lpf_provider_de_db_class_init (LpfProviderDeDbClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
- LpfProviderClass *plugin_class = LPF_PROVIDER_CLASS (klass);
g_type_class_add_private (klass, sizeof (LpfProviderDeDbPrivate));
- plugin_class->activate = lpf_provider_de_db_activate;
- plugin_class->deactivate = lpf_provider_de_db_deactivate;
- plugin_class->get_locs = lpf_provider_de_db_get_locs;
- plugin_class->get_trips = lpf_provider_de_db_get_trips;
+ object_class->get_property = get_property;
+ object_class->set_property = set_property;
object_class->finalize = lpf_provider_de_db_finalize;
+
+ g_object_class_override_property (object_class,
+ PROP_NAME,
+ "name");
+}
+
+static void
+lpf_provider_de_db_interface_init (LpfProviderInterface *iface)
+{
+ iface->get_name = lpf_provider_de_db_get_name;
+ iface->activate = lpf_provider_de_db_activate;
+ iface->deactivate = lpf_provider_de_db_deactivate;
+ iface->get_locs = lpf_provider_de_db_get_locs;
+ iface->get_trips = lpf_provider_de_db_get_trips;
}
static void
diff --git a/src/providers/de-db.h b/src/providers/de-db.h
index a0278c9..0c06ba1 100644
--- a/src/providers/de-db.h
+++ b/src/providers/de-db.h
@@ -19,8 +19,6 @@
#ifndef _LPF_PROVIDER_DE_DB_H
#define _LPF_PROVIDER_DE_DB_H
-#include "lpf-provider.h"
-
G_BEGIN_DECLS
#define LPF_TYPE_PROVIDER_DE_DB lpf_provider_de_db_get_type()
#define LPF_PROVIDER_DE_DB(obj) \
@@ -35,11 +33,11 @@ G_BEGIN_DECLS
(G_TYPE_INSTANCE_GET_CLASS ((obj), LPF_TYPE_PROVIDER_DE_DB, LpfProviderDe_DbClass))
typedef struct {
- LpfProvider parent;
+ GObject parent;
} LpfProviderDeDb;
typedef struct {
- LpfProviderClass parent_class;
+ GObjectClass parent_class;
} LpfProviderDeDbClass;
GType lpf_provider_de_db_get_type (void);