[ekiga] Opal: Fix process so that it takes care of destroying what it created.



commit 78fd4ee2c9ba634c407f98b00f017138291d036d
Author: Damien Sandras <dsandras seconix com>
Date:   Sat Jan 24 13:48:45 2015 +0100

    Opal: Fix process so that it takes care of destroying what it created.
    
    The Opal Process created a Bank that was added as a PresencePublisher
    and as a Cluster to the PresenceCore, and as a Bank to the AccountCore.
    
    When the Opal Process exits, it should take care of removing that Bank
    from those specific containers. That way, at least the Opal Process does
    not keep references it added.

 lib/engine/account/account-core.cpp         |    9 +++++++++
 lib/engine/account/account-core.h           |    6 ++++++
 lib/engine/components/opal/opal-process.cpp |   25 ++++++++++++++++---------
 lib/engine/components/opal/opal-process.h   |    7 +++++++
 lib/engine/presence/presence-core.cpp       |   15 +++++++++++++++
 lib/engine/presence/presence-core.h         |   11 +++++++++++
 6 files changed, 64 insertions(+), 9 deletions(-)
---
diff --git a/lib/engine/account/account-core.cpp b/lib/engine/account/account-core.cpp
index faec602..7c6fd9b 100644
--- a/lib/engine/account/account-core.cpp
+++ b/lib/engine/account/account-core.cpp
@@ -62,6 +62,15 @@ Ekiga::AccountCore::add_bank (BankPtr bank)
 
 
 void
