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 =
-"<?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, *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