From: Vinicius Costa Gomes <[email protected]>

This patch checks if the Handsfree Audio Manager already has an agent
registered for the same owner and object path.
---
 plugins/hfp_audio.c | 41 ++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 40 insertions(+), 1 deletion(-)

diff --git a/plugins/hfp_audio.c b/plugins/hfp_audio.c
index db21a5d..32ddebc 100644
--- a/plugins/hfp_audio.c
+++ b/plugins/hfp_audio.c
@@ -25,6 +25,7 @@
 
 #include <errno.h>
 #include <stdio.h>
+#include <string.h>
 
 #include <gdbus.h>
 
@@ -35,12 +36,34 @@
 
 #define HFP_AUDIO_MANAGER_INTERFACE            OFONO_SERVICE 
".HandsfreeAudioManager"
 
+struct agent {
+       char *owner;
+       char *path;
+       unsigned char *codecs;
+       int codecs_len;
+};
+
 /* Supported agents codecs */
 enum hfp_codec {
        HFP_CODEC_CVSD = 0x01,
        HFP_CODEC_MSBC = 0x02,
 };
 
+static GSList *agents = NULL;
+
+static int agent_cmp(gconstpointer a, gconstpointer b)
+{
+       const struct agent *agent = a;
+       const struct agent *match = b;
+       int ret;
+
+       ret = strcmp(agent->owner, match->owner);
+       if (ret != 0)
+               return ret;
+
+       return strcmp(agent->path, match->path);
+}
+
 static DBusMessage *am_get_cards(DBusConnection *conn,
                                        DBusMessage *msg, void *user_data)
 {
@@ -52,11 +75,14 @@ static DBusMessage *am_get_cards(DBusConnection *conn,
 static DBusMessage *am_agent_register(DBusConnection *conn,
                                        DBusMessage *msg, void *user_data)
 {
-       const char *path;
+       struct agent match, *agent;
+       const char *sender, *path;
        unsigned char *codecs;
        DBusMessageIter iter, array;
        int length, i;
 
+       sender = dbus_message_get_sender(msg);
+
        if (dbus_message_iter_init(msg, &iter) == FALSE)
                goto invalid_args;
 
@@ -75,6 +101,19 @@ static DBusMessage *am_agent_register(DBusConnection *conn,
                        goto invalid_args;
        }
 
+       match.owner = (char *) sender;
+       match.path = (char *) path;
+       if (g_slist_find_custom(agents, &match, agent_cmp))
+               goto invalid_args;
+
+       agent = g_new0(struct agent, 1);
+       agent->owner = g_strdup(sender);
+       agent->path = g_strdup(path);
+       agent->codecs = g_memdup(codecs, length);
+       agent->codecs_len = length;
+
+       agents = g_slist_prepend(agents, agent);
+
        return dbus_message_new_method_return(msg);
 
 invalid_args:
-- 
1.7.11.7

_______________________________________________
ofono mailing list
[email protected]
http://lists.ofono.org/listinfo/ofono

Reply via email to