All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/3] hfp: create modem for new devices paired on runtime
@ 2010-02-05 18:47 Gustavo F. Padovan
  2010-02-05 18:47 ` [PATCH 2/3] hfp: Don't call UnregisterAgent if a Release was received Gustavo F. Padovan
                   ` (2 more replies)
  0 siblings, 3 replies; 10+ messages in thread
From: Gustavo F. Padovan @ 2010-02-05 18:47 UTC (permalink / raw)
  To: ofono

[-- Attachment #1: Type: text/plain, Size: 4186 bytes --]

It listens the Paired property to create a modem to the recently paired
devices. It also renames added_watch to adapter_watch, a more proper
name.
---
 plugins/hfp.c |   62 ++++++++++++++++++++++++++++++++++++++++++++++++++++----
 1 files changed, 57 insertions(+), 5 deletions(-)

diff --git a/plugins/hfp.c b/plugins/hfp.c
index 981b05b..3e41342 100644
--- a/plugins/hfp.c
+++ b/plugins/hfp.c
@@ -66,6 +66,7 @@ static const char *cmer_prefix[] = { "+CMER:", NULL };
 static const char *chld_prefix[] = { "+CHLD:", NULL };
 
 static DBusConnection *connection;
+static GHashTable *uuid_hash = NULL;
 
 static void hfp_debug(const char *str, void *user_data)
 {
@@ -427,6 +428,7 @@ static int hfp_create_modem(const char *device)
 {
 	struct ofono_modem *modem;
 	struct hfp_data *data;
+	const char *path;
 
 	ofono_info("Using device: %s", device);
 
@@ -451,6 +453,9 @@ static int hfp_create_modem(const char *device)
 	ofono_modem_set_data(modem, data);
 	ofono_modem_register(modem);
 
+	path = ofono_modem_get_path(modem);
+	g_hash_table_insert(uuid_hash, g_strdup(device), g_strdup(path));
+
 	return 0;
 
 free:
@@ -465,6 +470,9 @@ static void parse_uuids(DBusMessageIter *i, const char *device)
 	DBusMessageIter variant, ai;
 	const char *value;
 
+	if (g_hash_table_lookup(uuid_hash, device))
+		return;
+
 	dbus_message_iter_recurse(i, &variant);
 	dbus_message_iter_recurse(&variant, &ai);
 
@@ -624,6 +632,33 @@ static gboolean adapter_added(DBusConnection *connection, DBusMessage *message,
 	return TRUE;
 }
 
+static gboolean uuid_emitted(DBusConnection *connection, DBusMessage *message,
+				void *user_data)
+{
+	const char *device, *property;
+	DBusMessageIter iter;
+
+	dbus_message_iter_init(message, &iter);
+
+	if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_STRING)
+		return FALSE;
+
+	dbus_message_iter_get_basic(&iter, &property);
+	if (g_str_equal(property, "UUIDs") == FALSE)
+		return TRUE;
+
+	if (!dbus_message_iter_next(&iter))
+		return FALSE;
+
+	if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_VARIANT)
+		return FALSE;
+
+	device = dbus_message_get_path(message);
+	parse_uuids(&iter, device);
+
+	return TRUE;
+}
+
 static void list_adapters_cb(DBusPendingCall *call, gpointer user_data)
 {
 	DBusError err;
@@ -725,6 +760,8 @@ static void hfp_remove(struct ofono_modem *modem)
 
 	hfp_unregister_ofono_handsfree(modem);
 
+	g_hash_table_remove(uuid_hash, data->handsfree_path);
+
 	g_free(data->handsfree_path);
 	g_free(data);
 
@@ -798,7 +835,8 @@ static struct ofono_modem_driver hfp_driver = {
 	.post_sim	= hfp_post_sim,
 };
 
-static guint added_watch;
+static guint adapter_watch;
+static guint uuid_watch;
 
 static int hfp_init(void)
 {
@@ -809,12 +847,21 @@ static int hfp_init(void)
 
 	connection = ofono_dbus_get_connection();
 
-	added_watch = g_dbus_add_signal_watch(connection, NULL, NULL,
+	adapter_watch = g_dbus_add_signal_watch(connection, NULL, NULL,
 						BLUEZ_MANAGER_INTERFACE,
 						"AdapterAdded",
 						adapter_added, NULL, NULL);
 
-	if (added_watch == 0) {
+	uuid_watch = g_dbus_add_signal_watch(connection, NULL, NULL,
+						BLUEZ_DEVICE_INTERFACE,
+						"PropertyChanged",
+						uuid_emitted, NULL, NULL);
+
+
+	uuid_hash = g_hash_table_new_full(g_str_hash, g_str_equal,
+			g_free, g_free);
+
+	if (adapter_watch == 0 || uuid_watch == 0) {
 		err = -EIO;
 		goto remove;
 	}
@@ -828,7 +875,9 @@ static int hfp_init(void)
 	return 0;
 
 remove:
-	g_dbus_remove_watch(connection, added_watch);
+	g_dbus_remove_watch(connection, adapter_watch);
+	g_dbus_remove_watch(connection, uuid_watch);
+	g_hash_table_destroy(uuid_hash);
 
 	dbus_connection_unref(connection);
 
@@ -837,9 +886,12 @@ remove:
 
 static void hfp_exit(void)
 {
-	g_dbus_remove_watch(connection, added_watch);
+	g_dbus_remove_watch(connection, adapter_watch);
+	g_dbus_remove_watch(connection, uuid_watch);
 
 	ofono_modem_driver_unregister(&hfp_driver);
+
+	g_hash_table_destroy(uuid_hash);
 }
 
 OFONO_PLUGIN_DEFINE(hfp, "Hands-Free Profile Plugins", VERSION,
-- 
1.6.4.4


^ permalink raw reply related	[flat|nested] 10+ messages in thread
* [PATCH 2/3] hfp: Don't call UnregisterAgent if a Release was received
@ 2010-02-04 21:30 Gustavo F. Padovan
  2010-02-04 21:30 ` [PATCH 3/3] hfp: wait Disconnect reply to power down the modem Gustavo F. Padovan
  0 siblings, 1 reply; 10+ messages in thread
From: Gustavo F. Padovan @ 2010-02-04 21:30 UTC (permalink / raw)
  To: ofono

[-- Attachment #1: Type: text/plain, Size: 1160 bytes --]

Prevent to call UnregisterAgent on an already unregistered agent.
---
 plugins/hfp.c |    9 ++++++++-
 1 files changed, 8 insertions(+), 1 deletions(-)

diff --git a/plugins/hfp.c b/plugins/hfp.c
index cd43af7..4202ddf 100644
--- a/plugins/hfp.c
+++ b/plugins/hfp.c
@@ -760,8 +760,11 @@ static int hfp_probe(struct ofono_modem *modem)
 static void hfp_remove(struct ofono_modem *modem)
 {
 	struct hfp_data *data = ofono_modem_get_data(modem);
+	const char *obj_path = ofono_modem_get_path(modem);
 
-	hfp_unregister_ofono_handsfree(modem);
+	if (g_dbus_unregister_interface(connection, obj_path,
+					HFP_AGENT_INTERFACE))
+		hfp_unregister_ofono_handsfree(modem);
 
 	g_hash_table_remove(uuid_hash, data->handsfree_path);
 
@@ -804,10 +807,14 @@ static int hfp_disconnect_ofono_handsfree(struct ofono_modem *modem)
 
 static int hfp_disable(struct ofono_modem *modem)
 {
+	const char *obj_path = ofono_modem_get_path(modem);
+
 	DBG("%p", modem);
 
 	clear_data(modem);
 
+	g_dbus_unregister_interface(connection, obj_path, HFP_AGENT_INTERFACE);
+
 	hfp_disconnect_ofono_handsfree(modem);
 	return 0;
 }
-- 
1.6.4.4


^ permalink raw reply related	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2010-07-08  7:03 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-02-05 18:47 [PATCH 1/3] hfp: create modem for new devices paired on runtime Gustavo F. Padovan
2010-02-05 18:47 ` [PATCH 2/3] hfp: Don't call UnregisterAgent if a Release was received Gustavo F. Padovan
2010-02-05 18:47   ` [PATCH 3/3] hfp: wait Disconnect reply to power down the modem Gustavo F. Padovan
2010-02-05 19:13     ` [PATCH 4/4] hfp: set timeout service level connection procedure Gustavo F. Padovan
2010-02-05 19:54       ` Denis Kenzior
2010-02-05 19:37     ` [PATCH 3/3] hfp: wait Disconnect reply to power down the modem Denis Kenzior
2010-02-05 19:37   ` [PATCH 2/3] hfp: Don't call UnregisterAgent if a Release was received Denis Kenzior
2010-02-05 19:36 ` [PATCH 1/3] hfp: create modem for new devices paired on runtime Denis Kenzior
2010-07-08  7:03 ` =?unknown-8bit?q?R=C3=A9mi?= Denis-Courmont
  -- strict thread matches above, loose matches on Subject: below --
2010-02-04 21:30 [PATCH 2/3] hfp: Don't call UnregisterAgent if a Release was received Gustavo F. Padovan
2010-02-04 21:30 ` [PATCH 3/3] hfp: wait Disconnect reply to power down the modem Gustavo F. Padovan

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.