Commit 981ba725 authored by Alexandre Bourget's avatar Alexandre Bourget

Remove the 'AUTO_REGISTER' parameter. Major clean-up of registration process.

Now, there should be only an 'Enabled' toggle for each account. It determines
if the account is registered on start-up AND if it's enabled, generally.

TODO: We'll need another parameter, to select which account is the one used
to do calls. Anyways, it wasn't very convenient to use the 'First one enabled',
since you'll often want multiple accounts enabled, and be able to select which
account to use for an outgoing call.

This commit updates the SFLphone daemon and the Gtk+ client.

It removes a whole bunch of useless variables (_state, _shouldInitOnStart,
_shouldRegisterOnStart, _registered). Now the registration state is fetched
directly from the VoIPLink (when called from the Account). So, no more
duplication of statuses.

TODO: SFLphone-gtk will need to support the TRYING and ERROR messages as
'Status' reply.
parent ba1e6d86
......@@ -28,7 +28,7 @@
#define ACCOUNT_TYPE "Account.type"
#define ACCOUNT_ALIAS "Account.alias"
#define ACCOUNT_ENABLED "Account.enable"
#define ACCOUNT_REGISTER "Account.autoregister"
//#define ACCOUNT_REGISTER "Account.autoregister"
#define ACCOUNT_SIP_FULL_NAME "SIP.fullName"
#define ACCOUNT_SIP_HOST_PART "SIP.hostPart"
......
......@@ -34,7 +34,7 @@ GtkWidget * entryID;
GtkWidget * entryName;
GtkWidget * entryProtocol;
GtkWidget * entryEnabled;
GtkWidget * entryRegister;
//GtkWidget * entryRegister;
GtkWidget * entryFullName;
GtkWidget * entryUserPart;
GtkWidget * entryHostPart;
......@@ -142,10 +142,10 @@ show_account_window (account_t * a)
strcmp(g_hash_table_lookup(currentAccount->properties, ACCOUNT_ENABLED),"TRUE") == 0 ? TRUE: FALSE);
gtk_table_attach ( GTK_TABLE( table ), entryEnabled, 0, 2, 1, 2, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
entryRegister = gtk_check_button_new_with_mnemonic("_Register on startup ");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(entryRegister),
strcmp(g_hash_table_lookup(currentAccount->properties, ACCOUNT_REGISTER),"TRUE") == 0 ? TRUE: FALSE);
gtk_table_attach ( GTK_TABLE( table ), entryRegister, 0, 2, 2, 3, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
//entryRegister = gtk_check_button_new_with_mnemonic("_Register on startup ");
//gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(entryRegister),
// strcmp(g_hash_table_lookup(currentAccount->properties, ACCOUNT_REGISTER),"TRUE") == 0 ? TRUE: FALSE);
//gtk_table_attach ( GTK_TABLE( table ), entryRegister, 0, 2, 2, 3, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
label = gtk_label_new_with_mnemonic ("_Alias:");
gtk_table_attach ( GTK_TABLE( table ), label, 0, 1, 3, 4, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
......@@ -252,9 +252,9 @@ show_account_window (account_t * a)
g_hash_table_replace(currentAccount->properties,
g_strdup(ACCOUNT_ENABLED),
g_strdup(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(entryEnabled)) ? "TRUE": "FALSE"));
g_hash_table_replace(currentAccount->properties,
g_strdup(ACCOUNT_REGISTER),
g_strdup(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(entryRegister)) ? "TRUE": "FALSE"));
// g_hash_table_replace(currentAccount->properties,
// g_strdup(ACCOUNT_REGISTER),
// g_strdup(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(entryRegister)) ? "TRUE": "FALSE"));
/* TODO Add SIP/IAX when IAX is ok */
g_hash_table_replace(currentAccount->properties,
g_strdup(ACCOUNT_ALIAS),
......
......@@ -25,11 +25,7 @@ Account::Account(const AccountID& accountID) : _accountID(accountID)
{
_link = NULL;
_shouldInitOnStart = false;
_shouldRegisterOnStart = false;
_enabled = false;
_registered = false;
_state = false;
}
......@@ -57,7 +53,6 @@ Account::initConfig(Conf::ConfigTree& config) {
void
Account::loadConfig()
{
_shouldInitOnStart = Manager::instance().getConfigInt(_accountID, CONFIG_ACCOUNT_ENABLE) ? true : false;
_shouldRegisterOnStart = Manager::instance().getConfigInt(_accountID, CONFIG_ACCOUNT_AUTO_REGISTER) ? true : false;
_enabled = Manager::instance().getConfigInt(_accountID, CONFIG_ACCOUNT_ENABLE) ? true : false;
}
......@@ -21,6 +21,7 @@
#include <string>
#include "config/config.h"
#include "voiplink.h"
class VoIPLink;
......@@ -28,7 +29,7 @@ typedef std::string AccountID;
#define AccountNULL ""
#define CONFIG_ACCOUNT_TYPE "Account.type"
#define CONFIG_ACCOUNT_ENABLE "Account.enable"
#define CONFIG_ACCOUNT_AUTO_REGISTER "Account.autoregister"
//#define CONFIG_ACCOUNT_AUTO_REGISTER "Account.autoregister"
#define CONFIG_ACCOUNT_ALIAS "Account.alias"
#define IAX_FULL_NAME "IAX.fullName"
......@@ -85,16 +86,20 @@ class Account{
/**
* Register the underlying VoIPLink
*
* This should update the getRegistrationState() return value.
*
* @return false is an error occurs
*/
virtual bool registerVoIPLink() = 0;
virtual void registerVoIPLink() = 0;
/**
* Unregister the underlying VoIPLink
*
* This should update the getRegistrationState() return value.
*
* @return false is an error occurs
*/
virtual bool unregisterVoIPLink() = 0;
virtual void unregisterVoIPLink() = 0;
/**
* Init the voiplink to run (event listener)
......@@ -109,27 +114,14 @@ class Account{
virtual bool terminate() = 0;
/**
* Tell if we should init the account on start
* @return true if we must init the link
*/
bool shouldInitOnStart() {return _shouldInitOnStart; }
/**
* Tell if we should register the account on start
* @return true if we must register the account
*/
bool shouldRegisterOnStart() {return _shouldRegisterOnStart; }
/**
* Tell if the account is enable or not
* Tell if the account is enable or not. See doc for _enabled.
*/
bool isEnabled() { return _enabled; }
/**
* Tell if the latest registration succeed or failed
* Return registration state of underlying VoIPLink
*/
bool setState(bool state) { _state = state; }
bool getState() { return _state; }
VoIPLink::RegistrationState getRegistrationState() { return _link->getRegistrationState(); }
private:
......@@ -145,34 +137,14 @@ protected:
VoIPLink* _link;
/**
* Tells if the link should be start on loading or not
* Tells if the link is enabled, active.
*
* This implies the link will be initialized on startup.
*
* Modified by the configuration (key: ENABLED)
*/
bool _shouldInitOnStart;
/**
* Tells if we should register automatically on startup
* Modified by the configuration (key: AUTO-REGISTER)
*/
bool _shouldRegisterOnStart;
/**
* Tells if the link is enabled or not.
* Modified by init/terminate
*/
bool _enabled;
/**
* Tells if the link is registered or not.
* Modified by unregister/register
*/
bool _registered;
/**
* The latest registration was a success or not
*/
bool _state;
};
#endif
......@@ -34,53 +34,40 @@ IAXAccount::~IAXAccount()
delete _link;
}
bool
void
IAXAccount::registerVoIPLink()
{
if (_link && !_registered) {
init();
//unregisterAccount(); No need to unregister first.
IAXVoIPLink* tmplink = dynamic_cast<IAXVoIPLink*> (_link);
if (tmplink) {
// Stuff needed for IAX registration
tmplink->setHost(Manager::instance().getConfigString(_accountID, IAX_HOST));
tmplink->setUser(Manager::instance().getConfigString(_accountID, IAX_USER));
tmplink->setPass(Manager::instance().getConfigString(_accountID, IAX_PASS));
}
_registered = _link->sendRegister();
init();
//unregisterAccount(); No need to unregister first.
IAXVoIPLink* thislink = dynamic_cast<IAXVoIPLink*> (_link);
if (thislink) {
// Stuff needed for IAX registration
thislink->setHost(Manager::instance().getConfigString(_accountID, IAX_HOST));
thislink->setUser(Manager::instance().getConfigString(_accountID, IAX_USER));
thislink->setPass(Manager::instance().getConfigString(_accountID, IAX_PASS));
}
return _registered;
_link->sendRegister();
}
bool
void
IAXAccount::unregisterVoIPLink()
{
if (_link && _registered) {
_registered = _link->sendUnregister();
}
return !_registered;
_link->sendUnregister();
}
bool
IAXAccount::init()
{
if (_link && !_enabled) {
_link->init();
_enabled = true;
return true;
}
return false;
_link->init();
return true;
}
bool
IAXAccount::terminate()
{
if (_link && _enabled) {
_link->terminate();
_enabled = false;
return true;
}
return false;
_link->terminate();
return true;
}
void
......
......@@ -38,8 +38,8 @@ public:
void initConfig(Conf::ConfigTree& config);
/** Actually unuseful, since config loading is done in init() */
void loadConfig();
bool registerVoIPLink();
bool unregisterVoIPLink();
void registerVoIPLink();
void unregisterVoIPLink();
bool init();
bool terminate();
......
......@@ -100,6 +100,10 @@ IAXVoIPLink::~IAXVoIPLink()
bool
IAXVoIPLink::init()
{
// If it was done, don't do it again, until we call terminate()
if (_initDone)
return false;
bool returnValue = false;
//_localAddress = "127.0.0.1";
// port 0 is default
......@@ -128,9 +132,13 @@ IAXVoIPLink::init()
break;
}
nbTry--;
_initDone = true;
}
if (port == IAX_FAILURE || nbTry==0) {
_debug("Fail to initialize iax\n");
_initDone = false;
}
return returnValue;
}
......@@ -138,10 +146,16 @@ IAXVoIPLink::init()
void
IAXVoIPLink::terminate()
{
// iaxc_shutdown();
// hangup all call
terminateIAXCall();
// iax_hangup(calls[callNo].session,"Dumped Call");
// If it was done, don't do it again, until we call init()
if (!_initDone)
return;
// iaxc_shutdown();
// Hangup all calls
terminateIAXCall();
_initDone = false;
}
void
......@@ -154,7 +168,7 @@ IAXVoIPLink::terminateIAXCall()
call = dynamic_cast<IAXCall*>(iter->second);
if (call) {
_mutexIAX.enterMutex();
iax_hangup(call->getSession(),"Dumped Call");
iax_hangup(call->getSession(), "Dumped Call");
_mutexIAX.leaveMutex();
call->setSession(NULL);
delete call; call = NULL;
......@@ -407,6 +421,8 @@ IAXVoIPLink::sendRegister()
// until we unregister.
_nextRefreshStamp = time(NULL) + 10;
result = true;
setRegistrationState(Trying);
}
// unlock
......@@ -432,6 +448,9 @@ IAXVoIPLink::sendUnregister()
_regSession = NULL;
}
_nextRefreshStamp = 0;
setRegistrationState(Unregistered);
return false;
}
......
......@@ -428,8 +428,8 @@ ManagerImpl::initRegisterAccounts()
while( iter != _accountMap.end() ) {
if ( iter->second) {
iter->second->loadConfig();
if ( iter->second->shouldInitOnStart() ) {
if ( iter->second->init() && iter->second->shouldRegisterOnStart()) {
if ( iter->second->isEnabled() ) {
if ( iter->second->init() ) {
iter->second->registerVoIPLink();
}
// init only the first account -- naahh..
......@@ -442,11 +442,12 @@ ManagerImpl::initRegisterAccounts()
}
//THREAD=Main
// Currently unused
bool
ManagerImpl::registerAccount(const AccountID& accountId)
{
_debug("Register VoIP Link\n");
int returnValue = false;
_debug("Register one VoIP Link\n");
// right now, we don't support two SIP account
// so we close everything before registring a new account
Account* account = getAccount(accountId);
......@@ -459,21 +460,22 @@ ManagerImpl::registerAccount(const AccountID& accountId)
}
iter++;
}
returnValue = account->registerVoIPLink();
account->registerVoIPLink();
}
return returnValue;
return true;
}
//THREAD=Main
// Currently unused
bool
ManagerImpl::unregisterAccount(const AccountID& accountId)
{
_debug("Unregister VoIP Link\n");
int returnValue = false;
_debug("Unregister one VoIP Link\n");
if (accountExists( accountId ) ) {
returnValue = getAccount(accountId)->unregisterVoIPLink();
getAccount(accountId)->unregisterVoIPLink();
}
return returnValue;
return true;
}
//THREAD=Main
......@@ -779,7 +781,7 @@ ManagerImpl::registrationSucceed(const AccountID& accountid)
{
Account* acc = getAccount(accountid);
if ( acc ) {
acc->setState(true);
//acc->setState(true);
if (_dbus) _dbus->getConfigurationManager()->accountsChanged();
}
}
......@@ -790,7 +792,7 @@ ManagerImpl::registrationFailed(const AccountID& accountid)
{
Account* acc = getAccount(accountid);
if ( acc ) {
acc->setState(false);
//acc->setState(false);
if (_dbus) _dbus->getConfigurationManager()->accountsChanged();
}
}
......@@ -1556,6 +1558,7 @@ ManagerImpl::getAccountDetails(const AccountID& accountID)
{
std::map<std::string, std::string> a;
std::string accountType;
enum VoIPLink::RegistrationState state = _accountMap[accountID]->getRegistrationState();
accountType = getConfigString(accountID, CONFIG_ACCOUNT_TYPE);
......@@ -1565,12 +1568,12 @@ ManagerImpl::getAccountDetails(const AccountID& accountID)
getConfigString(accountID, CONFIG_ACCOUNT_ALIAS)
)
);
a.insert(
/*a.insert(
std::pair<std::string, std::string>(
CONFIG_ACCOUNT_AUTO_REGISTER,
getConfigString(accountID, CONFIG_ACCOUNT_AUTO_REGISTER)== "1" ? "TRUE": "FALSE"
)
);
);*/
a.insert(
std::pair<std::string, std::string>(
CONFIG_ACCOUNT_ENABLE,
......@@ -1580,7 +1583,10 @@ ManagerImpl::getAccountDetails(const AccountID& accountID)
a.insert(
std::pair<std::string, std::string>(
"Status",
_accountMap[accountID]->getState() ? "REGISTERED": "UNREGISTERED"
(state == VoIPLink::Registered ? "REGISTERED":
(state == VoIPLink::Unregistered ? "UNREGISTERED":
(state == VoIPLink::Trying ? "TRYING":
(state == VoIPLink::Error ? "ERROR": "UNKNOWN"))))
)
);
a.insert(
......@@ -1680,8 +1686,8 @@ ManagerImpl::setAccountDetails( const ::DBus::String& accountID,
std::string accountType = (*details.find(CONFIG_ACCOUNT_TYPE)).second;
setConfig(accountID, CONFIG_ACCOUNT_ALIAS, (*details.find(CONFIG_ACCOUNT_ALIAS)).second);
setConfig(accountID, CONFIG_ACCOUNT_AUTO_REGISTER,
(*details.find(CONFIG_ACCOUNT_AUTO_REGISTER)).second == "TRUE" ? "1": "0" );
//setConfig(accountID, CONFIG_ACCOUNT_AUTO_REGISTER,
// (*details.find(CONFIG_ACCOUNT_AUTO_REGISTER)).second == "TRUE" ? "1": "0" );
setConfig(accountID, CONFIG_ACCOUNT_ENABLE,
(*details.find(CONFIG_ACCOUNT_ENABLE)).second == "TRUE" ? "1": "0" );
setConfig(accountID, CONFIG_ACCOUNT_TYPE, accountType);
......
......@@ -34,63 +34,50 @@ SIPAccount::~SIPAccount()
delete _link;
}
bool
void
SIPAccount::registerVoIPLink()
{
if (_link) {
init(); // init if not enable
unregisterVoIPLink();
SIPVoIPLink* tmplink = dynamic_cast<SIPVoIPLink*> (_link);
if (tmplink) {
// Stuff needed for SIP registration.
tmplink->setProxy (Manager::instance().getConfigString(_accountID,SIP_PROXY));
tmplink->setUserPart(Manager::instance().getConfigString(_accountID,SIP_USER_PART));
tmplink->setAuthName(Manager::instance().getConfigString(_accountID,SIP_AUTH_NAME));
tmplink->setPassword(Manager::instance().getConfigString(_accountID,SIP_PASSWORD));
}
_registered = _link->sendRegister();
init(); // init if not enable
unregisterVoIPLink();
SIPVoIPLink* thislink = dynamic_cast<SIPVoIPLink*> (_link);
if (thislink) {
// Stuff needed for SIP registration.
thislink->setProxy (Manager::instance().getConfigString(_accountID,SIP_PROXY));
thislink->setUserPart(Manager::instance().getConfigString(_accountID,SIP_USER_PART));
thislink->setAuthName(Manager::instance().getConfigString(_accountID,SIP_AUTH_NAME));
thislink->setPassword(Manager::instance().getConfigString(_accountID,SIP_PASSWORD));
}
return _registered;
_link->sendRegister();
}
bool
void
SIPAccount::unregisterVoIPLink()
{
if (_link && _registered) {
_registered = _link->sendUnregister();
}
return !_registered;
_link->sendUnregister();
}
bool
SIPAccount::init()
{
if (_link && !_enabled) {
_link->setFullName(Manager::instance().getConfigString(_accountID,SIP_FULL_NAME));
_link->setHostName(Manager::instance().getConfigString(_accountID,SIP_HOST_PART));
int useStun = Manager::instance().getConfigInt(_accountID,SIP_USE_STUN);
SIPVoIPLink* tmplink = dynamic_cast<SIPVoIPLink*> (_link);
if (tmplink) {
tmplink->setStunServer(Manager::instance().getConfigString(_accountID,SIP_STUN_SERVER));
tmplink->setUseStun( useStun!=0 ? true : false);
}
_link->init();
_enabled = true;
return true;
_link->setFullName(Manager::instance().getConfigString(_accountID,SIP_FULL_NAME));
_link->setHostName(Manager::instance().getConfigString(_accountID,SIP_HOST_PART));
int useStun = Manager::instance().getConfigInt(_accountID,SIP_USE_STUN);
SIPVoIPLink* thislink = dynamic_cast<SIPVoIPLink*> (_link);
if (thislink) {
thislink->setStunServer(Manager::instance().getConfigString(_accountID,SIP_STUN_SERVER));
thislink->setUseStun( useStun!=0 ? true : false);
}
return false;
_link->init();
return true;
}
bool
SIPAccount::terminate()
{
if (_link && _enabled) {
_link->terminate();
_enabled = false;
_link->terminate();
return true;
}
return false;
}
void
......
......@@ -38,8 +38,8 @@ public:
void initConfig(Conf::ConfigTree& config);
/** Actually unuseful, since config loading is done in init() */
void loadConfig();
bool registerVoIPLink();
bool unregisterVoIPLink();
void registerVoIPLink();
void unregisterVoIPLink();
bool init();
bool terminate();
......
......@@ -59,7 +59,6 @@ SIPVoIPLink::SIPVoIPLink(const AccountID& accountID)
_nMsgVoicemail = 0;
_eXosipRegID = EXOSIP_ERROR_STD;
_eXosipStarted = false;
_nbTryListenAddr = 2; // number of times to try to start SIP listener
_localExternPort = 0;
......@@ -77,12 +76,15 @@ SIPVoIPLink::~SIPVoIPLink()
bool
SIPVoIPLink::init()
{
if (!_eXosipStarted) {
if (!_initDone) {
if (0 != eXosip_init()) {
_debug("! SIP Failure: Could not initialize eXosip\n");
return false;
}
_eXosipStarted = true;
// Pour éviter qu'on refasse l'init sans avoir considéré l'erreur,
// s'il y en a une ?
_initDone = true;
// check networking capabilities
if ( !checkNetwork() ) {
......@@ -140,7 +142,11 @@ SIPVoIPLink::init()
_debug(" SIP Init: starting loop thread (SIP events)\n");
_evThread->start();
}
return _eXosipStarted;
_initDone = true;
// Useless
return true;
}
......@@ -149,9 +155,9 @@ void
SIPVoIPLink::terminate()
{
terminateSIPCall();
if (_eXosipStarted) {
if (_initDone) {
eXosip_quit();
_eXosipStarted = false;
_initDone = false;
}
}
......
......@@ -243,7 +243,7 @@ private:
/** EventThread get every incoming events */
EventThread* _evThread;
/** Tell if eXosip was stared (eXosip_init) */
bool _eXosipStarted;
bool _initDone;
/** Registration identifier, needed by unregister to build message */
int _eXosipRegID;
......
......@@ -25,7 +25,7 @@
#include "voiplink.h"
#include "manager.h"
VoIPLink::VoIPLink(const AccountID& accountID) : _accountID(accountID), _localIPAddress("127.0.0.1"), _localPort(0), _registrationError("")
VoIPLink::VoIPLink(const AccountID& accountID) : _accountID(accountID), _localIPAddress("127.0.0.1"), _localPort(0), _registrationError(""), _initDone(false)
{
}
......
......@@ -23,13 +23,16 @@
#define __VOIP_LINK_H__
#include <string>
#include "account.h" // for AccountID
#include "call.h"
#include <map>
#include <cc++/thread.h> // for mutex
class AudioCodec;
//#include "account.h" // for AccountID
// replaced by:
typedef std::string AccountID;
typedef std::map<CallID, Call*> CallMap;
/**
......@@ -179,6 +182,7 @@ protected:
/** Contains all the calls for this Link, protected by mutex */
CallMap _callMap;
/** Mutex to protect call map */
ost::Mutex _callMapMutex;
......@@ -186,6 +190,14 @@ protected:
std::string _localIPAddress;
/** Get local listening port (5060 for SIP, ...) */
unsigned int _localPort;
/** Whether init() was called already or not
*
* This should be used in [IAX|SIP]VoIPLink::init() and terminate(), to
* indicate that init() was called, or reset by terminate().
*/
bool _initDone;
};
#endif // __VOIP_LINK_H__
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment