---
 src/handsfree.c |   58 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 58 insertions(+), 0 deletions(-)

diff --git a/src/handsfree.c b/src/handsfree.c
index 24f2349..27af31c 100644
--- a/src/handsfree.c
+++ b/src/handsfree.c
@@ -41,9 +41,12 @@
 #include "ofono.h"
 #include "common.h"
 
+#define MAX_AG_FEATURE_COUNT 32
+
 static GSList *g_drivers = NULL;
 
 struct ofono_handsfree {
+       unsigned int ag_features;
        ofono_bool_t inband_ringing;
        ofono_bool_t voice_recognition;
        ofono_bool_t voice_recognition_pending;
@@ -54,6 +57,54 @@ struct ofono_handsfree {
        DBusMessage *pending;
 };
 
+static void append_ag_features(struct ofono_handsfree *hf, char **features)
+{
+       unsigned int bit;
+       int feature_count = 0;
+
+       for (bit = 1; bit != 0; bit <<= 1) {
+               if (hf->ag_features & bit) {
+                       char *name = NULL;
+
+                       switch ((enum hfp_ag_feature) bit) {
+                       case HFP_AG_FEATURE_VOICE_RECOG:
+                               name = "voice-recognition";
+                               break;
+                       case HFP_AG_FEATURE_ATTACH_VOICE_TAG:
+                               name = "attach-voice-tag";
+                               break;
+                       default:
+                               continue;
+                       }
+
+                       features[feature_count++] = name;
+               }
+       }
+
+       features[feature_count] = NULL;
+}
+
+void ofono_handsfree_set_ag_features(struct ofono_handsfree *hf,
+                                       unsigned int ag_features)
+{
+       DBusConnection *conn = ofono_dbus_get_connection();
+       const char *path = __ofono_atom_get_path(hf->atom);
+       char **features;
+
+       if (hf->ag_features == ag_features)
+               return;
+
+       hf->ag_features = ag_features;
+
+       features = g_new0(char *, MAX_AG_FEATURE_COUNT + 1);
+       append_ag_features(hf, features);
+       ofono_dbus_signal_array_property_changed(conn, path,
+                                               OFONO_HANDSFREE_INTERFACE,
+                                               "Features", DBUS_TYPE_STRING,
+                                               &features);
+       g_free(features);
+}
+
 void ofono_handsfree_set_inband_ringing(struct ofono_handsfree *hf,
                                                ofono_bool_t enabled)
 {
@@ -102,6 +153,7 @@ static DBusMessage *handsfree_get_properties(DBusConnection 
*conn,
        DBusMessageIter dict;
        dbus_bool_t inband_ringing;
        dbus_bool_t voice_recognition;
+       char **features;
 
        reply = dbus_message_new_method_return(msg);
        if (reply == NULL)
@@ -121,6 +173,12 @@ static DBusMessage 
*handsfree_get_properties(DBusConnection *conn,
        ofono_dbus_dict_append(&dict, "VoiceRecognition", DBUS_TYPE_BOOLEAN,
                                &voice_recognition);
 
+       features = g_new0(char *, MAX_AG_FEATURE_COUNT + 1);
+       append_ag_features(hf, features);
+       ofono_dbus_dict_append_array(&dict, "Features", DBUS_TYPE_STRING,
+                                       &features);
+       g_free(features);
+
        dbus_message_iter_close_container(&iter, &dict);
 
        return reply;
-- 
1.7.6.4

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

Reply via email to