[PATCH 3/3] hfp: remove modems if bluetoothd shutdowns without calling Release

Gustavo F. Padovan padovan at profusion.mobi
Mon Feb 15 11:26:36 PST 2010


---
 plugins/hfp.c |   28 ++++++++++++++++++++++++++--
 1 files changed, 26 insertions(+), 2 deletions(-)

diff --git a/plugins/hfp.c b/plugins/hfp.c
index 3776dc6..c63e332 100644
--- a/plugins/hfp.c
+++ b/plugins/hfp.c
@@ -911,6 +911,23 @@ done:
 	dbus_message_unref(reply);
 }
 
+static gboolean hfp_remove_each_modem(gpointer key, gpointer value, gpointer user_data)
+{
+	struct ofono_modem *modem = value;
+
+	ofono_modem_remove(modem);
+
+	return TRUE;
+}
+
+static void bluetooth_disconnect(DBusConnection *connection, void *user_data)
+{
+	if (uuid_hash == NULL)
+		return;
+
+	g_hash_table_foreach_remove(uuid_hash, hfp_remove_each_modem, NULL);
+}
+
 static int hfp_register_ofono_handsfree(struct ofono_modem *modem)
 {
 	const char *obj_path = ofono_modem_get_path(modem);
@@ -1098,6 +1115,7 @@ static struct ofono_modem_driver hfp_driver = {
 	.post_sim	= hfp_post_sim,
 };
 
+static guint watch;
 static guint adapter_added_watch;
 static guint adapter_removed_watch;
 static guint uuid_watch;
@@ -1111,6 +1129,10 @@ static int hfp_init()
 
 	connection = ofono_dbus_get_connection();
 
+	watch = g_dbus_add_service_watch(connection, BLUEZ_SERVICE,
+			NULL, bluetooth_disconnect, NULL, NULL);
+
+
 	adapter_added_watch = g_dbus_add_signal_watch(connection, NULL, NULL,
 						BLUEZ_MANAGER_INTERFACE,
 						"AdapterAdded",
@@ -1126,8 +1148,8 @@ static int hfp_init()
 						"PropertyChanged",
 						property_changed, NULL, NULL);
 
-	if (adapter_added_watch == 0 || adapter_removed_watch == 0||
-			uuid_watch == 0) {
+	if (watch == 0 || adapter_added_watch == 0 ||
+			adapter_removed_watch == 0|| uuid_watch == 0) {
 		err = -EIO;
 		goto remove;
 	}
@@ -1150,6 +1172,7 @@ static int hfp_init()
 	return 0;
 
 remove:
+	g_dbus_remove_watch(connection, watch);
 	g_dbus_remove_watch(connection, adapter_added_watch);
 	g_dbus_remove_watch(connection, adapter_removed_watch);
 	g_dbus_remove_watch(connection, uuid_watch);
@@ -1165,6 +1188,7 @@ remove:
 
 static void hfp_exit()
 {
+	g_dbus_remove_watch(connection, watch);
 	g_dbus_remove_watch(connection, adapter_added_watch);
 	g_dbus_remove_watch(connection, adapter_removed_watch);
 	g_dbus_remove_watch(connection, uuid_watch);
-- 
1.6.4.4



More information about the ofono mailing list