Basically maintaining a simple list of byte arrays, provided by the wifi
plugin in use.
---
 include/peer.h |  9 +++++++++
 src/peer.c     | 47 +++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 56 insertions(+)

diff --git a/include/peer.h b/include/peer.h
index 5e1795f..b667003 100644
--- a/include/peer.h
+++ b/include/peer.h
@@ -42,6 +42,11 @@ enum connman_peer_wps_method {
        CONNMAN_PEER_WPS_PIN             = 2,
 };
 
+enum connman_peer_service_type {
+       CONNMAN_PEER_SERVICE_UNKNOWN      = 0,
+       CONNMAN_PEER_SERVICE_WIFI_DISPLAY = 1,
+};
+
 struct connman_peer;
 
 struct connman_peer *connman_peer_create(const char *identifier);
@@ -68,6 +73,10 @@ void connman_peer_set_as_master(struct connman_peer *peer, 
bool master);
 int connman_peer_set_state(struct connman_peer *peer,
                                        enum connman_peer_state new_state);
 int connman_peer_request_connection(struct connman_peer *peer);
+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);
 
 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 5f2a699..cf4f0e7 100644
--- a/src/peer.c
+++ b/src/peer.c
@@ -44,6 +44,12 @@ struct _peers_notify {
        GHashTable *remove;
 } *peers_notify;
 
+struct _peer_service {
+       enum connman_peer_service_type type;
+       unsigned char *data;
+       int length;
+};
+
 struct connman_peer {
        int refcount;
        struct connman_device *device;
@@ -58,6 +64,7 @@ struct connman_peer {
        bool connection_master;
        struct connman_ippool *ip_pool;
        GDHCPServer *dhcp_server;
+       GSList *services;
 };
 
 static void stop_dhcp_server(struct connman_peer *peer)
@@ -188,6 +195,9 @@ static void peer_free(gpointer data)
                peer->device = NULL;
        }
 
+       if (peer->services)
+               connman_peer_reset_services(peer);
+
        g_free(peer->identifier);
        g_free(peer->name);
 
@@ -840,6 +850,43 @@ int connman_peer_request_connection(struct connman_peer 
*peer)
                                        NULL, NULL);
 }
 
+static void peer_service_free(gpointer data)
+{
+       struct _peer_service *service = data;
+
+       if (!service)
+               return;
+
+       g_free(service->data);
+       g_free(service);
+}
+
+void connman_peer_reset_services(struct connman_peer *peer)
+{
+       if (!peer)
+               return;
+
+       g_slist_free_full(peer->services, peer_service_free);
+       peer->services = NULL;
+}
+
+void connman_peer_add_service(struct connman_peer *peer,
+                               enum connman_peer_service_type type,
+                               const unsigned char *data, int data_length)
+{
+       struct _peer_service *service;
+
+       if (!peer || !data || type == CONNMAN_PEER_SERVICE_UNKNOWN)
+               return;
+
+       service = g_malloc0(sizeof(struct _peer_service));
+       service->type = type;
+       service->data = g_memdup(data, data_length * sizeof(unsigned char));
+       service->length = data_length;
+
+       peer->services = g_slist_prepend(peer->services, service);
+}
+
 static void peer_up(struct connman_ipconfig *ipconfig, const char *ifname)
 {
        DBG("%s up", ifname);
-- 
1.8.5.5

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

Reply via email to