These will let the wifi plugin know whether the peer could connect, is
connected or has disconnected.
---
 gsupplicant/gsupplicant.h | 12 +++++++++++
 gsupplicant/supplicant.c  | 54 +++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 66 insertions(+)

diff --git a/gsupplicant/gsupplicant.h b/gsupplicant/gsupplicant.h
index 6f79125..e52e069 100644
--- a/gsupplicant/gsupplicant.h
+++ b/gsupplicant/gsupplicant.h
@@ -118,6 +118,15 @@ typedef enum {
        G_SUPPLICANT_WPS_STATE_FAIL,
 } GSupplicantWpsState;
 
+typedef enum {
+       G_SUPPLICANT_PEER_GROUP_CHANGED,
+       G_SUPPLICANT_PEER_GROUP_STARTED,
+       G_SUPPLICANT_PEER_GROUP_FINISHED,
+       G_SUPPLICANT_PEER_GROUP_JOINED,
+       G_SUPPLICANT_PEER_GROUP_DISCONNECTED,
+       G_SUPPLICANT_PEER_GROUP_FAILED,
+} GSupplicantPeerGroupState;
+
 struct _GSupplicantSSID {
        const void *ssid;
        unsigned int ssid_len;
@@ -269,6 +278,7 @@ const void 
*g_supplicant_peer_get_device_address(GSupplicantPeer *peer);
 const char *g_supplicant_peer_get_name(GSupplicantPeer *peer);
 bool g_supplicant_peer_is_wps_pbc(GSupplicantPeer *peer);
 bool g_supplicant_peer_is_wps_pin(GSupplicantPeer *peer);
+bool g_supplicant_peer_is_in_a_group(GSupplicantPeer *peer);
 
 struct _GSupplicantCallbacks {
        void (*system_ready) (void);
@@ -285,6 +295,8 @@ struct _GSupplicantCallbacks {
                                        const char *property);
        void (*peer_found) (GSupplicantPeer *peer);
        void (*peer_lost) (GSupplicantPeer *peer);
+       void (*peer_changed) (GSupplicantPeer *peer,
+                                       GSupplicantPeerGroupState state);
        void (*debug) (const char *str);
 };
 
diff --git a/gsupplicant/supplicant.c b/gsupplicant/supplicant.c
index 580f38c..276e28b 100644
--- a/gsupplicant/supplicant.c
+++ b/gsupplicant/supplicant.c
@@ -492,6 +492,18 @@ static void callback_peer_lost(GSupplicantPeer *peer)
        callbacks_pointer->peer_lost(peer);
 }
 
+static void callback_peer_changed(GSupplicantPeer *peer,
+                                       GSupplicantPeerGroupState state)
+{
+       if (!callbacks_pointer)
+               return;
+
+       if (!callbacks_pointer->peer_changed)
+               return;
+
+       callbacks_pointer->peer_changed(peer, state);
+}
+
 static void remove_group(gpointer data)
 {
        GSupplicantGroup *group = data;
@@ -1067,6 +1079,14 @@ bool g_supplicant_peer_is_wps_pin(GSupplicantPeer *peer)
        return false;
 }
 
+bool g_supplicant_peer_is_in_a_group(GSupplicantPeer *peer)
+{
+       if (!peer || !peer->groups)
+               return false;
+
+       return true;
+}
+
 static void merge_network(GSupplicantNetwork *network)
 {
        GString *str;
@@ -2656,6 +2676,8 @@ static void signal_peer_changed(const char *path, 
DBusMessageIter *iter)
        if (!peer->groups_changed)
                return;
 
+       callback_peer_changed(peer, G_SUPPLICANT_PEER_GROUP_CHANGED);
+
        peer->groups_changed = false;
 }
 
@@ -2728,7 +2750,25 @@ static void signal_group_success(const char *path, 
DBusMessageIter *iter)
 
 static void signal_group_failure(const char *path, DBusMessageIter *iter)
 {
+       GSupplicantInterface *interface;
+       struct group_sig_data data = {};
+       GSupplicantPeer *peer;
+
        SUPPLICANT_DBG("");
+
+       interface = g_hash_table_lookup(interface_table, path);
+       if (!interface)
+               return;
+
+       supplicant_dbus_property_foreach(iter, group_sig_property, &data);
+       if (!data.peer_obj_path)
+               return;
+
+       peer = g_hash_table_lookup(interface->peer_table, data.peer_obj_path);
+       if (!peer)
+               return;
+
+       callback_peer_changed(peer, G_SUPPLICANT_PEER_GROUP_FAILED);
 }
 
 static void signal_group_started(const char *path, DBusMessageIter *iter)
@@ -2813,12 +2853,16 @@ static void signal_group_peer_joined(const char *path, 
DBusMessageIter *iter)
                return;
 
        group->members = g_slist_prepend(group->members, g_strdup(peer_path));
+
+       callback_peer_changed(peer, G_SUPPLICANT_PEER_GROUP_JOINED);
 }
 
 static void signal_group_peer_disconnected(const char *path, DBusMessageIter 
*iter)
 {
        const char *peer_path = NULL;
+       GSupplicantInterface *interface;
        GSupplicantGroup *group;
+       GSupplicantPeer *peer;
        GSList *elem;
 
        SUPPLICANT_DBG("");
@@ -2837,6 +2881,16 @@ static void signal_group_peer_disconnected(const char 
*path, DBusMessageIter *it
 
        g_free(elem->data);
        group->members = g_slist_delete_link(group->members, elem);
+
+       interface = g_hash_table_lookup(peer_mapping, peer_path);
+       if (!interface)
+               return;
+
+       peer = g_hash_table_lookup(interface->peer_table, peer_path);
+       if (!peer)
+               return;
+
+       callback_peer_changed(peer, G_SUPPLICANT_PEER_GROUP_DISCONNECTED);
 }
 
 static struct {
-- 
1.8.5.5

_______________________________________________
connman mailing list
[email protected]
https://lists.connman.net/mailman/listinfo/connman

Reply via email to