summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorClaudio Takahasi <claudio.takahasi@openbossa.org>2008-10-15 18:51:04 -0300
committerClaudio Takahasi <claudio.takahasi@openbossa.org>2008-10-15 18:51:04 -0300
commitfd2a6409244254452bec619100d73bc6c8d04ec5 (patch)
treeb6d402a1a16eaed92c7808c5543b2bd4c4bb73e4
parent19d73b1c58f87a80a7c82ce8e983c0360d3d0e87 (diff)
Allow dynamic adapter driver registration
-rw-r--r--src/adapter.c19
-rw-r--r--src/manager.c5
-rw-r--r--src/manager.h1
3 files changed, 25 insertions, 0 deletions
diff --git a/src/adapter.c b/src/adapter.c
index c2304e99..39d5f9c1 100644
--- a/src/adapter.c
+++ b/src/adapter.c
@@ -3246,10 +3246,29 @@ gboolean adapter_has_discov_sessions(struct btd_adapter *adapter)
return TRUE;
}
+static void probe_driver(gpointer data, gpointer user_data)
+{
+ struct btd_adapter *adapter = data;
+ struct btd_adapter_driver *driver = user_data;
+
+ if (!adapter->up)
+ return;
+
+ driver->probe(adapter);
+}
+
int btd_register_adapter_driver(struct btd_adapter_driver *driver)
{
+ GSList *adapters;
+
adapter_drivers = g_slist_append(adapter_drivers, driver);
+ if (driver->probe == NULL)
+ return 0;
+
+ adapters = manager_get_adapters();
+ g_slist_foreach(adapters, probe_driver, driver);
+
return 0;
}
diff --git a/src/manager.c b/src/manager.c
index 537582ac..49118ec7 100644
--- a/src/manager.c
+++ b/src/manager.c
@@ -346,6 +346,11 @@ struct btd_adapter *manager_find_adapter_by_id(int id)
return match->data;
}
+GSList *manager_get_adapters(void)
+{
+ return adapters;
+}
+
static void manager_add_adapter(struct btd_adapter *adapter)
{
const gchar *path = adapter_get_path(adapter);
diff --git a/src/manager.h b/src/manager.h
index a4c26313..f70bb524 100644
--- a/src/manager.h
+++ b/src/manager.h
@@ -30,6 +30,7 @@ void manager_cleanup(DBusConnection *conn, const char *path);
struct btd_adapter *manager_find_adapter(const bdaddr_t *sba);
struct btd_adapter *manager_find_adapter_by_path(const char *path);
struct btd_adapter *manager_find_adapter_by_id(int id);
+GSList *manager_get_adapters(void);
int manager_register_adapter(int id);
int manager_unregister_adapter(int id);
int manager_start_adapter(int id);