These will let the wifi plugin know whether the peer could connect, is
connected or has disconnected.
---
gsupplicant/gsupplicant.h | 12 ++++++++++++
gsupplicant/supplicant.c | 38 ++++++++++++++++++++++++++++++++++++++
2 files changed, 50 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 3b4bc88..a503150 100644
--- a/gsupplicant/supplicant.c
+++ b/gsupplicant/supplicant.c
@@ -491,6 +491,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;
@@ -1062,6 +1074,14 @@ bool g_supplicant_peer_is_wps_pin(GSupplicantPeer *peer)
G_SUPPLICANT_WPS_PIN);
}
+bool g_supplicant_peer_is_in_a_group(GSupplicantPeer *peer)
+{
+ if (!peer)
+ return false;
+
+ return (g_slist_length(peer->groups) > 0);
+}
+
static void merge_network(GSupplicantNetwork *network)
{
GString *str;
@@ -2651,6 +2671,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;
}
@@ -2741,6 +2763,8 @@ static void signal_group_failure(const char *path,
DBusMessageIter *iter)
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)
@@ -2831,12 +2855,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("");
@@ -2855,6 +2883,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