aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGuido Günther <agx@sigxcpu.org>2014-03-02 22:45:26 +0100
committerGuido Günther <agx@sigxcpu.org>2014-03-04 08:22:22 +0100
commit31083e66f49621ac8c73c8378e50942ba4465fb7 (patch)
tree2452ba36b4c7de5cbdd9e0a87511c8b66743644b
parentb0ba2fa850d6f7278796cac9d13b2617f0e2c4d2 (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.c36
-rw-r--r--src/providers/de-db.h6
-rw-r--r--src/providers/hafas-bin6.c122
-rw-r--r--src/providers/hafas-bin6.h30
-rw-r--r--src/providers/tests/Makefile.am6
-rw-r--r--src/providers/tests/de-db.c1
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