Commit 3baf3e36 authored by Emmanuel Milou's avatar Emmanuel Milou

nothing

parent 87a17f39
......@@ -657,7 +657,6 @@ enable_account(GtkCellRendererToggle *rend , gchar* path, gpointer data )
// Modify account state
g_hash_table_replace( acc->properties , g_strdup(ACCOUNT_ENABLED) , g_strdup((enable == 1)? "TRUE":"FALSE"));
//dbus_set_account_details(acc);
dbus_send_register( acc->accountID , enable );
}
......
......@@ -44,6 +44,7 @@ sflphoned_CXXFLAGS = -DPREFIX=\"$(prefix)\" -DPROGSHAREDIR=\"${datadir}/sflphone
sflphoned_LDADD = ./libsflphone.la $(SFLPHONE_LIBS) $(ZEROCONFLIB) $(LIB_DNSSD) $(IAX_LIBS) $(EXOSIP_LIBS) $(ALSAFLAG)
AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_srcdir)/libs $(libccext2_CFLAGS) $(libccgnu2_CFLAGS) $(IAX_CFLAGS) $(USER_INCLUDES) $(libdbuscpp_CFLAGS) \
-DCODECS_DIR=\""$(sflcodecdir)"\"
-DENABLE_TRACE
# libsflphone_la_LDFLAGS= -version-info 0:1:0
......
......@@ -25,6 +25,7 @@ EventThread::EventThread (VoIPLink* link) : Thread ()
{
_linkthread = link;
setCancel(cancelDeferred);
stopIt = false;
}
EventThread::~EventThread (void)
......@@ -38,9 +39,27 @@ EventThread::~EventThread (void)
void
EventThread::run (void)
{
while(!testCancel()) {
stopIt = false;
while(!stopIt) {
_linkthread->getEvent();
}
}
void
EventThread::stop( void )
{
stopIt = true;
}
void
EventThread::startLoop( void )
{
stopIt = false;
//start();
}
bool
EventThread::isStopped( void )
{
return stopIt;
}
......@@ -36,10 +36,14 @@ public:
~EventThread (void);
virtual void run ();
virtual void stop();
virtual void startLoop();
bool isStopped();
private:
/** VoIPLink is the object being called by getEvents() method */
VoIPLink* _linkthread;
bool stopIt;
};
#endif // __EVENT_THREAD_H__
......@@ -440,7 +440,6 @@ ManagerImpl::initRegisterAccounts()
if ( iter->second) {
iter->second->loadConfig();
if ( iter->second->isEnabled() ) {
_debug("Init register accounts\n" );
// NOW
iter->second->registerVoIPLink();
iter->second->loadContacts();
......@@ -789,6 +788,7 @@ ManagerImpl::startVoiceMessageNotification(const AccountID& accountId, const std
void
ManagerImpl::stopVoiceMessageNotification(const AccountID& accountId)
{
// TODO : do not notify when no messages
if (_dbus) _dbus->getCallManager()->voiceMailNotify(accountId, 0 );
}
......@@ -817,12 +817,22 @@ ManagerImpl::registrationFailed(const AccountID& accountid)
{
Account* acc = getAccount(accountid);
if ( acc ) {
//acc->setState(false);
_debug("REGISTRATION FAILED\n");
if (_dbus) _dbus->getConfigurationManager()->accountsChanged();
}
}
//THREAD=VoIP
void
ManagerImpl::registrationTrying(const AccountID& accountid)
{
Account* acc = getAccount(accountid);
if ( acc ) {
_debug("REGISTRATION TRYING\n");
if (_dbus) _dbus->getConfigurationManager()->accountsChanged();
}
}
/**
* Multi Thread
*/
......@@ -2117,26 +2127,36 @@ ManagerImpl::sendRegister( const ::DBus::String& accountID , bool expire )
{
// Update the active field
setConfig( accountID, CONFIG_ACCOUNT_ENABLE, expire );
Account* acc = getAccount(accountID);
acc->loadConfig();
if (acc->isEnabled()) {
// Test on the value freshly updated
if ( acc->isEnabled() ) {
// As we don't support multiple SIP account, we have to unregister everything before
AccountMap::iterator iter = _accountMap.begin();
while ( iter != _accountMap.end() ) {
if ( iter->second ) {
setConfig( iter->first , CONFIG_ACCOUNT_ENABLE , false );
iter->second->unregisterVoIPLink();
}
iter++;
}
// Verify we aren't already registered, then register
if (acc->getRegistrationState() != VoIPLink::Registered) {
_debug("SET ACCOUNTS DETAILS - non registered - > registered\n");
//if (acc->getRegistrationState() != VoIPLink::Registered) {
_debug("Send register for account %s\n" , accountID.c_str());
setConfig( accountID , CONFIG_ACCOUNT_ENABLE , true );
acc->registerVoIPLink();
}
//}
} else {
// Verify we are already registered, then unregister
if (acc->getRegistrationState() == VoIPLink::Registered) {
_debug("SET ACCOUNTS DETAILS - registered - > non registered\n");
_debug("Send unregister for account %s\n" , accountID.c_str());
acc->unregisterVoIPLink();
//unregisterAccount(accountID);
}
}
}
void
ManagerImpl::addAccount(const std::map< ::DBus::String, ::DBus::String >& details)
{
......@@ -2288,6 +2308,22 @@ ManagerImpl::associateCallToAccount(const CallID& callID, const AccountID& accou
}
}
AccountID
ManagerImpl::getAccountFromEvent( std::string authname )
{
AccountID id;
AccountMap::iterator iter = _accountMap.begin();
while( iter != _accountMap.end() ){
if( iter -> second != NULL ){
id = iter -> first ;
if(getConfigString( id , SIP_AUTH_NAME ) == authname )
return id;
}
}
return NULL;
}
AccountID
ManagerImpl::getAccountFromCall(const CallID& callID)
{
......
......@@ -208,6 +208,8 @@ public:
void unregistrationSucceed(const AccountID& accountId);
/** Notify the user that registration failed */
void registrationFailed(const AccountID& accountId);
/** Notify the user that registration is trying */
void registrationTrying(const AccountID& accountId);
void sendRegister( const AccountID& accountId , bool expire );
// configuration function requests
......@@ -498,6 +500,10 @@ public:
*/
bool isCurrentCall(const CallID& callId);
/**
* Map accounts parameters ( authname - hostname ) to an account ID
*/
AccountID getAccountFromEvent( std::string authname );
private:
/**
* Create .PROGNAME directory in home user and create
......
......@@ -38,16 +38,17 @@ SIPAccount::~SIPAccount()
void
SIPAccount::registerVoIPLink()
{
_debug("SIPAccount: register account %s\n" , getAccountID().c_str());
_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);
//_link->setAccountID( getAccountID() );
SIPVoIPLink* thislink = dynamic_cast<SIPVoIPLink*> (_link);
thislink->setStunServer(Manager::instance().getConfigString(_accountID,SIP_STUN_SERVER));
thislink->setUseStun( useStun!=0 ? true : false);
_link->init();
// Stuff needed for SIP registration.
thislink->setProxy (Manager::instance().getConfigString(_accountID,SIP_PROXY));
thislink->setUserPart(Manager::instance().getConfigString(_accountID,SIP_USER_PART));
......@@ -59,7 +60,9 @@ SIPAccount::registerVoIPLink()
void
SIPAccount::unregisterVoIPLink()
{
_debug("SIPAccount: unregister account %s\n" , getAccountID().c_str());
_link->sendUnregister();
_debug("Terminate SIP account\n");
_link->terminate();
}
......
......@@ -24,6 +24,7 @@
#include "eventthread.h"
#include "sipcall.h"
#include <sstream> // for ostringstream
#include "sipaccount.h"
#include "manager.h"
#include "user_cfg.h" // SIGNALISATION / PULSE #define
......@@ -56,6 +57,7 @@ SIPVoIPLink::SIPVoIPLink(const AccountID& accountID)
: VoIPLink(accountID), _localExternAddress("")
{
_evThread = new EventThread(this);
_initDone = false;
_nMsgVoicemail = 0;
_eXosipRegID = EXOSIP_ERROR_STD;
......@@ -76,6 +78,7 @@ SIPVoIPLink::~SIPVoIPLink()
bool
SIPVoIPLink::init()
{
_debug("INIT DONE : %d\n" , _initDone);
if (!_initDone) {
if (0 != eXosip_init()) {
_debug("! SIP Failure: Could not initialize eXosip\n");
......@@ -149,18 +152,18 @@ SIPVoIPLink::init()
return true;
}
void
SIPVoIPLink::terminate()
{
_debug("Terminate before\n");
terminateSIPCall();
_debug("Terminate after\n");
if (_initDone) {
// TODO The next line makes the daemon crash on
// account delete if at least one account is registered.
// It should called only when the last account
// is deleted/unregistered.
//eXosip_quit();
// eXosip_quit();
_initDone = false;
}
}
......@@ -168,6 +171,7 @@ SIPVoIPLink::terminate()
void
SIPVoIPLink::terminateSIPCall()
{
ost::MutexLock m(_callMapMutex);
CallMap::iterator iter = _callMap.begin();
SIPCall *call;
......@@ -213,18 +217,17 @@ void
SIPVoIPLink::getEvent()
{
char* tmp2;
const char* localport = ""+_localPort;
eXosip_event_t* event = eXosip_event_wait(0, 50);
eXosip_lock();
eXosip_automatic_action();
eXosip_unlock();
if (event == NULL) {
if ( event == NULL ) {
return;
}
_debugMid("> SIP Event: [cdt=%4d:%4d:%4d] type=#%03d %s = ", event->cid, event->did, event->tid, event->type, event->textinfo);
switch (event->type) {
/* REGISTER related events */
case EXOSIP_REGISTRATION_NEW: /** 00 < announce new registration. */
_debugMid(" !EXOSIP_REGISTRATION_NEW event is not implemented\n");
......@@ -232,18 +235,18 @@ SIPVoIPLink::getEvent()
case EXOSIP_REGISTRATION_SUCCESS: /** 01 < user is successfully registred. */
_debugMid(" !EXOSIP_REGISTRATION_SUCCESS \n");
if(_eXosipRegID == EXOSIP_ERROR_STD){
_debug("Successfully Unregister account ID = %s\n" , getAccountID().c_str());
setRegistrationState(Unregistered);
Manager::instance().unregistrationSucceed(getAccountID());
if( _evThread ) _evThread->stop();
}
else{
_debug("Successfully Register account ID = %s\n" , getAccountID().c_str());
setRegistrationState(Registered);
Manager::instance().registrationSucceed(getAccountID());
}
break;
case EXOSIP_REGISTRATION_FAILURE: /** 02 < user is not registred. */
setRegistrationState(Error, "SIP registration failure.");
_debugMid(" !EXOSIP_REGISTRATION_FAILURE\n");
//Manager::instance().registrationFailed(getAccountID());
break;
case EXOSIP_REGISTRATION_REFRESHED: /** 03 < registration has been refreshed. */
_debugMid(" !EXOSIP_REGISTRATION_REFRESHED event is not implemented\n");
......@@ -448,7 +451,6 @@ SIPVoIPLink::getEvent()
bool
SIPVoIPLink::sendRegister()
{
_debug("SEND REGISTER \n");
if (_eXosipRegID != EXOSIP_ERROR_STD) {
Manager::instance().displayError("! SIP Error: Registration already sent. Try to unregister");
......@@ -507,9 +509,9 @@ SIPVoIPLink::sendRegister()
eXosip_unlock();
return false;
}
eXosip_unlock();
setRegistrationState(Trying);
eXosip_unlock();
return true;
}
......@@ -520,6 +522,12 @@ SIPVoIPLink::SIPFromHeader(const std::string& userpart, const std::string& hostp
return ("\"" + getFullName() + "\"" + " <sip:" + userpart + "@" + hostpart + ">");
}
std::string
SIPVoIPLink::SIPFromHeaderAlternate(const std::string& userpart, const std::string& hostpart)
{
return ("<sip:" + userpart + "@" + hostpart + ">");
}
bool
SIPVoIPLink::sendSIPAuthentification()
{
......@@ -547,7 +555,7 @@ SIPVoIPLink::sendSIPAuthentification()
bool
SIPVoIPLink::sendUnregister()
{
_debug("SEND UNREGISTER\n");
_debug("SEND UNREGISTER for account %s\n" , getAccountID().c_str());
if ( _eXosipRegID == EXOSIP_ERROR_STD) return false;
int eXosipErr = EXOSIP_ERROR_NO;
osip_message_t *reg = NULL;
......@@ -572,8 +580,8 @@ SIPVoIPLink::sendUnregister()
if (eXosipErr == EXOSIP_ERROR_STD) {
_debug("! SIP Failure: Unable to send registration (unregister)\n");
}
eXosip_unlock();
_eXosipRegID = EXOSIP_ERROR_STD;
eXosip_unlock();
return true;
}
......@@ -1517,6 +1525,7 @@ SIPVoIPLink::SIPCallReleased(eXosip_event_t *event)
if (!call) { return; }
// if we are here.. something when wrong before...
_debug("SIP call release\n");
CallID id = call->getCallId();
Manager::instance().callFailure(id);
removeCall(id);
......@@ -1535,7 +1544,6 @@ SIPVoIPLink::SIPMessageNew(eXosip_event_t *event)
}
// Voice message
else if (MSG_IS_NOTIFY(event->request)){
_debug(" > NOTIFY Voice message\n");
int ii;
osip_body_t *body = NULL;
// Get the message body
......@@ -1565,6 +1573,7 @@ SIPVoIPLink::SIPMessageNew(eXosip_event_t *event)
// Set the number of voice-message
int msgVoicemail = atoi(nb_msg.data());
_debug(" > NOTIFY -> %i voice message for account %s\n" , msgVoicemail , getAccountID().c_str());
if (msgVoicemail != 0) {
// If there is at least one voice-message, start notification
......
......@@ -24,13 +24,13 @@
#include <string>
#include <eXosip2/eXosip.h>
#include "audio/audiortp.h"
#include <osip2/osip_mt.h>
class EventThread;
class SIPCall;
/**
* Specific VoIPLink for SIP (SIP core for incoming and outgoing events)
* @author Yan Morin <yan.morin@gmail.com>
*/
class SIPVoIPLink : public VoIPLink
......@@ -113,6 +113,7 @@ private:
* @return SIP URI for from Header
*/
std::string SIPFromHeader(const std::string& userpart, const std::string& hostpart);
std::string SIPFromHeaderAlternate(const std::string& userpart, const std::string& hostpart);
/**
* Build a sip address with the number that you want to call
......@@ -242,8 +243,6 @@ private:
/** To build sdp when call is off-hold */
int sdp_off_hold_call (sdp_message_t * sdp);
/** EventThread get every incoming events */
EventThread* _evThread;
/** Tell if eXosip was stared (eXosip_init) */
......
......@@ -88,17 +88,21 @@ VoIPLink::setRegistrationState(const enum RegistrationState state, const std::st
_registrationState = state;
_registrationError = errorMessage;
std::string acc_ID = getAccountID();
_debug("Set registration state for account %s\n" , acc_ID.c_str());
switch (state) {
case Registered:
Manager::instance().registrationSucceed(getAccountID());
Manager::instance().registrationSucceed(acc_ID);
break;
case Trying:
//Manager::instance(). some function to say that
Manager::instance().registrationTrying( acc_ID);
break;
case Error:
Manager::instance().registrationFailed(getAccountID());
Manager::instance().registrationFailed(acc_ID);
break;
case Unregistered:
Manager::instance().unregistrationSucceed(acc_ID);
break;
}
}
......
......@@ -122,6 +122,11 @@ public:
*/
AccountID& getAccountID(void) { return _accountID; }
/**
* Set parent Account's ID
*/
void setAccountID( const AccountID& accountID) { _accountID = accountID; }
/** Get the call pointer from the call map (protected by mutex)
* @param id A Call ID
* @return call pointer or 0
......
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