mirror of
https://github.com/signalwire/freeswitch.git
synced 2025-05-25 00:12:43 +00:00
Merge branch 'master' of git://git.freeswitch.org/freeswitch
This commit is contained in:
commit
1607348f80
@ -94,6 +94,8 @@
|
|||||||
<!--<param name="rtp-end-port" value="32768"/>-->
|
<!--<param name="rtp-end-port" value="32768"/>-->
|
||||||
<param name="rtp-enable-zrtp" value="true"/>
|
<param name="rtp-enable-zrtp" value="true"/>
|
||||||
<!-- <param name="core-db-dsn" value="dsn:username:password" /> -->
|
<!-- <param name="core-db-dsn" value="dsn:username:password" /> -->
|
||||||
|
<!-- Allow to specify the sqlite db at a different location (In this example, move it to ramdrive for better performance on most linux distro (note, you loose the data if you reboot)) -->
|
||||||
|
<!-- <param name="core-db-name" value="/dev/shm/core.db" /> -->
|
||||||
<!-- The system will create all the db schemas automatically, set this to false to avoid this behaviour-->
|
<!-- The system will create all the db schemas automatically, set this to false to avoid this behaviour-->
|
||||||
<!--<param name="auto-create-schemas" value="true"/>-->
|
<!--<param name="auto-create-schemas" value="true"/>-->
|
||||||
<!-- <param name="core-dbtype" value="MSSQL"/> -->
|
<!-- <param name="core-dbtype" value="MSSQL"/> -->
|
||||||
|
@ -1552,6 +1552,8 @@ ftdm_status_t ftdm_channel_from_event(ftdm_sigmsg_t *sigmsg, switch_core_session
|
|||||||
switch_channel_set_variable_printf(channel, "freetdm_chan_number", "%d", chanid);
|
switch_channel_set_variable_printf(channel, "freetdm_chan_number", "%d", chanid);
|
||||||
switch_channel_set_variable_printf(channel, "freetdm_bearer_capability", "%d", channel_caller_data->bearer_capability);
|
switch_channel_set_variable_printf(channel, "freetdm_bearer_capability", "%d", channel_caller_data->bearer_capability);
|
||||||
switch_channel_set_variable_printf(channel, "freetdm_bearer_layer1", "%d", channel_caller_data->bearer_layer1);
|
switch_channel_set_variable_printf(channel, "freetdm_bearer_layer1", "%d", channel_caller_data->bearer_layer1);
|
||||||
|
switch_channel_set_variable_printf(channel, "freetdm_screening_ind", ftdm_screening2str(channel_caller_data->screen));
|
||||||
|
switch_channel_set_variable_printf(channel, "freetdm_presentation_ind", ftdm_presentation2str(channel_caller_data->pres));
|
||||||
|
|
||||||
if (globals.sip_headers) {
|
if (globals.sip_headers) {
|
||||||
switch_channel_set_variable(channel, "sip_h_X-FreeTDM-SpanName", ftdm_channel_get_span_name(sigmsg->channel));
|
switch_channel_set_variable(channel, "sip_h_X-FreeTDM-SpanName", ftdm_channel_get_span_name(sigmsg->channel));
|
||||||
@ -1580,21 +1582,13 @@ ftdm_status_t ftdm_channel_from_event(ftdm_sigmsg_t *sigmsg, switch_core_session
|
|||||||
if (channel_caller_data->raw_data_len) {
|
if (channel_caller_data->raw_data_len) {
|
||||||
switch_channel_set_variable_printf(channel, "freetdm_custom_call_data", "%s", channel_caller_data->raw_data);
|
switch_channel_set_variable_printf(channel, "freetdm_custom_call_data", "%s", channel_caller_data->raw_data);
|
||||||
}
|
}
|
||||||
/* Add any channel variable to the dial plan */
|
|
||||||
iter = ftdm_channel_get_var_iterator(sigmsg->channel, NULL);
|
|
||||||
for (curr = iter ; curr; curr = ftdm_iterator_next(curr)) {
|
|
||||||
ftdm_channel_get_current_var(curr, &var_name, &var_value);
|
|
||||||
snprintf(name, sizeof(name), FREETDM_VAR_PREFIX "%s", var_name);
|
|
||||||
switch_channel_set_variable_printf(channel, name, "%s", var_value);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Add any call variable to the dial plan */
|
/* Add any call variable to the dial plan */
|
||||||
iter = ftdm_call_get_var_iterator(channel_caller_data, iter);
|
iter = ftdm_call_get_var_iterator(channel_caller_data, iter);
|
||||||
for (curr = iter ; curr; curr = ftdm_iterator_next(curr)) {
|
for (curr = iter ; curr; curr = ftdm_iterator_next(curr)) {
|
||||||
ftdm_call_get_current_var(curr, &var_name, &var_value);
|
ftdm_call_get_current_var(curr, &var_name, &var_value);
|
||||||
snprintf(name, sizeof(name), FREETDM_VAR_PREFIX "%s", var_name);
|
snprintf(name, sizeof(name), FREETDM_VAR_PREFIX "%s", var_name);
|
||||||
switch_channel_set_variable_printf(channel, name, "%s", var_value);
|
switch_channel_set_variable_printf(channel, name, "%s", var_value);
|
||||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Call Variable: %s=%s\n", name, var_value);
|
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Call Variable: %s = %s\n", name, var_value);
|
||||||
}
|
}
|
||||||
ftdm_iterator_free(iter);
|
ftdm_iterator_free(iter);
|
||||||
|
|
||||||
@ -2149,8 +2143,6 @@ static FIO_SIGNAL_CB_FUNCTION(on_clear_channel_signal)
|
|||||||
switch(sigmsg->event_id) {
|
switch(sigmsg->event_id) {
|
||||||
case FTDM_SIGEVENT_START:
|
case FTDM_SIGEVENT_START:
|
||||||
{
|
{
|
||||||
ftdm_call_add_var(caller_data, "screening_ind", ftdm_screening2str(caller_data->screen));
|
|
||||||
ftdm_call_add_var(caller_data, "presentation_ind", ftdm_presentation2str(caller_data->pres));
|
|
||||||
return ftdm_channel_from_event(sigmsg, &session);
|
return ftdm_channel_from_event(sigmsg, &session);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -2698,7 +2690,7 @@ static switch_status_t load_config(void)
|
|||||||
ftdm_conf_parameter_t spanparameters[30];
|
ftdm_conf_parameter_t spanparameters[30];
|
||||||
char *id = (char *) switch_xml_attr(myspan, "id");
|
char *id = (char *) switch_xml_attr(myspan, "id");
|
||||||
char *name = (char *) switch_xml_attr(myspan, "name");
|
char *name = (char *) switch_xml_attr(myspan, "name");
|
||||||
char *configname = (char *) switch_xml_attr(myspan, "config");
|
char *configname = (char *) switch_xml_attr(myspan, "cfgprofile");
|
||||||
ftdm_span_t *span = NULL;
|
ftdm_span_t *span = NULL;
|
||||||
uint32_t span_id = 0;
|
uint32_t span_id = 0;
|
||||||
unsigned paramindex = 0;
|
unsigned paramindex = 0;
|
||||||
@ -4259,7 +4251,9 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_freetdm_load)
|
|||||||
switch_console_set_complete("add ftdm gains");
|
switch_console_set_complete("add ftdm gains");
|
||||||
switch_console_set_complete("add ftdm dtmf on");
|
switch_console_set_complete("add ftdm dtmf on");
|
||||||
switch_console_set_complete("add ftdm dtmf off");
|
switch_console_set_complete("add ftdm dtmf off");
|
||||||
|
switch_console_set_complete("add ftdm core state");
|
||||||
|
switch_console_set_complete("add ftdm core flag");
|
||||||
|
switch_console_set_complete("add ftdm core calls");
|
||||||
|
|
||||||
SWITCH_ADD_APP(app_interface, "disable_ec", "Disable Echo Canceller", "Disable Echo Canceller", disable_ec_function, "", SAF_NONE);
|
SWITCH_ADD_APP(app_interface, "disable_ec", "Disable Echo Canceller", "Disable Echo Canceller", disable_ec_function, "", SAF_NONE);
|
||||||
SWITCH_ADD_APP(app_interface, "disable_dtmf", "Disable DTMF Detection", "Disable DTMF Detection", disable_dtmf_function, "", SAF_NONE);
|
SWITCH_ADD_APP(app_interface, "disable_dtmf", "Disable DTMF Detection", "Disable DTMF Detection", disable_dtmf_function, "", SAF_NONE);
|
||||||
|
@ -65,7 +65,6 @@ ftdm_time_t time_current_throttle_log = 0;
|
|||||||
static ftdm_iterator_t *get_iterator(ftdm_iterator_type_t type, ftdm_iterator_t *iter);
|
static ftdm_iterator_t *get_iterator(ftdm_iterator_type_t type, ftdm_iterator_t *iter);
|
||||||
static ftdm_status_t ftdm_call_set_call_id(ftdm_channel_t *fchan, ftdm_caller_data_t *caller_data);
|
static ftdm_status_t ftdm_call_set_call_id(ftdm_channel_t *fchan, ftdm_caller_data_t *caller_data);
|
||||||
static ftdm_status_t ftdm_call_clear_call_id(ftdm_caller_data_t *caller_data);
|
static ftdm_status_t ftdm_call_clear_call_id(ftdm_caller_data_t *caller_data);
|
||||||
static ftdm_status_t ftdm_channel_clear_vars(ftdm_channel_t *ftdmchan);
|
|
||||||
static ftdm_status_t ftdm_channel_done(ftdm_channel_t *ftdmchan);
|
static ftdm_status_t ftdm_channel_done(ftdm_channel_t *ftdmchan);
|
||||||
|
|
||||||
static int time_is_init = 0;
|
static int time_is_init = 0;
|
||||||
@ -2633,7 +2632,6 @@ static ftdm_status_t ftdm_channel_done(ftdm_channel_t *ftdmchan)
|
|||||||
ftdm_buffer_destroy(&ftdmchan->pre_buffer);
|
ftdm_buffer_destroy(&ftdmchan->pre_buffer);
|
||||||
ftdmchan->pre_buffer_size = 0;
|
ftdmchan->pre_buffer_size = 0;
|
||||||
ftdm_mutex_unlock(ftdmchan->pre_buffer_mutex);
|
ftdm_mutex_unlock(ftdmchan->pre_buffer_mutex);
|
||||||
ftdm_channel_clear_vars(ftdmchan);
|
|
||||||
if (ftdmchan->hangup_timer) {
|
if (ftdmchan->hangup_timer) {
|
||||||
ftdm_sched_cancel_timer(globals.timingsched, ftdmchan->hangup_timer);
|
ftdm_sched_cancel_timer(globals.timingsched, ftdmchan->hangup_timer);
|
||||||
}
|
}
|
||||||
@ -4033,20 +4031,13 @@ done:
|
|||||||
}
|
}
|
||||||
|
|
||||||
FT_DECLARE(void) ftdm_call_clear_data(ftdm_caller_data_t *caller_data)
|
FT_DECLARE(void) ftdm_call_clear_data(ftdm_caller_data_t *caller_data)
|
||||||
{
|
|
||||||
ftdm_call_clear_vars(caller_data);
|
|
||||||
memset(&caller_data->raw_data, 0, sizeof(caller_data->raw_data));
|
|
||||||
caller_data->raw_data_len = 0;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
FT_DECLARE(ftdm_status_t) ftdm_call_clear_vars(ftdm_caller_data_t *caller_data)
|
|
||||||
{
|
{
|
||||||
if (caller_data->variables) {
|
if (caller_data->variables) {
|
||||||
hashtable_destroy(caller_data->variables);
|
hashtable_destroy(caller_data->variables);
|
||||||
}
|
}
|
||||||
caller_data->variables = NULL;
|
caller_data->variables = NULL;
|
||||||
return FTDM_SUCCESS;
|
memset(&caller_data->raw_data, 0, sizeof(caller_data->raw_data));
|
||||||
|
caller_data->raw_data_len = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
FT_DECLARE(ftdm_status_t) ftdm_call_remove_var(ftdm_caller_data_t *caller_data, const char *var_name)
|
FT_DECLARE(ftdm_status_t) ftdm_call_remove_var(ftdm_caller_data_t *caller_data, const char *var_name)
|
||||||
@ -4058,7 +4049,6 @@ FT_DECLARE(ftdm_status_t) ftdm_call_remove_var(ftdm_caller_data_t *caller_data,
|
|||||||
return FTDM_SUCCESS;
|
return FTDM_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
FT_DECLARE(ftdm_status_t) ftdm_call_add_var(ftdm_caller_data_t *caller_data, const char *var_name, const char *value)
|
FT_DECLARE(ftdm_status_t) ftdm_call_add_var(ftdm_caller_data_t *caller_data, const char *var_name, const char *value)
|
||||||
{
|
{
|
||||||
char *t_name = 0, *t_val = 0;
|
char *t_name = 0, *t_val = 0;
|
||||||
@ -4125,72 +4115,6 @@ FT_DECLARE(ftdm_status_t) ftdm_call_get_current_var(ftdm_iterator_t *iter, const
|
|||||||
return FTDM_SUCCESS;
|
return FTDM_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static ftdm_status_t ftdm_channel_clear_vars(ftdm_channel_t *ftdmchan)
|
|
||||||
{
|
|
||||||
ftdm_channel_lock(ftdmchan);
|
|
||||||
|
|
||||||
if (ftdmchan->variable_hash) {
|
|
||||||
hashtable_destroy(ftdmchan->variable_hash);
|
|
||||||
}
|
|
||||||
ftdmchan->variable_hash = NULL;
|
|
||||||
|
|
||||||
ftdm_channel_unlock(ftdmchan);
|
|
||||||
return FTDM_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
FT_DECLARE(ftdm_status_t) ftdm_channel_add_var(ftdm_channel_t *ftdmchan, const char *var_name, const char *value)
|
|
||||||
{
|
|
||||||
char *t_name = 0, *t_val = 0;
|
|
||||||
|
|
||||||
ftdm_status_t status = FTDM_FAIL;
|
|
||||||
|
|
||||||
if (!var_name || !value) {
|
|
||||||
return FTDM_FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
ftdm_channel_lock(ftdmchan);
|
|
||||||
|
|
||||||
if (!ftdmchan->variable_hash) {
|
|
||||||
/* initialize on first use */
|
|
||||||
ftdmchan->variable_hash = create_hashtable(16, ftdm_hash_hashfromstring, ftdm_hash_equalkeys);
|
|
||||||
if (!ftdmchan->variable_hash) {
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
t_name = ftdm_strdup(var_name);
|
|
||||||
t_val = ftdm_strdup(value);
|
|
||||||
|
|
||||||
hashtable_insert(ftdmchan->variable_hash, t_name, t_val, HASHTABLE_FLAG_FREE_KEY | HASHTABLE_FLAG_FREE_VALUE);
|
|
||||||
|
|
||||||
status = FTDM_SUCCESS;
|
|
||||||
|
|
||||||
done:
|
|
||||||
ftdm_channel_unlock(ftdmchan);
|
|
||||||
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
FT_DECLARE(const char *) ftdm_channel_get_var(ftdm_channel_t *ftdmchan, const char *var_name)
|
|
||||||
{
|
|
||||||
const char *var = NULL;
|
|
||||||
|
|
||||||
ftdm_channel_lock(ftdmchan);
|
|
||||||
|
|
||||||
if (!ftdmchan->variable_hash || !var_name) {
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
|
|
||||||
var = (const char *)hashtable_search(ftdmchan->variable_hash, (void *)var_name);
|
|
||||||
|
|
||||||
done:
|
|
||||||
ftdm_channel_unlock(ftdmchan);
|
|
||||||
|
|
||||||
return var;
|
|
||||||
}
|
|
||||||
|
|
||||||
static ftdm_iterator_t *get_iterator(ftdm_iterator_type_t type, ftdm_iterator_t *iter)
|
static ftdm_iterator_t *get_iterator(ftdm_iterator_type_t type, ftdm_iterator_t *iter)
|
||||||
{
|
{
|
||||||
int allocated = 0;
|
int allocated = 0;
|
||||||
@ -4215,25 +4139,6 @@ static ftdm_iterator_t *get_iterator(ftdm_iterator_type_t type, ftdm_iterator_t
|
|||||||
return iter;
|
return iter;
|
||||||
}
|
}
|
||||||
|
|
||||||
FT_DECLARE(ftdm_iterator_t *) ftdm_channel_get_var_iterator(const ftdm_channel_t *ftdmchan, ftdm_iterator_t *iter)
|
|
||||||
{
|
|
||||||
ftdm_hash_iterator_t *hashiter = NULL;
|
|
||||||
ftdm_channel_lock(ftdmchan);
|
|
||||||
hashiter = ftdmchan->variable_hash == NULL ? NULL : hashtable_first(ftdmchan->variable_hash);
|
|
||||||
ftdm_channel_unlock(ftdmchan);
|
|
||||||
|
|
||||||
|
|
||||||
if (hashiter == NULL) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!(iter = get_iterator(FTDM_ITERATOR_VARS, iter))) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
iter->pvt.hashiter = hashiter;
|
|
||||||
return iter;
|
|
||||||
}
|
|
||||||
|
|
||||||
FT_DECLARE(ftdm_iterator_t *) ftdm_span_get_chan_iterator(const ftdm_span_t *span, ftdm_iterator_t *iter)
|
FT_DECLARE(ftdm_iterator_t *) ftdm_span_get_chan_iterator(const ftdm_span_t *span, ftdm_iterator_t *iter)
|
||||||
{
|
{
|
||||||
if (!(iter = get_iterator(FTDM_ITERATOR_CHANS, iter))) {
|
if (!(iter = get_iterator(FTDM_ITERATOR_CHANS, iter))) {
|
||||||
@ -4244,24 +4149,6 @@ FT_DECLARE(ftdm_iterator_t *) ftdm_span_get_chan_iterator(const ftdm_span_t *spa
|
|||||||
return iter;
|
return iter;
|
||||||
}
|
}
|
||||||
|
|
||||||
FT_DECLARE(ftdm_status_t) ftdm_channel_get_current_var(ftdm_iterator_t *iter, const char **var_name, const char **var_val)
|
|
||||||
{
|
|
||||||
const void *key = NULL;
|
|
||||||
void *val = NULL;
|
|
||||||
|
|
||||||
*var_name = NULL;
|
|
||||||
*var_val = NULL;
|
|
||||||
|
|
||||||
ftdm_assert_return(iter && (iter->type == FTDM_ITERATOR_VARS) && iter->pvt.hashiter, FTDM_FAIL, "Cannot get variable from invalid iterator!\n");
|
|
||||||
|
|
||||||
hashtable_this(iter->pvt.hashiter, &key, NULL, &val);
|
|
||||||
|
|
||||||
*var_name = key;
|
|
||||||
*var_val = val;
|
|
||||||
|
|
||||||
return FTDM_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
FT_DECLARE(ftdm_iterator_t *) ftdm_iterator_next(ftdm_iterator_t *iter)
|
FT_DECLARE(ftdm_iterator_t *) ftdm_iterator_next(ftdm_iterator_t *iter)
|
||||||
{
|
{
|
||||||
ftdm_assert_return(iter && iter->type, NULL, "Invalid iterator\n");
|
ftdm_assert_return(iter && iter->type, NULL, "Invalid iterator\n");
|
||||||
@ -5532,6 +5419,7 @@ FT_DECLARE(ftdm_status_t) ftdm_span_send_signal(ftdm_span_t *span, ftdm_sigmsg_t
|
|||||||
sigmsg->chan_id = sigmsg->channel->chan_id;
|
sigmsg->chan_id = sigmsg->channel->chan_id;
|
||||||
sigmsg->span_id = sigmsg->channel->span_id;
|
sigmsg->span_id = sigmsg->channel->span_id;
|
||||||
sigmsg->call_id = sigmsg->channel->caller_data.call_id;
|
sigmsg->call_id = sigmsg->channel->caller_data.call_id;
|
||||||
|
sigmsg->call_priv = sigmsg->channel->caller_data.priv;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* some core things to do on special events */
|
/* some core things to do on special events */
|
||||||
@ -5563,10 +5451,6 @@ FT_DECLARE(ftdm_status_t) ftdm_span_send_signal(ftdm_span_t *span, ftdm_sigmsg_t
|
|||||||
}
|
}
|
||||||
ftdm_set_flag(sigmsg->channel, FTDM_CHANNEL_CALL_STARTED);
|
ftdm_set_flag(sigmsg->channel, FTDM_CHANNEL_CALL_STARTED);
|
||||||
ftdm_call_set_call_id(sigmsg->channel, &sigmsg->channel->caller_data);
|
ftdm_call_set_call_id(sigmsg->channel, &sigmsg->channel->caller_data);
|
||||||
if (sigmsg->channel->dtmfdbg.requested) {
|
|
||||||
ftdm_channel_command(sigmsg->channel, FTDM_COMMAND_ENABLE_DEBUG_DTMF, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* when cleaning up the public API I added this because mod_freetdm.c on_fxs_signal was
|
/* when cleaning up the public API I added this because mod_freetdm.c on_fxs_signal was
|
||||||
* doing it during SIGEVENT_START, but now that flags are private they can't, wonder if
|
* doing it during SIGEVENT_START, but now that flags are private they can't, wonder if
|
||||||
* is needed at all?
|
* is needed at all?
|
||||||
|
@ -676,12 +676,6 @@ static void ftdm_r2_on_call_offered(openr2_chan_t *r2chan, const char *ani, cons
|
|||||||
ftdm_log_chan(ftdmchan, FTDM_LOG_NOTICE, "Call offered with ANI = %s, DNIS = %s, Category = %d, ANI restricted = %s\n",
|
ftdm_log_chan(ftdmchan, FTDM_LOG_NOTICE, "Call offered with ANI = %s, DNIS = %s, Category = %d, ANI restricted = %s\n",
|
||||||
ani, dnis, category, ani_restricted ? "Yes" : "No");
|
ani, dnis, category, ani_restricted ? "Yes" : "No");
|
||||||
|
|
||||||
/* nothing went wrong during call setup, MF has ended, we can and must disable the MF dump */
|
|
||||||
if (r2data->mf_dump_size) {
|
|
||||||
ftdm_channel_command(ftdmchan, FTDM_COMMAND_DISABLE_INPUT_DUMP, NULL);
|
|
||||||
ftdm_channel_command(ftdmchan, FTDM_COMMAND_DISABLE_OUTPUT_DUMP, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* check if this is a collect call and if we should accept it */
|
/* check if this is a collect call and if we should accept it */
|
||||||
if (!r2data->allow_collect_calls && category == OR2_CALLING_PARTY_CATEGORY_COLLECT_CALL) {
|
if (!r2data->allow_collect_calls && category == OR2_CALLING_PARTY_CATEGORY_COLLECT_CALL) {
|
||||||
ftdm_log_chan_msg(ftdmchan, FTDM_LOG_NOTICE, "Rejecting collect call\n");
|
ftdm_log_chan_msg(ftdmchan, FTDM_LOG_NOTICE, "Rejecting collect call\n");
|
||||||
@ -725,9 +719,10 @@ static void dump_mf(openr2_chan_t *r2chan)
|
|||||||
if (r2data->mf_dump_size) {
|
if (r2data->mf_dump_size) {
|
||||||
char *logname = R2CALL(ftdmchan)->logname;
|
char *logname = R2CALL(ftdmchan)->logname;
|
||||||
|
|
||||||
ftdm_log_chan(ftdmchan, FTDM_LOG_ERROR, "Dumping IO output in prefix %s\n", logname);
|
ftdm_log_chan(ftdmchan, FTDM_LOG_ERROR, "Dumping IO output in prefix %s\n", !ftdm_strlen_zero(logname)
|
||||||
snprintf(dfile, sizeof(dfile), logname ? "%s.s%dc%d.input.alaw" : "%s/s%dc%d.input.alaw",
|
? logname : r2data->logdir);
|
||||||
logname ? logname : r2data->logdir, ftdmchan->span_id, ftdmchan->chan_id);
|
snprintf(dfile, sizeof(dfile), !ftdm_strlen_zero(logname) ? "%s.s%dc%d.input.alaw" : "%s/s%dc%d.input.alaw",
|
||||||
|
!ftdm_strlen_zero(logname) ? logname : r2data->logdir, ftdmchan->span_id, ftdmchan->chan_id);
|
||||||
f = fopen(dfile, "wb");
|
f = fopen(dfile, "wb");
|
||||||
if (f) {
|
if (f) {
|
||||||
ftdm_log_chan(ftdmchan, FTDM_LOG_ERROR, "Dumping IO input in file %s\n", dfile);
|
ftdm_log_chan(ftdmchan, FTDM_LOG_ERROR, "Dumping IO input in file %s\n", dfile);
|
||||||
@ -737,8 +732,8 @@ static void dump_mf(openr2_chan_t *r2chan)
|
|||||||
ftdm_log_chan(ftdmchan, FTDM_LOG_ERROR, "Could not dump IO input in file %s, error: %s", dfile, strerror(errno));
|
ftdm_log_chan(ftdmchan, FTDM_LOG_ERROR, "Could not dump IO input in file %s, error: %s", dfile, strerror(errno));
|
||||||
}
|
}
|
||||||
|
|
||||||
snprintf(dfile, sizeof(dfile), logname ? "%s.s%dc%d.output.alaw" : "%s/s%dc%d.output.alaw",
|
snprintf(dfile, sizeof(dfile), !ftdm_strlen_zero(logname) ? "%s.s%dc%d.output.alaw" : "%s/s%dc%d.output.alaw",
|
||||||
logname ? logname : r2data->logdir, ftdmchan->span_id, ftdmchan->chan_id);
|
!ftdm_strlen_zero(logname) ? logname : r2data->logdir, ftdmchan->span_id, ftdmchan->chan_id);
|
||||||
f = fopen(dfile, "wb");
|
f = fopen(dfile, "wb");
|
||||||
if (f) {
|
if (f) {
|
||||||
ftdm_log_chan(ftdmchan, FTDM_LOG_ERROR, "Dumping IO output in file %s\n", dfile);
|
ftdm_log_chan(ftdmchan, FTDM_LOG_ERROR, "Dumping IO output in file %s\n", dfile);
|
||||||
@ -769,6 +764,12 @@ static void ftdm_r2_on_call_accepted(openr2_chan_t *r2chan, openr2_call_mode_t m
|
|||||||
|
|
||||||
R2CALL(ftdmchan)->accepted = 1;
|
R2CALL(ftdmchan)->accepted = 1;
|
||||||
|
|
||||||
|
/* nothing went wrong during call setup, MF has ended, we can and must disable the MF dump */
|
||||||
|
if (r2data->mf_dump_size) {
|
||||||
|
ftdm_channel_command(ftdmchan, FTDM_COMMAND_DISABLE_INPUT_DUMP, NULL);
|
||||||
|
ftdm_channel_command(ftdmchan, FTDM_COMMAND_DISABLE_OUTPUT_DUMP, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
if (OR2_DIR_BACKWARD == openr2_chan_get_direction(r2chan)) {
|
if (OR2_DIR_BACKWARD == openr2_chan_get_direction(r2chan)) {
|
||||||
if (R2CALL(ftdmchan)->answer_pending) {
|
if (R2CALL(ftdmchan)->answer_pending) {
|
||||||
ftdm_log_chan_msg(ftdmchan, FTDM_LOG_DEBUG, "Answer was pending, answering now.\n");
|
ftdm_log_chan_msg(ftdmchan, FTDM_LOG_DEBUG, "Answer was pending, answering now.\n");
|
||||||
@ -777,11 +778,6 @@ static void ftdm_r2_on_call_accepted(openr2_chan_t *r2chan, openr2_call_mode_t m
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
/* nothing went wrong during call setup, MF has ended, we can and must disable the MF dump */
|
|
||||||
if (r2data->mf_dump_size) {
|
|
||||||
ftdm_channel_command(ftdmchan, FTDM_COMMAND_DISABLE_INPUT_DUMP, NULL);
|
|
||||||
ftdm_channel_command(ftdmchan, FTDM_COMMAND_DISABLE_OUTPUT_DUMP, NULL);
|
|
||||||
}
|
|
||||||
ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_PROGRESS_MEDIA);
|
ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_PROGRESS_MEDIA);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -912,9 +912,6 @@ static FIO_CHANNEL_OUTGOING_CALL_FUNCTION(ftdm_sangoma_isdn_outgoing_call)
|
|||||||
sngisdn_chan_data_t *sngisdn_info = ftdmchan->call_data;
|
sngisdn_chan_data_t *sngisdn_info = ftdmchan->call_data;
|
||||||
ftdm_status_t status = FTDM_FAIL;
|
ftdm_status_t status = FTDM_FAIL;
|
||||||
|
|
||||||
/* lock the channel while we check whether it is availble */
|
|
||||||
ftdm_channel_lock(ftdmchan);
|
|
||||||
|
|
||||||
switch (ftdmchan->state) {
|
switch (ftdmchan->state) {
|
||||||
|
|
||||||
case FTDM_CHANNEL_STATE_DOWN:
|
case FTDM_CHANNEL_STATE_DOWN:
|
||||||
@ -942,7 +939,6 @@ static FIO_CHANNEL_OUTGOING_CALL_FUNCTION(ftdm_sangoma_isdn_outgoing_call)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
ftdm_channel_unlock(ftdmchan);
|
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
static FIO_CHANNEL_GET_SIG_STATUS_FUNCTION(ftdm_sangoma_isdn_get_chan_sig_status)
|
static FIO_CHANNEL_GET_SIG_STATUS_FUNCTION(ftdm_sangoma_isdn_get_chan_sig_status)
|
||||||
|
@ -680,8 +680,8 @@ static ftdm_status_t handle_print_usuage(ftdm_stream_handle_t *stream)
|
|||||||
stream->write_function(stream, "ftdm ss7 set mtrace X Y\n");
|
stream->write_function(stream, "ftdm ss7 set mtrace X Y\n");
|
||||||
stream->write_function(stream, "\n");
|
stream->write_function(stream, "\n");
|
||||||
stream->write_function(stream, "Ftmod_sangoma_ss7 information:\n");
|
stream->write_function(stream, "Ftmod_sangoma_ss7 information:\n");
|
||||||
stream->write_function(stream, "ftdm ss7 show status link X\n");
|
stream->write_function(stream, "ftdm ss7 show status mtp3 X\n");
|
||||||
stream->write_function(stream, "ftdm ss7 show status linkset X\n");
|
stream->write_function(stream, "ftdm ss7 show status mtp2 X\n");
|
||||||
stream->write_function(stream, "ftdm ss7 show status span X chan Y\n");
|
stream->write_function(stream, "ftdm ss7 show status span X chan Y\n");
|
||||||
stream->write_function(stream, "ftdm ss7 show free span X chan Y\n");
|
stream->write_function(stream, "ftdm ss7 show free span X chan Y\n");
|
||||||
stream->write_function(stream, "ftdm ss7 show inuse span X chan Y\n");
|
stream->write_function(stream, "ftdm ss7 show inuse span X chan Y\n");
|
||||||
|
@ -299,7 +299,7 @@ void ft_to_sngss7_iam (ftdm_channel_t * ftdmchan)
|
|||||||
ftdmchan->caller_data.dnis.digits,
|
ftdmchan->caller_data.dnis.digits,
|
||||||
iam.cdPtyNum.natAddrInd.val);
|
iam.cdPtyNum.natAddrInd.val);
|
||||||
|
|
||||||
ftdm_call_clear_vars(&ftdmchan->caller_data);
|
ftdm_call_clear_data(&ftdmchan->caller_data);
|
||||||
SS7_FUNC_TRACE_EXIT (__FUNCTION__);
|
SS7_FUNC_TRACE_EXIT (__FUNCTION__);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -379,7 +379,7 @@ void ft_to_sngss7_acm (ftdm_channel_t * ftdmchan)
|
|||||||
ADDRCMPLT);
|
ADDRCMPLT);
|
||||||
|
|
||||||
SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx ACM\n", sngss7_info->circuit->cic);
|
SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx ACM\n", sngss7_info->circuit->cic);
|
||||||
ftdm_call_clear_vars(&ftdmchan->caller_data);
|
ftdm_call_clear_data(&ftdmchan->caller_data);
|
||||||
SS7_FUNC_TRACE_EXIT (__FUNCTION__);
|
SS7_FUNC_TRACE_EXIT (__FUNCTION__);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -403,7 +403,7 @@ void ft_to_sngss7_anm (ftdm_channel_t * ftdmchan)
|
|||||||
5);
|
5);
|
||||||
|
|
||||||
SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx ANM\n", sngss7_info->circuit->cic);
|
SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx ANM\n", sngss7_info->circuit->cic);
|
||||||
ftdm_call_clear_vars(&ftdmchan->caller_data);
|
ftdm_call_clear_data(&ftdmchan->caller_data);
|
||||||
SS7_FUNC_TRACE_EXIT (__FUNCTION__);
|
SS7_FUNC_TRACE_EXIT (__FUNCTION__);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -438,7 +438,7 @@ void ft_to_sngss7_rel (ftdm_channel_t * ftdmchan)
|
|||||||
SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx REL cause=%d \n",
|
SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx REL cause=%d \n",
|
||||||
sngss7_info->circuit->cic,
|
sngss7_info->circuit->cic,
|
||||||
ftdmchan->caller_data.hangup_cause );
|
ftdmchan->caller_data.hangup_cause );
|
||||||
ftdm_call_clear_vars(&ftdmchan->caller_data);
|
ftdm_call_clear_data(&ftdmchan->caller_data);
|
||||||
SS7_FUNC_TRACE_EXIT (__FUNCTION__);
|
SS7_FUNC_TRACE_EXIT (__FUNCTION__);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -461,7 +461,7 @@ void ft_to_sngss7_rlc (ftdm_channel_t * ftdmchan)
|
|||||||
&rlc);
|
&rlc);
|
||||||
|
|
||||||
SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx RLC\n", sngss7_info->circuit->cic);
|
SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx RLC\n", sngss7_info->circuit->cic);
|
||||||
ftdm_call_clear_vars(&ftdmchan->caller_data);
|
ftdm_call_clear_data(&ftdmchan->caller_data);
|
||||||
SS7_FUNC_TRACE_EXIT (__FUNCTION__);
|
SS7_FUNC_TRACE_EXIT (__FUNCTION__);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -482,7 +482,7 @@ void ft_to_sngss7_rsc (ftdm_channel_t * ftdmchan)
|
|||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx RSC\n", sngss7_info->circuit->cic);
|
SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx RSC\n", sngss7_info->circuit->cic);
|
||||||
ftdm_call_clear_vars(&ftdmchan->caller_data);
|
ftdm_call_clear_data(&ftdmchan->caller_data);
|
||||||
SS7_FUNC_TRACE_EXIT (__FUNCTION__);
|
SS7_FUNC_TRACE_EXIT (__FUNCTION__);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -503,7 +503,7 @@ void ft_to_sngss7_rsca (ftdm_channel_t * ftdmchan)
|
|||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx RSC-RLC\n", sngss7_info->circuit->cic);
|
SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx RSC-RLC\n", sngss7_info->circuit->cic);
|
||||||
ftdm_call_clear_vars(&ftdmchan->caller_data);
|
ftdm_call_clear_data(&ftdmchan->caller_data);
|
||||||
SS7_FUNC_TRACE_EXIT (__FUNCTION__);
|
SS7_FUNC_TRACE_EXIT (__FUNCTION__);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -524,7 +524,7 @@ void ft_to_sngss7_blo (ftdm_channel_t * ftdmchan)
|
|||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx BLO\n", sngss7_info->circuit->cic);
|
SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx BLO\n", sngss7_info->circuit->cic);
|
||||||
ftdm_call_clear_vars(&ftdmchan->caller_data);
|
ftdm_call_clear_data(&ftdmchan->caller_data);
|
||||||
SS7_FUNC_TRACE_EXIT (__FUNCTION__);
|
SS7_FUNC_TRACE_EXIT (__FUNCTION__);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -545,7 +545,7 @@ void ft_to_sngss7_bla (ftdm_channel_t * ftdmchan)
|
|||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx BLA\n", sngss7_info->circuit->cic);
|
SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx BLA\n", sngss7_info->circuit->cic);
|
||||||
ftdm_call_clear_vars(&ftdmchan->caller_data);
|
ftdm_call_clear_data(&ftdmchan->caller_data);
|
||||||
SS7_FUNC_TRACE_EXIT (__FUNCTION__);
|
SS7_FUNC_TRACE_EXIT (__FUNCTION__);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -567,7 +567,7 @@ ft_to_sngss7_ubl (ftdm_channel_t * ftdmchan)
|
|||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx UBL\n", sngss7_info->circuit->cic);
|
SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx UBL\n", sngss7_info->circuit->cic);
|
||||||
ftdm_call_clear_vars(&ftdmchan->caller_data);
|
ftdm_call_clear_data(&ftdmchan->caller_data);
|
||||||
SS7_FUNC_TRACE_EXIT (__FUNCTION__);
|
SS7_FUNC_TRACE_EXIT (__FUNCTION__);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -588,7 +588,7 @@ void ft_to_sngss7_uba (ftdm_channel_t * ftdmchan)
|
|||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx UBA\n", sngss7_info->circuit->cic);
|
SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx UBA\n", sngss7_info->circuit->cic);
|
||||||
ftdm_call_clear_vars(&ftdmchan->caller_data);
|
ftdm_call_clear_data(&ftdmchan->caller_data);
|
||||||
SS7_FUNC_TRACE_EXIT (__FUNCTION__);
|
SS7_FUNC_TRACE_EXIT (__FUNCTION__);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -609,7 +609,7 @@ void ft_to_sngss7_lpa (ftdm_channel_t * ftdmchan)
|
|||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx LPA\n", sngss7_info->circuit->cic);
|
SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx LPA\n", sngss7_info->circuit->cic);
|
||||||
ftdm_call_clear_vars(&ftdmchan->caller_data);
|
ftdm_call_clear_data(&ftdmchan->caller_data);
|
||||||
SS7_FUNC_TRACE_EXIT (__FUNCTION__);
|
SS7_FUNC_TRACE_EXIT (__FUNCTION__);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -654,7 +654,7 @@ void ft_to_sngss7_gra (ftdm_channel_t * ftdmchan)
|
|||||||
sngss7_info->circuit->cic,
|
sngss7_info->circuit->cic,
|
||||||
(sngss7_info->circuit->cic + sngss7_span->rx_grs.range));
|
(sngss7_info->circuit->cic + sngss7_span->rx_grs.range));
|
||||||
|
|
||||||
ftdm_call_clear_vars(&ftdmchan->caller_data);
|
ftdm_call_clear_data(&ftdmchan->caller_data);
|
||||||
SS7_FUNC_TRACE_EXIT (__FUNCTION__);
|
SS7_FUNC_TRACE_EXIT (__FUNCTION__);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -688,7 +688,7 @@ void ft_to_sngss7_grs (ftdm_channel_t * ftdmchan)
|
|||||||
sngss7_info->circuit->cic,
|
sngss7_info->circuit->cic,
|
||||||
(sngss7_info->circuit->cic + sngss7_span->tx_grs.range));
|
(sngss7_info->circuit->cic + sngss7_span->tx_grs.range));
|
||||||
|
|
||||||
ftdm_call_clear_vars(&ftdmchan->caller_data);
|
ftdm_call_clear_data(&ftdmchan->caller_data);
|
||||||
SS7_FUNC_TRACE_EXIT (__FUNCTION__);
|
SS7_FUNC_TRACE_EXIT (__FUNCTION__);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -737,7 +737,7 @@ void ft_to_sngss7_cgba(ftdm_channel_t * ftdmchan)
|
|||||||
|
|
||||||
/* clean out the saved data */
|
/* clean out the saved data */
|
||||||
memset(&sngss7_span->rx_cgb, 0x0, sizeof(sngss7_group_data_t));
|
memset(&sngss7_span->rx_cgb, 0x0, sizeof(sngss7_group_data_t));
|
||||||
ftdm_call_clear_vars(&ftdmchan->caller_data);
|
ftdm_call_clear_data(&ftdmchan->caller_data);
|
||||||
SS7_FUNC_TRACE_EXIT (__FUNCTION__);
|
SS7_FUNC_TRACE_EXIT (__FUNCTION__);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -787,7 +787,7 @@ void ft_to_sngss7_cgua(ftdm_channel_t * ftdmchan)
|
|||||||
/* clean out the saved data */
|
/* clean out the saved data */
|
||||||
memset(&sngss7_span->rx_cgu, 0x0, sizeof(sngss7_group_data_t));
|
memset(&sngss7_span->rx_cgu, 0x0, sizeof(sngss7_group_data_t));
|
||||||
|
|
||||||
ftdm_call_clear_vars(&ftdmchan->caller_data);
|
ftdm_call_clear_data(&ftdmchan->caller_data);
|
||||||
SS7_FUNC_TRACE_EXIT (__FUNCTION__);
|
SS7_FUNC_TRACE_EXIT (__FUNCTION__);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -838,7 +838,7 @@ void ft_to_sngss7_cgb(ftdm_channel_t * ftdmchan)
|
|||||||
/* clean out the saved data */
|
/* clean out the saved data */
|
||||||
memset(&sngss7_span->tx_cgb, 0x0, sizeof(sngss7_group_data_t));
|
memset(&sngss7_span->tx_cgb, 0x0, sizeof(sngss7_group_data_t));
|
||||||
|
|
||||||
ftdm_call_clear_vars(&ftdmchan->caller_data);
|
ftdm_call_clear_data(&ftdmchan->caller_data);
|
||||||
SS7_FUNC_TRACE_EXIT (__FUNCTION__);
|
SS7_FUNC_TRACE_EXIT (__FUNCTION__);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -889,7 +889,7 @@ void ft_to_sngss7_cgu(ftdm_channel_t * ftdmchan)
|
|||||||
/* clean out the saved data */
|
/* clean out the saved data */
|
||||||
memset(&sngss7_span->tx_cgu, 0x0, sizeof(sngss7_group_data_t));
|
memset(&sngss7_span->tx_cgu, 0x0, sizeof(sngss7_group_data_t));
|
||||||
|
|
||||||
ftdm_call_clear_vars(&ftdmchan->caller_data);
|
ftdm_call_clear_data(&ftdmchan->caller_data);
|
||||||
SS7_FUNC_TRACE_EXIT (__FUNCTION__);
|
SS7_FUNC_TRACE_EXIT (__FUNCTION__);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -2833,7 +2833,7 @@ static int ftmod_ss7_fill_in_ccSpan(sng_ccSpan_t *ccSpan)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* find a spot for this circuit in the global structure */
|
/* find a spot for this circuit in the global structure */
|
||||||
x = (ccSpan->procId * 1000);
|
x = (ccSpan->procId * 1000) + 1;
|
||||||
flag = 0;
|
flag = 0;
|
||||||
while (flag == 0) {
|
while (flag == 0) {
|
||||||
/**********************************************************************/
|
/**********************************************************************/
|
||||||
|
@ -554,6 +554,7 @@ struct ftdm_sigmsg {
|
|||||||
uint32_t chan_id; /*!< easy access to chan id */
|
uint32_t chan_id; /*!< easy access to chan id */
|
||||||
uint32_t span_id; /*!< easy access to span_id */
|
uint32_t span_id; /*!< easy access to span_id */
|
||||||
uint32_t call_id; /*!< unique call id for this call */
|
uint32_t call_id; /*!< unique call id for this call */
|
||||||
|
void *call_priv; /*!< Private data for the FreeTDM user from ftdm_caller_data->priv */
|
||||||
union {
|
union {
|
||||||
ftdm_event_sigstatus_t sigstatus; /*!< valid if event_id is FTDM_SIGEVENT_SIGSTATUS_CHANGED */
|
ftdm_event_sigstatus_t sigstatus; /*!< valid if event_id is FTDM_SIGEVENT_SIGSTATUS_CHANGED */
|
||||||
ftdm_event_trace_t trace; /*!< valid if event_id is FTDM_SIGEVENT_TRACE or FTDM_SIGEVENT_TRACE_RAW */
|
ftdm_event_trace_t trace; /*!< valid if event_id is FTDM_SIGEVENT_TRACE or FTDM_SIGEVENT_TRACE_RAW */
|
||||||
@ -1368,34 +1369,12 @@ FT_DECLARE(ftdm_status_t) ftdm_channel_read(ftdm_channel_t *ftdmchan, void *data
|
|||||||
*/
|
*/
|
||||||
FT_DECLARE(ftdm_status_t) ftdm_channel_write(ftdm_channel_t *ftdmchan, void *data, ftdm_size_t datasize, ftdm_size_t *datalen);
|
FT_DECLARE(ftdm_status_t) ftdm_channel_write(ftdm_channel_t *ftdmchan, void *data, ftdm_size_t datasize, ftdm_size_t *datalen);
|
||||||
|
|
||||||
/*! \brief Add a custom variable to the channel
|
|
||||||
* \note This variables may be used by signaling modules to override signaling parameters
|
|
||||||
* \todo Document which signaling variables are available
|
|
||||||
* */
|
|
||||||
FT_DECLARE(ftdm_status_t) ftdm_channel_add_var(ftdm_channel_t *ftdmchan, const char *var_name, const char *value);
|
|
||||||
|
|
||||||
/*! \brief Get a custom variable from the channel.
|
|
||||||
* \note The variable pointer returned is only valid while the channel is open and it'll be destroyed when the channel is closed. */
|
|
||||||
FT_DECLARE(const char *) ftdm_channel_get_var(ftdm_channel_t *ftdmchan, const char *var_name);
|
|
||||||
|
|
||||||
/*! \brief Get an iterator to iterate over the channel variables
|
|
||||||
* \param ftdmchan The channel structure containing the variables
|
|
||||||
* \param iter Optional iterator. You can reuse an old iterator (not previously freed) to avoid the extra allocation of a new iterator.
|
|
||||||
* \note The iterator pointer returned is only valid while the channel is open and it'll be destroyed when the channel is closed.
|
|
||||||
* This iterator is completely non-thread safe, if you are adding variables or removing variables while iterating
|
|
||||||
* results are unpredictable
|
|
||||||
*/
|
|
||||||
FT_DECLARE(ftdm_iterator_t *) ftdm_channel_get_var_iterator(const ftdm_channel_t *ftdmchan, ftdm_iterator_t *iter);
|
|
||||||
|
|
||||||
/*! \brief Get iterator current value (depends on the iterator type)
|
/*! \brief Get iterator current value (depends on the iterator type)
|
||||||
* \note Channel iterators return a pointer to ftdm_channel_t
|
* \note Channel iterators return a pointer to ftdm_channel_t
|
||||||
* Variable iterators return a pointer to the variable name (not the variable value)
|
* Variable iterators return a pointer to the variable name (not the variable value)
|
||||||
*/
|
*/
|
||||||
FT_DECLARE(void *) ftdm_iterator_current(ftdm_iterator_t *iter);
|
FT_DECLARE(void *) ftdm_iterator_current(ftdm_iterator_t *iter);
|
||||||
|
|
||||||
/*! \brief Get variable name and value for the current iterator position */
|
|
||||||
FT_DECLARE(ftdm_status_t) ftdm_channel_get_current_var(ftdm_iterator_t *iter, const char **var_name, const char **var_val);
|
|
||||||
|
|
||||||
/*! \brief Advance iterator */
|
/*! \brief Advance iterator */
|
||||||
FT_DECLARE(ftdm_iterator_t *) ftdm_iterator_next(ftdm_iterator_t *iter);
|
FT_DECLARE(ftdm_iterator_t *) ftdm_iterator_next(ftdm_iterator_t *iter);
|
||||||
|
|
||||||
@ -1426,23 +1405,6 @@ FT_DECLARE(ftdm_iterator_t *) ftdm_call_get_var_iterator(const ftdm_caller_data_
|
|||||||
/*! \brief Get variable name and value for the current iterator position */
|
/*! \brief Get variable name and value for the current iterator position */
|
||||||
FT_DECLARE(ftdm_status_t) ftdm_call_get_current_var(ftdm_iterator_t *iter, const char **var_name, const char **var_val);
|
FT_DECLARE(ftdm_status_t) ftdm_call_get_current_var(ftdm_iterator_t *iter, const char **var_name, const char **var_val);
|
||||||
|
|
||||||
/*! \brief Clear all variables attached to the call
|
|
||||||
* \note Variables are cleared at the end of each call back, so it is not necessary for the user to call this function.
|
|
||||||
* \todo Document which signaling variables are available
|
|
||||||
* */
|
|
||||||
FT_DECLARE(ftdm_status_t) ftdm_call_clear_vars(ftdm_caller_data_t *caller_data);
|
|
||||||
|
|
||||||
/*! \brief Remove a variable attached to the call
|
|
||||||
* \note Removes a variable that was attached to the call.
|
|
||||||
* \todo Document which call variables are available
|
|
||||||
* */
|
|
||||||
FT_DECLARE(ftdm_status_t) ftdm_call_remove_var(ftdm_caller_data_t *caller_data, const char *var_name);
|
|
||||||
|
|
||||||
/*! \brief Clears all the temporary data attached to this call
|
|
||||||
* \note Clears caller_data->variables and caller_data->raw_data.
|
|
||||||
* */
|
|
||||||
FT_DECLARE(void) ftdm_call_clear_data(ftdm_caller_data_t *caller_data);
|
|
||||||
|
|
||||||
/*! \brief Get the span pointer associated to the channel */
|
/*! \brief Get the span pointer associated to the channel */
|
||||||
FT_DECLARE(ftdm_span_t *) ftdm_channel_get_span(const ftdm_channel_t *ftdmchan);
|
FT_DECLARE(ftdm_span_t *) ftdm_channel_get_span(const ftdm_channel_t *ftdmchan);
|
||||||
|
|
||||||
|
@ -451,7 +451,6 @@ struct ftdm_channel {
|
|||||||
struct ftdm_caller_data caller_data;
|
struct ftdm_caller_data caller_data;
|
||||||
struct ftdm_span *span;
|
struct ftdm_span *span;
|
||||||
struct ftdm_io_interface *fio;
|
struct ftdm_io_interface *fio;
|
||||||
ftdm_hash_t *variable_hash;
|
|
||||||
unsigned char rx_cas_bits;
|
unsigned char rx_cas_bits;
|
||||||
uint32_t pre_buffer_size;
|
uint32_t pre_buffer_size;
|
||||||
uint8_t rxgain_table[FTDM_GAINS_TABLE_SIZE];
|
uint8_t rxgain_table[FTDM_GAINS_TABLE_SIZE];
|
||||||
@ -629,6 +628,24 @@ FT_DECLARE(void) ftdm_channel_clear_detected_tones(ftdm_channel_t *ftdmchan);
|
|||||||
FT_DECLARE(void) ftdm_set_echocancel_call_begin(ftdm_channel_t *chan);
|
FT_DECLARE(void) ftdm_set_echocancel_call_begin(ftdm_channel_t *chan);
|
||||||
FT_DECLARE(void) ftdm_set_echocancel_call_end(ftdm_channel_t *chan);
|
FT_DECLARE(void) ftdm_set_echocancel_call_end(ftdm_channel_t *chan);
|
||||||
|
|
||||||
|
/*! \brief Clear all variables attached to the call
|
||||||
|
* \note Variables are cleared at the end of each call back, so it is not necessary for the user to call this function.
|
||||||
|
* \todo Document which signaling variables are available
|
||||||
|
* */
|
||||||
|
FT_DECLARE(ftdm_status_t) ftdm_call_clear_vars(ftdm_caller_data_t *caller_data);
|
||||||
|
|
||||||
|
/*! \brief Remove a variable attached to the call
|
||||||
|
* \note Removes a variable that was attached to the call.
|
||||||
|
* \todo Document which call variables are available
|
||||||
|
* */
|
||||||
|
FT_DECLARE(ftdm_status_t) ftdm_call_remove_var(ftdm_caller_data_t *caller_data, const char *var_name);
|
||||||
|
|
||||||
|
/*! \brief Clears all the temporary data attached to this call
|
||||||
|
* \note Clears caller_data->variables and caller_data->raw_data.
|
||||||
|
* */
|
||||||
|
FT_DECLARE(void) ftdm_call_clear_data(ftdm_caller_data_t *caller_data);
|
||||||
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
\brief Assert condition
|
\brief Assert condition
|
||||||
*/
|
*/
|
||||||
@ -688,6 +705,9 @@ FT_DECLARE(void) ftdm_set_echocancel_call_end(ftdm_channel_t *chan);
|
|||||||
if (!ftdm_test_flag((fchan), FTDM_CHANNEL_MEDIA)) { \
|
if (!ftdm_test_flag((fchan), FTDM_CHANNEL_MEDIA)) { \
|
||||||
ftdm_set_flag((fchan), FTDM_CHANNEL_MEDIA); \
|
ftdm_set_flag((fchan), FTDM_CHANNEL_MEDIA); \
|
||||||
ftdm_set_echocancel_call_begin((fchan)); \
|
ftdm_set_echocancel_call_begin((fchan)); \
|
||||||
|
if ((fchan)->dtmfdbg.requested) { \
|
||||||
|
ftdm_channel_command((fchan), FTDM_COMMAND_ENABLE_DEBUG_DTMF, NULL); \
|
||||||
|
} \
|
||||||
} \
|
} \
|
||||||
} while (0);
|
} while (0);
|
||||||
|
|
||||||
|
@ -236,6 +236,7 @@ struct switch_runtime {
|
|||||||
char *odbc_dsn;
|
char *odbc_dsn;
|
||||||
char *odbc_user;
|
char *odbc_user;
|
||||||
char *odbc_pass;
|
char *odbc_pass;
|
||||||
|
char *dbname;
|
||||||
uint32_t debug_level;
|
uint32_t debug_level;
|
||||||
uint32_t runlevel;
|
uint32_t runlevel;
|
||||||
uint32_t tipping_point;
|
uint32_t tipping_point;
|
||||||
|
@ -1384,6 +1384,8 @@ static void *SWITCH_THREAD_FUNC outbound_agent_thread_run(switch_thread_t *threa
|
|||||||
switch_event_add_header(ovars, SWITCH_STACK_BOTTOM, "cc_agent", "%s", h->agent_name);
|
switch_event_add_header(ovars, SWITCH_STACK_BOTTOM, "cc_agent", "%s", h->agent_name);
|
||||||
switch_event_add_header(ovars, SWITCH_STACK_BOTTOM, "cc_agent_type", "%s", h->agent_type);
|
switch_event_add_header(ovars, SWITCH_STACK_BOTTOM, "cc_agent_type", "%s", h->agent_type);
|
||||||
switch_event_add_header(ovars, SWITCH_STACK_BOTTOM, "ignore_early_media", "true");
|
switch_event_add_header(ovars, SWITCH_STACK_BOTTOM, "ignore_early_media", "true");
|
||||||
|
/* Force loopback to remain live, if not, the loop will detect the actual channel to gone */
|
||||||
|
switch_event_add_header(ovars, SWITCH_STACK_BOTTOM, "loopback_bowout", "false");
|
||||||
|
|
||||||
t_agent_called = switch_epoch_time_now(NULL);
|
t_agent_called = switch_epoch_time_now(NULL);
|
||||||
dialstr = switch_mprintf("%s", h->originate_string);
|
dialstr = switch_mprintf("%s", h->originate_string);
|
||||||
@ -2080,6 +2082,32 @@ void *SWITCH_THREAD_FUNC cc_member_thread_run(switch_thread_t *thread, void *obj
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct moh_dtmf_helper {
|
||||||
|
const char *queue_name;
|
||||||
|
char dtmf;
|
||||||
|
};
|
||||||
|
|
||||||
|
static switch_status_t moh_on_dtmf(switch_core_session_t *session, void *input, switch_input_type_t itype, void *buf, unsigned int buflen) {
|
||||||
|
struct moh_dtmf_helper *h = (struct moh_dtmf_helper *) buf;
|
||||||
|
|
||||||
|
switch (itype) {
|
||||||
|
case SWITCH_INPUT_TYPE_DTMF:
|
||||||
|
{
|
||||||
|
/* Just laywork for people who want to get some DTMF actions */
|
||||||
|
switch_dtmf_t *dtmf = (switch_dtmf_t *) input;
|
||||||
|
if (strchr("#", dtmf->digit)) {
|
||||||
|
h->dtmf = dtmf->digit;
|
||||||
|
return SWITCH_STATUS_BREAK;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return SWITCH_STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
#define CC_DESC "callcenter"
|
#define CC_DESC "callcenter"
|
||||||
#define CC_USAGE "queue_name"
|
#define CC_USAGE "queue_name"
|
||||||
|
|
||||||
@ -2226,8 +2254,6 @@ SWITCH_STANDARD_APP(callcenter_function)
|
|||||||
switch_thread_create(&thread, thd_attr, cc_member_thread_run, h, h->pool);
|
switch_thread_create(&thread, thd_attr, cc_member_thread_run, h, h->pool);
|
||||||
|
|
||||||
/* Playback MOH */
|
/* Playback MOH */
|
||||||
/* TODO Add DTMF callback support */
|
|
||||||
/* TODO add MOH infitite loop */
|
|
||||||
if (cc_moh_override) {
|
if (cc_moh_override) {
|
||||||
cur_moh = switch_core_session_strdup(member_session, cc_moh_override);
|
cur_moh = switch_core_session_strdup(member_session, cc_moh_override);
|
||||||
} else {
|
} else {
|
||||||
@ -2237,6 +2263,12 @@ SWITCH_STANDARD_APP(callcenter_function)
|
|||||||
|
|
||||||
while (switch_channel_ready(member_channel)) {
|
while (switch_channel_ready(member_channel)) {
|
||||||
switch_input_args_t args = { 0 };
|
switch_input_args_t args = { 0 };
|
||||||
|
struct moh_dtmf_helper ht;
|
||||||
|
|
||||||
|
ht.dtmf = '\0';
|
||||||
|
args.input_callback = moh_on_dtmf;
|
||||||
|
args.buf = (void *) &ht;
|
||||||
|
args.buflen = sizeof(h);
|
||||||
|
|
||||||
/* An agent was found, time to exit and let the bridge do it job */
|
/* An agent was found, time to exit and let the bridge do it job */
|
||||||
if ((agent_uuid = switch_channel_get_variable(member_channel, "cc_agent_uuid"))) {
|
if ((agent_uuid = switch_channel_get_variable(member_channel, "cc_agent_uuid"))) {
|
||||||
@ -2260,6 +2292,8 @@ SWITCH_STANDARD_APP(callcenter_function)
|
|||||||
switch_ivr_collect_digits_callback(session, &args, 0, 0);
|
switch_ivr_collect_digits_callback(session, &args, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
switch_yield(1000);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Stop Member Thread */
|
/* Stop Member Thread */
|
||||||
|
@ -780,7 +780,7 @@ SWITCH_STANDARD_API(user_data_function)
|
|||||||
if ((domain = strchr(user, '@'))) {
|
if ((domain = strchr(user, '@'))) {
|
||||||
*domain++ = '\0';
|
*domain++ = '\0';
|
||||||
} else {
|
} else {
|
||||||
if ((dup_domain = switch_core_get_variable("domain"))) {
|
if ((dup_domain = switch_core_get_variable_dup("domain"))) {
|
||||||
domain = dup_domain;
|
domain = dup_domain;
|
||||||
} else {
|
} else {
|
||||||
domain = "cluecon.com";
|
domain = "cluecon.com";
|
||||||
|
@ -1298,6 +1298,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_init(switch_core_flag_t flags, switc
|
|||||||
runtime.default_dtmf_duration = SWITCH_DEFAULT_DTMF_DURATION;
|
runtime.default_dtmf_duration = SWITCH_DEFAULT_DTMF_DURATION;
|
||||||
runtime.min_dtmf_duration = SWITCH_MIN_DTMF_DURATION;
|
runtime.min_dtmf_duration = SWITCH_MIN_DTMF_DURATION;
|
||||||
runtime.odbc_dbtype = DBTYPE_DEFAULT;
|
runtime.odbc_dbtype = DBTYPE_DEFAULT;
|
||||||
|
runtime.dbname = NULL;
|
||||||
|
|
||||||
/* INIT APR and Create the pool context */
|
/* INIT APR and Create the pool context */
|
||||||
if (apr_initialize() != SWITCH_STATUS_SUCCESS) {
|
if (apr_initialize() != SWITCH_STATUS_SUCCESS) {
|
||||||
@ -1641,6 +1642,8 @@ static void switch_load_core_config(const char *file)
|
|||||||
switch_rtp_set_start_port((switch_port_t) atoi(val));
|
switch_rtp_set_start_port((switch_port_t) atoi(val));
|
||||||
} else if (!strcasecmp(var, "rtp-end-port") && !zstr(val)) {
|
} else if (!strcasecmp(var, "rtp-end-port") && !zstr(val)) {
|
||||||
switch_rtp_set_end_port((switch_port_t) atoi(val));
|
switch_rtp_set_end_port((switch_port_t) atoi(val));
|
||||||
|
} else if (!strcasecmp(var, "core-db-name") && !zstr(val)) {
|
||||||
|
runtime.dbname = switch_core_strdup(runtime.memory_pool, val);
|
||||||
} else if (!strcasecmp(var, "core-db-dsn") && !zstr(val)) {
|
} else if (!strcasecmp(var, "core-db-dsn") && !zstr(val)) {
|
||||||
if (switch_odbc_available()) {
|
if (switch_odbc_available()) {
|
||||||
runtime.odbc_dsn = switch_core_strdup(runtime.memory_pool, val);
|
runtime.odbc_dsn = switch_core_strdup(runtime.memory_pool, val);
|
||||||
|
@ -73,8 +73,12 @@ SWITCH_DECLARE(switch_status_t) _switch_core_db_handle(switch_cache_db_handle_t
|
|||||||
options.odbc_options.pass = runtime.odbc_pass;
|
options.odbc_options.pass = runtime.odbc_pass;
|
||||||
|
|
||||||
r = _switch_cache_db_get_db_handle(dbh, SCDB_TYPE_ODBC, &options, file, func, line);
|
r = _switch_cache_db_get_db_handle(dbh, SCDB_TYPE_ODBC, &options, file, func, line);
|
||||||
|
} else {
|
||||||
|
if (runtime.dbname) {
|
||||||
|
options.core_db_options.db_path = runtime.dbname;
|
||||||
} else {
|
} else {
|
||||||
options.core_db_options.db_path = SWITCH_CORE_DB;
|
options.core_db_options.db_path = SWITCH_CORE_DB;
|
||||||
|
}
|
||||||
r = _switch_cache_db_get_db_handle(dbh, SCDB_TYPE_CORE_DB, &options, file, func, line);
|
r = _switch_cache_db_get_db_handle(dbh, SCDB_TYPE_CORE_DB, &options, file, func, line);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1635,7 +1639,7 @@ static char create_registrations_sql[] =
|
|||||||
" network_proto VARCHAR(256),\n"
|
" network_proto VARCHAR(256),\n"
|
||||||
" hostname VARCHAR(256)\n"
|
" hostname VARCHAR(256)\n"
|
||||||
");\n"
|
");\n"
|
||||||
"create index regindex1 on registrations (user,realm,hostname);\n";
|
"create index regindex1 on registrations (reg_user,realm,hostname);\n";
|
||||||
|
|
||||||
|
|
||||||
SWITCH_DECLARE(switch_status_t) switch_core_add_registration(const char *user, const char *realm, const char *token, const char *url, uint32_t expires,
|
SWITCH_DECLARE(switch_status_t) switch_core_add_registration(const char *user, const char *realm, const char *token, const char *url, uint32_t expires,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user