diff options
author | Luiz Augusto von Dentz <luiz.von.dentz@intel.com> | 2014-01-06 16:59:36 +0200 |
---|---|---|
committer | Pedro Alvarez <pedro.alvarez@codethink.co.uk> | 2016-03-09 18:17:23 +0000 |
commit | eb043b9141b8037e8e30246d5bea904c546dbbf1 (patch) | |
tree | 333884d89b582be5046f8082dbc1fc80ea08680e | |
parent | 981981942c8a42976cc90d47c4756fbd99ae4efc (diff) | |
download | bluez-eb043b9141b8037e8e30246d5bea904c546dbbf1.tar.gz |
plugins/service: Add implemention of .Connect method
-rw-r--r-- | plugins/service.c | 53 |
1 files changed, 52 insertions, 1 deletions
diff --git a/plugins/service.c b/plugins/service.c index 207ac213b..ded4487a5 100644 --- a/plugins/service.c +++ b/plugins/service.c @@ -50,6 +50,7 @@ static GSList *services = NULL; struct service_data { struct btd_service *service; char *path; + DBusMessage *connect; }; static struct service_data *find_data(struct btd_service *service) @@ -70,6 +71,9 @@ static void data_free(void *user_data) { struct service_data *data = user_data; + if (data->connect) + dbus_message_unref(data->connect); + g_free(data->path); g_free(data); } @@ -90,7 +94,19 @@ static DBusMessage *service_disconnect(DBusConnection *conn, DBusMessage *msg, static DBusMessage *service_connect(DBusConnection *conn, DBusMessage *msg, void *user_data) { - return btd_error_not_available(msg); + struct service_data *data = user_data; + int err; + + if (data->connect) + return btd_error_in_progress(msg); + + err = btd_service_connect(data->service); + if (err < 0) + return btd_error_failed(msg, strerror(-err)); + + data->connect = dbus_message_ref(msg); + + return NULL; } static const char *data_get_state(struct service_data *data) @@ -215,6 +231,35 @@ static struct service_data *service_get_data(struct btd_service *service) return data; } +static void service_connected(struct service_data *data) +{ + DBusMessage *reply; + + if (!data->connect) + return; + + reply = dbus_message_new_method_return(data->connect); + g_dbus_send_message(btd_get_dbus_connection(), reply); + dbus_message_unref(data->connect); + data->connect = NULL; +} + +static void service_disconnected(struct service_data *data) +{ + DBusMessage *reply; + int err; + + if (!data->connect) + return; + + err = btd_service_get_error(data->service); + + reply = btd_error_failed(data->connect, strerror(-err)); + g_dbus_send_message(btd_get_dbus_connection(), reply); + dbus_message_unref(data->connect); + data->connect = NULL; +} + static void service_cb(struct btd_service *service, btd_service_state_t old_state, btd_service_state_t new_state, @@ -230,6 +275,12 @@ static void service_cb(struct btd_service *service, case BTD_SERVICE_STATE_UNAVAILABLE: data_remove(data); return; + case BTD_SERVICE_STATE_CONNECTED: + service_connected(data); + break; + case BTD_SERVICE_STATE_DISCONNECTED: + service_disconnected(data); + break; default: break; } |