[ekiga] Presence: Make sure the Ekiga::Cluster are destroyed properly on quit.



commit 6e9a106d39b9bb7f521c99117ee7878658bdae3c
Author: Damien Sandras <dsandras seconix com>
Date:   Sun Feb 8 13:07:48 2015 +0100

    Presence: Make sure the Ekiga::Cluster are destroyed properly on quit.
    
    We were binding shared_ptr to the Cluster objects signals.
    
    That means that the shared_ptr are garbage collected
    at a later stage, at least with boost::signals2, which is not what we
    want. One solution would be to use weak_ptr's. However, we are not
    really using the Cluster share_ptr in any of our callbacks, so
    simplifying the signals signature seems to be a better idea.
    
    Signals relay was also simplified, useless callbacks have been removed.

 lib/engine/gui/gtk-frontend/roster-view-gtk.cpp |   36 +++++----------
 lib/engine/presence/presence-core.cpp           |   55 +++--------------------
 lib/engine/presence/presence-core.h             |   25 +++--------
 3 files changed, 23 insertions(+), 93 deletions(-)
---
diff --git a/lib/engine/gui/gtk-frontend/roster-view-gtk.cpp b/lib/engine/gui/gtk-frontend/roster-view-gtk.cpp
index 499f39f..26bf56f 100644
--- a/lib/engine/gui/gtk-frontend/roster-view-gtk.cpp
+++ b/lib/engine/gui/gtk-frontend/roster-view-gtk.cpp
@@ -271,7 +271,6 @@ static bool visit_heaps (RosterViewGtk* self,
  * PRE          : /
  */
 static void on_heap_added (RosterViewGtk* self,
-                          Ekiga::ClusterPtr cluster,
                           Ekiga::HeapPtr heap);
 
 /* DESCRIPTION  : Called when the heap_updated signal has been emitted
@@ -279,7 +278,6 @@ static void on_heap_added (RosterViewGtk* self,
  * PRE          : /
  */
 static void on_heap_updated (RosterViewGtk* self,
-                            Ekiga::ClusterPtr cluster,
                             Ekiga::HeapPtr heap);
 
 
@@ -291,7 +289,6 @@ static void on_heap_updated (RosterViewGtk* self,
  * PRE          : /
  */
 static void on_heap_removed (RosterViewGtk* self,
-                            Ekiga::ClusterPtr cluster,
                             Ekiga::HeapPtr heap);
 
 
@@ -300,7 +297,6 @@ static void on_heap_removed (RosterViewGtk* self,
  * PRE          : /
  */
 static bool visit_presentities (RosterViewGtk* self,
-                               Ekiga::ClusterPtr cluster,
                                Ekiga::HeapPtr heap,
                                Ekiga::PresentityPtr presentity);
 
@@ -312,7 +308,6 @@ static bool visit_presentities (RosterViewGtk* self,
  * PRE          : A valid Heap.
  */
 static void on_presentity_added (RosterViewGtk* self,
-                                Ekiga::ClusterPtr cluster,
                                 Ekiga::HeapPtr heap,
                                 Ekiga::PresentityPtr presentity);
 
@@ -323,7 +318,6 @@ static void on_presentity_added (RosterViewGtk* self,
  * PRE          : A valid Heap.
  */
 static void on_presentity_updated (RosterViewGtk* self,
-                                  Ekiga::ClusterPtr cluster,
                                   Ekiga::HeapPtr heap,
                                   Ekiga::PresentityPtr presentity);
 
@@ -334,7 +328,6 @@ static void on_presentity_updated (RosterViewGtk* self,
  * PRE          : A valid Heap.
  */
 static void on_presentity_removed (RosterViewGtk* self,
-                                  Ekiga::ClusterPtr cluster,
                                   Ekiga::HeapPtr heap,
                                   Ekiga::PresentityPtr presentity);
 
@@ -962,7 +955,7 @@ visit_heaps (RosterViewGtk* self,
             Ekiga::ClusterPtr cluster,
             Ekiga::HeapPtr heap)
 {
-  on_heap_added (self, cluster, heap);
+  on_heap_added (self, heap);
 
   return true;
 }
@@ -1021,7 +1014,6 @@ on_account_updated (Ekiga::AccountPtr account,
 
 static void
 on_heap_added (RosterViewGtk* self,
-              Ekiga::ClusterPtr cluster,
               Ekiga::HeapPtr heap)
 {
   boost::signals2::connection conn;
@@ -1043,13 +1035,12 @@ on_heap_added (RosterViewGtk* self,
     self->priv->connections.add (conn);
   }
 
-  on_heap_updated (self, cluster, heap);
-  heap->visit_presentities (boost::bind (&visit_presentities, self, cluster, heap, _1));
+  on_heap_updated (self, heap);
+  heap->visit_presentities (boost::bind (&visit_presentities, self, heap, _1));
 }
 
 static void
 on_heap_updated (RosterViewGtk* self,
-                G_GNUC_UNUSED Ekiga::ClusterPtr cluster,
                 Ekiga::HeapPtr heap)
 {
   gchar *heap_name = NULL;
@@ -1070,7 +1061,6 @@ on_heap_updated (RosterViewGtk* self,
 
 static void
 on_heap_removed (RosterViewGtk* self,
-                G_GNUC_UNUSED Ekiga::ClusterPtr cluster,
                 Ekiga::HeapPtr heap)
 {
   GtkTreeIter iter;
@@ -1109,18 +1099,16 @@ on_heap_removed (RosterViewGtk* self,
 
 static bool
 visit_presentities (RosterViewGtk* self,
-                   Ekiga::ClusterPtr cluster,
                    Ekiga::HeapPtr heap,
                    Ekiga::PresentityPtr presentity)
 {
-  on_presentity_added (self, cluster, heap, presentity);
+  on_presentity_added (self, heap, presentity);
 
   return true;
 }
 
 static void
 on_presentity_added (RosterViewGtk* self,
-                    G_GNUC_UNUSED Ekiga::ClusterPtr cluster,
                     Ekiga::HeapPtr heap,
                     Ekiga::PresentityPtr presentity)
 {
@@ -1271,7 +1259,6 @@ on_presentity_added (RosterViewGtk* self,
 
 static void
 on_presentity_updated (RosterViewGtk* self,
-                      Ekiga::ClusterPtr cluster,
                       Ekiga::HeapPtr heap,
                       Ekiga::PresentityPtr presentity)
 {
@@ -1289,7 +1276,7 @@ on_presentity_updated (RosterViewGtk* self,
     groups.push_back (_("Unsorted"));
 
   // This makes sure we are in all groups where we should
-  on_presentity_added (self, cluster, heap, presentity);
+  on_presentity_added (self, heap, presentity);
 
   // Now let's remove from all the others
   roster_view_gtk_find_iter_for_heap (self, heap, &heap_iter);
@@ -1330,7 +1317,6 @@ on_presentity_updated (RosterViewGtk* self,
 
 static void
 on_presentity_removed (RosterViewGtk* self,
-                      G_GNUC_UNUSED Ekiga::ClusterPtr cluster,
                       Ekiga::HeapPtr heap,
                       Ekiga::PresentityPtr presentity)
 {
@@ -1765,17 +1751,17 @@ roster_view_gtk_new (boost::shared_ptr<Ekiga::PresenceCore> pcore)
   /* Presence */
   conn = pcore->cluster_added.connect (boost::bind (&on_cluster_added, self, _1));
   self->priv->connections.add (conn);
-  conn = pcore->heap_added.connect (boost::bind (&on_heap_added, self, _1, _2));
+  conn = pcore->heap_added.connect (boost::bind (&on_heap_added, self, _1));
   self->priv->connections.add (conn);
-  conn = pcore->heap_updated.connect (boost::bind (&on_heap_updated, self, _1, _2));
+  conn = pcore->heap_updated.connect (boost::bind (&on_heap_updated, self, _1));
   self->priv->connections.add (conn);
-  conn = pcore->heap_removed.connect (boost::bind (&on_heap_removed, self, _1, _2));
+  conn = pcore->heap_removed.connect (boost::bind (&on_heap_removed, self, _1));
   self->priv->connections.add (conn);
-  conn = pcore->presentity_added.connect (boost::bind (&on_presentity_added, self, _1, _2, _3));
+  conn = pcore->presentity_added.connect (boost::bind (&on_presentity_added, self, _1, _2));
   self->priv->connections.add (conn);
-  conn = pcore->presentity_updated.connect (boost::bind (&on_presentity_updated, self, _1, _2, _3));
+  conn = pcore->presentity_updated.connect (boost::bind (&on_presentity_updated, self, _1, _2));
   self->priv->connections.add (conn);
-  conn = pcore->presentity_removed.connect (boost::bind (&on_presentity_removed, self, _1, _2, _3));
+  conn = pcore->presentity_removed.connect (boost::bind (&on_presentity_removed, self, _1, _2));
   self->priv->connections.add (conn);
   conn = pcore->questions.connect (boost::bind (&on_handle_questions, self, _1));
   self->priv->connections.add (conn);
diff --git a/lib/engine/presence/presence-core.cpp b/lib/engine/presence/presence-core.cpp
index 988e6e4..8fd85ca 100644
--- a/lib/engine/presence/presence-core.cpp
+++ b/lib/engine/presence/presence-core.cpp
@@ -49,12 +49,12 @@ Ekiga::PresenceCore::add_cluster (ClusterPtr cluster)
   clusters.insert (cluster);
   cluster_added (cluster);
   conns.add (cluster->updated.connect (boost::ref (updated)));
-  conns.add (cluster->heap_added.connect (boost::bind (&Ekiga::PresenceCore::on_heap_added, this, _1, 
cluster)));
-  conns.add (cluster->heap_updated.connect (boost::bind (&Ekiga::PresenceCore::on_heap_updated, this, _1, 
cluster)));
-  conns.add (cluster->heap_removed.connect (boost::bind (&Ekiga::PresenceCore::on_heap_removed, this, _1, 
cluster)));
-  conns.add (cluster->presentity_added.connect (boost::bind (&Ekiga::PresenceCore::on_presentity_added, 
this, _1, _2, cluster)));
-  conns.add (cluster->presentity_updated.connect (boost::bind (&Ekiga::PresenceCore::on_presentity_updated, 
this, _1, _2, cluster)));
-  conns.add (cluster->presentity_removed.connect (boost::bind (&Ekiga::PresenceCore::on_presentity_removed, 
this, _1, _2, cluster)));
+  conns.add (cluster->heap_added.connect (boost::bind (boost::ref (heap_added), _1)));
+  conns.add (cluster->heap_updated.connect (boost::bind (boost::ref (heap_updated), _1)));
+  conns.add (cluster->heap_removed.connect (boost::bind (boost::ref (heap_removed), _1)));
+  conns.add (cluster->presentity_added.connect (boost::bind (boost::ref (presentity_added), _1, _2)));
+  conns.add (cluster->presentity_updated.connect (boost::bind (boost::ref (presentity_updated), _1, _2)));
+  conns.add (cluster->presentity_removed.connect (boost::bind (boost::ref (presentity_removed), _1, _2)));
   cluster->questions.connect (boost::ref (questions));
 
   updated ();
@@ -79,49 +79,6 @@ Ekiga::PresenceCore::visit_clusters (boost::function1<bool, ClusterPtr > visitor
     go_on = visitor (*iter);
 }
 
-void Ekiga::PresenceCore::on_heap_added (HeapPtr heap,
-                                        ClusterPtr cluster)
-{
-  heap_added (cluster, heap);
-}
-
-void
-Ekiga::PresenceCore::on_heap_updated (HeapPtr heap,
-                                     ClusterPtr cluster)
-{
-  heap_updated (cluster, heap);
-}
-
-void
-Ekiga::PresenceCore::on_heap_removed (HeapPtr heap, ClusterPtr cluster)
-{
-  heap_removed (cluster, heap);
-}
-
-void
-Ekiga::PresenceCore::on_presentity_added (HeapPtr heap,
-                                         PresentityPtr presentity,
-                                         ClusterPtr cluster)
-{
-  presentity_added (cluster, heap, presentity);
-}
-
-void
-Ekiga::PresenceCore::on_presentity_updated (HeapPtr heap,
-                                           PresentityPtr presentity,
-                                           ClusterPtr cluster)
-{
-  presentity_updated (cluster, heap, presentity);
-}
-
-void
-Ekiga::PresenceCore::on_presentity_removed (HeapPtr heap,
-                                           PresentityPtr presentity,
-                                           ClusterPtr cluster)
-{
-  presentity_removed (cluster, heap, presentity);
-}
-
 void
 Ekiga::PresenceCore::add_presence_fetcher (boost::shared_ptr<PresenceFetcher> fetcher)
 {
diff --git a/lib/engine/presence/presence-core.h b/lib/engine/presence/presence-core.h
index 22c22bb..e912db1 100644
--- a/lib/engine/presence/presence-core.h
+++ b/lib/engine/presence/presence-core.h
@@ -174,32 +174,19 @@ namespace Ekiga
      * and heap_removed from the given Cluster.
      *
      */
-    boost::signals2::signal<void(ClusterPtr , HeapPtr )> heap_added;
-    boost::signals2::signal<void(ClusterPtr , HeapPtr )> heap_updated;
-    boost::signals2::signal<void(ClusterPtr , HeapPtr )> heap_removed;
+    boost::signals2::signal<void(HeapPtr)> heap_added;
+    boost::signals2::signal<void(HeapPtr)> heap_updated;
+    boost::signals2::signal<void(HeapPtr)> heap_removed;
 
     /** Those signals are forwarding the presentity_added, presentity_updated
      * and presentity_removed from the given Heap of the given Cluster.
      */
-    boost::signals2::signal<void(ClusterPtr , HeapPtr , PresentityPtr )> presentity_added;
-    boost::signals2::signal<void(ClusterPtr , HeapPtr , PresentityPtr )> presentity_updated;
-    boost::signals2::signal<void(ClusterPtr , HeapPtr , PresentityPtr )> presentity_removed;
+    boost::signals2::signal<void(HeapPtr, PresentityPtr)> presentity_added;
+    boost::signals2::signal<void(HeapPtr, PresentityPtr)> presentity_updated;
+    boost::signals2::signal<void(HeapPtr, PresentityPtr)> presentity_removed;
 
   private:
-
     std::set<ClusterPtr > clusters;
-    void on_heap_added (HeapPtr heap, ClusterPtr cluster);
-    void on_heap_updated (HeapPtr heap, ClusterPtr cluster);
-    void on_heap_removed (HeapPtr heap, ClusterPtr cluster);
-    void on_presentity_added (HeapPtr heap,
-                             PresentityPtr presentity,
-                             ClusterPtr cluster);
-    void on_presentity_updated (HeapPtr heap,
-                               PresentityPtr presentity,
-                               ClusterPtr cluster);
-    void on_presentity_removed (HeapPtr heap,
-                               PresentityPtr presentity,
-                               ClusterPtr cluster);
 
     /*** API to help presentities get presence ***/
   public:


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]