From d0c9777345d50ac189f88914f3980b2fc8161035 Mon Sep 17 00:00:00 2001 From: "Eric S. Raymond" Date: Tue, 27 Sep 2011 12:12:49 -0400 Subject: More refactoring. Bring DBUS API closer to the generic one. --- libgps_dbus.c | 70 +++++++++++++++++++++++++++++++++++++---------------------- 1 file changed, 44 insertions(+), 26 deletions(-) (limited to 'libgps_dbus.c') 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 -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) */ -- cgit v1.2.1