]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
OPENZAP-112 --resolve
authorMoises Silva <moy@sangoma.com>
Sun, 7 Aug 2011 01:29:46 +0000 (21:29 -0400)
committerMoises Silva <moy@sangoma.com>
Sun, 7 Aug 2011 01:32:21 +0000 (21:32 -0400)
libs/freetdm/conf/freetdm.conf.xml
libs/freetdm/mod_freetdm/mod_freetdm.c
libs/freetdm/src/ftmod/ftmod_analog/ftdm_analog.h
libs/freetdm/src/ftmod/ftmod_analog/ftmod_analog.c
libs/freetdm/src/ftmod/ftmod_zt/ftmod_zt.c
libs/freetdm/src/ftmod/ftmod_zt/ftmod_zt.h

index dd426b089a1dd611ce28be7bbc5c05668959ab78..d8fa55c8cb3ac35edb691a6a7cd72c70f16e9a56 100644 (file)
@@ -75,6 +75,11 @@ with the signaling protocols that you can run on top of your I/O interfaces.
                        <param name="polarity-delay" value="600"/>
                        -->
 
+                       <!-- Retrieve caller id on polarity reverse -->
+                       <!-- 
+                       <param name="polarity-callerid" value="true"/>
+                       -->
+
                        <!-- regex to stop dialing when it matches -->
                        <!--<param name="dial-regex" value="5555"/>-->
 
index c3ca4786d5ef74d0f49a7973762a4bef33767771..9d6eac94f5283160bea1b0b8c36d8d045f4479ca 100755 (executable)
@@ -3021,6 +3021,7 @@ static switch_status_t load_config(void)
                        const char *enable_callerid = "true";
                        const char *answer_polarity = "false";
                        const char *hangup_polarity = "false";
+                       const char *polarity_callerid = "false";
                        int polarity_delay = 600;
                        int callwaiting = 1;
                        int dialtone_timeout = 5000;
@@ -3102,6 +3103,8 @@ static switch_status_t load_config(void)
                                        hangup_polarity = val;
                                } else if (!strcasecmp(var, "polarity-delay")) {
                                        polarity_delay = atoi(val);
+                               } else if (!strcasecmp(var, "polarity-callerid")) {
+                                       polarity_callerid = val;
                                } else if (!strcasecmp(var, "fail-dial-regex")) {
                                        fail_dial_regex = val;
                                } else if (!strcasecmp(var, "hold-music")) {
@@ -3164,6 +3167,7 @@ static switch_status_t load_config(void)
                                                                   "enable_callerid", enable_callerid,
                                                                   "answer_polarity_reverse", answer_polarity,
                                                                   "hangup_polarity_reverse", hangup_polarity,
+                                                                  "polarity_callerid", polarity_callerid,
                                                                   "polarity_delay", &polarity_delay,
                                                                   "callwaiting", &callwaiting,
                                                                   "wait_dialtone_timeout", &dialtone_timeout,
index 39cbc5ff2b2d786e71304346bc14f2fb48b3fe09..a2339120c584906a0071759b4ef6875a407a0c2b 100644 (file)
@@ -39,7 +39,8 @@ typedef enum {
        FTDM_ANALOG_RUNNING = (1 << 0),
        FTDM_ANALOG_CALLERID = (1 << 1),
        FTDM_ANALOG_ANSWER_POLARITY_REVERSE = (1 << 2),
-       FTDM_ANALOG_HANGUP_POLARITY_REVERSE = (1 << 3)
+       FTDM_ANALOG_HANGUP_POLARITY_REVERSE = (1 << 3),
+       FTDM_ANALOG_POLARITY_CALLERID = (1 << 4)
 } ftdm_analog_flag_t;
 
 #define FTDM_MAX_HOTLINE_STR           20
index 27eecb4f7f992c86dcc163709e97bfcca37219c1..cfbc4807f383109b8d988f418834d3d42d06a581 100644 (file)
@@ -275,6 +275,15 @@ static FIO_SIG_CONFIGURE_FUNCTION(ftdm_analog_configure_span)
                                break;
                        }
                        hotline = val;
+               } else if (!strcasecmp(var, "polarity_callerid")) {
+                       if (!(val = va_arg(ap, char *))) {
+                               break;
+                       }
+                       if (ftdm_true(val)) {
+                               flags |= FTDM_ANALOG_POLARITY_CALLERID;
+                       } else {
+                               flags &= ~FTDM_ANALOG_POLARITY_CALLERID;
+                       }
                } else {
                        ftdm_log(FTDM_LOG_ERROR, "Unknown parameter %s in span %s\n", var, span->name);
                }                       
