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 | 169 +++++++++++++++++++++--------------------------------- 1 file changed, 65 insertions(+), 104 deletions(-)
diff --git a/plugins/hfp_hf.c b/plugins/hfp_hf.c index 7c500e3..e618518 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,54 +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 const GDBusMethodTable agent_methods[] = { - { GDBUS_ASYNC_METHOD("NewConnection", - GDBUS_ARGS({ "fd", "h" }, { "version", "q" }), - NULL, hfp_agent_new_connection) }, - { GDBUS_METHOD("Release", NULL, NULL, hfp_agent_release) }, - { } -}; - static int hfp_hf_probe(const char *device, const char *dev_addr, const char *adapter_addr, const char *alias) { @@ -297,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); @@ -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,61 @@ 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; + const char *path = NULL; + guint16 features = 0; + guint16 version = 0; + + fd = bluetooth_parse_newconnection_message(msg, &device, &version, + &features, &path); + if (fd < 0) + return __ofono_error_invalid_args(msg); + + DBG("New connection for %s (version 0x%04X, features 0x%02X, " \ + "media transport path: %s)", + device, 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 const GDBusMethodTable agent_methods[] = { + { GDBUS_ASYNC_METHOD("NewConnection", + GDBUS_ARGS({ "fd", "h" }, + { "property", "a{sv}" }), + NULL, hfp_agent_new_connection) }, + { GDBUS_METHOD("Release", NULL, NULL, hfp_agent_release) }, + { } +}; + static struct ofono_modem_driver hfp_driver = { .name = "hfp", .modem_type = OFONO_MODEM_TYPE_HFP, @@ -517,6 +471,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 +493,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.9.5 _______________________________________________ ofono mailing list ofono@ofono.org http://lists.ofono.org/listinfo/ofono