plugins/service: Add implemention of .Connect method
authorLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
Mon, 6 Jan 2014 14:59:36 +0000 (16:59 +0200)
committerMikko Ylinen <mikko.ylinen@intel.com>
Tue, 23 Sep 2014 18:29:47 +0000 (21:29 +0300)
plugins/service.c

index 207ac21..ded4487 100644 (file)
@@ -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;
        }