Bluez moves agent registration from a per device interface to
a per adapter interface.
Update hfp_hf modem to reflect this change.
---
plugins/hfp_hf.c | 166 ++++++++++++++++++++---------------------------------
1 files changed, 63 insertions(+), 103 deletions(-)
diff --git a/plugins/hfp_hf.c b/plugins/hfp_hf.c
index c11525e..7c3747b 100644
--- a/plugins/hfp_hf.c
+++ b/plugins/hfp_hf.c
@@ -51,7 +51,7 @@
#define BLUEZ_GATEWAY_INTERFACE BLUEZ_SERVICE ".HandsfreeGateway"
-#define HFP_AGENT_INTERFACE "org.bluez.HandsfreeAgent"
+#define HFP_AGENT_PATH "/hfp_hf"
#define HFP_AGENT_ERROR_INTERFACE "org.bluez.Error"
#ifndef DBUS_TYPE_UNIX_FD
@@ -66,7 +66,6 @@ struct hfp_data {
char *handsfree_path;
char *handsfree_address;
DBusMessage *slc_msg;
- gboolean agent_registered;
DBusPendingCall *call;
};
@@ -158,53 +157,6 @@ static int service_level_connection(struct ofono_modem *modem, int
fd)
return -EINPROGRESS;
}
-static DBusMessage *hfp_agent_new_connection(DBusConnection *conn,
- DBusMessage *msg, void *data)
-{
- int fd, err;
- struct ofono_modem *modem = data;
- struct hfp_data *hfp_data = ofono_modem_get_data(modem);
- guint16 version;
-
- if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_UNIX_FD, &fd,
- DBUS_TYPE_UINT16, &version, DBUS_TYPE_INVALID))
- return __ofono_error_invalid_args(msg);
-
- hfp_slc_info_init(&hfp_data->info, version);
-
- err = service_level_connection(modem, fd);
- if (err < 0 && err != -EINPROGRESS)
- return __ofono_error_failed(msg);
-
- hfp_data->slc_msg = msg;
- dbus_message_ref(msg);
-
- return NULL;
-}
-
-static DBusMessage *hfp_agent_release(DBusConnection *conn,
- DBusMessage *msg, void *data)
-{
- struct ofono_modem *modem = data;
- struct hfp_data *hfp_data = ofono_modem_get_data(modem);
- const char *obj_path = ofono_modem_get_path(modem);
-
- g_dbus_unregister_interface(connection, obj_path, HFP_AGENT_INTERFACE);
- hfp_data->agent_registered = FALSE;
-
- g_hash_table_remove(modem_hash, hfp_data->handsfree_path);
- ofono_modem_remove(modem);
-
- return dbus_message_new_method_return(msg);
-}
-
-static GDBusMethodTable agent_methods[] = {
- { "NewConnection", "hq", "", hfp_agent_new_connection,
- G_DBUS_METHOD_FLAG_ASYNC },
- { "Release", "", "", hfp_agent_release },
- { NULL, NULL, NULL, NULL }
-};
-
static int hfp_hf_probe(const char *device, const char *dev_addr,
const char *adapter_addr, const char *alias)
{
@@ -296,76 +248,24 @@ static void hfp_hf_set_alias(const char *device, const char *alias)
ofono_modem_set_name(modem, alias);
}
-static int hfp_register_ofono_handsfree(struct ofono_modem *modem)
-{
- const char *obj_path = ofono_modem_get_path(modem);
- struct hfp_data *data = ofono_modem_get_data(modem);
- DBusMessage *msg;
-
- DBG("Registering oFono Agent to bluetooth daemon");
-
- msg = dbus_message_new_method_call(BLUEZ_SERVICE, data->handsfree_path,
- BLUEZ_GATEWAY_INTERFACE, "RegisterAgent");
- if (msg == NULL)
- return -ENOMEM;
-
- dbus_message_append_args(msg, DBUS_TYPE_OBJECT_PATH, &obj_path,
- DBUS_TYPE_INVALID);
-
- g_dbus_send_message(connection, msg);
- return 0;
-}
-
-static int hfp_unregister_ofono_handsfree(struct ofono_modem *modem)
-{
- const char *obj_path = ofono_modem_get_path(modem);
- struct hfp_data *data = ofono_modem_get_data(modem);
- DBusMessage *msg;
-
- DBG("Unregistering oFono Agent from bluetooth daemon");
-
- msg = dbus_message_new_method_call(BLUEZ_SERVICE, data->handsfree_path,
- BLUEZ_GATEWAY_INTERFACE, "UnregisterAgent");
- if (msg == NULL)
- return -ENOMEM;
-
- dbus_message_append_args(msg, DBUS_TYPE_OBJECT_PATH, &obj_path,
- DBUS_TYPE_INVALID);
-
- g_dbus_send_message(connection, msg);
- return 0;
-}
-
static int hfp_probe(struct ofono_modem *modem)
{
- const char *obj_path = ofono_modem_get_path(modem);
struct hfp_data *data = ofono_modem_get_data(modem);
if (data == NULL)
return -EINVAL;
- g_dbus_register_interface(connection, obj_path, HFP_AGENT_INTERFACE,
- agent_methods, NULL, NULL, modem, NULL);
-
- data->agent_registered = TRUE;
-
- if (hfp_register_ofono_handsfree(modem) != 0)
- return -EINVAL;
-
return 0;
}
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);
if (data->call != NULL)
dbus_pending_call_cancel(data->call);
- if (g_dbus_unregister_interface(connection, obj_path,
- HFP_AGENT_INTERFACE))
- hfp_unregister_ofono_handsfree(modem);
+ g_hash_table_remove(modem_hash, data->handsfree_path);
g_free(data->handsfree_address);
g_free(data->handsfree_path);
@@ -464,7 +364,7 @@ static int hfp_disable(struct ofono_modem *modem)
g_at_chat_unref(data->info.chat);
data->info.chat = NULL;
- if (data->agent_registered) {
+ if (ofono_modem_get_powered(modem)) {
status = bluetooth_send_with_reply(data->handsfree_path,
BLUEZ_GATEWAY_INTERFACE, "Disconnect",
&data->call, hfp_power_down,
@@ -496,6 +396,59 @@ static void hfp_post_sim(struct ofono_modem *modem)
DBG("%p", modem);
}
+static DBusMessage *hfp_agent_new_connection(DBusConnection *conn,
+ DBusMessage *msg, void *data)
+{
+ int fd, err;
+ struct ofono_modem *modem;
+ struct hfp_data *hfp_data;
+ const char *device, *uuid;
+ const char *path = NULL;
+ guint16 features = 0;
+ guint16 version = 0;
+
+ fd = bluetooth_parse_newconnection_message(msg, &device, &uuid,
+ &version, &features, &path);
+ if (fd < 0)
+ return __ofono_error_invalid_args(msg);
+
+ DBG("New connection for %s on %s (version 0x%04X, features 0x%02X, " \
+ "media transport path: %s)",
+ device, uuid, version, features, path);
+
+ modem = g_hash_table_lookup(modem_hash, device);
+ if (modem == NULL)
+ return __ofono_error_invalid_args(msg);
+
+ hfp_data = ofono_modem_get_data(modem);
+
+ hfp_slc_info_init(&hfp_data->info, version);
+
+ err = service_level_connection(modem, fd);
+ if (err < 0 && err != -EINPROGRESS)
+ return __ofono_error_failed(msg);
+
+ hfp_data->slc_msg = msg;
+ dbus_message_ref(msg);
+
+ return NULL;
+}
+
+static DBusMessage *hfp_agent_release(DBusConnection *conn,
+ DBusMessage *msg, void *data)
+{
+ DBG("");
+
+ return dbus_message_new_method_return(msg);
+}
+
+static GDBusMethodTable agent_methods[] = {
+ { "NewConnection", "ha{sv}", "",
hfp_agent_new_connection,
+ G_DBUS_METHOD_FLAG_ASYNC },
+ { "Release", "", "", hfp_agent_release },
+ { NULL, NULL, NULL, NULL }
+};
+
static struct ofono_modem_driver hfp_driver = {
.name = "hfp",
.modem_type = OFONO_MODEM_TYPE_HFP,
@@ -516,6 +469,8 @@ static struct bluetooth_profile hfp_hf = {
static int hfp_init(void)
{
+ dbus_uint16_t features = HFP_HF_FEATURE_3WAY | HFP_HF_FEATURE_CLIP |
+ HFP_HF_FEATURE_REMOTE_VOLUME_CONTROL;
int err;
if (DBUS_TYPE_UNIX_FD < 0)
@@ -536,11 +491,16 @@ static int hfp_init(void)
modem_hash = g_hash_table_new_full(g_str_hash, g_str_equal,
g_free, NULL);
+ bluetooth_register_telephony_agent(HFP_AGENT_PATH, HFP_HS_UUID,
+ HFP_VERSION_1_5, features,
+ agent_methods, NULL, NULL);
+
return 0;
}
static void hfp_exit(void)
{
+ bluetooth_unregister_telephony_agent(HFP_AGENT_PATH);
bluetooth_unregister_uuid(HFP_AG_UUID);
ofono_modem_driver_unregister(&hfp_driver);
--
1.7.1