diff --git a/src/audio/audiortp.cpp b/src/audio/audiortp.cpp index 36f8b357f15b02d04157d5d43bf6f5e46711095a..3dcd3ec5ec3fd5ad4eb01a4d8843baf61ffd86b4 100644 --- a/src/audio/audiortp.cpp +++ b/src/audio/audiortp.cpp @@ -280,7 +280,7 @@ AudioRtpRTX::receiveSessionForSpkr (int16* data_for_speakers, // Notify (with a beep) an incoming call when there is already a call countTime += time->getSecond(); - if (Manager::instance().incomingCallWaiting()) { + if (Manager::instance().incomingCallWaiting() > 0) { countTime = countTime % 4000; if (countTime < 100 and countTime > 0) { Manager::instance().notificationIncomingCall(); diff --git a/src/gui/guiframework.h b/src/gui/guiframework.h index c4fc9f660d739cafe5e1bb2b7372d29336a370b5..d131db8f928888c8bc7975a406b8d88b6e71e456 100644 --- a/src/gui/guiframework.h +++ b/src/gui/guiframework.h @@ -55,6 +55,8 @@ public: short id, TokenList arg) = 0; + virtual void callFailure(short id) = 0; + /* Child class to parent class */ int outgoingCall (const std::string& to); int hangupCall (short id); diff --git a/src/gui/server/guiserverimpl.cpp b/src/gui/server/guiserverimpl.cpp index 7fbad6455f029a2dfa9c167a935f3068998cde86..c91f049da6b4ead43f95073eecd055006c1e4d85 100644 --- a/src/gui/server/guiserverimpl.cpp +++ b/src/gui/server/guiserverimpl.cpp @@ -408,3 +408,15 @@ GUIServerImpl::update() { } + +void +GUIServerImpl::callFailure(short id) +{ + CallMap::iterator iter = _callMap.find(id); + if ( iter != _callMap.end() ) { + std::ostringstream responseMessage; + responseMessage << iter->second.callId() << " Wrong number"; + + _requestManager.sendResponse(ResponseMessage("504", iter->second.sequenceId(), responseMessage.str())); + } +} diff --git a/src/gui/server/guiserverimpl.h b/src/gui/server/guiserverimpl.h index 51104d3eaeef4641d36248998e7e003e4bf87a42..8b896a42f362101739765d8901832b524dc02045 100644 --- a/src/gui/server/guiserverimpl.h +++ b/src/gui/server/guiserverimpl.h @@ -62,6 +62,7 @@ arg); const std::string& sequenceId, short id, TokenList arg); + void callFailure(short id); bool getEvents(const std::string& sequenceId); bool sendGetEventsEnd(const std::string& sequenceId); diff --git a/src/managerimpl.cpp b/src/managerimpl.cpp index 14436a3fa00f4e24b29b760b9bcf5eaab4bc9982..e3c3a07f7ab4e97657c11c46ecd1718f09dba8b0 100644 --- a/src/managerimpl.cpp +++ b/src/managerimpl.cpp @@ -150,12 +150,10 @@ ManagerImpl::init (void) // If network is available if (getConfigInt(SIGNALISATION, AUTO_REGISTER) && _exist == 1) { - if (registerVoIPLink() != 1) { - _debug("Registration failed\n"); - } - } + registerVoIPLink(); + } } - + } void ManagerImpl::terminate() @@ -353,6 +351,7 @@ ManagerImpl::outgoingCall (const string& to) int ManagerImpl::hangupCall (short id) { + stopTone(); // stop tone, like a 700 error: number not found Not Found Call* call; call = getCall(id); @@ -569,19 +568,26 @@ ManagerImpl::saveConfig (void) /** * Initialize action (main thread) + * Note that Registration is only send if STUN is not activated + * @return 1 if setRegister is call without failure, else return 0 */ int ManagerImpl::registerVoIPLink (void) { - if (_voIPLinkVector.at(DFT_VOIP_LINK)->setRegister() == 0) { - return 1; - } else { - return 0; - } + int returnValue = 0; + if ( !useStun() ) { + if (_voIPLinkVector.at(DFT_VOIP_LINK)->setRegister() == 0) { + returnValue = true; + } else { + _debug("ManagerImpl::registerVoIPLink: Registration Failed\n"); + } + } + return returnValue; } /** * Terminate action (main thread) + * @return 1 if the unregister method is send correctly */ int ManagerImpl::unregisterVoIPLink (void) @@ -982,6 +988,10 @@ void ManagerImpl::callFailure(short id) { playATone(ZT_TONE_BUSY); getCall(id)->setState(Call::Error); + + if (_gui) { + _gui->callFailure(id); + } } /** diff --git a/src/sipvoiplink.cpp b/src/sipvoiplink.cpp index f98c0e562b0dcc6f7a0abd2c3e3c2be595347e7e..386b15980618d3dd8243f91fd35ac7e7f0c589b4 100644 --- a/src/sipvoiplink.cpp +++ b/src/sipvoiplink.cpp @@ -53,6 +53,8 @@ SipVoIPLink::SipVoIPLink (short id) _nMsgVoicemail = 0; _reg_id = -1; // defautlt _sipcallVector object initialization + + _registrationSend = false; } SipVoIPLink::~SipVoIPLink(void) { @@ -216,6 +218,9 @@ SipVoIPLink::setRegister (void) return -1; } + osip_message_set_header (reg, "Event", "Registration"); + osip_message_set_header (reg, "Allow-Events", "presence"); + int i = eXosip_register_send_register (_reg_id, reg); if (i == -2) { _debug("cannot build registration, check the setup\n"); @@ -232,44 +237,53 @@ SipVoIPLink::setRegister (void) manager.error()->setError(0); // subscribe to message one time? - subscribeMessageSummary(); + // subscribeMessageSummary(); + + _registrationSend = true; return i; } +/** + * setUnregister + * unregister if we already send the first registration + * @return -1 if there is an error + */ int SipVoIPLink::setUnregister (void) { - int i = 0; - osip_message_t *reg = NULL; + if ( _registrationSend ) { + int i = 0; + osip_message_t *reg = NULL; - eXosip_lock(); + eXosip_lock(); - if (_reg_id > 0) { - _debug("UNREGISTER\n"); - i = eXosip_register_build_register (_reg_id, 0, ®); - } - - if (_reg_id < 0) { - eXosip_unlock(); - return -1; - } - - i = eXosip_register_send_register (_reg_id, reg); - if (i == -2) { - _debug("cannot build registration, check the setup\n"); - eXosip_unlock(); - return -1; - } - if (i == -1) { - _debug("Registration Failed\n"); + if (_reg_id > 0) { + _debug("UNREGISTER\n"); + i = eXosip_register_build_register (_reg_id, 0, ®); + } + if (_reg_id < 0) { + eXosip_unlock(); + return -1; + } + + i = eXosip_register_send_register (_reg_id, reg); + if (i == -2) { + _debug("(unregister) Cannot build registration, check the setup\n"); + eXosip_unlock(); + return -1; + } + if (i == -1) { + _debug("(unregister) Registration Failed\n"); + eXosip_unlock(); + return -1; + } eXosip_unlock(); + Manager::instance().error()->setError(0); + return i; + } else { + // no registration send before return -1; } - - eXosip_unlock(); - - Manager::instance().error()->setError(0); - return i; } int @@ -787,6 +801,7 @@ SipVoIPLink::getEvent (void) switch (event->response->status_code) { case AUTH_REQUIRED: _debug("EXOSIP_CALL_REQUESTFAILURE :: AUTH_REQUIRED\n"); + setAuthentication(); eXosip_lock(); eXosip_automatic_action(); eXosip_unlock(); @@ -930,12 +945,15 @@ SipVoIPLink::getEvent (void) } break; - case EXOSIP_SUBSCRIPTION_ANSWERED: + case EXOSIP_SUBSCRIPTION_ANSWERED: // 38 eXosip_lock(); eXosip_automatic_action(); eXosip_unlock(); break; + case EXOSIP_SUBSCRIPTION_REQUESTFAILURE: //40 + break; + default: //Manager::instance().displayErrorText(event->type, "getEvent:default"); returnValue = -1; diff --git a/src/sipvoiplink.h b/src/sipvoiplink.h index ee763d88837fa32ebfd1957a094c50d139070ef9..285a5052abffbe897140a7095fce9ece1ebdb7eb 100644 --- a/src/sipvoiplink.h +++ b/src/sipvoiplink.h @@ -215,6 +215,8 @@ private: int _localPort; int _reg_id; int _nMsgVoicemail; + + bool _registrationSend; // unregistered }; #endif // __SIP_VOIP_LINK_H__