Update of /usr/cvsroot/asterisk/channels
In directory mongoose.digium.com:/tmp/cvs-serv16816/channels

Modified Files:
        chan_zap.c 
Log Message:
handle polarity reversal hangup indication during an incoming call that is 
still ringing (issue #5191)


Index: chan_zap.c
===================================================================
RCS file: /usr/cvsroot/asterisk/channels/chan_zap.c,v
retrieving revision 1.515
retrieving revision 1.516
diff -u -d -r1.515 -r1.516
--- chan_zap.c  25 Sep 2005 02:28:31 -0000      1.515
+++ chan_zap.c  26 Sep 2005 03:14:44 -0000      1.516
@@ -4140,37 +4140,44 @@
                        }
                        break;
                case ZT_EVENT_POLARITY:
-                       /*
-                        * If we get a Polarity Switch event, check to see
-                        * if we should change the polarity state and
-                        * mark the channel as UP or if this is an indication
-                        * of remote end disconnect. 
-                        */
-                       if (p->polarity == POLARITY_IDLE) {
-                               p->polarity = POLARITY_REV;
-                               if (p->answeronpolarityswitch &&
-                                   ((ast->_state == AST_STATE_DIALING) ||
-                                    (ast->_state == AST_STATE_RINGING))) {
-                                       ast_log(LOG_DEBUG, "Answering on 
polarity switch!\n");
-                                       ast_setstate(p->owner, AST_STATE_UP);
-                               } else 
-                                       ast_log(LOG_DEBUG, "Ignore switch to 
REVERSED Polarity on channel %d, state %d\n", p->channel, ast->_state);
-                       } else if(p->hanguponpolarityswitch &&
+                        /*
+                         * If we get a Polarity Switch event, check to see
+                         * if we should change the polarity state and
+                         * mark the channel as UP or if this is an indication
+                         * of remote end disconnect.
+                         */
+                        if (p->polarity == POLARITY_IDLE) {
+                                p->polarity = POLARITY_REV;
+                                if (p->answeronpolarityswitch &&
+                                    ((ast->_state == AST_STATE_DIALING) ||
+                                     (ast->_state == AST_STATE_RINGING))) {
+                                        ast_log(LOG_DEBUG, "Answering on 
polarity switch!\n");
+                                        ast_setstate(p->owner, AST_STATE_UP);
+                                } else
+                                        ast_log(LOG_DEBUG, "Ignore switch to 
REVERSED Polarity on channel %d, state %d\n", p->channel, ast->_state);
+                       } 
+                       /* Removed else statement from here as it was 
preventing hangups from ever happening*/
+                       /* Added AST_STATE_RING in if statement below to deal 
with calling party hangups that take place when ringing */
+                       if(p->hanguponpolarityswitch &&
                                (p->polarityonanswerdelay > 0) &&
-                               (p->polarity == POLARITY_REV) &&
-                               (ast->_state == AST_STATE_UP)) {
-
+                              (p->polarity == POLARITY_REV) &&
+                               ((ast->_state == AST_STATE_UP) || (ast->_state 
== AST_STATE_RING)) ) {
+                                /* Added log_debug information below to 
provide a better indication of what is going on */
+                               ast_log(LOG_DEBUG, "Polarity Reversal event 
occured - DEBUG 1: channel %d, state %d, pol= %d, aonp= %d, honp= %d, pdelay= 
%d, tv= %d\n", p->channel, ast->_state, p->polarity, p->answeronpolarityswitch, 
p->hanguponpolarityswitch, p->polarityonanswerdelay, ast_tvdiff_ms(ast_tvnow(), 
p->polaritydelaytv) );
+                       
                                if(ast_tvdiff_ms(ast_tvnow(), 
p->polaritydelaytv) > p->polarityonanswerdelay) {
-                                       ast_log(LOG_DEBUG, "Hangup due to 
Reverse Polarity on channel %d\n", p->channel);
+                                       ast_log(LOG_DEBUG, "Polarity Reversal 
detected and now Hanging up on channel %d\n", p->channel);
                                        ast_softhangup(p->owner, 
AST_SOFTHANGUP_EXPLICIT);
                                        p->polarity = POLARITY_IDLE;
                                } else {
-                                       ast_log(LOG_DEBUG, "Ignore Reverse 
Polarity (too close to answer event) on channel %d, state %d\n", p->channel, 
ast->_state);
+                                       ast_log(LOG_DEBUG, "Polarity Reversal 
detected but NOT hanging up (too close to answer event) on channel %d, state 
%d\n", p->channel, ast->_state);
                                }
                        } else {
                                p->polarity = POLARITY_IDLE;
-                               ast_log(LOG_DEBUG, "Ignore switch to IDLE 
Polarity on channel %d, state %d\n", p->channel, ast->_state);
+                               ast_log(LOG_DEBUG, "Ignoring Polarity switch to 
IDLE on channel %d, state %d\n", p->channel, ast->_state);
                        }
+                       /* Added more log_debug information below to provide a 
better indication of what is going on */
+                       ast_log(LOG_DEBUG, "Polarity Reversal event occured - 
DEBUG 2: channel %d, state %d, pol= %d, aonp= %d, honp= %d, pdelay= %d, tv= 
%d\n", p->channel, ast->_state, p->polarity, p->answeronpolarityswitch, 
p->hanguponpolarityswitch, p->polarityonanswerdelay, ast_tvdiff_ms(ast_tvnow(), 
p->polaritydelaytv) );
                        break;
                default:
                        ast_log(LOG_DEBUG, "Dunno what to do with event %d on 
channel %d\n", res, p->channel);
@@ -4180,6 +4187,7 @@
 
 
 
+
 static struct ast_frame *__zt_exception(struct ast_channel *ast)
 {
        struct zt_pvt *p = ast->tech_pvt;

_______________________________________________
Asterisk-Cvs mailing list
[email protected]
http://lists.digium.com/mailman/listinfo/asterisk-cvs

Reply via email to