From d62caf5eadf14e0fe234a038021af15bcda9d45f Mon Sep 17 00:00:00 2001 From: yanmorin <yanmorin> Date: Thu, 30 Mar 2006 04:56:15 +0000 Subject: [PATCH] VoIPLink integration inside account getAccount() patch for managerimpl Remove old voiplink vector in managerimpl --- src/Makefile.am | 4 ++-- src/account.cpp | 1 + src/account.h | 19 +++++++++++----- src/aixaccount.cpp | 27 +++++++++++++++++++--- src/audio/audiortp.cpp | 3 ++- src/managerimpl.cpp | 51 +++++++++++++++++++----------------------- src/managerimpl.h | 21 +++++++++-------- src/sipaccount.cpp | 28 ++++++++++++++++++++--- src/sipvoiplink.cpp | 5 +++++ src/voIPLink.cpp | 25 --------------------- src/voIPLink.h | 11 +-------- 11 files changed, 106 insertions(+), 89 deletions(-) diff --git a/src/Makefile.am b/src/Makefile.am index b49de9425b..77070875f7 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -16,7 +16,7 @@ SUBDIRS = audio config gui $(ZEROCONFDIR) sflphoned_SOURCES = call.cpp eventthread.cpp main.cpp sipvoiplink.cpp voIPLink.cpp \ sipcall.cpp managerimpl.cpp \ observer.cpp \ - account.cpp sipaccount.cpp aixaccount.cpp accountcreator.cpp + account.cpp sipaccount.cpp aixaccount.cpp accountcreator.cpp aixvoiplink.cpp sflphoned_CXXFLAGS = -DPREFIX=\"$(prefix)\" -DPROGSHAREDIR=\"${datadir}/sflphone\" $(ZEROCONFFLAGS) @@ -40,4 +40,4 @@ libsflphone_la_SOURCES = noinst_LTLIBRARIES = libsflphone.la noinst_HEADERS = managerimpl.h manager.h global.h observer.h eventthread.h sipvoiplink.h user_cfg.h \ call.h voIPLink.h sipcall.h \ - account.h sipaccount.h aixaccount.h accountcreator.h + account.h sipaccount.h aixaccount.h accountcreator.h aixvoiplink.h diff --git a/src/account.cpp b/src/account.cpp index e3f2d88635..20cb189460 100644 --- a/src/account.cpp +++ b/src/account.cpp @@ -22,6 +22,7 @@ Account::Account(const AccountID& accountID) : _accountID(accountID) { _link = 0; + _shouldInitOnStart = false; _enabled = false; _registered = false; diff --git a/src/account.h b/src/account.h index f0cae00b66..3cbdc73887 100644 --- a/src/account.h +++ b/src/account.h @@ -46,6 +46,13 @@ public: */ virtual void initConfig(Conf::ConfigTree& config) = 0; + + /** + * Get the voiplink pointer + * @return the pointer or 0 + */ + inline VoIPLink* getVoIPLink() { return _link; } + /** * Register the account * @return false is an error occurs @@ -78,6 +85,12 @@ private: */ virtual bool createVoIPLink() = 0; +protected: + /** + * Account ID are assign in constructor and shall not changed + */ + AccountID _accountID; + /** * Voice over IP Link contains a listener thread and calls */ @@ -101,12 +114,6 @@ private: */ bool _registered; -protected: - /** - * Account ID are assign in constructor and shall not changed - */ - AccountID _accountID; - }; #endif diff --git a/src/aixaccount.cpp b/src/aixaccount.cpp index 3d071d10cc..f918a21fcc 100644 --- a/src/aixaccount.cpp +++ b/src/aixaccount.cpp @@ -17,10 +17,12 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "aixaccount.h" +#include "aixvoiplink.h" AIXAccount::AIXAccount(const AccountID& accountID) : Account(accountID) { + createVoIPLink(); } @@ -32,30 +34,49 @@ AIXAccount::~AIXAccount() bool AIXAccount::createVoIPLink() { - return false; + if (!_link) { + _link = new AIXVoIPLink(); + } + return (_link != 0 ? true : false); } bool AIXAccount::registerAccount() { - return false; + if (_link && !_registered) { + _registered = (_link->setRegister() >= 0) ? true : false; + } + return _registered; } bool AIXAccount::unregisterAccount() { - return false; + if (_link && _registered) { + _registered = (_link->setUnregister() == 0) ? false : true; + } + return !_registered; } bool AIXAccount::init() { + if (_link && !_enabled) { + _link->init(); + _enabled = true; + return true; + } return false; } bool AIXAccount::terminate() { + if (_link && _enabled) { + _link->terminate(); + _enabled = false; + return true; + } return false; } diff --git a/src/audio/audiortp.cpp b/src/audio/audiortp.cpp index f748bc4149..d4af191490 100644 --- a/src/audio/audiortp.cpp +++ b/src/audio/audiortp.cpp @@ -107,7 +107,8 @@ AudioRtpRTX::AudioRtpRTX (SipCall *sipcall, AudioLayer* driver, bool sym) { #endif // TODO: Change bind address according to user settings. - std::string localipConfig = _ca->getLocalIp(); + // TODO: this should be the local ip not the external (router) IP + std::string localipConfig = "0.0.0.0"; // _ca->getLocalIp(); ost::InetHostAddress local_ip(localipConfig.c_str()); //_debug("AudioRtpRTX ctor : Local IP:port %s:%d\tsymmetric:%d\n", local_ip.getHostname(), _ca->getLocalAudioPort(), _sym); diff --git a/src/managerimpl.cpp b/src/managerimpl.cpp index 8fd6dcbf9d..6cb14fb00a 100644 --- a/src/managerimpl.cpp +++ b/src/managerimpl.cpp @@ -38,7 +38,6 @@ #include "audio/tonelist.h" #include "accountcreator.h" // create new account -#include "sipvoiplink.h" #include "voIPLink.h" #include "call.h" @@ -158,8 +157,6 @@ ManagerImpl::init() } _debugInit("Adding new VoIP Link"); - // Set a sip voip link by default - _voIPLinkVector.push_back(new SipVoIPLink()); // initRegisterVoIP was here, but we doing it after the gui loaded... // the stun detection is long, so it's a better idea to do it after getEvents @@ -170,14 +167,7 @@ void ManagerImpl::terminate() { saveConfig(); - _debug("Removing VoIP Links...\n"); - for(VoIPLinkVector::iterator pos = _voIPLinkVector.begin(); - pos != _voIPLinkVector.end(); - pos++) { - delete *pos; - *pos = NULL; - } - _voIPLinkVector.clear(); + unloadAccountMap(); _debug("Removing calls\n"); _mutex.enterMutex(); @@ -189,8 +179,6 @@ void ManagerImpl::terminate() _callVector.clear(); _mutex.leaveMutex(); - unloadAccountMap(); - _debug("Unload DTMF Key\n"); delete _dtmfKey; @@ -214,7 +202,8 @@ Call * ManagerImpl::pushBackNewCall(CALLID id, Call::CallType type) { ost::MutexLock m(_mutex); - Call* call = new Call(id, type, _voIPLinkVector.at(DFT_VOIP_LINK)); + + Call* call = new Call(id, type, getAccountLink(ACCOUNT_SIP0)); // Set the wanted voip-link (first of the list) _callVector.push_back(call); return call; @@ -308,7 +297,7 @@ ManagerImpl::outgoingCall (const std::string& to) bool ManagerImpl::sendTextMessage(const std::string&, const std::string& to, const std::string& message) { - return _voIPLinkVector.at(DFT_VOIP_LINK)->sendMessage(to, message); + return getAccountLink(ACCOUNT_SIP0)->sendMessage(to, message); } /** @@ -519,7 +508,7 @@ ManagerImpl::initRegisterVoIPLink() int returnValue = true; _debugInit("Initiate VoIP Link Registration\n"); if (_hasTriedToRegister == false) { - if ( _voIPLinkVector.at(DFT_VOIP_LINK)->init() ) { + if ( getAccount(ACCOUNT_SIP0)->init() ) { // we call here, because it's long... // If network is available and exosip is start.. if (getConfigInt(SIGNALISATION, AUTO_REGISTER) && _exist == 1) { @@ -544,8 +533,8 @@ ManagerImpl::registerVoIPLink (void) { _debug("Register VoIP Link\n"); int returnValue = false; - if (_voIPLinkVector.at(DFT_VOIP_LINK)->setRegister() >= 0) { - returnValue = true; + returnValue = getAccount(ACCOUNT_SIP0)->registerAccount(); + if (returnValue) { _registerState = REGISTERED; } else { _registerState = FAILED; @@ -561,11 +550,7 @@ bool ManagerImpl::unregisterVoIPLink (void) { _debug("Unregister VoIP Link\n"); - if (_voIPLinkVector.at(DFT_VOIP_LINK)->setUnregister() == 0) { - return true; - } else { - return false; - } + return getAccount(ACCOUNT_SIP0)->unregisterAccount(); } /** @@ -579,7 +564,7 @@ ManagerImpl::sendDtmf (CALLID id, char code) switch (sendType) { case 0: // SIP INFO playDtmf(code); - _voIPLinkVector.at(DFT_VOIP_LINK)->carryingDTMFdigits(id, code); + getAccountLink(ACCOUNT_SIP0)->carryingDTMFdigits(id, code); returnValue = true; break; @@ -920,10 +905,10 @@ ManagerImpl::displayErrorText (CALLID id, const std::string& message) * for outgoing call, send by SipEvent */ void -ManagerImpl::displayError (const std::string& voIPError) +ManagerImpl::displayError (const std::string& error) { if(_gui) { - _gui->displayError(voIPError); + _gui->displayError(error); } } @@ -1870,7 +1855,7 @@ ManagerImpl::unloadAccountMap() } bool -ManagerImpl::accountExists(AccountID accountID) +ManagerImpl::accountExists(const AccountID& accountID) { AccountMap::iterator iter = _accountMap.find(accountID); if ( iter == 0 || iter == _accountMap.end() ) { @@ -1880,7 +1865,7 @@ ManagerImpl::accountExists(AccountID accountID) } Account* -ManagerImpl::getAccount(AccountID accountID) +ManagerImpl::getAccount(const AccountID& accountID) { AccountMap::iterator iter = _accountMap.find(accountID); if ( iter == 0 || iter == _accountMap.end() ) { @@ -1889,6 +1874,16 @@ ManagerImpl::getAccount(AccountID accountID) return iter->second; } +VoIPLink* +ManagerImpl::getAccountLink(const AccountID& accountID) +{ + Account* acc = getAccount(accountID); + if ( acc ) { + return acc->getVoIPLink(); + } + return 0; +} + void ManagerImpl::initConfigAccount() { AccountMap::iterator iter = _accountMap.begin(); diff --git a/src/managerimpl.h b/src/managerimpl.h index bf80c7d654..7e37bc9f56 100644 --- a/src/managerimpl.h +++ b/src/managerimpl.h @@ -48,6 +48,7 @@ class GuiFramework; class TelephoneTone; class VoIPLink; + #ifdef USE_ZEROCONF class DNSService; #endif @@ -69,11 +70,6 @@ class DNSService; */ typedef std::vector< Call* > CallVector; -/* - * Define a type for a list of VoIPLink - */ -typedef std::vector< VoIPLink* > VoIPLinkVector; - /** * Define a type for a CallID to AccountID Map inside ManagerImpl */ @@ -105,8 +101,6 @@ public: // it's multi-thread and use mutex internally AudioLayer* getAudioDriver(void) const { return _audiodriverPA ;} - // Accessor to VoIPLinkVector - VoIPLinkVector* getVoIPLinkVector (void) {return &_voIPLinkVector;} // Codec Descriptor CodecDescriptorMap& getCodecDescriptorMap(void) {return _codecDescriptorMap;} @@ -328,8 +322,6 @@ private: // // Multithread variable with extern accessor and change only inside the main thread // - /** Vector of VoIPLink */ - VoIPLinkVector _voIPLinkVector; /** Vector of CodecDescriptor */ CodecDescriptor* _codecBuilder; @@ -477,14 +469,21 @@ private: * Tell if an account exists * @param accountID account ID check */ - bool accountExists(AccountID accountID); + bool accountExists(const AccountID& accountID); /** * Get an account pointer * @param accountID account ID to get * @param the account pointer or 0 */ - Account* getAccount(AccountID accountID); + Account* getAccount(const AccountID& accountID); + + /** + * Get the voip link from the account pointer + * @param accountID account ID to get + * @param the voip link from the account pointer or 0 + */ + VoIPLink* getAccountLink(const AccountID& accountID); /** * load default account variable for each protocol diff --git a/src/sipaccount.cpp b/src/sipaccount.cpp index 40f8286dcc..153d2d172f 100644 --- a/src/sipaccount.cpp +++ b/src/sipaccount.cpp @@ -17,6 +17,8 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "sipaccount.h" +#include "sipvoiplink.h" + #define SIP_FULL_NAME "SIP.fullName" #define SIP_USER_PART "SIP.userPart" #define SIP_AUTH_USER_NAME "SIP.username" @@ -31,6 +33,7 @@ SIPAccount::SIPAccount(const AccountID& accountID) : Account(accountID) { + createVoIPLink(); } @@ -42,30 +45,49 @@ SIPAccount::~SIPAccount() bool SIPAccount::createVoIPLink() { - return false; + if (!_link) { + _link = new SipVoIPLink(); + } + return (_link != 0 ? true : false); } bool SIPAccount::registerAccount() { - return false; + if (_link && !_registered) { + _registered = (_link->setRegister() >= 0) ? true : false; + } + return _registered; } bool SIPAccount::unregisterAccount() { - return false; + if (_link && _registered) { + _registered = (_link->setUnregister() == 0) ? false : true; + } + return !_registered; } bool SIPAccount::init() { + if (_link && !_enabled) { + _link->init(); + _enabled = true; + return true; + } return false; } bool SIPAccount::terminate() { + if (_link && _enabled) { + _link->terminate(); + _enabled = false; + return true; + } return false; } diff --git a/src/sipvoiplink.cpp b/src/sipvoiplink.cpp index ca05212e31..314f462852 100644 --- a/src/sipvoiplink.cpp +++ b/src/sipvoiplink.cpp @@ -53,6 +53,7 @@ SipVoIPLink::SipVoIPLink() : VoIPLink() _registrationSend = false; _started = false; + _localIpAddress = "127.0.0.1"; // sipvoip require this value to check network } SipVoIPLink::~SipVoIPLink(void) { @@ -87,6 +88,10 @@ SipVoIPLink::checkNetwork (void) bool SipVoIPLink::init(void) { + // TODO: should be inside the account + _fullname = Manager::instance().getConfigString(SIGNALISATION,FULL_NAME) ; + _hostname = Manager::instance().getConfigString(SIGNALISATION,HOST_PART); + if (0 != eXosip_init()) { _debug("Could not initialize eXosip\n"); return false; diff --git a/src/voIPLink.cpp b/src/voIPLink.cpp index a5372cb98a..6ff6b56172 100644 --- a/src/voIPLink.cpp +++ b/src/voIPLink.cpp @@ -26,25 +26,12 @@ VoIPLink::VoIPLink () { - initConstructor(); } VoIPLink::~VoIPLink (void) { } -void -VoIPLink::setType (VoIPLinkType type) -{ - _type = type; -} - -VoIPLinkType -VoIPLink::getType (void) -{ - return _type; -} - void VoIPLink::setFullName (const std::string& fullname) { @@ -80,15 +67,3 @@ VoIPLink::getLocalIpAddress (void) { return _localIpAddress; } - -void -VoIPLink::initConstructor(void) -{ - _type = Sip; - // TODO: should be inside the account - _fullname = -Manager::instance().getConfigString(SIGNALISATION,FULL_NAME -) ; - _hostname = Manager::instance().getConfigString(SIGNALISATION,HOST_PART); - _localIpAddress = "127.0.0.1"; // sipvoip require this value to check network -} diff --git a/src/voIPLink.h b/src/voIPLink.h index d6802e1b6d..bfd7f957ee 100644 --- a/src/voIPLink.h +++ b/src/voIPLink.h @@ -24,11 +24,6 @@ #include <string> #include "call.h" -enum VoIPLinkType { - Sip = 0, - Iax -}; - class AudioCodec; class Call; @@ -58,8 +53,6 @@ public: virtual AudioCodec* getAudioCodec (CALLID id) = 0; virtual bool sendMessage(const std::string& to, const std::string& body) = 0; - void setType (VoIPLinkType type); - VoIPLinkType getType (void); void setFullName (const std::string& fullname); std::string getFullName (void); void setHostName (const std::string& hostname); @@ -67,10 +60,8 @@ public: void setLocalIpAddress (const std::string& ipAdress); std::string getLocalIpAddress (void); -private: - void initConstructor(void); +protected: - VoIPLinkType _type; std::string _fullname; std::string _hostname; std::string _localIpAddress; -- GitLab