@@ -1130,8 +1139,18 @@ static __inline__ ftdm_status_t process_event(ftdm_span_t *span, ftdm_event_t *e
                                break;
                        }
                        if (event->channel->state == FTDM_CHANNEL_STATE_DOWN) {
-                               ftdm_log_chan_msg(event->channel, FTDM_LOG_DEBUG, 
-                                       "Ignoring polarity reversal because this channel is down\n");
+                               if (ftdm_test_flag(analog_data, FTDM_ANALOG_CALLERID) 
+                                   && ftdm_test_flag(analog_data, FTDM_ANALOG_POLARITY_CALLERID)) {
+                                       ftdm_log_chan_msg(event->channel, "Polarity reversal detected while down, getting caller id now\n");
+                                       ftdm_set_state(event->channel, FTDM_CHANNEL_STATE_GET_CALLERID);
+                                       event->channel->ring_count = 1;
+                                       ftdm_mutex_unlock(event->channel->mutex);
+                                       locked = 0;
+                                       ftdm_thread_create_detached(ftdm_analog_channel_run);
+                               } else {
+                                       ftdm_log_chan_msg(event->channel, FTDM_LOG_DEBUG, 
+                                               "Ignoring polarity reversal because this channel is down\n");
+                               }
                                break;
                        }
                        /* we have a good channel, set the polarity flag and let the channel thread deal with it */
index 982412d334e8f7c68a13b1f86cf34872e580ba6e..4e7914685bc74c741bc9911aa597eb0034d02d4d 100644 (file)
  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Contributors: 
+ *
+ * Moises Silva <moy@sangoma.com>
+ * W McRoberts <fs@whmcr.com>
+ *
  */
 
 #include "private/ftdm_core.h"
@@ -94,6 +100,7 @@ struct ioctl_codes {
     ioctlcmd ECHOTRAIN;
     ioctlcmd SETTXBITS;
     ioctlcmd GETRXBITS;
+    ioctlcmd SETPOLARITY;
 };
 
 /**
@@ -169,7 +176,8 @@ static struct ioctl_codes dahdi_ioctl_codes = {
     .GETCONFMUTE = DAHDI_GETCONFMUTE,
     .ECHOTRAIN = DAHDI_ECHOTRAIN,
     .SETTXBITS = DAHDI_SETTXBITS,
-    .GETRXBITS = DAHDI_GETRXBITS
+    .GETRXBITS = DAHDI_GETRXBITS,
+    .SETPOLARITY = DAHDI_SETPOLARITY
 };
 
 #define ZT_INVALID_SOCKET -1
@@ -826,6 +834,15 @@ static FIO_COMMAND_FUNCTION(zt_command)
                        err = ioctl(ftdmchan->sockfd, codes.FLUSH, &flushmode);
                }
                break;
+       case FTDM_COMMAND_SET_POLARITY:
+               {
+                       ftdm_polarity_t polarity = FTDM_COMMAND_OBJ_INT;
+                       err = ioctl(ftdmchan->sockfd, codes.SETPOLARITY, polarity);
+                       if (!err) {
+                               ftdmchan->polarity = polarity;
+                       }
+               }
+               break;
        case FTDM_COMMAND_FLUSH_RX_BUFFERS:
                {
                        int flushmode = ZT_FLUSH_READ;
@@ -1088,6 +1105,12 @@ static __inline__ ftdm_status_t zt_channel_process_event(ftdm_channel_t *fchan,
                        *event_id = FTDM_OOB_NOOP;      /* What else could we do? */
                }
                break;
+       case ZT_EVENT_POLARITY:
+               {
+                       ftdm_log_chan_msg(fchan, FTDM_LOG_ERROR, "Got polarity reverse (ZT_EVENT_POLARITY)\n");
+                       *event_id = FTDM_OOB_POLARITY_REVERSE;
+               }
+               break;
        case ZT_EVENT_NONE:
                {
                        ftdm_log_chan_msg(fchan, FTDM_LOG_DEBUG, "No event\n");
index cf5479dba1a2f894f575b9f13b5e428c52cf1c95..065d7e63e2ef4957d2f81246ff8ee127b3146f47 100644 (file)
  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Contributors: 
+ *
+ * Moises Silva <moy@sangoma.com>
+ * W McRoberts <fs@whmcr.com>
+ *
  */
 
 #ifndef FTDM_ZT_H
@@ -349,6 +355,7 @@ ZT_ABIT = 8
 #define DAHDI_SETTXBITS _IOW (DAHDI_CODE, 43, int)
 #define DAHDI_GETRXBITS _IOR (DAHDI_CODE, 43, int)
 
+#define DAHDI_SETPOLARITY _IOW (DAHDI_CODE, 92, int) /* Polarity setting for FXO lines */
 
 #endif