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 |  165 ++++++++++++++++++++---------------------------------
 1 files changed, 62 insertions(+), 103 deletions(-)

diff --git a/plugins/hfp_hf.c b/plugins/hfp_hf.c
index 48a734a..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,52 +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;
-
-       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)
 {
@@ -295,77 +248,23 @@ 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);
@@ -465,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,
@@ -497,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,
@@ -517,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)
@@ -537,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

_______________________________________________
ofono mailing list
ofono@ofono.org
http://lists.ofono.org/listinfo/ofono

Reply via email to