]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
add some options
authorAnthony Minessale <anthony.minessale@gmail.com>
Fri, 25 Jan 2008 16:42:06 +0000 (16:42 +0000)
committerAnthony Minessale <anthony.minessale@gmail.com>
Fri, 25 Jan 2008 16:42:06 +0000 (16:42 +0000)
git-svn-id: http://svn.openzap.org/svn/openzap/trunk@372 a93c3328-9c30-0410-af19-c9cd2b2d52af

libs/openzap/conf/openzap.conf.xml
libs/openzap/mod_openzap/mod_openzap.c
libs/openzap/src/zap_analog.c
libs/openzap/src/zap_zt.c

index 45780e97874ff28f1aea7fceb25b0f9d4281df4e..1ca75c0e2129e04867b216839159660963fe7cd1 100644 (file)
@@ -1,9 +1,16 @@
 <configuration name="openzap.conf" description="OpenZAP Configuration">
   <settings>
     <param name="debug" value="0"/>
+    <!--<param name="hold-music" value="$${moh_uri}"/>-->
+    <!--<param name="enable-analog-option" value="call-swap"/>-->
+    <!--<param name="enable-analog-option" value="3-way"/>-->
   </settings>
+  <!-- one entry here per openzap span -->
   <analog_spans>
     <span id="1">
+      <!--<param name="hold-music" value="$${moh_uri}"/>-->
+      <!--<param name="enable-analog-option" value="call-swap"/>-->
+      <!--<param name="enable-analog-option" value="3-way"/>-->
       <param name="tonegroup" value="us"/>
       <param name="digit-timeout" value="2000"/>
       <param name="max-digits" value="11"/>
index ce707eab4cb07b64a234ed56f1fab9183c22faf7..ceabd3c5473d7d9ffc751115fae8defd86cad6f8 100644 (file)
@@ -42,6 +42,12 @@ switch_endpoint_interface_t *openzap_endpoint_interface;
 
 static switch_memory_pool_t *module_pool = NULL;
 
