add some options

git-svn-id: http://svn.openzap.org/svn/openzap/trunk@372 a93c3328-9c30-0410-af19-c9cd2b2d52af
This commit is contained in:
Anthony Minessale 2008-01-25 16:42:06 +00:00
parent c973fadc4e
commit 254c3ed2d8
4 changed files with 54 additions and 8 deletions

View 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"/>

View 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);
}

View 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;
}

View 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;