diff options
author | Eric S. Raymond <esr@thyrsus.com> | 2011-09-27 12:12:49 -0400 |
---|---|---|
committer | Eric S. Raymond <esr@thyrsus.com> | 2011-09-27 12:12:49 -0400 |
commit | d0c9777345d50ac189f88914f3980b2fc8161035 (patch) | |
tree | 5a81aba36fc4fe8ac8aa3185b5f26118307bc719 /libgps_dbus.c | |
parent | 8b79518d4627859ab8351f1fd01bbaaf0ecee8a9 (diff) | |
download | gpsd-d0c9777345d50ac189f88914f3980b2fc8161035.tar.gz |
More refactoring. Bring DBUS API closer to the generic one.
Diffstat (limited to 'libgps_dbus.c')
-rw-r--r-- | libgps_dbus.c | 70 |
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) */ |