diff --git a/src/sipvoiplink.cpp b/src/sipvoiplink.cpp index 3c559c0c74f21a6d7f25c83d6f075c5defb46478..6334e686e1e6292107f9eb5ebdb33f4937639e0f 100644 --- a/src/sipvoiplink.cpp +++ b/src/sipvoiplink.cpp @@ -184,6 +184,9 @@ SIPVoIPLink::sendUnregister() { _debug("SEND UNREGISTER for account %s\n" , getAccountID().c_str()); + if(!_bRegister) + return true; + _bRegister = false; Manager::instance().getUserAgent()->removeAccount(_regc); diff --git a/src/sipvoiplink.h b/src/sipvoiplink.h index 979085a7a9f6a58507a958b1668e69b990cf0105..e8805bcff8c0960162ac3ddaa5044112cf47c2ce 100644 --- a/src/sipvoiplink.h +++ b/src/sipvoiplink.h @@ -213,6 +213,8 @@ class SIPVoIPLink : public VoIPLink void setPortNumber(const std::string& port); bool isRegister() {return _bRegister;} + + void setRegister(bool result) {_bRegister = result;} public: diff --git a/src/useragent.cpp b/src/useragent.cpp index 7fc5c1e4d61e3537e350c897ba5bdb4cb28a8412..009afa64706ef389169977a0b2dd572ab5de5958 100644 --- a/src/useragent.cpp +++ b/src/useragent.cpp @@ -17,6 +17,9 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +#include <string> + + #include <iostream> #include "manager.h" @@ -485,9 +488,18 @@ pj_status_t UserAgent::stunServerResolve() { stun_status = PJ_EPENDING; // Init STUN socket - pj_strdup2(_pool, &stun_adr, _stunServer.data()); - stun_status = pj_sockaddr_in_init(&stun_srv.ipv4, &stun_adr, (pj_uint16_t) 3478); - + size_t pos = _stunServer.find(':'); + if(pos == std::string::npos) { + pj_strdup2(_pool, &stun_adr, _stunServer.data()); + stun_status = pj_sockaddr_in_init(&stun_srv.ipv4, &stun_adr, (pj_uint16_t) 3478); + } else { + std::string serverName = _stunServer.substr(0, pos); + std::string serverPort = _stunServer.substr(pos + 1); + int nPort = atoi(serverPort.data()); + pj_strdup2(_pool, &stun_adr, serverName.data()); + stun_status = pj_sockaddr_in_init(&stun_srv.ipv4, &stun_adr, (pj_uint16_t) nPort); + } + if (stun_status != PJ_SUCCESS) { _debug("UserAgent: Unresolved stun server!\n"); stun_status = pj_gethostbyname(&stun_adr, &he); @@ -556,6 +568,9 @@ void UserAgent::regc_cb(struct pjsip_regc_cbparam *param) { SIPVoIPLink *voipLink; _debug("UserAgent: Account ID is %s, Register result: %d, Status: %d\n", id->data(), param->status, param->code); + voipLink = dynamic_cast<SIPVoIPLink *>(Manager::instance().getAccountLink(*id)); + if(!voipLink) + return; if (param->status == PJ_SUCCESS) { if (param->code < 0 || param->code >= 300) { @@ -563,18 +578,20 @@ void UserAgent::regc_cb(struct pjsip_regc_cbparam *param) { * So checking the code for real result */ Manager::instance().getAccountLink(*id)->setRegistrationState(VoIPLink::Error); - } else + voipLink->setRegister(false); + } else { // Registration/Unregistration is success - voipLink = dynamic_cast<SIPVoIPLink *>(Manager::instance().getAccountLink(*id)); - if(!voipLink) - return; if(voipLink->isRegister()) Manager::instance().getAccountLink(*id)->setRegistrationState(VoIPLink::Registered); - else + else { Manager::instance().getAccountLink(*id)->setRegistrationState(VoIPLink::Unregistered); + voipLink->setRegister(false); + } + } } else { Manager::instance().getAccountLink(*id)->setRegistrationState(VoIPLink::Error); + voipLink->setRegister(false); } }