diff options
author | Luiz Augusto von Dentz <luiz.von.dentz@intel.com> | 2014-01-06 17:11:43 +0200 |
---|---|---|
committer | Mikko Ylinen <mikko.ylinen@intel.com> | 2014-09-23 21:29:47 +0300 |
commit | 7c830fb36836b73e0b031a0d52e060922c252583 (patch) | |
tree | 31bb2445092c2af3fd5215383fd7015a106b7085 | |
parent | 2b63b5c56bc96e23c11be5b1d31ec80194f68e48 (diff) | |
download | bluez-7c830fb36836b73e0b031a0d52e060922c252583.tar.gz bluez-7c830fb36836b73e0b031a0d52e060922c252583.tar.bz2 bluez-7c830fb36836b73e0b031a0d52e060922c252583.zip |
plugins/service: Add implemention of .Disconnect method
-rw-r--r-- | plugins/service.c | 28 |
1 files changed, 27 insertions, 1 deletions
diff --git a/plugins/service.c b/plugins/service.c index ded4487a..69bae8f7 100644 --- a/plugins/service.c +++ b/plugins/service.c @@ -51,6 +51,7 @@ struct service_data { struct btd_service *service; char *path; DBusMessage *connect; + DBusMessage *disconnect; }; static struct service_data *find_data(struct btd_service *service) @@ -74,6 +75,9 @@ static void data_free(void *user_data) if (data->connect) dbus_message_unref(data->connect); + if (data->disconnect) + dbus_message_unref(data->disconnect); + g_free(data->path); g_free(data); } @@ -88,7 +92,22 @@ static void data_remove(struct service_data *data) static DBusMessage *service_disconnect(DBusConnection *conn, DBusMessage *msg, void *user_data) { - return btd_error_not_available(msg); + struct service_data *data = user_data; + int err; + + if (data->disconnect) + return btd_error_in_progress(msg); + + data->disconnect = dbus_message_ref(msg); + + err = btd_service_disconnect(data->service); + if (err == 0) + return NULL; + + dbus_message_unref(data->disconnect); + data->disconnect = NULL; + + return btd_error_failed(msg, strerror(-err)); } static DBusMessage *service_connect(DBusConnection *conn, DBusMessage *msg, @@ -249,6 +268,13 @@ static void service_disconnected(struct service_data *data) DBusMessage *reply; int err; + if (data->disconnect) { + reply = dbus_message_new_method_return(data->disconnect); + g_dbus_send_message(btd_get_dbus_connection(), reply); + dbus_message_unref(data->disconnect); + data->connect = NULL; + } + if (!data->connect) return; |