+typedef enum {
+       ANALOG_OPTION_NONE = 0,
+       ANALOG_OPTION_3WAY = (1 << 0),
+       ANALOG_OPTION_CALL_SWAP = (1 << 1)
+} analog_option_t;
+
 struct span_config {
        zap_span_t *span;
        char dialplan[80];
@@ -49,6 +55,7 @@ struct span_config {
        char dial_regex[256];
        char fail_dial_regex[256];
        char hold_music[256];
+       analog_option_t analog_options;
 };
 
 static struct span_config SPAN_CONFIG[ZAP_MAX_SPANS_INTERFACE] = {{0}};
@@ -75,6 +82,7 @@ static struct {
        int calls;
        char hold_music[256];
        switch_mutex_t *mutex;
+       analog_option_t analog_options;
 } globals;
 
 struct private_object {
@@ -511,6 +519,7 @@ static switch_status_t channel_read_frame(switch_core_session_t *session, switch
 
        channel = switch_core_session_get_channel(session);
        assert(channel != NULL);
+       
 
        tech_pvt = switch_core_session_get_private(session);
        assert(tech_pvt != NULL);
@@ -1052,6 +1061,7 @@ static ZIO_SIGNAL_CB_FUNCTION(on_fxs_signal)
                break;
     case ZAP_SIGEVENT_START:
                {
+                       zap_clear_flag_locked(sigmsg->channel, ZAP_CHANNEL_HOLD);
                        status = zap_channel_from_event(sigmsg, &session);
                        if (status != ZAP_SUCCESS) {
                                zap_set_state_locked(sigmsg->channel, ZAP_CHANNEL_STATE_BUSY);
@@ -1132,8 +1142,7 @@ static ZIO_SIGNAL_CB_FUNCTION(on_fxs_signal)
                break;
     case ZAP_SIGEVENT_FLASH:
                {
-                       
-                       if (sigmsg->channel->token_count == 2) {
+                       if (sigmsg->channel->token_count == 2 && (SPAN_CONFIG[sigmsg->span_id].analog_options & ANALOG_OPTION_3WAY)) {
                                if (zap_test_flag(sigmsg->channel, ZAP_CHANNEL_3WAY)) {
                                        zap_clear_flag(sigmsg->channel, ZAP_CHANNEL_3WAY);
                                        if ((session = zap_channel_get_session(sigmsg->channel, 1))) {
@@ -1150,7 +1159,9 @@ static ZIO_SIGNAL_CB_FUNCTION(on_fxs_signal)
                                        cycle_foreground(sigmsg->channel, 1, cmd);
                                        free(cmd);
                                }
-                       } else { 
+                       } else if ((SPAN_CONFIG[sigmsg->span_id].analog_options & ANALOG_OPTION_CALL_SWAP)
+                                          || (SPAN_CONFIG[sigmsg->span_id].analog_options & ANALOG_OPTION_3WAY)
+                                          ) { 
                                cycle_foreground(sigmsg->channel, 1, NULL);
                                if (sigmsg->channel->token_count == 1) {
                                        zap_set_flag_locked(sigmsg->channel, ZAP_CHANNEL_HOLD);
@@ -1315,6 +1326,20 @@ static void zap_logger(char *file, const char *func, int line, int level, char *
 
 }
 
+static uint32_t enable_analog_option(const char *str, uint32_t current_options)
+{
+       if (!strcasecmp(str, "3-way")) {
+               current_options |= ANALOG_OPTION_3WAY;
+               current_options &= ~ANALOG_OPTION_CALL_SWAP;
+       } else if (!strcasecmp(str, "call-swap")) {
+               current_options |= ANALOG_OPTION_CALL_SWAP;
+               current_options &= ~ANALOG_OPTION_3WAY;
+       }
+       
+       return current_options;
+       
+}
+
 static switch_status_t load_config(void)
 {
        char *cf = "openzap.conf";
@@ -1336,6 +1361,8 @@ static switch_status_t load_config(void)
                                globals.debug = atoi(val);
                        } else if (!strcasecmp(var, "hold-music")) {
                                switch_set_string(globals.hold_music, val);
+                       } else if (!strcasecmp(var, "enable-analog-option")) {
+                               globals.analog_options = enable_analog_option(val, globals.analog_options);
                        }
                }
        }
@@ -1353,6 +1380,7 @@ static switch_status_t load_config(void)
                        char *fail_dial_regex = NULL;
                        uint32_t span_id = 0, to = 0, max = 0;
                        zap_span_t *span = NULL;
+                       analog_option_t analog_options = ANALOG_OPTION_NONE;
 
                        for (param = switch_xml_child(myspan, "param"); param; param = param->next) {
                                char *var = (char *) switch_xml_attr_soft(param, "name");
@@ -1374,6 +1402,8 @@ static switch_status_t load_config(void)
                                        hold_music = val;
                                } else if (!strcasecmp(var, "max_digits") || !strcasecmp(var, "max-digits")) {
                                        digit_timeout = val;
+                               } else if (!strcasecmp(var, "enable-analog-option")) {
+                                       analog_options = enable_analog_option(val, analog_options);
                                }
                        }
                                
@@ -1408,7 +1438,8 @@ static switch_status_t load_config(void)
                        SPAN_CONFIG[span->span_id].span = span;
                        switch_set_string(SPAN_CONFIG[span->span_id].context, context);
                        switch_set_string(SPAN_CONFIG[span->span_id].dialplan, dialplan);
-
+                       SPAN_CONFIG[span->span_id].analog_options = analog_options | globals.analog_options;
+                       
                        if (dial_regex) {
                                switch_set_string(SPAN_CONFIG[span->span_id].dial_regex, dial_regex);
                        }
index a53d5ab7e646a31581d038bd57870804c166ce87..ee16393eecf1d232ed3c854deb61b8853fddddbb 100644 (file)
@@ -369,6 +369,10 @@ static void *zap_analog_channel_run(zap_thread_t *me, void *obj)
                                                zap_channel_command(zchan, ZAP_COMMAND_GENERATE_RING_OFF, NULL);
                                        }
 
+                                       if (zchan->token_count == 1) {
+                                               zap_clear_flag(zchan, ZAP_CHANNEL_HOLD);
+                                       }
+
                                        if (zap_test_flag(zchan, ZAP_CHANNEL_HOLD)) {
                                                zap_clear_flag(zchan, ZAP_CHANNEL_HOLD);
                                                sig.event_id = ZAP_SIGEVENT_ADD_CALL;
@@ -519,7 +523,7 @@ static void *zap_analog_channel_run(zap_thread_t *me, void *obj)
                }
 
                if (zap_channel_read(zchan, frame, &len) != ZAP_SUCCESS) {
-                       zap_log(ZAP_LOG_ERROR, "READ ERROR\n");
+                       zap_log(ZAP_LOG_ERROR, "READ ERROR [%s]\n", zchan->last_error);
                        goto done;
                }
 
index 0513333e91e7e702c43647f6d0e026bcbf3a7c19..43d434036dfe196078528df859d948c15e387f31 100644 (file)
@@ -654,11 +654,15 @@ ZIO_SPAN_NEXT_EVENT_FUNCTION(zt_next_event)
 static ZIO_READ_FUNCTION(zt_read)
 {
        zap_ssize_t r = 0;
-       //*datalen = zchan->packet_len;
+       int errs = 0;
 
-       r = read(zchan->sockfd, data, *datalen);
+       while (errs++ < 100) {
+               if ((r = read(zchan->sockfd, data, *datalen)) > 0) {
+                       break;
+               }
+       }
 
-       if (r >= 0) {
+       if (r > 0) {
                *datalen = r;
                if (zchan->type == ZAP_CHAN_TYPE_DQ921) {
                        *datalen -= 2;