[ekiga] Opal: Fixed STUN usage and improved setup procedure.
- From: Damien Sandras <dsandras src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [ekiga] Opal: Fixed STUN usage and improved setup procedure.
- Date: Sat, 18 Apr 2015 15:55:17 +0000 (UTC)
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]