summaryrefslogtreecommitdiff
path: root/libgps_dbus.c
diff options
context:
space:
mode:
authorEric S. Raymond <esr@thyrsus.com>2011-09-27 12:12:49 -0400
committerEric S. Raymond <esr@thyrsus.com>2011-09-27 12:12:49 -0400
commitd0c9777345d50ac189f88914f3980b2fc8161035 (patch)
tree5a81aba36fc4fe8ac8aa3185b5f26118307bc719 /libgps_dbus.c
parent8b79518d4627859ab8351f1fd01bbaaf0ecee8a9 (diff)
downloadgpsd-d0c9777345d50ac189f88914f3980b2fc8161035.tar.gz
More refactoring. Bring DBUS API closer to the generic one.
Diffstat (limited to 'libgps_dbus.c')
-rw-r--r--libgps_dbus.c70
1 files changed, 44 insertions, 26 deletions
diff --git a/libgps_dbus.c b/libgps_dbus.c
index 3c05705d..5e124f32 100644
--- a/libgps_dbus.c
+++ b/libgps_dbus.c
@@ -30,8 +30,14 @@ struct privdata_t
#include <glib/gprintf.h>
-DBusConnection *connection;
-
+/*
+ * Unpleasant that we have to declare a static context pointer here - means
+ * you can't have multiple DBUS sessions open (not that this matters
+ * much in practice). The problem is the DBUS API lacks some hook
+ * arguments that it ought to have.
+ */
+static struct gps_data_t *share_gpsdata;
+static DBusConnection *connection;
static char gpsd_devname[BUFSIZ];
static DBusHandlerResult handle_gps_fix(DBusMessage * message)
@@ -39,35 +45,33 @@ static DBusHandlerResult handle_gps_fix(DBusMessage * message)
DBusError error;
/* this packet format was designed before we split eph */
double eph;
- struct gps_data_t gpsdata;
dbus_error_init(&error);
- (void)memset(&gpsdata, '\0', sizeof(gpsdata));
dbus_message_get_args(message,
&error,
- DBUS_TYPE_DOUBLE, &gpsdata.fix.time,
- DBUS_TYPE_INT32, &gpsdata.fix.mode,
- DBUS_TYPE_DOUBLE, &gpsdata.fix.ept,
- DBUS_TYPE_DOUBLE, &gpsdata.fix.latitude,
- DBUS_TYPE_DOUBLE, &gpsdata.fix.longitude,
+ DBUS_TYPE_DOUBLE, &share_gpsdata->fix.time,
+ DBUS_TYPE_INT32, &share_gpsdata->fix.mode,
+ DBUS_TYPE_DOUBLE, &share_gpsdata->fix.ept,
+ DBUS_TYPE_DOUBLE, &share_gpsdata->fix.latitude,
+ DBUS_TYPE_DOUBLE, &share_gpsdata->fix.longitude,
DBUS_TYPE_DOUBLE, &eph,
- DBUS_TYPE_DOUBLE, &gpsdata.fix.altitude,
- DBUS_TYPE_DOUBLE, &gpsdata.fix.epv,
- DBUS_TYPE_DOUBLE, &gpsdata.fix.track,
- DBUS_TYPE_DOUBLE, &gpsdata.fix.epd,
- DBUS_TYPE_DOUBLE, &gpsdata.fix.speed,
- DBUS_TYPE_DOUBLE, &gpsdata.fix.eps,
- DBUS_TYPE_DOUBLE, &gpsdata.fix.climb,
- DBUS_TYPE_DOUBLE, &gpsdata.fix.epc,
+ DBUS_TYPE_DOUBLE, &share_gpsdata->fix.altitude,
+ DBUS_TYPE_DOUBLE, &share_gpsdata->fix.epv,
+ DBUS_TYPE_DOUBLE, &share_gpsdata->fix.track,
+ DBUS_TYPE_DOUBLE, &share_gpsdata->fix.epd,
+ DBUS_TYPE_DOUBLE, &share_gpsdata->fix.speed,
+ DBUS_TYPE_DOUBLE, &share_gpsdata->fix.eps,
+ DBUS_TYPE_DOUBLE, &share_gpsdata->fix.climb,
+ DBUS_TYPE_DOUBLE, &share_gpsdata->fix.epc,
DBUS_TYPE_STRING, &gpsd_devname, DBUS_TYPE_INVALID);
- if (gpsdata.fix.mode > MODE_NO_FIX )
- gpsdata.status = STATUS_FIX;
+ if (share_gpsdata->fix.mode > MODE_NO_FIX )
+ share_gpsdata->status = STATUS_FIX;
else
- gpsdata.status = STATUS_NO_FIX;
+ share_gpsdata->status = STATUS_NO_FIX;
- PRIVATE(&gpsdata)->handler(&gpsdata);
+ PRIVATE(share_gpsdata)->handler(share_gpsdata);
return DBUS_HANDLER_RESULT_HANDLED;
}
@@ -90,15 +94,13 @@ static DBusHandlerResult signal_handler(DBusConnection * connection,
return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
}
-int gps_dbus_open(void (*handler)(struct gps_data_t *), struct gps_data_t *gpsdata)
+int gps_dbus_open(struct gps_data_t *gpsdata)
{
- GMainLoop *mainloop;
DBusError error;
gpsdata->privdata = (void *)malloc(sizeof(struct privdata_t));
if (gpsdata->privdata == NULL)
return -1;
- PRIVATE(gpsdata)->handler = handler;
dbus_error_init(&error);
connection = dbus_bus_get(DBUS_BUS_SYSTEM, &error);
@@ -121,11 +123,27 @@ int gps_dbus_open(void (*handler)(struct gps_data_t *), struct gps_data_t *gpsda
return 5;
}
- /* This probably needs to be factored out */
+ share_gpsdata = gpsdata;
+ return 0;
+}
+
+int gps_dbus_stream(struct gps_data_t *unused UNUSED,
+ unsigned int flags UNUSED,
+ /*@null@*/ void *handler)
+{
+ /* must refer to the static context here */
+ PRIVATE(share_gpsdata)->handler = (void (*)(struct gps_data_t *))handler;
+ return 0;
+}
+
+void gps_dbus_mainloop(void)
+/* run a DBUS main loop with a specified handler */
+{
+ GMainLoop *mainloop;
+
mainloop = g_main_loop_new(NULL, FALSE);
dbus_connection_setup_with_g_main(connection, NULL);
g_main_loop_run(mainloop);
- return 0;
}
#endif /* defined(DBUS_EXPORT_ENABLE) && !defined(S_SPLINT_S) */