handle polarity reversal hangup indication during an incoming call that is still...
authorKevin P. Fleming <kpfleming@digium.com>
Mon, 26 Sep 2005 03:14:44 +0000 (03:14 +0000)
committerKevin P. Fleming <kpfleming@digium.com>
Mon, 26 Sep 2005 03:14:44 +0000 (03:14 +0000)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@6661 65c4cc65-6c06-0410-ace0-fbb531ad65f3

channels/chan_zap.c

index ed15c03..c8a8973 100755 (executable)
@@ -4140,37 +4140,44 @@ static struct ast_frame *zt_handle_event(struct ast_channel *ast)
                        }
                        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_handle_event(struct ast_channel *ast)
 
 
 
+
 static struct ast_frame *__zt_exception(struct ast_channel *ast)
 {
        struct zt_pvt *p = ast->tech_pvt;