Bluez moves agent registration from a per device interface to a per adapter interface. Update hfp_ag modem emulator to reflect this change. --- plugins/hfp_ag.c | 126 ++++++++++++++++++++++++------------------------------ 1 files changed, 56 insertions(+), 70 deletions(-) diff --git a/plugins/hfp_ag.c b/plugins/hfp_ag.c index c2d1d30..ea9c112 100644 --- a/plugins/hfp_ag.c +++ b/plugins/hfp_ag.c @@ -35,97 +35,83 @@ #include "bluetooth.h" -#define HFP_AG_CHANNEL 13 +#define AGENT_PATH "/hfp_ag" +#define VERSION_1_5 0x0105 +#define FEATURES (HFP_AG_FEATURE_3WAY | HFP_AG_FEATURE_REJECT_CALL | \ + HFP_AG_FEATURE_ENHANCED_CALL_STATUS | \ + HFP_AG_FEATURE_ENHANCED_CALL_CONTROL | \ + HFP_AG_FEATURE_EXTENDED_RES_CODE) + +#ifndef DBUS_TYPE_UNIX_FD +#define DBUS_TYPE_UNIX_FD -1 +#endif -static struct server *server; static guint modemwatch_id; static GList *modems; static GHashTable *sim_hash = NULL; -static const gchar *hfp_ag_record = -"\n" -"\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -"\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -"\n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -" \n" -"\n" -" \n" -" \n" -" \n" -"\n" -" \n" -" \n" -" \n" -"\n" -" \n" -" \n" -" \n" -"\n"; - -static void hfp_ag_connect_cb(GIOChannel *io, GError *err, gpointer user_data) +static DBusMessage *hfp_ag_agent_new_connection(DBusConnection *conn, + DBusMessage *msg, void *data) { - struct ofono_modem *modem; - struct ofono_emulator *em; int fd; + const char *device, *uuid; + const char *path = NULL; + guint16 version = 0; + guint16 features = 0; + struct ofono_emulator *em; + struct ofono_modem *modem; - DBG(""); + fd = bluetooth_parse_newconnection_message(msg, &device, &uuid, + &version, &features, &path); + if (fd < 0) + return __ofono_error_invalid_args(msg); - if (err) { - DBG("%s", err->message); - return; - } + DBG("New connection for %s on %s (version 0x%04X, features 0x%02X, " \ + "media transport path: %s)", + device, uuid, version, features, path); /* Pick the first voicecall capable modem */ modem = modems->data; if (modem == NULL) - return; + return __ofono_error_failed(msg); DBG("Picked modem %p for emulator", modem); em = ofono_emulator_create(modem, OFONO_EMULATOR_TYPE_HFP); if (em == NULL) - return; - - fd = g_io_channel_unix_get_fd(io); - g_io_channel_set_close_on_unref(io, FALSE); + return __ofono_error_failed(msg); ofono_emulator_register(em, fd); + + return dbus_message_new_method_return(msg); } +static DBusMessage *hfp_ag_agent_release(DBusConnection *conn, + DBusMessage *msg, void *data) +{ + DBG(""); + + return dbus_message_new_method_return(msg); +} + +static GDBusMethodTable agent_methods[] = { + { "NewConnection", "ha{sv}", "", hfp_ag_agent_new_connection, + G_DBUS_METHOD_FLAG_ASYNC }, + { "Release", "", "", hfp_ag_agent_release }, + { NULL, NULL, NULL, NULL } +}; + static void sim_state_watch(enum ofono_sim_state new_state, void *data) { struct ofono_modem *modem = data; if (new_state != OFONO_SIM_STATE_READY) { + if (modems == NULL) + return; + modems = g_list_remove(modems, modem); - if (modems == NULL && server != NULL) { - bluetooth_unregister_server(server); - server = NULL; - } + if (modems == NULL) + bluetooth_unregister_telephony_agent(AGENT_PATH); return; } @@ -138,8 +124,9 @@ static void sim_state_watch(enum ofono_sim_state new_state, void *data) if (modems->next != NULL) return; - server = bluetooth_register_server(HFP_AG_CHANNEL, hfp_ag_record, - hfp_ag_connect_cb, NULL); + bluetooth_register_telephony_agent(AGENT_PATH, HFP_AG_UUID, + VERSION_1_5, FEATURES, + agent_methods, NULL, NULL); } static gboolean sim_watch_remove(gpointer key, gpointer value, @@ -192,6 +179,9 @@ static void call_modemwatch(struct ofono_modem *modem, void *user) static int hfp_ag_init(void) { + if (DBUS_TYPE_UNIX_FD < 0) + return -EBADF; + sim_hash = g_hash_table_new(g_direct_hash, g_direct_equal); modemwatch_id = __ofono_modemwatch_add(modem_watch, NULL, NULL); @@ -203,14 +193,10 @@ static int hfp_ag_init(void) static void hfp_ag_exit(void) { __ofono_modemwatch_remove(modemwatch_id); + g_list_free(modems); g_hash_table_foreach_remove(sim_hash, sim_watch_remove, NULL); g_hash_table_destroy(sim_hash); - - if (server) { - bluetooth_unregister_server(server); - server = NULL; - } } OFONO_PLUGIN_DEFINE(hfp_ag, "Hands-Free Audio Gateway Profile Plugins", VERSION, -- 1.7.1