+Ekiga::AccountCore::remove_bank (BankPtr bank)
+{
+  bank_removed (bank);
+
+  banks.remove (bank);
+}
+
+
+void
 Ekiga::AccountCore::visit_banks (boost::function1<bool, BankPtr> visitor) const
 {
   bool go_on = true;
diff --git a/lib/engine/account/account-core.h b/lib/engine/account/account-core.h
index ea0d1ab..e71422d 100644
--- a/lib/engine/account/account-core.h
+++ b/lib/engine/account/account-core.h
@@ -96,6 +96,12 @@ namespace Ekiga
     void add_bank (BankPtr bank);
 
 
+    /** Removes a bank from the AccountCore service.
+     * @param The bank to be removed.
+     */
+    void remove_bank (BankPtr bank);
+
+
     /** Triggers a callback for all Ekiga::Bank banks of the
      * AccountCore service.
      * @param The callback (the return value means "go on" and allows
diff --git a/lib/engine/components/opal/opal-process.cpp b/lib/engine/components/opal/opal-process.cpp
index 43f74a8..7d88ae8 100644
--- a/lib/engine/components/opal/opal-process.cpp
+++ b/lib/engine/components/opal/opal-process.cpp
@@ -44,8 +44,6 @@
 #include "runtime.h"
 
 #include "call-core.h"
-#include "account-core.h"
-#include "presence-core.h"
 
 GnomeMeeting *GnomeMeeting::GM = 0;
 
@@ -59,6 +57,11 @@ GnomeMeeting::GnomeMeeting ()
 
 GnomeMeeting::~GnomeMeeting ()
 {
+  boost::shared_ptr<Ekiga::AccountCore> acore = account_core.lock ();
+  boost::shared_ptr<Ekiga::PresenceCore> pcore = presence_core.lock ();
+  acore->remove_bank (bank);
+  pcore->remove_presence_publisher (bank);
+  pcore->remove_cluster (bank);
 }
 
 GnomeMeeting *
@@ -75,17 +78,21 @@ void GnomeMeeting::Main ()
 
 void GnomeMeeting::Start (Ekiga::ServiceCore& core)
 {
-  boost::shared_ptr<Ekiga::CallCore> call_core = core.get<Ekiga::CallCore> ("call-core");
-  boost::shared_ptr<Ekiga::PresenceCore> presence_core = core.get<Ekiga::PresenceCore> ("presence-core");
-  boost::shared_ptr<Ekiga::AccountCore> account_core = core.get<Ekiga::AccountCore> ("account-core");
+  call_core = boost::weak_ptr<Ekiga::CallCore> (core.get<Ekiga::CallCore> ("call-core"));
+  presence_core = boost::weak_ptr<Ekiga::PresenceCore> (core.get<Ekiga::PresenceCore> ("presence-core"));
+  account_core = boost::weak_ptr<Ekiga::AccountCore> (core.get<Ekiga::AccountCore> ("account-core"));
+
+  boost::shared_ptr<Ekiga::AccountCore> acore = account_core.lock ();
+  boost::shared_ptr<Ekiga::PresenceCore> pcore = presence_core.lock ();
+  boost::shared_ptr<Ekiga::CallCore> ccore = call_core.lock ();
 
   call_manager = boost::shared_ptr<Opal::CallManager> (new Opal::CallManager (core));
   bank = boost::shared_ptr<Opal::Bank> (new Opal::Bank (core, call_manager));
-  account_core->add_bank (bank);
-  presence_core->add_cluster (bank);
+  acore->add_bank (bank);
+  pcore->add_cluster (bank);
   core.add (bank);
   call_manager->setup ();
-  presence_core->add_presence_publisher (bank);
+  pcore->add_presence_publisher (bank);
 
-  call_core->add_manager (call_manager);
+  ccore->add_manager (call_manager);
 }
diff --git a/lib/engine/components/opal/opal-process.h b/lib/engine/components/opal/opal-process.h
index cf7535d..30af9ad 100644
--- a/lib/engine/components/opal/opal-process.h
+++ b/lib/engine/components/opal/opal-process.h
@@ -47,6 +47,9 @@
 #include "opal-call-manager.h"
 #include "opal-bank.h"
 
+#include "presence-core.h"
+#include "account-core.h"
+
 /**
  * COMMON NOTICE: The Application must be initialized with Init after its
  * creation.
@@ -79,6 +82,10 @@ class GnomeMeeting : public PProcess
   static GnomeMeeting *GM;
   boost::shared_ptr<Opal::CallManager> call_manager;
   boost::shared_ptr<Opal::Bank> bank;
+
+  boost::weak_ptr<Ekiga::CallCore> call_core;
+  boost::weak_ptr<Ekiga::PresenceCore> presence_core;
+  boost::weak_ptr<Ekiga::AccountCore> account_core;
 };
 
 #endif
diff --git a/lib/engine/presence/presence-core.cpp b/lib/engine/presence/presence-core.cpp
index fcc2aee..63b9271 100644
--- a/lib/engine/presence/presence-core.cpp
+++ b/lib/engine/presence/presence-core.cpp
@@ -62,6 +62,15 @@ Ekiga::PresenceCore::add_cluster (ClusterPtr cluster)
 }
 
 void
+Ekiga::PresenceCore::remove_cluster (ClusterPtr cluster)
+{
+  cluster_removed (cluster);
+  clusters.erase (cluster);
+
+  updated ();
+}
+
+void
 Ekiga::PresenceCore::visit_clusters (boost::function1<bool, ClusterPtr > visitor) const
 {
   bool go_on = true;
@@ -202,6 +211,12 @@ Ekiga::PresenceCore::add_presence_publisher (boost::shared_ptr<PresencePublisher
 }
 
 void
+Ekiga::PresenceCore::remove_presence_publisher (boost::shared_ptr<PresencePublisher> publisher)
+{
+  presence_publishers.remove (publisher);
+}
+
+void
 Ekiga::PresenceCore::publish ()
 {
   for (std::list<boost::shared_ptr<PresencePublisher> >::iterator iter
diff --git a/lib/engine/presence/presence-core.h b/lib/engine/presence/presence-core.h
index a7d4935..fe01766 100644
--- a/lib/engine/presence/presence-core.h
+++ b/lib/engine/presence/presence-core.h
@@ -149,6 +149,11 @@ namespace Ekiga
      */
     void add_cluster (ClusterPtr cluster);
 
+    /** Removes a cluster from the PresenceCore service.
+     * @param The cluster to be removed.
+     */
+    void remove_cluster (ClusterPtr cluster);
+
     /** Triggers a callback for all Ekiga::Cluster clusters of the
      * PresenceCore service.
      * @param The callback (the return value means "go on" and allows
@@ -161,6 +166,11 @@ namespace Ekiga
      */
     boost::signals2::signal<void(ClusterPtr)> cluster_added;
 
+    /** This signal is emitted when an Ekiga::Cluster has been removed
+     * to the PresenceCore Service.
+     */
+    boost::signals2::signal<void(ClusterPtr)> cluster_removed;
+
     /** Those signals are forwarding the heap_added, heap_updated
      * and heap_removed from the given Cluster.
      *
@@ -253,6 +263,7 @@ namespace Ekiga
   public:
 
     void add_presence_publisher (boost::shared_ptr<PresencePublisher> publisher);
+    void remove_presence_publisher (boost::shared_ptr<PresencePublisher> publisher);
 
   private:
 


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