aboutsummaryrefslogtreecommitdiffstats
path: root/meta-ivi/recipes-connectivity/bluez5/bluez5/0006-plugins-service-Add-implemention-of-.Connect-method.patch
blob: 3e601ad892b82d02d06a48285600ba12ad6ccfda (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
From 2b63b5c56bc96e23c11be5b1d31ec80194f68e48 Mon Sep 17 00:00:00 2001
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
Date: Mon, 6 Jan 2014 16:59:36 +0200
Subject: [PATCH 06/12] plugins/service: Add implemention of .Connect method

---
 plugins/service.c | 53 ++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 52 insertions(+), 1 deletion(-)

diff --git a/plugins/service.c b/plugins/service.c
index 207ac21..ded4487 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;
 	}
-- 
2.2.0