b/f: stopping failed outbound calls

applications which are doing outbound calls should implement
onFailedOutboundCall if the behavior should be different than
setting stopped.

Reported by Andrei Samusenko
sayer/1.4-spce2.6
Stefan Sayer 15 years ago
parent e6b3af3839
commit 26fdaa8eaf

@ -968,35 +968,27 @@ void ConferenceDialog::onSipReply(const AmSipReply& reply, int old_dlg_status, c
} }
break; break;
case AmSipDialog::Disconnected: default: break;
}
if(!transfer_req.get()){ }
}
disconnectDialout(); void ConferenceDialog::onOutboundCallFailed(const AmSipReply& reply) {
//switch(reply.code){ DBG("Outbound call failed with reply %d %s.\n",
//default: reply.code, reply.reason.c_str());
if(!transfer_req.get()){
disconnectDialout();
AmSessionContainer::instance() AmSessionContainer::instance()
->postEvent(dialout_channel->getConfID(), ->postEvent(dialout_channel->getConfID(),
new DialoutConfEvent(DoConfError, new DialoutConfEvent(DoConfError,
dialout_channel->getConfID())); dialout_channel->getConfID()));
//} } else {
}
else {
dlg.reply(*(transfer_req.get()),reply.code,reply.reason); dlg.reply(*(transfer_req.get()),reply.code,reply.reason);
transfer_req.reset(0); transfer_req.reset(0);
setStopped(); setStopped();
} }
break;
default: break;
}
}
} }
#ifdef WITH_SAS_TTS #ifdef WITH_SAS_TTS

@ -154,6 +154,7 @@ public:
void onSessionStart(const AmSipRequest& req); void onSessionStart(const AmSipRequest& req);
void onBye(const AmSipRequest& req); void onBye(const AmSipRequest& req);
void onOutboundCallFailed(const AmSipReply& reply);
void onSipRequest(const AmSipRequest& req); void onSipRequest(const AmSipRequest& req);
void onSipReply(const AmSipReply& reply, int old_dlg_status, void onSipReply(const AmSipReply& reply, int old_dlg_status,
const string& trans_method); const string& trans_method);

