aboutsummaryrefslogtreecommitdiffstats
path: root/meta-ivi/recipes-connectivity/bluez5/bluez5/0003-plugins-service-Add-State-property.patch
blob: da2ac7973232567480e131c2f293162a737580e6 (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
From 879cd4b30144c1b16f1b4f97a3bb28c217bf949d Mon Sep 17 00:00:00 2001
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
Date: Mon, 6 Jan 2014 16:02:27 +0200
Subject: [PATCH 03/12] plugins/service: Add State property

---
 plugins/service.c | 49 ++++++++++++++++++++++++++++++++++++++++++++++---
 1 file changed, 46 insertions(+), 3 deletions(-)

diff --git a/plugins/service.c b/plugins/service.c
index 0c22d79..b660810 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)
-- 
2.2.0