[ekiga] Fixed bug #596185



commit f355c3ef1ca10528092a271a5c423149570c9582
Author: Julien Puydt <jpuydt newton localdomain>
Date:   Sat Sep 24 14:22:23 2011 +0200

    Fixed bug #596185
    
    Now we differentiate a little between the different bank events, and act accordingly

 lib/engine/components/opal/sip-endpoint.cpp |   41 +++++++++++++++++++-------
 lib/engine/components/opal/sip-endpoint.h   |    6 ++--
 2 files changed, 33 insertions(+), 14 deletions(-)
---
diff --git a/lib/engine/components/opal/sip-endpoint.cpp b/lib/engine/components/opal/sip-endpoint.cpp
index 620b7c5..f7975e8 100644
--- a/lib/engine/components/opal/sip-endpoint.cpp
+++ b/lib/engine/components/opal/sip-endpoint.cpp
@@ -1066,27 +1066,46 @@ Opal::Sip::EndPoint::update_bank ()
   bank = core.get<Opal::Bank> ("opal-account-store");
   if (boost::shared_ptr<Opal::Bank> bk = bank.lock ()) { // should always happen, but still
 
-    bk->account_added.connect (boost::bind (&Opal::Sip::EndPoint::on_bank_updated, this, _1));
-    bk->account_removed.connect (boost::bind (&Opal::Sip::EndPoint::on_bank_updated, this, _1));
-    bk->account_updated.connect (boost::bind (&Opal::Sip::EndPoint::on_bank_updated, this, _1));
+    bk->account_added.connect (boost::bind (&Opal::Sip::EndPoint::account_added, this, _1));
+    bk->account_updated.connect (boost::bind (&Opal::Sip::EndPoint::account_updated_or_removed, this, _1));
+    bk->account_removed.connect (boost::bind (&Opal::Sip::EndPoint::account_updated_or_removed, this, _1));
+    account_updated_or_removed (Ekiga::AccountPtr ()/* unused*/);
   }
 }
 
 void
-Opal::Sip::EndPoint::on_bank_updated (Ekiga::AccountPtr /*account*/)
+Opal::Sip::EndPoint::account_updated_or_removed (Ekiga::AccountPtr /*account*/)
 {
-  if (boost::shared_ptr<Opal::Bank> bk = bank.lock ())
-    bk->visit_accounts (boost::bind (&Opal::Sip::EndPoint::visit_accounts, this, _1));
-}
+  /* we don't remember what the account information was, so we need
+   * to clear our current information everytime something changed
+   * (hopefully nobody has hundreds of opal accounts that get updated
+   * often, so performance shouldn't be an issue!
+   */
+
+  { // keep the mutex only to clear the accounts variable...
+    PWaitAndSignal m(aorMutex);
+    accounts.clear ();
+  }
+  { // ... because here we call something which will want that very same mutex!
+    bank = core.get<Opal::Bank> ("opal-account-store");
+    if (boost::shared_ptr<Opal::Bank> bk = bank.lock ()) { // should always happen, but still
 
+      bk->visit_accounts (boost::bind (&Opal::Sip::EndPoint::visit_account, this, _1));
+    }
+  }
+}
 
 bool
-Opal::Sip::EndPoint::visit_accounts (Ekiga::AccountPtr account_)
+Opal::Sip::EndPoint::visit_account (Ekiga::AccountPtr _account)
 {
-  Opal::AccountPtr account = boost::dynamic_pointer_cast<Opal::Account> (account_);
+  account_added (_account);
+  return true;
+}
 
+void
+Opal::Sip::EndPoint::account_added (Ekiga::AccountPtr _account)
+{
+  Opal::AccountPtr account = boost::dynamic_pointer_cast<Opal::Account> (_account);
   PWaitAndSignal m(aorMutex);
   accounts[account->get_host ()] = account->get_aor ();
-
-  return true;
 }
diff --git a/lib/engine/components/opal/sip-endpoint.h b/lib/engine/components/opal/sip-endpoint.h
index 519f271..30eaf5d 100644
--- a/lib/engine/components/opal/sip-endpoint.h
+++ b/lib/engine/components/opal/sip-endpoint.h
@@ -181,9 +181,9 @@ namespace Opal {
 		       std::string name);
       void on_transfer (std::string uri);
 
-      void on_bank_updated (Ekiga::AccountPtr account);
-
-      bool visit_accounts (Ekiga::AccountPtr account);
+      void account_updated_or_removed (Ekiga::AccountPtr account);
+      bool visit_account (Ekiga::AccountPtr account);
+      void account_added (Ekiga::AccountPtr account);
 
       void registration_event_in_main (const std::string aor,
 				       Account::RegistrationState state,



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