static void iaxc_dump_one_call(int callNo) { if ( callNo < 0 ) return; if ( calls[callNo].state == IAXC_CALL_STATE_FREE ) return; iax_hangup(calls[callNo].session,"Dumped Call"); iaxci_usermsg(IAXC_STATUS, "Hanging up call %d", callNo); iaxc_clear_call(callNo); }
void IAXVoIPLink::hangup(const std::string& id) { IAXCall* call = getIAXCall(id); if (call == NULL) throw VoipLinkException("Could not find call"); Manager::instance().getMainBuffer()->unBindAll(call->getCallId()); mutexIAX_.enter(); iax_hangup(call->session, (char*) "Dumped Call"); mutexIAX_.leave(); call->session = NULL; removeCall(id); }
void IAXVoIPLink::terminate() { if (!initDone_) return; ost::MutexLock m(callMapMutex_); for (CallMap::iterator iter = callMap_.begin(); iter != callMap_.end(); ++iter) { IAXCall *call = dynamic_cast<IAXCall*>(iter->second); if (call) { ost::MutexLock lock(mutexIAX_); iax_hangup(call->session, const_cast<char*>("Dumped Call")); delete call; } } callMap_.clear(); initDone_ = false; }
static void iaxc_handle_network_event(struct iax_event *e, int callNo) { if ( callNo < 0 ) return; iaxc_note_activity(callNo); switch ( e->etype ) { case IAX_EVENT_NULL: break; case IAX_EVENT_HANGUP: iaxci_usermsg(IAXC_STATUS, "Call disconnected by remote"); // XXX does the session go away now? iaxc_clear_call(callNo); break; case IAX_EVENT_REJECT: iaxci_usermsg(IAXC_STATUS, "Call rejected by remote"); iaxc_clear_call(callNo); break; case IAX_EVENT_ACCEPT: calls[callNo].format = e->ies.format & IAXC_AUDIO_FORMAT_MASK; calls[callNo].vformat = e->ies.format & IAXC_VIDEO_FORMAT_MASK; if ( !(e->ies.format & IAXC_VIDEO_FORMAT_MASK) ) { iaxci_usermsg(IAXC_NOTICE, "Failed video codec negotiation."); } iaxci_usermsg(IAXC_STATUS,"Call %d accepted", callNo); break; case IAX_EVENT_ANSWER: calls[callNo].state &= ~IAXC_CALL_STATE_RINGING; calls[callNo].state |= IAXC_CALL_STATE_COMPLETE; iaxci_do_state_callback(callNo); iaxci_usermsg(IAXC_STATUS,"Call %d answered", callNo); //iaxc_answer_call(callNo); // notify the user? break; case IAX_EVENT_BUSY: calls[callNo].state &= ~IAXC_CALL_STATE_RINGING; calls[callNo].state |= IAXC_CALL_STATE_BUSY; iaxci_do_state_callback(callNo); iaxci_usermsg(IAXC_STATUS, "Call %d busy", callNo); break; case IAX_EVENT_VOICE: handle_audio_event(e, callNo); if ( (calls[callNo].state & IAXC_CALL_STATE_OUTGOING) && (calls[callNo].state & IAXC_CALL_STATE_RINGING) ) { calls[callNo].state &= ~IAXC_CALL_STATE_RINGING; calls[callNo].state |= IAXC_CALL_STATE_COMPLETE; iaxci_do_state_callback(callNo); iaxci_usermsg(IAXC_STATUS,"Call %d progress", callNo); } break; #ifdef USE_VIDEO case IAX_EVENT_VIDEO: handle_video_event(e, callNo); break; #endif case IAX_EVENT_TEXT: handle_text_event(e, callNo); break; case IAX_EVENT_RINGA: calls[callNo].state |= IAXC_CALL_STATE_RINGING; iaxci_do_state_callback(callNo); iaxci_usermsg(IAXC_STATUS,"Call %d ringing", callNo); break; case IAX_EVENT_PONG: generate_netstat_event(callNo); break; case IAX_EVENT_URL: handle_url_event(e, callNo); break; case IAX_EVENT_CNG: /* ignore? */ break; case IAX_EVENT_TIMEOUT: iax_hangup(e->session, "Call timed out"); iaxci_usermsg(IAXC_STATUS, "Call %d timed out.", callNo); iaxc_clear_call(callNo); break; case IAX_EVENT_TRANSFER: calls[callNo].state |= IAXC_CALL_STATE_TRANSFER; iaxci_do_state_callback(callNo); iaxci_usermsg(IAXC_STATUS,"Call %d transfer released", callNo); break; case IAX_EVENT_DTMF: iaxci_do_dtmf_callback(callNo,e->subclass); iaxci_usermsg(IAXC_STATUS, "DTMF digit %c received", e->subclass); break; default: iaxci_usermsg(IAXC_STATUS, "Unknown event: %d for call %d", e->etype, callNo); break; } }