From c49adea89c9a928f6012af0230339b6f966ba783 Mon Sep 17 00:00:00 2001 From: Jeremy McNamara Date: Thu, 16 Dec 2004 04:25:49 +0000 Subject: [PATCH] Properly deal with Q.931 cause codes git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@4470 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- channels/chan_h323.c | 27 ++++++++++++++++++++++----- channels/h323/ast_h323.cpp | 8 +++++--- 2 files changed, 27 insertions(+), 8 deletions(-) diff --git a/channels/chan_h323.c b/channels/chan_h323.c index a8404682ab..5457f17028 100755 --- a/channels/chan_h323.c +++ b/channels/chan_h323.c @@ -463,7 +463,6 @@ static struct oh323_peer *build_peer(char *name, struct ast_variable *v) */ static int oh323_digit(struct ast_channel *c, char digit) { - ast_log(LOG_DEBUG, "Sending %c...\n", digit); struct oh323_pvt *p = (struct oh323_pvt *) c->pvt->pvt; if (p && p->rtp && (p->dtmfmode & H323_DTMF_RFC2833)) { ast_rtp_senddigit(p->rtp, digit); @@ -542,9 +541,8 @@ static int oh323_hangup(struct ast_channel *c) { struct oh323_pvt *pvt = (struct oh323_pvt *) c->pvt->pvt; int needcancel = 0; - if (h323debug) { - ast_log(LOG_DEBUG, "oh323_hangup(%s)\n", c->name); - } + int q931cause = AST_CAUSE_NORMAL_CLEARING; + if (!c->pvt->pvt) { ast_log(LOG_DEBUG, "Asked to hangup channel not connected\n"); return 0; @@ -568,9 +566,28 @@ static int oh323_hangup(struct ast_channel *c) pvt->owner = NULL; c->pvt->pvt = NULL; + if (c->hangupcause) { + q931cause = c->hangupcause; + } else { + char *cause = pbx_builtin_getvar_helper(c, "DIALSTATUS"); + if (cause) { + if (!strcmp(cause, "CONGESTION")) { + q931cause = AST_CAUSE_NORMAL_CIRCUIT_CONGESTION; + } else if (!strcmp(cause, "BUSY")) { + q931cause = AST_CAUSE_USER_BUSY; + } else if (!strcmp(cause, "CHANISUNVAIL")) { + q931cause = AST_CAUSE_REQUESTED_CHAN_UNAVAIL; + } else if (!strcmp(cause, "NOANSWER")) { + q931cause = AST_CAUSE_NO_ANSWER; + } else if (!strcmp(cause, "CANCEL")) { + q931cause = AST_CAUSE_CALL_REJECTED; + } + } + } + /* Start the process if it's not already started */ if (!pvt->alreadygone) { - if (h323_clear_call((pvt->cd).call_token, c->hangupcause)) { + if (h323_clear_call((pvt->cd).call_token, q931cause)) { ast_log(LOG_DEBUG, "ClearCall failed.\n"); } pvt->needdestroy = 1; diff --git a/channels/h323/ast_h323.cpp b/channels/h323/ast_h323.cpp index fc77e9b857..91e8b85c16 100755 --- a/channels/h323/ast_h323.cpp +++ b/channels/h323/ast_h323.cpp @@ -301,7 +301,7 @@ BOOL MyH323EndPoint::ClearCall(const PString & token) if (h323debug) { cout << "\t-- ClearCall: Request to clear call with token " << token << endl; } - return ClearCall(token, H323Connection::EndedByLocalUser); + return H323EndPoint::ClearCall(token, H323Connection::EndedByLocalUser); } void MyH323EndPoint::SendUserTone(const PString &token, char tone) @@ -1287,13 +1287,15 @@ int h323_make_call(char *dest, call_details_t *cd, call_options_t *call_options) int h323_clear_call(const char *call_token, int cause) { H225_ReleaseCompleteReason dummy; - H323Connection::CallEndReason r = H323Connection::NumCallEndReasons; + H323Connection::CallEndReason r = H323Connection::EndedByLocalUser; if (!h323_end_point_exist()) { return 1; } - r = H323TranslateToCallEndReason((Q931::CauseValues)(cause), dummy); + if (cause) { + r = H323TranslateToCallEndReason((Q931::CauseValues)(cause), dummy); + } endPoint->ClearCall(PString(call_token), r); return 0;