From 254c3ed2d838c6693dcf6a366b8e639e4e2bbe4c Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Fri, 25 Jan 2008 16:42:06 +0000 Subject: [PATCH] add some options git-svn-id: http://svn.openzap.org/svn/openzap/trunk@372 a93c3328-9c30-0410-af19-c9cd2b2d52af --- libs/freetdm/conf/openzap.conf.xml | 7 +++++ libs/freetdm/mod_openzap/mod_openzap.c | 39 +++++++++++++++++++++++--- libs/freetdm/src/zap_analog.c | 6 +++- libs/freetdm/src/zap_zt.c | 10 +++++-- 4 files changed, 54 insertions(+), 8 deletions(-) diff --git a/libs/freetdm/conf/openzap.conf.xml b/libs/freetdm/conf/openzap.conf.xml index 45780e9787..1ca75c0e21 100644 --- a/libs/freetdm/conf/openzap.conf.xml +++ b/libs/freetdm/conf/openzap.conf.xml @@ -1,9 +1,16 @@ + + + + + + + diff --git a/libs/freetdm/mod_openzap/mod_openzap.c b/libs/freetdm/mod_openzap/mod_openzap.c index ce707eab4c..ceabd3c547 100644 --- a/libs/freetdm/mod_openzap/mod_openzap.c +++ b/libs/freetdm/mod_openzap/mod_openzap.c @@ -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); } diff --git a/libs/freetdm/src/zap_analog.c b/libs/freetdm/src/zap_analog.c index a53d5ab7e6..ee16393eec 100644 --- a/libs/freetdm/src/zap_analog.c +++ b/libs/freetdm/src/zap_analog.c @@ -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; } diff --git a/libs/freetdm/src/zap_zt.c b/libs/freetdm/src/zap_zt.c index 0513333e91..43d434036d 100644 --- a/libs/freetdm/src/zap_zt.c +++ b/libs/freetdm/src/zap_zt.c @@ -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;