[svn-commits] moy: branch moy/mfcr2 r115263 - /team/moy/mfcr2/channels/chan_zap.c

SVN commits to the Digium repositories svn-commits at lists.digium.com
Fri May 2 20:41:44 CDT 2008


Author: moy
Date: Fri May  2 20:41:43 2008
New Revision: 115263

URL: http://svn.digium.com/view/asterisk?view=rev&rev=115263
Log:
handle hangup condition properly when the line is still no UP

Modified:
    team/moy/mfcr2/channels/chan_zap.c

Modified: team/moy/mfcr2/channels/chan_zap.c
URL: http://svn.digium.com/view/asterisk/team/moy/mfcr2/channels/chan_zap.c?view=diff&rev=115263&r1=115262&r2=115263
==============================================================================
--- team/moy/mfcr2/channels/chan_zap.c (original)
+++ team/moy/mfcr2/channels/chan_zap.c Fri May  2 20:41:43 2008
@@ -1391,16 +1391,37 @@
 	/*ast_log(LOG_DEBUG, "Read data from zap channel %d\n", openr2_chan_get_number(r2chan));*/
 }
 
-static void zt_r2_on_call_disconnected(openr2_chan_t *r2chan, openr2_call_disconnect_reason_t reason)
+static int zt_r2_cause_to_ast_cause(openr2_call_disconnect_cause_t cause)
+{
+	switch (cause) {
+	case OR2_CAUSE_BUSY_NUMBER:
+		return AST_CAUSE_BUSY;
+	case OR2_CAUSE_NETWORK_CONGESTION:
+		return AST_CAUSE_CONGESTION;
+	case OR2_CAUSE_OUT_OF_ORDER:
+		return AST_CAUSE_DESTINATION_OUT_OF_ORDER;
+	case OR2_CAUSE_UNASSIGNED_NUMBER:
+		return AST_CAUSE_UNREGISTERED;
+	case OR2_CAUSE_NO_ANSWER:
+		return AST_CAUSE_NO_ANSWER;
+	case OR2_CAUSE_NORMAL_CLEARING:
+		return AST_CAUSE_NORMAL_CLEARING;
+	case OR2_CAUSE_UNSPECIFIED:
+	default:
+		return AST_CAUSE_NOTDEFINED;
+	}	
+}
+
+static void zt_r2_on_call_disconnected(openr2_chan_t *r2chan, openr2_call_disconnect_cause_t cause)
 {
 	struct zt_pvt *p = openr2_chan_get_client_data(r2chan);
 	ast_log(LOG_NOTICE, "MFC/R2 call disconnected on chan %d\n", openr2_chan_get_number(r2chan));
 	if (p->owner) {
 		if (p->owner->_state == AST_STATE_UP) {
 			p->owner->_softhangup |= AST_SOFTHANGUP_DEV;
-		} else {
-			/* should we have this branch at all? */
-			switch (reason) {
+		} else if (openr2_chan_get_direction(r2chan) == OR2_DIR_FORWARD) {
+			/* being the forward side we must report what happened to the call to whoever requested it */
+			switch (cause) {
 			case OR2_CAUSE_BUSY_NUMBER:
 				p->subs[SUB_REAL].needbusy = 1;
 				break;
@@ -1415,6 +1436,9 @@
 			default:
 				p->owner->_softhangup |= AST_SOFTHANGUP_DEV;
 			}
+		} else {
+			/* being the backward side and not UP yet, we only need to request hangup */
+			ast_queue_hangup(p->owner, zt_r2_cause_to_ast_cause(cause));
 		}	
 	}
 	openr2_chan_disconnect_call(r2chan, OR2_CAUSE_NORMAL_CLEARING);




More information about the svn-commits mailing list