The peer P2P services are provided through an array of byte arrays.
Each of those represent a P2P service at its bare level.
---
 include/peer.h |  1 +
 src/peer.c     | 39 ++++++++++++++++++++++++++++++++++++++-
 2 files changed, 39 insertions(+), 1 deletion(-)

diff --git a/include/peer.h b/include/peer.h
index b667003..e98e442 100644
--- a/include/peer.h
+++ b/include/peer.h
@@ -77,6 +77,7 @@ void connman_peer_reset_services(struct connman_peer *peer);
 void connman_peer_add_service(struct connman_peer *peer,
                                enum connman_peer_service_type type,
                                const unsigned char *data, int data_length);
+void connman_peer_services_changed(struct connman_peer *peer);
 
 int connman_peer_register(struct connman_peer *peer);
 void connman_peer_unregister(struct connman_peer *peer);
diff --git a/src/peer.c b/src/peer.c
index cf4f0e7..5d0f19f 100644
--- a/src/peer.c
+++ b/src/peer.c
@@ -288,6 +288,31 @@ static void append_ipv4(DBusMessageIter *iter, void 
*user_data)
                __connman_ipconfig_append_ipv4(peer->ipconfig, iter);
 }
 
+static void append_peer_services(DBusMessageIter *iter, void *user_data)
+{
+       struct connman_peer *peer = user_data;
+       DBusMessageIter dict;
+       GSList *list;
+
+       for (list = peer->services; list; list = list->next) {
+               struct _peer_service *service = list->data;
+
+               connman_dbus_dict_open(iter, &dict);
+
+               switch (service->type) {
+               case CONNMAN_PEER_SERVICE_UNKNOWN:
+                       /* Should never happen */
+                       break;
+               case CONNMAN_PEER_SERVICE_WIFI_DISPLAY:
+                       connman_dbus_property_append_fixed_array(&dict,
+                                       "WiFiDisplayIEs", DBUS_TYPE_BYTE,
+                                       &service->data, service->length);
+                       break;
+               }
+               connman_dbus_dict_close(iter, &dict);
+       }
+}
+
 static void append_properties(DBusMessageIter *iter, struct connman_peer *peer)
 {
        const char *state = state2string(peer->state);
@@ -300,7 +325,9 @@ static void append_properties(DBusMessageIter *iter, struct 
connman_peer *peer)
        connman_dbus_dict_append_basic(&dict, "Name",
                                        DBUS_TYPE_STRING, &peer->name);
        connman_dbus_dict_append_dict(&dict, "IPv4", append_ipv4, peer);
-
+       connman_dbus_dict_append_array(&dict, "Services",
+                                       DBUS_TYPE_DICT_ENTRY,
+                                       append_peer_services, peer);
        connman_dbus_dict_close(iter, &dict);
 }
 
@@ -870,6 +897,16 @@ void connman_peer_reset_services(struct connman_peer *peer)
        peer->services = NULL;
 }
 
+void connman_peer_services_changed(struct connman_peer *peer)
+{
+       if (!peer || !peer->registered || !allow_property_changed(peer))
+               return;
+
+       connman_dbus_property_changed_array(peer->path,
+                       CONNMAN_PEER_INTERFACE, "Services",
+                       DBUS_TYPE_DICT_ENTRY, append_peer_services, peer);
+}
+
 void connman_peer_add_service(struct connman_peer *peer,
                                enum connman_peer_service_type type,
                                const unsigned char *data, int data_length)
-- 
1.8.5.5

_______________________________________________
connman mailing list
connman@connman.net
https://lists.connman.net/mailman/listinfo/connman

Reply via email to