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 | 128 +++++++++++++++++++++++++----------------------------- 1 file changed, 58 insertions(+), 70 deletions(-)
diff --git a/plugins/hfp_ag.c b/plugins/hfp_ag.c index c2d1d30..2652f3f 100644 --- a/plugins/hfp_ag.c +++ b/plugins/hfp_ag.c @@ -35,97 +35,85 @@ #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 = -"<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n" -"<record>\n" -" <attribute id=\"0x0001\">\n" -" <sequence>\n" -" <uuid value=\"0x111F\"/>\n" -" <uuid value=\"0x1203\"/>\n" -" </sequence>\n" -" </attribute>\n" -"\n" -" <attribute id=\"0x0004\">\n" -" <sequence>\n" -" <sequence>\n" -" <uuid value=\"0x0100\"/>\n" -" </sequence>\n" -" <sequence>\n" -" <uuid value=\"0x0003\"/>\n" -" <uint8 value=\"13\" name=\"channel\"/>\n" -" </sequence>\n" -" </sequence>\n" -" </attribute>\n" -"\n" -" <attribute id=\"0x0009\">\n" -" <sequence>\n" -" <sequence>\n" -" <uuid value=\"0x111E\"/>\n" -" <uint16 value=\"0x0105\" name=\"version\"/>\n" -" </sequence>\n" -" </sequence>\n" -" </attribute>\n" -"\n" -" <attribute id=\"0x0100\">\n" -" <text value=\"Hands-Free Audio Gateway\" name=\"name\"/>\n" -" </attribute>\n" -"\n" -" <attribute id=\"0x0301\">\n" -" <uint8 value=\"0x01\" />\n" -" </attribute>\n" -"\n" -" <attribute id=\"0x0311\">\n" -" <uint16 value=\"0x0001\" />\n" -" </attribute>\n" -"</record>\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; + 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, &version, + &features, &path); + if (fd < 0) + return __ofono_error_invalid_args(msg); - if (err) { - DBG("%s", err->message); - return; - } + DBG("New connection for %s (version 0x%04X, features 0x%02X, " \ + "media transport path: %s)", + device, 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 const GDBusMethodTable agent_methods[] = { + { GDBUS_ASYNC_METHOD("NewConnection", + GDBUS_ARGS({ "fd", "h" }, + { "property", "a{sv}" }), + NULL, hfp_ag_agent_new_connection) }, + { GDBUS_METHOD("Release", NULL, NULL, hfp_ag_agent_release) }, + { } +}; + 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 +126,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 +181,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 +195,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.9.5 _______________________________________________ ofono mailing list ofono@ofono.org http://lists.ofono.org/listinfo/ofono