diff options
author | jeremy <jeremy@f38db490-d61c-443f-a65b-d21fe96a405b> | 2004-12-16 04:25:49 +0000 |
---|---|---|
committer | jeremy <jeremy@f38db490-d61c-443f-a65b-d21fe96a405b> | 2004-12-16 04:25:49 +0000 |
commit | c805315084b5f9803b152eb565bb1253fcb5ed43 (patch) | |
tree | b4995f24e7f34f2ba4afdffda0a38ed5b0bee5c4 /channels | |
parent | ee9a76e7cb3df0d6b28229e8ae7b1667e4a48c3f (diff) |
Properly deal with Q.931 cause codes
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@4470 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'channels')
-rwxr-xr-x | channels/chan_h323.c | 27 | ||||
-rwxr-xr-x | 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 a8404682a..5457f1702 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 fc77e9b85..91e8b85c1 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; |