[gnome-network-displays] p2p-provider: Watch for changes of WFDIEs
- From: Benjamin Berg <bberg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-network-displays] p2p-provider: Watch for changes of WFDIEs
- Date: Tue, 20 Apr 2021 12:21:42 +0000 (UTC)
commit 412abbed54dc5c7baf132bd2683b756ccf6a9691
Author: Benjamin Berg <bberg redhat com>
Date: Tue Apr 20 13:39:20 2021 +0200
p2p-provider: Watch for changes of WFDIEs
It seems that occasionally the WFDIEs might not be filled in
immediately. So watch for changes on ignored peer object and try to
re-add the peer if they are updated.
src/nd-wfd-p2p-provider.c | 26 +++++++++++++++++++++++++-
1 file changed, 25 insertions(+), 1 deletion(-)
---
diff --git a/src/nd-wfd-p2p-provider.c b/src/nd-wfd-p2p-provider.c
index daaba8c..5221d6b 100644
--- a/src/nd-wfd-p2p-provider.c
+++ b/src/nd-wfd-p2p-provider.c
@@ -45,6 +45,8 @@ enum {
static void nd_wfd_p2p_provider_provider_iface_init (NdProviderIface *iface);
static GList * nd_wfd_p2p_provider_provider_get_sinks (NdProvider *provider);
+static void peer_added_cb (NdWFDP2PProvider *provider, NMWifiP2PPeer *peer, NMDevice *device);
+
G_DEFINE_TYPE_EXTENDED (NdWFDP2PProvider, nd_wfd_p2p_provider, G_TYPE_OBJECT, 0,
G_IMPLEMENT_INTERFACE (ND_TYPE_PROVIDER,
nd_wfd_p2p_provider_provider_iface_init);
@@ -52,6 +54,20 @@ G_DEFINE_TYPE_EXTENDED (NdWFDP2PProvider, nd_wfd_p2p_provider, G_TYPE_OBJECT, 0,
static GParamSpec * props[PROP_LAST] = { NULL, };
+static void
+on_peer_wfd_ie_notify_cb (NdWFDP2PProvider *provider,
+ GParamSpec *pspec,
+ NMWifiP2PPeer *peer)
+{
+ g_debug ("WFDP2PProvider: WFDIEs for ignored peer \"%s\" (%s) changed, trying to re-add",
+ nm_wifi_p2p_peer_get_name (peer),
+ nm_wifi_p2p_peer_get_hw_address (peer));
+
+ g_signal_handlers_disconnect_by_func (peer, on_peer_wfd_ie_notify_cb, provider);
+
+ peer_added_cb (provider, peer, provider->nm_device);
+}
+
static void
peer_added_cb (NdWFDP2PProvider *provider, NMWifiP2PPeer *peer, NMDevice *device)
{
@@ -63,9 +79,14 @@ peer_added_cb (NdWFDP2PProvider *provider, NMWifiP2PPeer *peer, NMDevice *device
/* Assume this is not a WFD Peer if there are no WFDIEs set. */
if (!wfd_ies || g_bytes_get_size (wfd_ies) == 0)
{
- g_debug ("WFDP2PProvider: Ignoring peer \"%s\" (%s) as it has no WFDIEs set",
+ g_debug ("WFDP2PProvider: Ignoring peer \"%s\" (%s) for now as it has no WFDIEs set",
nm_wifi_p2p_peer_get_name (peer),
nm_wifi_p2p_peer_get_hw_address (peer));
+
+ g_signal_connect_object (peer, "notify::" NM_WIFI_P2P_PEER_WFD_IES,
+ G_CALLBACK (on_peer_wfd_ie_notify_cb),
+ provider,
+ G_CONNECT_SWAPPED);
return;
}
@@ -82,6 +103,9 @@ peer_removed_cb (NdWFDP2PProvider *provider, NMWifiP2PPeer *peer, NMDevice *devi
{
g_debug ("WFDP2PProvider: Peer removed");
+ /* Otherwise we may see properties changing to NULL before the object is destroyed. */
+ g_signal_handlers_disconnect_by_func (peer, on_peer_wfd_ie_notify_cb, provider);
+
for (gint i = 0; i < provider->sinks->len; i++)
{
g_autoptr(NdWFDP2PSink) sink = g_object_ref (g_ptr_array_index (provider->sinks, i));
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]