diff options
author | Guido Günther <agx@sigxcpu.org> | 2014-03-02 22:45:26 +0100 |
---|---|---|
committer | Guido Günther <agx@sigxcpu.org> | 2014-03-04 08:22:22 +0100 |
commit | 31083e66f49621ac8c73c8378e50942ba4465fb7 (patch) | |
tree | 2452ba36b4c7de5cbdd9e0a87511c8b66743644b | |
parent | b0ba2fa850d6f7278796cac9d13b2617f0e2c4d2 (diff) |
Make HafasBin6 a proper GObject implementing the provider interface
This will allow us to share the code for different Hafas based
providers.
-rw-r--r-- | src/providers/de-db.c | 36 | ||||
-rw-r--r-- | src/providers/de-db.h | 6 | ||||
-rw-r--r-- | src/providers/hafas-bin6.c | 122 | ||||
-rw-r--r-- | src/providers/hafas-bin6.h | 30 | ||||
-rw-r--r-- | src/providers/tests/Makefile.am | 6 | ||||
-rw-r--r-- | src/providers/tests/de-db.c | 1 |
6 files changed, 170 insertions, 31 deletions
diff --git a/src/providers/de-db.c b/src/providers/de-db.c index 72e8baa..207a8c3 100644 --- a/src/providers/de-db.c +++ b/src/providers/de-db.c @@ -49,7 +49,7 @@ enum { LAST_PROP }; -/* transfers data between invocation and passed in callback */ +/* transfers data between invocation and the passed in callback */ typedef struct _LpfProviderGotItUserData { LpfProvider *self; gpointer callback; @@ -58,7 +58,7 @@ typedef struct _LpfProviderGotItUserData { static void lpf_provider_de_db_interface_init (LpfProviderInterface *iface); -G_DEFINE_TYPE_WITH_CODE (LpfProviderDeDb, lpf_provider_de_db, G_TYPE_OBJECT, +G_DEFINE_TYPE_WITH_CODE (LpfProviderDeDb, lpf_provider_de_db, LPF_TYPE_PROVIDER_HAFAS_BIN6, G_IMPLEMENT_INTERFACE (LPF_TYPE_PROVIDER, lpf_provider_de_db_interface_init)); #define GET_PRIVATE(o) \ @@ -377,7 +377,7 @@ hafas_binary_parse_each_trip (const gchar *data, gsize num, guint base, const ch for (i = 0; i < num; i++) { /* The trips itself */ t = HAFAS_BIN6_TRIP(data, i); - day_off = hafas_bin6_parse_service_day(data, i); + day_off = lpf_provider_hafas_bin6_parse_service_day(data, i); LPF_DEBUG("Trip #%d, Changes: %4d", i, t->changes); #ifdef ENABLE_DEBUG @@ -390,12 +390,12 @@ hafas_binary_parse_each_trip (const gchar *data, gsize num, guint base, const ch for (j = 0; j < t->part_cnt; j++) { p = HAFAS_BIN6_TRIP_PART(data, i, j); start = g_object_new(LPF_TYPE_STOP, NULL); - if (hafas_bin6_parse_station(data, p->dep_off, LPF_LOC(start), enc) < 0) { + if (lpf_provider_hafas_bin6_parse_station(data, p->dep_off, LPF_LOC(start), enc) < 0) { g_warning("Failed to parse start station %d/%d", i, j); goto error; } end = g_object_new(LPF_TYPE_STOP, NULL); - if (hafas_bin6_parse_station(data, p->arr_off, LPF_LOC(end), enc) < 0) { + if (lpf_provider_hafas_bin6_parse_station(data, p->arr_off, LPF_LOC(end), enc) < 0) { g_warning("Failed to parse end station %d/%d", i, j); goto error; } @@ -403,7 +403,7 @@ hafas_binary_parse_each_trip (const gchar *data, gsize num, guint base, const ch h = p->dep / 100; m = p->dep % 100; - dt = hafas_bin6_date_time (base, day_off, h, m); + dt = lpf_provider_hafas_bin6_date_time (base, day_off, h, m); g_object_set (start, "departure", dt, NULL); if (g_strcmp0 (HAFAS_BIN6_NO_PLATFORM, HAFAS_BIN6_STR(data, p->dep_pos_off))) { @@ -414,7 +414,7 @@ hafas_binary_parse_each_trip (const gchar *data, gsize num, guint base, const ch h = p->arr / 100; m = p->arr % 100; - dt = hafas_bin6_date_time (base, day_off, h, m); + dt = lpf_provider_hafas_bin6_date_time (base, day_off, h, m); g_object_set (end, "arrival", dt, NULL); if (g_strcmp0 (HAFAS_BIN6_NO_PLATFORM, HAFAS_BIN6_STR(data, p->arr_pos_off))) { @@ -429,14 +429,14 @@ hafas_binary_parse_each_trip (const gchar *data, gsize num, guint base, const ch if (pd->arr_pred != HAFAS_BIN6_NO_REALTIME) { h = pd->arr_pred / 100; m = pd->arr_pred % 100; - dt = hafas_bin6_date_time (base, day_off, h, m); + dt = lpf_provider_hafas_bin6_date_time (base, day_off, h, m); g_object_set (start, "rt_arrival", dt, NULL); } if (pd->dep_pred != HAFAS_BIN6_NO_REALTIME) { h = pd->dep_pred / 100; m = pd->dep_pred % 100; - dt = hafas_bin6_date_time (base, day_off, h, m); + dt = lpf_provider_hafas_bin6_date_time (base, day_off, h, m); g_object_set (end, "rt_departure", dt, NULL); } @@ -448,18 +448,18 @@ hafas_binary_parse_each_trip (const gchar *data, gsize num, guint base, const ch stop = HAFAS_BIN6_STOP(data, i, j, k); astop = g_object_new (LPF_TYPE_STOP, - "arrival", hafas_bin6_date_time (base, - day_off, - stop->arr / 100, - stop->arr % 100), - "departure", hafas_bin6_date_time (base, - day_off, - stop->dep / 100, - stop->dep % 100), + "arrival", lpf_provider_hafas_bin6_date_time (base, + day_off, + stop->arr / 100, + stop->arr % 100), + "departure", lpf_provider_hafas_bin6_date_time (base, + day_off, + stop->dep / 100, + stop->dep % 100), NULL ); - if (hafas_bin6_parse_station(data, stop->stop_idx, LPF_LOC(astop), enc) < 0) { + if (lpf_provider_hafas_bin6_parse_station(data, stop->stop_idx, LPF_LOC(astop), enc) < 0) { g_warning("Failed to parse stop %d/%d", i, j); goto error; } diff --git a/src/providers/de-db.h b/src/providers/de-db.h index 0c06ba1..e9cc4c9 100644 --- a/src/providers/de-db.h +++ b/src/providers/de-db.h @@ -19,6 +19,8 @@ #ifndef _LPF_PROVIDER_DE_DB_H #define _LPF_PROVIDER_DE_DB_H +#include "hafas-bin6.h" + G_BEGIN_DECLS #define LPF_TYPE_PROVIDER_DE_DB lpf_provider_de_db_get_type() #define LPF_PROVIDER_DE_DB(obj) \ @@ -33,11 +35,11 @@ G_BEGIN_DECLS (G_TYPE_INSTANCE_GET_CLASS ((obj), LPF_TYPE_PROVIDER_DE_DB, LpfProviderDe_DbClass)) typedef struct { - GObject parent; + LpfProviderHafasBin6 parent; } LpfProviderDeDb; typedef struct { - GObjectClass parent_class; + LpfProviderHafasBin6Class parent_class; } LpfProviderDeDbClass; GType lpf_provider_de_db_get_type (void); diff --git a/src/providers/hafas-bin6.c b/src/providers/hafas-bin6.c index e860284..a6d8655 100644 --- a/src/providers/hafas-bin6.c +++ b/src/providers/hafas-bin6.c @@ -1,5 +1,5 @@ /* - * hafas-bin6.c: HAFAS Binary Format Version 6 provider + * lpf-provider-hafas-bin6.c: HAFAS Binary Format Version 6 provider * * Copyright (C) 2014 Guido Günther * @@ -27,9 +27,67 @@ #include "hafas-bin6.h" #include "lpf-loc.h" #include "lpf-priv.h" +#include "lpf-provider.h" + +static void lpf_provider_hafas_bin6_interface_init (LpfProviderInterface *iface); + +G_DEFINE_TYPE_WITH_CODE (LpfProviderHafasBin6, lpf_provider_hafas_bin6, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (LPF_TYPE_PROVIDER, lpf_provider_hafas_bin6_interface_init)); + +#define PROVIDER_NAME "hafas_bin6" + +enum { + PROP_0, + PROP_NAME, + LAST_PROP +}; + +#define GET_PRIVATE(o) \ + (G_TYPE_INSTANCE_GET_PRIVATE ((o), LPF_TYPE_PROVIDER_HAFAS_BIN6, LpfProviderHafasBin6Private)) + + +typedef struct _LpfProviderHafasBin6Private LpfProviderHafasBin6Private; + +struct _LpfProviderHafasBin6Private { + gchar *name; +}; + +static void +lpf_provider_hafas_bin6_set_property (GObject *object, guint prop_id, + const GValue *value, GParamSpec *pspec) +{ + LpfProviderHafasBin6Private *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 +lpf_provider_hafas_bin6_get_property (GObject *object, guint prop_id, + GValue *value, GParamSpec *pspec) +{ + LpfProviderHafasBin6Private *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; + } +} gint -hafas_bin6_parse_station(const gchar *data, guint16 off, LpfLoc *loc, const char *enc) +lpf_provider_hafas_bin6_parse_station(const gchar *data, guint16 off, LpfLoc *loc, const char *enc) { gchar *name; HafasBin6Station *station; @@ -60,12 +118,12 @@ err: /** - * hafas_bin6_parse_service_day: + * lpf_provicer_hafas_bin6_parse_service_day: * * Parse a servide day entry and return the offset from the base date in days. */ guint -hafas_bin6_parse_service_day (const char *data, int idx) +lpf_provider_hafas_bin6_parse_service_day (const char *data, int idx) { gint i; gchar bits; @@ -94,7 +152,7 @@ hafas_bin6_parse_service_day (const char *data, int idx) } /** - * hafas_bin6_date_time: + * lpf_provider_hafas_bin6_date_time: * @base_days: day off set from 1980-01-01 * @off_days: day offset from base_days * @hours: hour trip starts/ends @@ -105,7 +163,7 @@ hafas_bin6_parse_service_day (const char *data, int idx) * Returns: the travel date and time as #GDateTime */ GDateTime* -hafas_bin6_date_time(guint base_days, guint off_days, guint hours, guint min) +lpf_provider_hafas_bin6_date_time(guint base_days, guint off_days, guint hours, guint min) { /* FIXME: should we always use Europe/Berlin as TZ? */ GDateTime *dt, *base = g_date_time_new_local (1979, 12, 31, 0, 0, 0); @@ -117,3 +175,55 @@ hafas_bin6_date_time(guint base_days, guint off_days, guint hours, guint min) g_date_time_unref (base); return dt; } + +static void +lpf_provider_hafas_bin6_activate (LpfProvider *self, GObject *obj) +{ + g_warn_if_reached (); +} + +static void +lpf_provider_hafas_bin6_deactivate (LpfProvider *self, GObject *obj) +{ + g_warn_if_reached (); +} + + +static void +lpf_provider_hafas_bin6_finalize (GObject *self) +{ + G_OBJECT_CLASS (lpf_provider_hafas_bin6_parent_class)->finalize (self); +} + +static void +lpf_provider_hafas_bin6_class_init (LpfProviderHafasBin6Class *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + g_type_class_add_private (klass, sizeof (LpfProviderHafasBin6Private)); + + object_class->get_property = lpf_provider_hafas_bin6_get_property; + object_class->set_property = lpf_provider_hafas_bin6_set_property; + object_class->finalize = lpf_provider_hafas_bin6_finalize; + + g_object_class_override_property (object_class, + PROP_NAME, + "name"); +} + +static void +lpf_provider_hafas_bin6_interface_init (LpfProviderInterface *iface) +{ + /* abstract base class */ + iface->activate = lpf_provider_hafas_bin6_activate; + iface->deactivate = lpf_provider_hafas_bin6_deactivate; + + /* To be implemented */ + iface->get_locs = NULL; /* lpf_provider_hafas_bin6_get_locs; */ + iface->get_trips = NULL; /* lpf_provider_hafas_bin6_get_trips; */ +} + +static void +lpf_provider_hafas_bin6_init (LpfProviderHafasBin6 *self) +{ +} diff --git a/src/providers/hafas-bin6.h b/src/providers/hafas-bin6.h index a402da4..cc6a3a1 100644 --- a/src/providers/hafas-bin6.h +++ b/src/providers/hafas-bin6.h @@ -26,8 +26,32 @@ #include "hafas-bin6-format.h" #include "lpf-loc.h" -gint hafas_bin6_parse_station(const gchar *data, guint16 off, LpfLoc *station, const char *enc); -guint hafas_bin6_parse_service_day (const char *data, int idx); -GDateTime* hafas_bin6_date_time(guint base_days, guint off_days, guint hours, guint min); +G_BEGIN_DECLS +#define LPF_TYPE_PROVIDER_HAFAS_BIN6 lpf_provider_hafas_bin6_get_type() +#define LPF_PROVIDER_HAFAS_BIN6(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST ((obj), LPF_TYPE_PROVIDER_HAFAS_BIN6, LpfProviderHafasBin6)) +#define LPF_PROVIDER_HAFAS_BIN6_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST ((klass), LPF_TYPE_PROVIDER_HAFAS_BIN6, LpfProviderHafasBin6Class)) +#define LPF_IS_PROVIDER_HAFAS_BIN6(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE ((obj), LPF_TYPE_PROVIDER_HAFAS_BIN6)) +#define LPF_IS_PROVIDER_HAFAS_BIN6_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE ((klass), LPF_TYPE_PROVIDER_HAFAS_BIN6)) +#define LPF_PROVIDER_HAFAS_BIN6_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS ((obj), LPF_TYPE_PROVIDER_HAFAS_BIN6, LpfProviderHafasBin6Class)) +typedef struct { + GObject parent; +} LpfProviderHafasBin6; + +typedef struct { + GObjectClass parent_class; +} LpfProviderHafasBin6Class; + +GType lpf_provider_hafas_bin6_get_type (void); + +gint lpf_provider_hafas_bin6_parse_station(const gchar *data, guint16 off, LpfLoc *station, const char *enc); +guint lpf_provider_hafas_bin6_parse_service_day (const char *data, int idx); +GDateTime* lpf_provider_hafas_bin6_date_time(guint base_days, guint off_days, guint hours, guint min); + +G_END_DECLS #endif /* _HAFAS_BIN6_H */ diff --git a/src/providers/tests/Makefile.am b/src/providers/tests/Makefile.am index 721885d..6fb8de4 100644 --- a/src/providers/tests/Makefile.am +++ b/src/providers/tests/Makefile.am @@ -21,13 +21,17 @@ LDADD = \ $(GTHREAD2_LIBS) \ $(NULL) -de_db_SOURCES = de-db.c +de_db_SOURCES = \ + de-db.c \ + $(NULL) + de_db_CFLAGS = \ $(AM_CFLAGS) \ $(LIBSOUP_CFLAGS) \ $(LIBXML2_CFLAGS) \ $(NULL) de_db_LDADD = \ + ../libplanfahr-provider-de-db.la \ $(LDADD) \ $(LIBSOUP_LIBS) \ $(LIBXML2_LIBS) \ diff --git a/src/providers/tests/de-db.c b/src/providers/tests/de-db.c index db34274..b542d54 100644 --- a/src/providers/tests/de-db.c +++ b/src/providers/tests/de-db.c @@ -21,7 +21,6 @@ */ #include "../de-db.c" -#include "../hafas-bin6.c" /* Make sure we can parse the station xml list as returned by the current Deutsche Bahn Hafas */ static void |