[gnome-network-displays] p2p-provider: Watch for changes of WFDIEs



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]