[ekiga] Opal: Fixed STUN usage and improved setup procedure.



commit 08479eef4debdd0548cf76ed2e4c80a0ccd5a437
Author: Damien Sandras <dsandras seconix com>
Date:   Sat Apr 18 13:34:49 2015 +0200

    Opal: Fixed STUN usage and improved setup procedure.
    
    Here is the list of changes fixing STUN operation and improving startup:
    - Instead of adding the Accounts and their Presentities when the
      Opal::EndPoint is ready, we add them from the beginning but only
      enable them when the endpoint is ready. This fixes a visual effect
      where the roster was empty for a few seconds during the STUN test.
    - GSettings setup methods are now private and executed by their respective
      CallManagers when the Opal::EndPoint is ready.

 lib/engine/components/opal/h323-call-manager.cpp   |    7 +++
 lib/engine/components/opal/h323-call-manager.h     |    3 +-
 lib/engine/components/opal/opal-bank.cpp           |   30 ++++++++++---
 lib/engine/components/opal/opal-bank.h             |    4 ++
 lib/engine/components/opal/opal-call-manager.cpp   |   13 ++++--
 lib/engine/components/opal/opal-main.cpp           |   44 +++++--------------
 .../components/opal/process/opal-endpoint.cpp      |   22 +++++++++-
 lib/engine/components/opal/process/opal-endpoint.h |    3 +
 lib/engine/components/opal/sip-call-manager.cpp    |    7 +++
 lib/engine/components/opal/sip-call-manager.h      |    3 +-
 10 files changed, 87 insertions(+), 49 deletions(-)
---
diff --git a/lib/engine/components/opal/h323-call-manager.cpp 
b/lib/engine/components/opal/h323-call-manager.cpp
index 08a5449..27c13ac 100644
--- a/lib/engine/components/opal/h323-call-manager.cpp
+++ b/lib/engine/components/opal/h323-call-manager.cpp
@@ -56,6 +56,8 @@ Opal::H323::CallManager::CallManager (Ekiga::ServiceCore& _core,
   h323_settings = Ekiga::SettingsPtr (new Ekiga::Settings (H323_SCHEMA, setup_cb));
   call_forwarding_settings = Ekiga::SettingsPtr (new Ekiga::Settings (CALL_FORWARDING_SCHEMA, setup_cb));
   video_codecs_settings = Ekiga::SettingsPtr (new Ekiga::Settings (VIDEO_CODECS_SCHEMA));
+
+  setup ("");
 }
 
 
@@ -177,6 +179,11 @@ Opal::H323::CallManager::get_dtmf_mode () const
 
 void Opal::H323::CallManager::setup (const std::string & setting)
 {
+  if (!endpoint.IsReady ()) {
+    endpoint.ready.connect (boost::bind (&Opal::H323::CallManager::setup, this, ""));
+    return;
+  }
+
   if (setting.empty () || setting == "listen-port")
     set_listen_port (h323_settings->get_int ("listen-port"));
 
diff --git a/lib/engine/components/opal/h323-call-manager.h b/lib/engine/components/opal/h323-call-manager.h
index bfbab20..7d25c23 100644
--- a/lib/engine/components/opal/h323-call-manager.h
+++ b/lib/engine/components/opal/h323-call-manager.h
@@ -83,9 +83,8 @@ namespace Opal {
 
       unsigned get_dtmf_mode () const;
 
-      /* Setup */
-      void setup (const std::string & setting = "");
   private:
+      void setup (const std::string & setting = "");
 
       Ekiga::SettingsPtr h323_settings;
       Ekiga::SettingsPtr call_forwarding_settings;
diff --git a/lib/engine/components/opal/opal-bank.cpp b/lib/engine/components/opal/opal-bank.cpp
index 63972bf..1de5902 100644
--- a/lib/engine/components/opal/opal-bank.cpp
+++ b/lib/engine/components/opal/opal-bank.cpp
@@ -49,6 +49,7 @@
 
 
 Opal::Bank::Bank (Ekiga::ServiceCore& core,
+                  Opal::EndPoint& _endpoint,
 #ifdef HAVE_H323
                   Opal::H323::EndPoint* _h323_endpoint,
 #endif
@@ -57,6 +58,7 @@ Opal::Bank::Bank (Ekiga::ServiceCore& core,
   notification_core(core.get<Ekiga::NotificationCore> ("notification-core")),
   personal_details(core.get<Ekiga::PersonalDetails> ("personal-details")),
   audiooutput_core(core.get<Ekiga::AudioOutputCore> ("audiooutput-core")),
+  endpoint (_endpoint),
 #ifdef HAVE_H323
   h323_endpoint(_h323_endpoint),
 #endif
@@ -114,11 +116,7 @@ Opal::Bank::Bank (Ekiga::ServiceCore& core,
       add_account (account);
       heap_added (account);
 
-      boost::shared_ptr<Ekiga::PresenceCore> pcore = presence_core.lock ();
-      if (pcore)
-        pcore->add_presence_fetcher (account);
-      if (account->is_enabled ())
-        account->enable ();
+      start ();
     }
   }
 
@@ -129,8 +127,6 @@ Opal::Bank::Bank (Ekiga::ServiceCore& core,
 
 Opal::Bank::~Bank ()
 {
-  std::cout << "BANK DESTROY" << std::endl << std::flush;
-
   delete protocols_settings;
 }
 
@@ -592,3 +588,23 @@ Opal::Bank::add_actions ()
                                                                 Opal::Account::H323, "", ""))));
 #endif
 }