@ -320,8 +320,9 @@ void DSMCall::onSipReply(const AmSipReply& reply, int old_dlg_status, const stri
AmB2BCallerSession::onSipReply(reply,old_dlg_status,trans_method); AmB2BCallerSession::onSipReply(reply,old_dlg_status,trans_method);
if ((old_dlg_status < AmSipDialog::Connected) && }
(dlg.getStatus() == AmSipDialog::Disconnected)) {
void DSMCall::onOutboundCallFailed(const AmSipReply& reply) {
DBG("Outbound call failed with reply %d %s.\n", DBG("Outbound call failed with reply %d %s.\n",
reply.code, reply.reason.c_str()); reply.code, reply.reason.c_str());
map<string, string> params; map<string, string> params;
@ -330,7 +331,6 @@ void DSMCall::onSipReply(const AmSipReply& reply, int old_dlg_status, const stri
engine.runEvent(this, this, DSMCondition::FailedCall, &params); engine.runEvent(this, this, DSMCondition::FailedCall, &params);
setStopped(); setStopped();
} }
}
void DSMCall::onSystemEvent(AmSystemEvent* ev) { void DSMCall::onSystemEvent(AmSystemEvent* ev) {
map<string, string> params; map<string, string> params;

@ -80,6 +80,7 @@ public:
void startSession(); void startSession();
void onCancel(); void onCancel();
void onBye(const AmSipRequest& req); void onBye(const AmSipRequest& req);
void onOutboundCallFailed(const AmSipReply& reply);
void onDtmf(int event, int duration_msec); void onDtmf(int event, int duration_msec);
void onBeforeDestroy(); void onBeforeDestroy();

@ -206,12 +206,6 @@ void WebConferenceDialog::onSipReply(const AmSipReply& reply, int old_dlg_status
AmSipDialog::status2str[old_dlg_status], AmSipDialog::status2str[old_dlg_status],
AmSipDialog::status2str[dlg.getStatus()]); AmSipDialog::status2str[dlg.getStatus()]);
if ((old_dlg_status < AmSipDialog::Connected) &&
(dlg.getStatus() == AmSipDialog::Disconnected)) {
DBG("Call failed.\n");
setStopped();
}
// update status to map // update status to map
if (is_dialout) { if (is_dialout) {
// map AmSipDialog state to WebConferenceState // map AmSipDialog state to WebConferenceState

@ -464,6 +464,10 @@ void AmB2BSession::onInvite2xx(const AmSipReply& reply)
} }
} }
void AmB2BSession::onOutboundCallFailed(const AmSipReply& reply) {
// in B2B session failed B leg is handled in A leg - ignore here
}
int AmB2BSession::relayEvent(AmEvent* ev) int AmB2BSession::relayEvent(AmEvent* ev)
{ {
DBG("AmB2BSession::relayEvent: to other_id='%s'\n", DBG("AmB2BSession::relayEvent: to other_id='%s'\n",

@ -185,6 +185,7 @@ class AmB2BSession: public AmSession
int old_dlg_status, const string& trans_method); int old_dlg_status, const string& trans_method);
void onInvite2xx(const AmSipReply& reply); void onInvite2xx(const AmSipReply& reply);
void onOutboundCallFailed(const AmSipReply& reply);
void onSessionTimeout(); void onSessionTimeout();
void onNoAck(unsigned int cseq); void onNoAck(unsigned int cseq);

@ -906,14 +906,14 @@ void AmSession::onSipReply(const AmSipReply& reply,
AmSipDialog::status2str[old_dlg_status], AmSipDialog::status2str[old_dlg_status],
sess_stopped.get() ? "true" : "false"); sess_stopped.get() ? "true" : "false");
DBG("negotiate_onreply = %s\n", negotiate_onreply?"true":"false");
if (negotiate_onreply) { if (negotiate_onreply) {
if(old_dlg_status < AmSipDialog::Connected){ if(old_dlg_status < AmSipDialog::Connected){
DBG("old is < conn\n");
switch(dlg.getStatus()){ switch(dlg.getStatus()){
case AmSipDialog::Connected: case AmSipDialog::Connected:
DBG("case conn\n");
try { try {
RTPStream()->setMonitorRTPTimeout(true); RTPStream()->setMonitorRTPTimeout(true);
@ -942,7 +942,7 @@ void AmSession::onSipReply(const AmSipReply& reply,
break; break;
case AmSipDialog::Pending: case AmSipDialog::Pending:
DBG("case pending\n");
switch(reply.code){ switch(reply.code){
// todo: 180 with body (remote rbt) // todo: 180 with body (remote rbt)
case 180: { case 180: {
@ -979,7 +979,13 @@ void AmSession::onSipReply(const AmSipReply& reply,
} }
} break; } break;
default: break;// continue waiting. default: break;// continue waiting.
} } break;
case AmSipDialog::Disconnected: {
// status change: <Connected -> Disconnected => outbound call failed
onOutboundCallFailed(reply);
}; break;
} // switch dlg status } // switch dlg status
} // status < Connected } // status < Connected
} //if negotiate_onreply } //if negotiate_onreply
@ -1039,6 +1045,11 @@ void AmSession::onBye(const AmSipRequest& req)
setStopped(); setStopped();
} }
void AmSession::onOutboundCallFailed(const AmSipReply& reply) {
DBG("Outbound call failed. Stopping session.\n");
setStopped();
}
int AmSession::acceptAudio(const string& body, int AmSession::acceptAudio(const string& body,
const string& hdrs, const string& hdrs,
string* sdp_reply) string* sdp_reply)

@ -562,6 +562,9 @@ public:
*/ */
virtual void onBye(const AmSipRequest& req); virtual void onBye(const AmSipRequest& req);
/** onOutboundCallFailed is called when an outbound call fails */
virtual void onOutboundCallFailed(const AmSipReply& reply);
/** Entry point for SIP Requests */ /** Entry point for SIP Requests */
virtual void onSipRequest(const AmSipRequest& req); virtual void onSipRequest(const AmSipRequest& req);

Loading…
Cancel
Save