diff options
| author | Luiz Augusto von Dentz <luiz.von.dentz@intel.com> | 2014-01-06 16:02:27 +0200 |
|---|---|---|
| committer | Pedro Alvarez <pedro.alvarez@codethink.co.uk> | 2016-03-09 18:17:23 +0000 |
| commit | 454e7a97633396e1931eb4936072de8884b9a2d2 (patch) | |
| tree | 982a1cb8663165d10924dfde47ad88204c561035 | |
| parent | c3f333368b75e0621be47c75f63e7a5fd981fa7d (diff) | |
| download | bluez-454e7a97633396e1931eb4936072de8884b9a2d2.tar.gz | |
plugins/service: Add State property
| -rw-r--r-- | plugins/service.c | 49 |
1 files changed, 46 insertions, 3 deletions
diff --git a/plugins/service.c b/plugins/service.c index 0c22d7967..b660810c1 100644 --- a/plugins/service.c +++ b/plugins/service.c @@ -93,6 +93,46 @@ static DBusMessage *service_connect(DBusConnection *conn, DBusMessage *msg, return btd_error_not_available(msg); } +static const char *data_get_state(struct service_data *data) +{ + btd_service_state_t state = btd_service_get_state(data->service); + int err; + + switch (state) { + case BTD_SERVICE_STATE_UNAVAILABLE: + return "unavailable"; + case BTD_SERVICE_STATE_DISCONNECTED: + err = btd_service_get_error(data->service); + return err < 0 ? "error" : "disconnected"; + case BTD_SERVICE_STATE_CONNECTING: + return "connecting"; + case BTD_SERVICE_STATE_CONNECTED: + return "connected"; + case BTD_SERVICE_STATE_DISCONNECTING: + return "disconnecting"; + } + + return "unknown"; +} + +static gboolean get_state(const GDBusPropertyTable *property, + DBusMessageIter *iter, void *user_data) +{ + struct service_data *data = user_data; + const char *state; + + state = data_get_state(data); + + dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING, &state); + + return TRUE; +} + +static const GDBusPropertyTable service_properties[] = { + { "State", "s", get_state, NULL, NULL }, + { } +}; + static const GDBusMethodTable service_methods[] = { { GDBUS_ASYNC_METHOD("Disconnect", NULL, NULL, service_disconnect) }, { GDBUS_ASYNC_METHOD("Connect", NULL, NULL, service_connect) }, @@ -117,7 +157,7 @@ static struct service_data *service_get_data(struct btd_service *service) if (g_dbus_register_interface(btd_get_dbus_connection(), data->path, SERVICE_INTERFACE, service_methods, NULL, - NULL, data, + service_properties, data, data_free) == FALSE) { error("Unable to register service interface for %s", data->path); @@ -146,10 +186,13 @@ static void service_cb(struct btd_service *service, switch (new_state) { case BTD_SERVICE_STATE_UNAVAILABLE: data_remove(data); - break; - default: return; + default: + break; } + + g_dbus_emit_property_changed(btd_get_dbus_connection(), data->path, + SERVICE_INTERFACE, "State"); } static int service_init(void) |