+
+
+void
+Opal::Bank::start ()
+{
+  if (!endpoint.IsReady ()) {
+    endpoint.ready.connect (boost::bind (&Opal::Bank::start, this));
+    return;
+  }
+
+  boost::shared_ptr<Ekiga::PresenceCore> pcore = presence_core.lock ();
+  for (iterator iter = begin ();
+       iter != end ();
+       ++iter) {
+    if (pcore)
+      pcore->add_presence_fetcher (*iter);
+    if ((*iter)->is_enabled ())
+      (*iter)->enable ();
+  }
+}
diff --git a/lib/engine/components/opal/opal-bank.h b/lib/engine/components/opal/opal-bank.h
index 22a2ae6..b82613e 100644
--- a/lib/engine/components/opal/opal-bank.h
+++ b/lib/engine/components/opal/opal-bank.h
@@ -83,6 +83,7 @@ public:
      * the last object having a reference to them is deleted.
      */
     Bank (Ekiga::ServiceCore& _core,
+          Opal::EndPoint& _endpoint,
 #ifdef HAVE_H323
           Opal::H323::EndPoint* _h323_endpoint,
 #endif
@@ -168,8 +169,11 @@ private:
 
     void add_actions ();
 
+    void start ();
+
     Ekiga::Settings *protocols_settings;
 
+    Opal::EndPoint& endpoint;
 #ifdef HAVE_H323
     Opal::H323::EndPoint* h323_endpoint;
 #endif
diff --git a/lib/engine/components/opal/opal-call-manager.cpp 
b/lib/engine/components/opal/opal-call-manager.cpp
index ff8c6e9..d5e82e7 100644
--- a/lib/engine/components/opal/opal-call-manager.cpp
+++ b/lib/engine/components/opal/opal-call-manager.cpp
@@ -59,12 +59,20 @@ Opal::CallManager::CallManager (Ekiga::ServiceCore& _core,
   call_options_settings = Ekiga::SettingsPtr (new Ekiga::Settings (CALL_OPTIONS_SCHEMA, setup_cb));
   call_forwarding_settings = Ekiga::SettingsPtr (new Ekiga::Settings (CALL_FORWARDING_SCHEMA, setup_cb));
   personal_data_settings = Ekiga::SettingsPtr (new Ekiga::Settings (PERSONAL_DATA_SCHEMA, setup_cb));
+
+  /* STUN must be enabled at the very beginning */
+  if (nat_settings->get_bool ("enable-stun") && !nat_settings->get_string ("stun-server").empty ())
+    endpoint.SetStunServer (nat_settings->get_string ("stun-server"));
+  else
+    endpoint.SetStunServer (PString::Empty ());
 }
 
 
 Opal::CallManager::~CallManager ()
 {
-  std::cout << "hey" << std::endl;
+#if DEBUG
+  std::cout << "Opal::CallManager: Destructor invoked" << std::endl;
+#endif
 }
 
 
@@ -183,9 +191,6 @@ void Opal::CallManager::setup (const std::string & setting)
 {
   std::cout << "IN Opal::CallManager::setup" << std::endl;
 
-  if (setting.empty () || setting == "enable-stun" || setting == "stun-server")
-    endpoint.SetStunServer (nat_settings->get_bool ("enable-stun") ? nat_settings->get_string 
("stun-server") : "");
-
   if (setting.empty () || setting == "maximum-jitter-buffer")
     set_maximum_jitter (audio_codecs_settings->get_int ("maximum-jitter-buffer"));
 
diff --git a/lib/engine/components/opal/opal-main.cpp b/lib/engine/components/opal/opal-main.cpp
index d3c7182..49e2ffe 100644
--- a/lib/engine/components/opal/opal-main.cpp
+++ b/lib/engine/components/opal/opal-main.cpp
@@ -58,37 +58,14 @@
  */
 using namespace Opal;
 
+
 class OPALSpark: public Ekiga::Spark
 {
 public:
-  OPALSpark (): result(false), bank_created(false)
+  OPALSpark (): result(false)
   {}
 
 
-  void on_ready (Ekiga::ServiceCore& core,
-#ifdef HAVE_H323
-                 Opal::H323::EndPoint& h323_endpoint,
-#endif
-                 Opal::Sip::EndPoint& sip_endpoint)
-  {
-    if (!bank_created) {
-      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");
-      boost::shared_ptr<Opal::Bank> bank = boost::shared_ptr<Opal::Bank> (new Opal::Bank (core,
-#ifdef HAVE_H323
-                                                                                          &h323_endpoint,
-#endif
-                                                                                          &sip_endpoint));
-
-      account_core->add_bank (bank);
-      presence_core->add_cluster (bank);
-      core.add (bank);
-      presence_core->add_presence_publisher (bank);
-      bank_created = true;
-    }
-  }
-
-
   bool try_initialize_more (Ekiga::ServiceCore& core,
                            int* /*argc*/,
                            char** /*argv*/[])
@@ -116,27 +93,30 @@ public:
       Opal::H323::EndPoint& h323_endpoint = endpoint.GetH323EndPoint ();
 #endif
 
-      // We will create the Bank when ready
-      endpoint.ready.connect (boost::bind (&OPALSpark::on_ready, this,
-                                           boost::ref (core),
+      // We create the Bank
+      boost::shared_ptr<Opal::Bank> bank = boost::shared_ptr<Opal::Bank> (new Opal::Bank (core,
+                                                                                          endpoint,
 #ifdef HAVE_H323
-                                           boost::ref (h323_endpoint),
+                                                                                          &h323_endpoint,
 #endif
-                                           boost::ref (sip_endpoint)));
+                                                                                          &sip_endpoint));
+
+      account_core->add_bank (bank);
+      presence_core->add_cluster (bank);
+      core.add (bank);
+      presence_core->add_presence_publisher (bank);
 
       // We create our various CallManagers: SIP, H.323
       boost::shared_ptr<Opal::Sip::CallManager> sip_call_manager (new Opal::Sip::CallManager (core, 
endpoint, sip_endpoint));
       contact_core->push_back (Ekiga::URIActionProviderPtr (sip_call_manager));
       presence_core->push_back (Ekiga::URIActionProviderPtr (sip_call_manager));
       call_core->add_manager (sip_call_manager);
-      sip_call_manager->setup ();
 
 #ifdef HAVE_H323
       boost::shared_ptr<Opal::H323::CallManager> h323_call_manager (new Opal::H323::CallManager (core, 
endpoint, h323_endpoint));
       contact_core->push_back (Ekiga::URIActionProviderPtr (h323_call_manager));
       presence_core->push_back (Ekiga::URIActionProviderPtr (h323_call_manager));
       call_core->add_manager (h323_call_manager);
-      h323_call_manager->setup ();
 #endif
 
       result = true;
diff --git a/lib/engine/components/opal/process/opal-endpoint.cpp 
b/lib/engine/components/opal/process/opal-endpoint.cpp
index 0fd6934..1ee13db 100644
--- a/lib/engine/components/opal/process/opal-endpoint.cpp
+++ b/lib/engine/components/opal/process/opal-endpoint.cpp
@@ -94,7 +94,6 @@ public:
   void Main ()
     {
       PSTUNClient::NatTypes result = manager.SetSTUNServer (server);
-
       g_async_queue_push (queue, GUINT_TO_POINTER ((guint)result + 1));
     };
 
@@ -130,6 +129,7 @@ Opal::EndPoint::EndPoint (Ekiga::ServiceCore& _core) : core(_core)
   SetSignalingTimeout (1500);  // Useless to wait 10 seconds for a connection
 
   stun_enabled = false;
+  isReady = false;
   autoAnswer = false;
 
   // Create video devices
@@ -334,16 +334,26 @@ bool Opal::EndPoint::GetAutoAnswer (void) const
 
 void Opal::EndPoint::SetStunServer (const std::string & server)
 {
+  if (server == (const char*) GetNATServer ("STUN")) {
+    if (!isReady && !stun_thread) {
+      isReady = true;
+      ready ();
+    }
+
+    return;
+  }
+
   if (!server.empty () && !stun_thread) {
 
     // Ready
-    stun_thread = new StunDetector (stun_server, *this, queue);
+    stun_thread = new StunDetector (server, *this, queue);
     patience = 20;
     Ekiga::Runtime::run_in_main (boost::bind (&Opal::EndPoint::HandleSTUNResult, this), 1);
   }
   else {
 
     SetSTUNServer (PString ());
+    isReady = true;
     ready ();
   }
 
@@ -365,6 +375,12 @@ Opal::H323::EndPoint& Opal::EndPoint::GetH323EndPoint ()
 #endif
 
 
+bool Opal::EndPoint::IsReady ()
+{
+  return isReady;
+}
+
+
 void Opal::EndPoint::SetVideoOptions (const Opal::EndPoint::VideoOptions & options)
 {
   OpalMediaFormatList media_formats_list;
@@ -559,6 +575,7 @@ Opal::EndPoint::HandleSTUNResult ()
     }
     else {
 
+      isReady = true;
       ready ();
     }
   }
@@ -571,6 +588,7 @@ Opal::EndPoint::HandleSTUNResult ()
 
     ReportSTUNError (_("Ekiga did not manage to configure your network settings automatically. We suggest"
                       " you disable STUN support and relay on a SIP provider that supports NAT 
environments.\n\n"));
+    isReady = true;
     ready ();
   }
   else if (!got_answer) {
diff --git a/lib/engine/components/opal/process/opal-endpoint.h 
b/lib/engine/components/opal/process/opal-endpoint.h
index 378c4dc..7dbc98c 100644
--- a/lib/engine/components/opal/process/opal-endpoint.h
+++ b/lib/engine/components/opal/process/opal-endpoint.h
@@ -109,6 +109,8 @@ public:
     H323::EndPoint& GetH323EndPoint ();
 #endif
 
+    bool IsReady ();
+
 
     /**/
     struct VideoOptions
@@ -164,6 +166,7 @@ private:
     unsigned noAnswerDelay;
     bool autoAnswer;
     bool stun_enabled;
+    bool isReady;
 
     /* The various related endpoints */
     Sip::EndPoint *sip_endpoint;
diff --git a/lib/engine/components/opal/sip-call-manager.cpp b/lib/engine/components/opal/sip-call-manager.cpp
index e772476..e812492 100644
--- a/lib/engine/components/opal/sip-call-manager.cpp
+++ b/lib/engine/components/opal/sip-call-manager.cpp
@@ -55,6 +55,8 @@ Opal::Sip::CallManager::CallManager (Ekiga::ServiceCore& _core,
   Ekiga::SettingsCallback setup_cb = boost::bind (&Opal::Sip::CallManager::setup, this, _1);
   sip_settings = Ekiga::SettingsPtr (new Ekiga::Settings (SIP_SCHEMA, setup_cb));
   call_forwarding_settings = Ekiga::SettingsPtr (new Ekiga::Settings (CALL_FORWARDING_SCHEMA, setup_cb));
+
+  setup ("");
 }
 
 
@@ -165,6 +167,11 @@ Opal::Sip::CallManager::get_dtmf_mode () const
 
 void Opal::Sip::CallManager::setup (const std::string & setting)
 {
+  if (!endpoint.IsReady ()) {
+    endpoint.ready.connect (boost::bind (&Opal::Sip::CallManager::setup, this, ""));
+    return;
+  }
+
   if (setting.empty () || setting == "listen-port")
     set_listen_port (sip_settings->get_int ("listen-port"));
 
diff --git a/lib/engine/components/opal/sip-call-manager.h b/lib/engine/components/opal/sip-call-manager.h
index f2a8be3..512fd67 100644
--- a/lib/engine/components/opal/sip-call-manager.h
+++ b/lib/engine/components/opal/sip-call-manager.h
@@ -83,9 +83,8 @@ namespace Opal {
 
       unsigned get_dtmf_mode () const;
 
-      /* Setup */
-      void setup (const std::string & setting = "");
   private:
+      void setup (const std::string & setting = "");
 
       Ekiga::SettingsPtr sip_settings;
       Ekiga::SettingsPtr call_forwarding_settings;


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