aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjeremy <jeremy@f38db490-d61c-443f-a65b-d21fe96a405b>2004-12-16 04:25:49 +0000
committerjeremy <jeremy@f38db490-d61c-443f-a65b-d21fe96a405b>2004-12-16 04:25:49 +0000
commitc805315084b5f9803b152eb565bb1253fcb5ed43 (patch)
treeb4995f24e7f34f2ba4afdffda0a38ed5b0bee5c4
parentee9a76e7cb3df0d6b28229e8ae7b1667e4a48c3f (diff)
Properly deal with Q.931 cause codes
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@4470 f38db490-d61c-443f-a65b-d21fe96a405b
-rwxr-xr-xchannels/chan_h323.c27
-rwxr-xr-xchannels/h323/ast_h323.cpp8
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;