diff --git a/Freeswitch.2008.express.sln b/Freeswitch.2008.express.sln
index b4f1f60201..43cbc02d0e 100644
--- a/Freeswitch.2008.express.sln
+++ b/Freeswitch.2008.express.sln
@@ -9,12 +9,14 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FreeSwitchConsole", "w32\Co
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FreeSwitchCoreLib", "w32\Library\FreeSwitchCore.2008.vcproj", "{202D7A4E-760D-4D0E-AFA1-D7459CED30FF}"
ProjectSection(ProjectDependencies) = postProject
+ {D331904D-A00A-4694-A5A3-FCFF64AB5DBE} = {D331904D-A00A-4694-A5A3-FCFF64AB5DBE}
{8D04B550-D240-4A44-8A18-35DA3F7038D9} = {8D04B550-D240-4A44-8A18-35DA3F7038D9}
{89385C74-5860-4174-9CAF-A39E7C48909C} = {89385C74-5860-4174-9CAF-A39E7C48909C}
{1CBB0077-18C5-455F-801C-0A0CE7B0BBF5} = {1CBB0077-18C5-455F-801C-0A0CE7B0BBF5}
{F057DA7F-79E5-4B00-845C-EF446EF055E3} = {F057DA7F-79E5-4B00-845C-EF446EF055E3}
{03207781-0D1C-4DB3-A71D-45C608F28DBD} = {03207781-0D1C-4DB3-A71D-45C608F28DBD}
{F6C55D93-B927-4483-BB69-15AEF3DD2DFF} = {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}
+ {87EE9DA4-DE1E-4448-8324-183C98DCA588} = {87EE9DA4-DE1E-4448-8324-183C98DCA588}
{EEF031CB-FED8-451E-A471-91EC8D4F6750} = {EEF031CB-FED8-451E-A471-91EC8D4F6750}
{6EDFEFD5-3596-4FA9-8EBA-B331547B35A3} = {6EDFEFD5-3596-4FA9-8EBA-B331547B35A3}
EndProjectSection
diff --git a/Freeswitch.2008.sln b/Freeswitch.2008.sln
index f915005e7c..4061116d07 100644
--- a/Freeswitch.2008.sln
+++ b/Freeswitch.2008.sln
@@ -379,12 +379,14 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FreeSwitchConsole", "w32\Co
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FreeSwitchCoreLib", "w32\Library\FreeSwitchCore.2008.vcproj", "{202D7A4E-760D-4D0E-AFA1-D7459CED30FF}"
ProjectSection(ProjectDependencies) = postProject
+ {D331904D-A00A-4694-A5A3-FCFF64AB5DBE} = {D331904D-A00A-4694-A5A3-FCFF64AB5DBE}
{8D04B550-D240-4A44-8A18-35DA3F7038D9} = {8D04B550-D240-4A44-8A18-35DA3F7038D9}
{89385C74-5860-4174-9CAF-A39E7C48909C} = {89385C74-5860-4174-9CAF-A39E7C48909C}
{1CBB0077-18C5-455F-801C-0A0CE7B0BBF5} = {1CBB0077-18C5-455F-801C-0A0CE7B0BBF5}
{F057DA7F-79E5-4B00-845C-EF446EF055E3} = {F057DA7F-79E5-4B00-845C-EF446EF055E3}
{03207781-0D1C-4DB3-A71D-45C608F28DBD} = {03207781-0D1C-4DB3-A71D-45C608F28DBD}
{F6C55D93-B927-4483-BB69-15AEF3DD2DFF} = {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}
+ {87EE9DA4-DE1E-4448-8324-183C98DCA588} = {87EE9DA4-DE1E-4448-8324-183C98DCA588}
{EEF031CB-FED8-451E-A471-91EC8D4F6750} = {EEF031CB-FED8-451E-A471-91EC8D4F6750}
{6EDFEFD5-3596-4FA9-8EBA-B331547B35A3} = {6EDFEFD5-3596-4FA9-8EBA-B331547B35A3}
EndProjectSection
diff --git a/Makefile.am b/Makefile.am
index 5b6b9896ac..fcb2297131 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -103,14 +103,22 @@ CORE_CFLAGS += -I$(switch_srcdir)/libs/speex/include -Ilibs/speex/include
CORE_CFLAGS += -I$(switch_srcdir)/libs/srtp/include
CORE_CFLAGS += -I$(switch_srcdir)/libs/srtp/crypto/include -Ilibs/srtp/crypto/include
CORE_CFLAGS += -I$(switch_srcdir)/libs/spandsp/src -I$(switch_srcdir)/libs/tiff-3.8.2/libtiff
+CORE_CFLAGS += $(LIBCURL_CPPFLAGS) $(openssl_CFLAGS)
+
+if ENABLE_CORE_CURL
+CORE_CFLAGS += -DCORE_USE_CURL
+endif
CORE_LIBS = libs/apr-util/libaprutil-1.la libs/apr/libapr-1.la
CORE_LIBS += libs/sqlite/libsqlite3.la libs/pcre/libpcre.la libs/speex/libspeex/libspeexdsp.la
+if ENABLE_SRTP
+CORE_CFLAGS += -DENABLE_SRTP
CORE_LIBS += libs/srtp/libsrtp.la
+endif
MOD_LINK = $(switch_srcdir)/libfreeswitch.la
CLEANFILES = src/include/switch_version.h src/include/switch_swigable_cpp.h
-BUILT_SOURCES = src/include/switch_version.h src/include/switch_swigable_cpp.h
+BUILT_SOURCES = src/include/switch_version.h src/include/switch_swigable_cpp.h $(LIBCURL_DEPS)
if HAVE_ODBC
CORE_CFLAGS += -DSWITCH_HAVE_ODBC $(ODBC_INC_FLAGS)
@@ -127,7 +135,7 @@ endif
lib_LTLIBRARIES = libfreeswitch.la
libfreeswitch_la_CFLAGS = $(CORE_CFLAGS) $(AM_CFLAGS)
libfreeswitch_la_LDFLAGS = -version-info 1:0:0 $(AM_LDFLAGS) $(PLATFORM_CORE_DEPLIBS)
-libfreeswitch_la_LIBADD = $(CORE_LIBS)
+libfreeswitch_la_LIBADD = $(CORE_LIBS) $(LIBCURL)
libfreeswitch_la_DEPENDENCIES = $(BUILT_SOURCES)
if HAVE_ODBC
@@ -177,7 +185,8 @@ library_include_HEADERS = \
libs/libteletone/src/libteletone_generate.h \
libs/libteletone/src/libteletone.h \
src/include/switch_limit.h \
- src/include/switch_odbc.h
+ src/include/switch_odbc.h \
+ src/include/switch_curl.h
nodist_libfreeswitch_la_SOURCES = \
src/include/switch_frame.h \
@@ -237,6 +246,7 @@ libfreeswitch_la_SOURCES = \
src/switch_pcm.c \
src/switch_profile.c \
src/switch_json.c \
+ src/switch_curl.c \
libs/stfu/stfu.c \
libs/libteletone/src/libteletone_detect.c \
libs/libteletone/src/libteletone_generate.c \
@@ -432,6 +442,9 @@ libs/srtp/libsrtp.la: libs/srtp libs/srtp/.update
@cd libs/srtp && $(MAKE)
@$(TOUCH_TARGET)
+libs/curl/lib/libcurl.la:
+ @cd $libs/curl && $(MAKE)
+ @$(TOUCH_TARGET)
##
## helper targets
diff --git a/build/freeswitch.init.redhat b/build/freeswitch.init.redhat
index 6fe9c43c47..b9dc3d8db5 100644
--- a/build/freeswitch.init.redhat
+++ b/build/freeswitch.init.redhat
@@ -15,7 +15,7 @@
. /etc/init.d/functions
PROG_NAME=freeswitch
-PID_FILE=${PID_FILE-/opt/freeswitch/run/freeswitch.pid}
+PID_FILE=${PID_FILE-/var/run/freeswitch/freeswitch.pid}
FS_USER=${FS_USER-freeswitch}
FS_FILE=${FS_FILE-/opt/freeswitch/bin/freeswitch}
FS_HOME=${FS_HOME-/opt/freeswitch}
diff --git a/build/modmake.rules.in b/build/modmake.rules.in
index 51923ec3dd..f0db222f71 100644
--- a/build/modmake.rules.in
+++ b/build/modmake.rules.in
@@ -80,9 +80,9 @@ TOUCH_TARGET=@TOUCH_TARGET@
MAKE_OPTS = `test -n "$(VERBOSE)" || echo -s`
RECURSE_MODNAME=`pwd | sed -e 's|^.*/||'`
RECURSE_SOURCEFILE=`if test -f "$$modname.cpp" -o -f "$(MODDIR)/$$modname.cpp"; then echo "$$modname.cpp"; else echo "$$modname.c"; fi`
-RECURSE_OUR_DEPS=`test -z "$(WANT_CURL)" || if test ! -z "$(LIBCURL_DEPS)"; then echo $(CURLLA); fi `
-RECURSE_OUR_CFLAGS=`test -z "$(WANT_CURL)" || echo $(LIBCURL_CPPFLAGS) ; $(LOCAL_INSERT_CFLAGS) `
-RECURSE_OUR_LDFLAGS=`test -z "$(WANT_CURL)" || echo $(LIBCURL) ; $(LOCAL_INSERT_LDFLAGS) `
+RECURSE_OUR_DEPS=
+RECURSE_OUR_CFLAGS=`$(LOCAL_INSERT_CFLAGS)`
+RECURSE_OUR_LDFLAGS=`$(LOCAL_INSERT_LDFLAGS)`
RECURSE_MODDIR=`if test -z $(MODDIR); then pwd | sed -e 's|$(switch_builddir)|$(switch_srcdir)|'; else echo $(MODDIR); fi`
RECURSE_MAKE=+modname="$(RECURSE_MODNAME)" ; \
sourcefile="$(RECURSE_SOURCEFILE)" ; \
diff --git a/build/modules.conf.in b/build/modules.conf.in
index d31bb31b76..1084461f0e 100644
--- a/build/modules.conf.in
+++ b/build/modules.conf.in
@@ -37,6 +37,7 @@ applications/mod_valet_parking
#applications/mod_callcenter
#applications/mod_fsk
#applications/mod_ladspa
+#applications/mod_mongo
codecs/mod_g723_1
codecs/mod_amr
#codecs/mod_amrwb
diff --git a/build/sounds_version.txt b/build/sounds_version.txt
index cb456d76eb..55729b1f9f 100644
--- a/build/sounds_version.txt
+++ b/build/sounds_version.txt
@@ -1,3 +1,3 @@
-en-us-callie 1.0.15
+en-us-callie 1.0.16
ru-RU-elena 1.0.12
diff --git a/conf/autoload_configs/mongo.conf.xml b/conf/autoload_configs/mongo.conf.xml
new file mode 100644
index 0000000000..a7fdecae8d
--- /dev/null
+++ b/conf/autoload_configs/mongo.conf.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/conf/dialplan/default/01_Talking_Clock.xml b/conf/dialplan/default/01_Talking_Clock.xml
index 4e37962001..205132a249 100644
--- a/conf/dialplan/default/01_Talking_Clock.xml
+++ b/conf/dialplan/default/01_Talking_Clock.xml
@@ -1,6 +1,6 @@
-
+
@@ -8,7 +8,7 @@
-
+
@@ -17,7 +17,7 @@
-
+
diff --git a/configure.in b/configure.in
index 356e4c4705..c9952d855f 100644
--- a/configure.in
+++ b/configure.in
@@ -347,6 +347,16 @@ AC_ARG_ENABLE(cpp,
AM_CONDITIONAL([ENABLE_CPP],[test "${enable_cpp}" = "yes"])
+AC_ARG_ENABLE(srtp,
+[AC_HELP_STRING([--disable-srtp],[build without srtp support])],[enable_srtp="$enableval"],[enable_srtp="yes"])
+
+AM_CONDITIONAL([ENABLE_SRTP],[test "${enable_srtp}" = "yes"])
+
+AC_ARG_ENABLE(core-curl,
+[AC_HELP_STRING([--disable-core-curl],[build without core-curl support])],[enable_core_curl="$enableval"],[enable_core_curl="yes"])
+
+AM_CONDITIONAL([ENABLE_CORE_CURL],[test "${enable_core_curl}" = "yes"])
+
AC_ARG_ENABLE(zrtp,
[AS_HELP_STRING([--enable-zrtp], [Compile with zrtp Support])],,[enable_zrtp="no"])
if test "x$enable_zrtp" = "xyes" ; then
@@ -785,6 +795,11 @@ if test "$ac_cv_use_system_curl" != "yes" ; then
LIBCURL_DEPS='${switch_builddir}/libs/curl/lib/libcurl.la'
LIBCURL='${switch_builddir}/libs/curl/lib/libcurl.la'
LIBCURL_CPPFLAGS='-I${switch_srcdir}/libs/curl/include'
+else
+ AC_CHECK_LIB(curl, curl_global_init, have_curl=yes, have_curl=no)
+ if test "x$have_curl" = "xyes" ; then
+ APR_ADDTO(SWITCH_AM_LDFLAGS, -lcurl)
+ fi
fi
AC_SUBST(LIBCURL_DEPS)
diff --git a/docs/phrase/phrase_en.xml b/docs/phrase/phrase_en.xml
index ab4f61bb46..507fc7bd34 100644
--- a/docs/phrase/phrase_en.xml
+++ b/docs/phrase/phrase_en.xml
@@ -5,6 +5,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -222,6 +239,8 @@
+
+
@@ -270,7 +289,13 @@
-
+
+
+
+
+
+
+
@@ -432,26 +457,40 @@
-
-
-
+
+
-
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/phrase/phrase_fr.xml b/docs/phrase/phrase_fr.xml
index ef3ee7bb6d..2d5f488152 100644
--- a/docs/phrase/phrase_fr.xml
+++ b/docs/phrase/phrase_fr.xml
@@ -219,14 +219,14 @@
-
+
-
-
+
+
diff --git a/freeswitch.spec b/freeswitch.spec
index 4397430d7f..d13ae2686d 100644
--- a/freeswitch.spec
+++ b/freeswitch.spec
@@ -776,6 +776,7 @@ fi
%config(noreplace) %attr(0640, freeswitch, daemon) %{prefix}/conf/autoload_configs/logfile.conf.xml
%config(noreplace) %attr(0640, freeswitch, daemon) %{prefix}/conf/autoload_configs/memcache.conf.xml
%config(noreplace) %attr(0640, freeswitch, daemon) %{prefix}/conf/autoload_configs/modules.conf.xml
+%config(noreplace) %attr(0640, freeswitch, daemon) %{prefix}/conf/autoload_configs/mongo.conf.xml
%config(noreplace) %attr(0640, freeswitch, daemon) %{prefix}/conf/autoload_configs/nibblebill.conf.xml
%config(noreplace) %attr(0640, freeswitch, daemon) %{prefix}/conf/autoload_configs/opal.conf.xml
%config(noreplace) %attr(0640, freeswitch, daemon) %{prefix}/conf/autoload_configs/osp.conf.xml
diff --git a/libs/freetdm/mod_freetdm/mod_freetdm.c b/libs/freetdm/mod_freetdm/mod_freetdm.c
index 68728668bd..b2ac9a8293 100755
--- a/libs/freetdm/mod_freetdm/mod_freetdm.c
+++ b/libs/freetdm/mod_freetdm/mod_freetdm.c
@@ -294,10 +294,7 @@ static void cycle_foreground(ftdm_channel_t *ftdmchan, int flash, const char *bc
}
}
-
-
-
-static switch_status_t tech_init(private_t *tech_pvt, switch_core_session_t *session, ftdm_channel_t *ftdmchan)
+static switch_status_t tech_init(private_t *tech_pvt, switch_core_session_t *session, ftdm_channel_t *ftdmchan, ftdm_caller_data_t *caller_data)
{
const char *dname = NULL;
uint32_t interval = 0, srate = 8000;
@@ -321,6 +318,14 @@ static switch_status_t tech_init(private_t *tech_pvt, switch_core_session_t *ses
return SWITCH_STATUS_GENERR;
}
+ if (caller_data->bearer_capability == FTDM_BEARER_CAP_64K_UNRESTRICTED) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Initializing digital call.\n");
+ /* temporary hack, this will be configurable */
+ dname = "G722";
+ srate = 16000;
+ goto init_codecs;
+ }
+
if (FTDM_SUCCESS != ftdm_channel_command(ftdmchan, FTDM_COMMAND_GET_CODEC, &codec)) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Failed to retrieve channel codec.\n");
return SWITCH_STATUS_GENERR;
@@ -349,6 +354,7 @@ static switch_status_t tech_init(private_t *tech_pvt, switch_core_session_t *ses
}
}
+init_codecs:
if (switch_core_codec_init(&tech_pvt->read_codec,
dname,
@@ -1093,7 +1099,7 @@ static ftdm_status_t on_channel_found(ftdm_channel_t *fchan, ftdm_caller_data_t
span_id = ftdm_channel_get_span_id(fchan);
chan_id = ftdm_channel_get_id(fchan);
- tech_init(hdata->tech_pvt, hdata->new_session, fchan);
+ tech_init(hdata->tech_pvt, hdata->new_session, fchan, caller_data);
snprintf(name, sizeof(name), "FreeTDM/%u:%u/%s", span_id, chan_id, caller_data->dnis.digits);
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Connect outbound channel %s\n", name);
@@ -1298,32 +1304,72 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi
sipvar = switch_channel_get_variable(channel, "sip_h_X-FreeTDM-RDNIS");
if (sipvar) {
ftdm_set_string(caller_data.rdnis.digits, sipvar);
- }
-
- sipvar = switch_channel_get_variable(channel, "sip_h_X-FreeTDM-RDNIS-TON");
- if (sipvar) {
- caller_data.rdnis.type = (uint8_t)atoi(sipvar);
+ ftdm_usrmsg_add_var(&usrmsg, "ss7_rdnis_digits", sipvar);
}
sipvar = switch_channel_get_variable(channel, "sip_h_X-FreeTDM-RDNIS-Plan");
if (sipvar) {
- caller_data.rdnis.plan = (uint8_t)atoi(sipvar);
+ ftdm_usrmsg_add_var(&usrmsg, "ss7_rdnis_plan", sipvar);
}
- /* Used by ftmod_sangoma_ss7 only */
sipvar = switch_channel_get_variable(channel, "sip_h_X-FreeTDM-RDNIS-NADI");
if (sipvar) {
ftdm_usrmsg_add_var(&usrmsg, "ss7_rdnis_nadi", sipvar);
}
+ sipvar = switch_channel_get_variable(channel, "sip_h_X-FreeTDM-RDNIS-Screen");
+ if (sipvar) {
+ ftdm_usrmsg_add_var(&usrmsg, "ss7_rdnis_screen_ind", sipvar);
+ }
+
+ sipvar = switch_channel_get_variable(channel, "sip_h_X-FreeTDM-RDNIS-Presentation");
+ if (sipvar) {
+ ftdm_usrmsg_add_var(&usrmsg, "ss7_rdnis_pres_ind", sipvar);
+ }
+
+ sipvar = switch_channel_get_variable(channel, "sip_h_X-FreeTDM-GN");
+ if (sipvar) {
+ ftdm_usrmsg_add_var(&usrmsg, "ss7_gn_digits", sipvar);
+ }
+
+ sipvar = switch_channel_get_variable(channel, "sip_h_X-FreeTDM-GN-NumQual");
+ if (sipvar) {
+ ftdm_usrmsg_add_var(&usrmsg, "ss7_gn_numqual", sipvar);
+ }
+
+ sipvar = switch_channel_get_variable(channel, "sip_h_X-FreeTDM-GN-NADI");
+ if (sipvar) {
+ ftdm_usrmsg_add_var(&usrmsg, "ss7_gn_nadi", sipvar);
+ }
+
+ sipvar = switch_channel_get_variable(channel, "sip_h_X-FreeTDM-GN-Screen");
+ if (sipvar) {
+ ftdm_usrmsg_add_var(&usrmsg, "ss7_gn_screen_ind", sipvar);
+ }
+
+ sipvar = switch_channel_get_variable(channel, "sip_h_X-FreeTDM-GN-Presentation");
+ if (sipvar) {
+ ftdm_usrmsg_add_var(&usrmsg, "ss7_gn_pres_ind", sipvar);
+ }
+
+ sipvar = switch_channel_get_variable(channel, "sip_h_X-FreeTDM-GN-Plan");
+ if (sipvar) {
+ ftdm_usrmsg_add_var(&usrmsg, "ss7_gn_npi", sipvar);
+ }
+
+ sipvar = switch_channel_get_variable(channel, "sip_h_X-FreeTDM-GN-NumInComp");
+ if (sipvar) {
+ ftdm_usrmsg_add_var(&usrmsg, "ss7_gn_num_inc_ind", sipvar);
+ }
+
sipvar = switch_channel_get_variable(channel, "sip_h_X-FreeTDM-Screen");
if (sipvar) {
- caller_data.screen = (uint8_t)atoi(sipvar);
+ ftdm_usrmsg_add_var(&usrmsg, "ss7_screen_ind", sipvar);
}
sipvar = switch_channel_get_variable(channel, "sip_h_X-FreeTDM-Presentation");
if (sipvar) {
- caller_data.pres = (uint8_t)atoi(sipvar);
+ ftdm_usrmsg_add_var(&usrmsg, "ss7_pres_ind", sipvar);
}
@@ -1342,19 +1388,19 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi
}
if ((var = channel_get_variable(session, var_event, "freetdm_bearer_layer1"))) {
- caller_data.bearer_layer1 = (uint8_t)atoi(var);
+ caller_data.bearer_layer1 = (uint8_t)atoi(var);
}
if ((var = channel_get_variable(session, var_event, "freetdm_screening_ind"))) {
- ftdm_set_screening_ind(var, &caller_data.screen);
+ ftdm_set_screening_ind(var, &caller_data.screen);
}
if ((var = channel_get_variable(session, var_event, "freetdm_presentation_ind"))) {
- ftdm_set_presentation_ind(var, &caller_data.pres);
+ ftdm_set_presentation_ind(var, &caller_data.pres);
}
if ((var = channel_get_variable(session, var_event, "freetdm_outbound_ton"))) {
- ftdm_set_ton(var, &caller_data.dnis.type);
+ ftdm_set_ton(var, &caller_data.dnis.type);
} else {
caller_data.dnis.type = outbound_profile->destination_number_ton;
}
@@ -1502,7 +1548,7 @@ ftdm_status_t ftdm_channel_from_event(ftdm_sigmsg_t *sigmsg, switch_core_session
tech_pvt = (private_t *) switch_core_session_alloc(session, sizeof(private_t));
assert(tech_pvt != NULL);
channel = switch_core_session_get_channel(session);
- if (tech_init(tech_pvt, session, sigmsg->channel) != SWITCH_STATUS_SUCCESS) {
+ if (tech_init(tech_pvt, session, sigmsg->channel, channel_caller_data) != SWITCH_STATUS_SUCCESS) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Initilization Error!\n");
switch_core_session_destroy(&session);
return FTDM_FAIL;
@@ -1585,8 +1631,53 @@ ftdm_status_t ftdm_channel_from_event(ftdm_sigmsg_t *sigmsg, switch_core_session
switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-DNIS-Plan", "%d", channel_caller_data->dnis.plan);
switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-RDNIS", "%s", channel_caller_data->rdnis.digits);
- switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-RDNIS-TON", "%d", channel_caller_data->rdnis.type);
+ switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-RDNIS-NADI", "%d", channel_caller_data->rdnis.type);
switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-RDNIS-Plan", "%d", channel_caller_data->rdnis.plan);
+
+ var_value = ftdm_sigmsg_get_var(sigmsg, "ss7_rdnis_screen_ind");
+ if (!ftdm_strlen_zero(var_value)) {
+ switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-RDNIS-Screen", "%d", var_value);
+ }
+
+ var_value = ftdm_sigmsg_get_var(sigmsg, "ss7_rdnis_pres_ind");
+ if (!ftdm_strlen_zero(var_value)) {
+ switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-RDNIS-Presentation", "%d", channel_caller_data->rdnis.plan);
+ }
+
+ var_value = ftdm_sigmsg_get_var(sigmsg, "ss7_gn_digits");
+ if (!ftdm_strlen_zero(var_value)) {
+ switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-GN", "%d", var_value);
+
+ var_value = ftdm_sigmsg_get_var(sigmsg, "ss7_gn_numqual");
+ if (!ftdm_strlen_zero(var_value)) {
+ switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-GN-NumQual", "%d", var_value);
+ }
+
+ var_value = ftdm_sigmsg_get_var(sigmsg, "ss7_gn_nadi");
+ if (!ftdm_strlen_zero(var_value)) {
+ switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-GN-NADI", "%d", var_value);
+ }
+
+ var_value = ftdm_sigmsg_get_var(sigmsg, "ss7_gn_screen_ind");
+ if (!ftdm_strlen_zero(var_value)) {
+ switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-GN-Screen", "%d", var_value);
+ }
+
+ var_value = ftdm_sigmsg_get_var(sigmsg, "ss7_gn_pres_ind");
+ if (!ftdm_strlen_zero(var_value)) {
+ switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-GN-Presentation", "%d", var_value);
+ }
+
+ var_value = ftdm_sigmsg_get_var(sigmsg, "ss7_gn_npi");
+ if (!ftdm_strlen_zero(var_value)) {
+ switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-GN-Plan", "%d", var_value);
+ }
+
+ var_value = ftdm_sigmsg_get_var(sigmsg, "ss7_gn_num_inc_ind");
+ if (!ftdm_strlen_zero(var_value)) {
+ switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-GN-NumInComp", "%d", var_value);
+ }
+ } /* End - var_value = ftdm_sigmsg_get_var(sigmsg, "ss7_gn_digits"); */
switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-Screen", "%d", channel_caller_data->screen);
switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-Presentation", "%d", channel_caller_data->pres);
@@ -3518,6 +3609,12 @@ void dump_chan(ftdm_span_t *span, uint32_t chan_id, switch_stream_handle_t *stre
"physical_span_id: %u\n"
"physical_chan_id: %u\n"
"physical_status: %s\n"
+ "physical_status_red: %d\n"
+ "physical_status_yellow: %d\n"
+ "physical_status_rai: %d\n"
+ "physical_status_blue: %d\n"
+ "physical_status_ais: %d\n"
+ "physical_status_general: %d\n"
"signaling_status: %s\n"
"type: %s\n"
"state: %s\n"
@@ -3538,7 +3635,13 @@ void dump_chan(ftdm_span_t *span, uint32_t chan_id, switch_stream_handle_t *stre
phspan_id,
phchan_id,
alarmflag ? "alarmed" : "ok",
- ftdm_signaling_status2str(sigstatus),
+ (alarmflag & FTDM_ALARM_RED) ? 1 : 0,
+ (alarmflag & FTDM_ALARM_YELLOW) ? 1 : 0,
+ (alarmflag & FTDM_ALARM_RAI) ? 1 : 0,
+ (alarmflag & FTDM_ALARM_BLUE) ? 1 : 0,
+ (alarmflag & FTDM_ALARM_AIS) ? 1 : 0,
+ (alarmflag & FTDM_ALARM_GENERAL) ? 1 : 0,
+ ftdm_signaling_status2str(sigstatus),
chan_type,
state,
last_state,
@@ -3594,6 +3697,12 @@ void dump_chan_xml(ftdm_span_t *span, uint32_t chan_id, switch_stream_handle_t *
" %u\n"
" %u\n"
" %s\n"
+ " %d\n"
+ " %d\n"
+ " %d\n"
+ " %d\n"
+ " %d\n"
+ " %d\n"
" %s\n"
" %s\n"
" %s\n"
@@ -3614,7 +3723,13 @@ void dump_chan_xml(ftdm_span_t *span, uint32_t chan_id, switch_stream_handle_t *
phspan_id,
phchan_id,
alarmflag ? "alarmed" : "ok",
- ftdm_signaling_status2str(sigstatus),
+ (alarmflag & FTDM_ALARM_RED) ? 1 : 0,
+ (alarmflag & FTDM_ALARM_YELLOW) ? 1 : 0,
+ (alarmflag & FTDM_ALARM_RAI) ? 1 : 0,
+ (alarmflag & FTDM_ALARM_BLUE) ? 1 : 0,
+ (alarmflag & FTDM_ALARM_AIS) ? 1 : 0,
+ (alarmflag & FTDM_ALARM_GENERAL) ? 1 : 0,
+ ftdm_signaling_status2str(sigstatus),
chan_type,
state,
last_state,
diff --git a/libs/freetdm/src/ftdm_io.c b/libs/freetdm/src/ftdm_io.c
index 1c10171202..ddfe78dd71 100644
--- a/libs/freetdm/src/ftdm_io.c
+++ b/libs/freetdm/src/ftdm_io.c
@@ -508,13 +508,16 @@ FT_DECLARE(ftdm_status_t) ftdm_channel_set_caller_data(ftdm_channel_t *ftdmchan,
{
ftdm_status_t err = FTDM_SUCCESS;
if (!ftdmchan) {
- ftdm_log(FTDM_LOG_CRIT, "Error: trying to set caller data, but no ftdmchan!\n");
+ ftdm_log(FTDM_LOG_CRIT, "trying to set caller data, but no ftdmchan!\n");
return FTDM_FAIL;
}
if ((err = ftdm_set_caller_data(ftdmchan->span, caller_data)) != FTDM_SUCCESS) {
return err;
}
ftdmchan->caller_data = *caller_data;
+ if (ftdmchan->caller_data.bearer_capability == FTDM_BEARER_CAP_64K_UNRESTRICTED) {
+ ftdm_set_flag(ftdmchan, FTDM_CHANNEL_DIGITAL_MEDIA);
+ }
return FTDM_SUCCESS;
}
@@ -2628,6 +2631,7 @@ static ftdm_status_t ftdm_channel_done(ftdm_channel_t *ftdmchan)
ftdm_clear_flag(ftdmchan, FTDM_CHANNEL_MEDIA);
ftdm_clear_flag(ftdmchan, FTDM_CHANNEL_ANSWERED);
ftdm_clear_flag(ftdmchan, FTDM_CHANNEL_USER_HANGUP);
+ ftdm_clear_flag(ftdmchan, FTDM_CHANNEL_DIGITAL_MEDIA);
ftdm_mutex_lock(ftdmchan->pre_buffer_mutex);
ftdm_buffer_destroy(&ftdmchan->pre_buffer);
ftdmchan->pre_buffer_size = 0;
@@ -3780,6 +3784,10 @@ FT_DECLARE(ftdm_status_t) ftdm_channel_read(ftdm_channel_t *ftdmchan, void *data
handle_tone_generation(ftdmchan);
+ if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_DIGITAL_MEDIA)) {
+ goto done;
+ }
+
if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_TRANSCODE) && ftdmchan->effective_codec != ftdmchan->native_codec) {
if (ftdmchan->native_codec == FTDM_CODEC_ULAW && ftdmchan->effective_codec == FTDM_CODEC_SLIN) {
codec_func = fio_ulaw2slin;
@@ -3994,6 +4002,10 @@ FT_DECLARE(ftdm_status_t) ftdm_channel_write(ftdm_channel_t *ftdmchan, void *dat
status = FTDM_FAIL;
goto done;
}
+
+ if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_DIGITAL_MEDIA)) {
+ goto do_write;
+ }
if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_TRANSCODE) && ftdmchan->effective_codec != ftdmchan->native_codec) {
if (ftdmchan->native_codec == FTDM_CODEC_ULAW && ftdmchan->effective_codec == FTDM_CODEC_SLIN) {
@@ -4025,6 +4037,8 @@ FT_DECLARE(ftdm_status_t) ftdm_channel_write(ftdm_channel_t *ftdmchan, void *dat
}
}
+do_write:
+
if (ftdmchan->span->sig_write) {
status = ftdmchan->span->sig_write(ftdmchan, data, *datalen);
if (status == FTDM_BREAK) {
@@ -5374,10 +5388,12 @@ 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_call_set_call_id(sigmsg->channel, &sigmsg->channel->caller_data);
/* 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
- * is needed at all?
- * */
+ * doing it during SIGEVENT_START, but now that flags are private they can't, wonder if
+ * is needed at all? */
ftdm_clear_flag(sigmsg->channel, FTDM_CHANNEL_HOLD);
+ if (sigmsg->channel->caller_data.bearer_capability == FTDM_BEARER_CAP_64K_UNRESTRICTED) {
+ ftdm_set_flag(sigmsg->channel, FTDM_CHANNEL_DIGITAL_MEDIA);
+ }
}
break;
diff --git a/libs/freetdm/src/ftmod/ftmod_libpri/ftmod_libpri.c b/libs/freetdm/src/ftmod/ftmod_libpri/ftmod_libpri.c
index 949ea154e3..8093443986 100644
--- a/libs/freetdm/src/ftmod/ftmod_libpri/ftmod_libpri.c
+++ b/libs/freetdm/src/ftmod/ftmod_libpri/ftmod_libpri.c
@@ -562,14 +562,18 @@ static ftdm_status_t state_advance(ftdm_channel_t *chan)
sig.chan_id = ftdm_channel_get_id(chan);
sig.span_id = ftdm_channel_get_span_id(chan);
sig.channel = chan;
-
+
ftdm_channel_complete_state(chan);
switch (ftdm_channel_get_state(chan)) {
case FTDM_CHANNEL_STATE_DOWN:
{
ftdm_channel_t *chtmp = chan;
- chan->call_data = NULL;
+
+ if (call) {
+ pri_destroycall(isdn_data->spri.pri, call);
+ chan->call_data = NULL;
+ }
if (ftdm_channel_close(&chtmp) != FTDM_SUCCESS) {
ftdm_log(FTDM_LOG_WARNING, "-- Failed to close channel %d:%d\n",
@@ -776,8 +780,7 @@ static ftdm_status_t state_advance(ftdm_channel_t *chan)
pri_hangup(isdn_data->spri.pri, call, caller_data->hangup_cause);
// pri_destroycall(isdn_data->spri.pri, call);
-
- chan->call_data = NULL;
+// chan->call_data = NULL;
}
ftdm_set_state_locked(chan, FTDM_CHANNEL_STATE_HANGUP_COMPLETE);
}
@@ -785,10 +788,10 @@ static ftdm_status_t state_advance(ftdm_channel_t *chan)
case FTDM_CHANNEL_STATE_HANGUP_COMPLETE:
{
- if (call) {
- pri_destroycall(isdn_data->spri.pri, call);
- chan->call_data = NULL;
- }
+// if (call) {
+// pri_destroycall(isdn_data->spri.pri, call);
+// chan->call_data = NULL;
+// }
ftdm_set_state_locked(chan, FTDM_CHANNEL_STATE_DOWN);
}
break;
@@ -862,18 +865,61 @@ static int on_hangup(lpwrap_pri_t *spri, lpwrap_pri_event_t event_type, pri_even
ftdm_channel_lock(chan);
- if (ftdm_channel_get_state(chan) >= FTDM_CHANNEL_STATE_TERMINATING) {
- ftdm_log_chan(chan, FTDM_LOG_DEBUG, "Ignoring remote hangup in state %s\n", ftdm_channel_get_state_str(chan));
- goto done;
+ switch (event_type) {
+ case LPWRAP_PRI_EVENT_HANGUP_REQ: /* DISCONNECT */
+ if (ftdm_channel_get_state(chan) >= FTDM_CHANNEL_STATE_TERMINATING) {
+ ftdm_log_chan(chan, FTDM_LOG_DEBUG, "Ignoring remote hangup in state %s\n",
+ ftdm_channel_get_state_str(chan));
+ goto done;
+ }
+ ftdm_log(FTDM_LOG_DEBUG, "-- Hangup REQ on channel %d:%d\n",
+ ftdm_span_get_id(spri->span), pevent->hangup.channel);
+
+ pri_hangup(spri->pri, pevent->hangup.call, pevent->hangup.cause);
+
+ chan->caller_data.hangup_cause = pevent->hangup.cause;
+ ftdm_set_state(chan, FTDM_CHANNEL_STATE_TERMINATING);
+ break;
+
+ case LPWRAP_PRI_EVENT_HANGUP_ACK: /* */
+ ftdm_log(FTDM_LOG_DEBUG, "-- Hangup ACK on channel %d:%d\n",
+ ftdm_span_get_id(spri->span), pevent->hangup.channel);
+
+ pri_hangup(spri->pri, pevent->hangup.call, pevent->hangup.cause);
+
+ ftdm_set_state(chan, FTDM_CHANNEL_STATE_HANGUP_COMPLETE);
+ break;
+
+ case LPWRAP_PRI_EVENT_HANGUP: /* "RELEASE/RELEASE_COMPLETE/other" */
+ ftdm_log(FTDM_LOG_DEBUG, "-- Hangup on channel %d:%d\n",
+ ftdm_span_get_id(spri->span), pevent->hangup.channel);
+
+ switch (ftdm_channel_get_state(chan)) {
+ case FTDM_CHANNEL_STATE_DIALING:
+ case FTDM_CHANNEL_STATE_RINGING:
+ case FTDM_CHANNEL_STATE_PROGRESS:
+ case FTDM_CHANNEL_STATE_PROGRESS_MEDIA:
+ case FTDM_CHANNEL_STATE_PROCEED:
+ case FTDM_CHANNEL_STATE_UP:
+ chan->caller_data.hangup_cause = pevent->hangup.cause;
+ ftdm_set_state(chan, FTDM_CHANNEL_STATE_TERMINATING);
+ break;
+ case FTDM_CHANNEL_STATE_HANGUP:
+ chan->caller_data.hangup_cause = pevent->hangup.cause;
+ ftdm_set_state(chan, FTDM_CHANNEL_STATE_HANGUP_COMPLETE);
+ break;
+// case FTDM_CHANNEL_STATE_TERMINATING:
+// ftdm_set_state(chan, FTDM_CHANNEL_STATE_HANGUP);
+// break;
+// case FTDM_CHANNEL_STATE_HANGUP_COMPLETE:
+// ftdm_set_state(chan, FTDM_CHANNEL_STATE_DOWN);
+// break;
+ }
+ break;
+ default:
+ break;
}
- ftdm_log(FTDM_LOG_DEBUG, "-- Hangup on channel %d:%d\n", ftdm_span_get_id(spri->span), pevent->hangup.channel);
-
- pri_hangup(spri->pri, pevent->hangup.call, -1);
-
- chan->caller_data.hangup_cause = pevent->hangup.cause;
- chan->call_data = NULL;
- ftdm_set_state(chan, FTDM_CHANNEL_STATE_TERMINATING);
done:
ftdm_channel_unlock(chan);
return 0;
@@ -1644,6 +1690,7 @@ static void *ftdm_libpri_run(ftdm_thread_t *me, void *obj)
LPWRAP_MAP_PRI_EVENT(isdn_data->spri, LPWRAP_PRI_EVENT_DCHAN_UP, on_dchan_up);
LPWRAP_MAP_PRI_EVENT(isdn_data->spri, LPWRAP_PRI_EVENT_DCHAN_DOWN, on_dchan_down);
LPWRAP_MAP_PRI_EVENT(isdn_data->spri, LPWRAP_PRI_EVENT_HANGUP_REQ, on_hangup);
+ LPWRAP_MAP_PRI_EVENT(isdn_data->spri, LPWRAP_PRI_EVENT_HANGUP_ACK, on_hangup);
LPWRAP_MAP_PRI_EVENT(isdn_data->spri, LPWRAP_PRI_EVENT_HANGUP, on_hangup);
LPWRAP_MAP_PRI_EVENT(isdn_data->spri, LPWRAP_PRI_EVENT_INFO_RECEIVED, on_info);
LPWRAP_MAP_PRI_EVENT(isdn_data->spri, LPWRAP_PRI_EVENT_RESTART, on_restart);
@@ -1918,6 +1965,10 @@ static FIO_CONFIGURE_SPAN_SIGNALING_FUNCTION(ftdm_libpri_configure_span)
assert(isdn_data != NULL);
memset(isdn_data, 0, sizeof(*isdn_data));
+ /* set some default values */
+ isdn_data->mode = PRI_CPE;
+ isdn_data->ton = PRI_UNKNOWN;
+
switch (ftdm_span_get_trunk_type(span)) {
case FTDM_TRUNK_BRI:
case FTDM_TRUNK_BRI_PTMP:
@@ -1928,12 +1979,14 @@ static FIO_CONFIGURE_SPAN_SIGNALING_FUNCTION(ftdm_libpri_configure_span)
#endif
case FTDM_TRUNK_E1:
ftdm_log(FTDM_LOG_NOTICE, "Setting default Layer 1 to ALAW since this is an E1/BRI/BRI PTMP trunk\n");
- isdn_data->layer1 = PRI_LAYER_1_ALAW;
+ isdn_data->layer1 = PRI_LAYER_1_ALAW;
+ isdn_data->dialect = PRI_SWITCH_EUROISDN_E1;
break;
case FTDM_TRUNK_T1:
case FTDM_TRUNK_J1:
ftdm_log(FTDM_LOG_NOTICE, "Setting default Layer 1 to ULAW since this is a T1/J1 trunk\n");
- isdn_data->layer1 = PRI_LAYER_1_ULAW;
+ isdn_data->layer1 = PRI_LAYER_1_ULAW;
+ isdn_data->dialect = PRI_SWITCH_LUCENT5E;
break;
default:
ftdm_log(FTDM_LOG_ERROR, "Invalid trunk type: '%s'\n", ftdm_span_get_trunk_type_str(span));
diff --git a/libs/freetdm/src/ftmod/ftmod_r2/ftmod_r2.c b/libs/freetdm/src/ftmod/ftmod_r2/ftmod_r2.c
index 64d8b4fc3c..1c15f992a2 100755
--- a/libs/freetdm/src/ftmod/ftmod_r2/ftmod_r2.c
+++ b/libs/freetdm/src/ftmod/ftmod_r2/ftmod_r2.c
@@ -360,11 +360,15 @@ static void ft_r2_clean_call(ftdm_r2_call_t *call)
static void ft_r2_accept_call(ftdm_channel_t *ftdmchan)
{
openr2_chan_t *r2chan = R2CALL(ftdmchan)->r2chan;
- // FIXME: not always accept as no charge, let the user decide that
- // also we should check the return code from openr2_chan_accept_call and handle error condition
+ ftdm_r2_data_t *r2data = ftdmchan->span->signal_data;
+
+ // FIXME: we should check the return code from openr2_chan_accept_call and handle error condition
// hanging up the call with protocol error as the reason, this openr2 API will fail only when there something
// wrong at the I/O layer or the library itself
- openr2_chan_accept_call(r2chan, OR2_CALL_NO_CHARGE);
+ if (r2data->charge_calls)
+ openr2_chan_accept_call(r2chan, OR2_CALL_WITH_CHARGE);
+ else
+ openr2_chan_accept_call(r2chan, OR2_CALL_NO_CHARGE);
}
static void ft_r2_answer_call(ftdm_channel_t *ftdmchan)
@@ -1697,6 +1701,8 @@ static FIO_CONFIGURE_SPAN_SIGNALING_FUNCTION(ftdm_r2_configure_span_signaling)
r2data->category = r2conf.category;
r2data->allow_collect_calls = r2conf.allow_collect_calls;
r2data->flags = 0;
+ r2data->charge_calls = r2conf.charge_calls;
+ r2data->forced_release = r2conf.forced_release;
spanpvt->r2context = r2data->r2context;
/* just the value must be freed by the hash */
@@ -1854,6 +1860,10 @@ static ftdm_status_t ftdm_r2_state_advance(ftdm_channel_t *ftdmchan)
{
if (!r2call->disconnect_rcvd) {
openr2_call_disconnect_cause_t disconnect_cause = ftdm_r2_ftdm_cause_to_openr2_cause(ftdmchan);
+ /* overwrite the hangup cause if this is an incoming call and forced_release is set */
+ if (openr2_chan_get_direction(r2chan) == OR2_DIR_BACKWARD && r2data->forced_release) {
+ disconnect_cause = OR2_CAUSE_FORCED_RELEASE;
+ }
ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Clearing call, cause = %s\n", openr2_proto_get_disconnect_string(disconnect_cause));
/* this will disconnect the call, but need to wait for the call end before moving to DOWN */
openr2_chan_disconnect_call(r2chan, disconnect_cause);
diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn.c b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn.c
index 75379eef64..3cf4876070 100644
--- a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn.c
+++ b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn.c
@@ -1199,9 +1199,17 @@ static FIO_SIG_UNLOAD_FUNCTION(ftdm_sangoma_isdn_unload)
return FTDM_SUCCESS;
}
+#define SANGOMA_ISDN_API_USAGE_TRACE "ftdm sangoma_isdn trace \n"
+#define SANGOMA_ISDN_API_USAGE_SHOW_L1_STATS "ftdm sangoma_isdn l1_stats \n"
+#define SANGOMA_ISDN_API_USAGE_SHOW_SPANS "ftdm sangoma_isdn show_spans []\n"
+
+#define SANGOMA_ISDN_API_USAGE "\t"SANGOMA_ISDN_API_USAGE_TRACE \
+ "\t"SANGOMA_ISDN_API_USAGE_SHOW_L1_STATS \
+ "\t"SANGOMA_ISDN_API_USAGE_SHOW_SPANS
+
static FIO_API_FUNCTION(ftdm_sangoma_isdn_api)
{
- ftdm_status_t status = FTDM_SUCCESS;
+ ftdm_status_t status = FTDM_EINVAL;
char *mycmd = NULL, *argv[10] = { 0 };
int argc = 0;
@@ -1223,7 +1231,7 @@ static FIO_API_FUNCTION(ftdm_sangoma_isdn_api)
ftdm_span_t *span;
if (argc < 3) {
- ftdm_log(FTDM_LOG_ERROR, "Usage: ftdm sangoma_isdn trace \n");
+ ftdm_log(FTDM_LOG_ERROR, "Usage: %s\n", SANGOMA_ISDN_API_USAGE_TRACE);
status = FTDM_FAIL;
goto done;
}
@@ -1232,34 +1240,40 @@ static FIO_API_FUNCTION(ftdm_sangoma_isdn_api)
status = ftdm_span_find_by_name(argv[2], &span);
if (FTDM_SUCCESS != status) {
stream->write_function(stream, "-ERR failed to find span by name %s\n", argv[2]);
+
+ status = FTDM_FAIL;
goto done;
}
if (!strcasecmp(trace_opt, "q921")) {
- sngisdn_activate_trace(span, SNGISDN_TRACE_Q921);
+ status = sngisdn_activate_trace(span, SNGISDN_TRACE_Q921);
} else if (!strcasecmp(trace_opt, "q931")) {
- sngisdn_activate_trace(span, SNGISDN_TRACE_Q931);
+ status = sngisdn_activate_trace(span, SNGISDN_TRACE_Q931);
} else if (!strcasecmp(trace_opt, "disable")) {
- sngisdn_activate_trace(span, SNGISDN_TRACE_DISABLE);
+ status = sngisdn_activate_trace(span, SNGISDN_TRACE_DISABLE);
} else {
stream->write_function(stream, "-ERR invalid trace option \n");
+ status = FTDM_FAIL;
}
+ goto done;
}
+
if (!strcasecmp(argv[0], "l1_stats")) {
ftdm_span_t *span;
if (argc < 2) {
- stream->write_function(stream, "Usage: ftdm sangoma_isdn l1_stats \n");
+ stream->write_function(stream, "Usage: %s\n", SANGOMA_ISDN_API_USAGE_SHOW_L1_STATS);
status = FTDM_FAIL;
goto done;
}
status = ftdm_span_find_by_name(argv[1], &span);
if (FTDM_SUCCESS != status) {
stream->write_function(stream, "-ERR failed to find span with name %s\n", argv[1]);
- /* Return SUCCESS because we do not want to print the general FTDM usage list */
- status = FTDM_SUCCESS;
+
+ status = FTDM_FAIL;
goto done;
}
- sngisdn_print_phy_stats(stream, span);
+ status = sngisdn_show_l1_stats(stream, span);
+ goto done;
}
if (!strcasecmp(argv[0], "show_spans")) {
@@ -1268,20 +1282,39 @@ static FIO_API_FUNCTION(ftdm_sangoma_isdn_api)
status = ftdm_span_find_by_name(argv[1], &span);
if (FTDM_SUCCESS != status) {
stream->write_function(stream, "-ERR failed to find span with name %s\n", argv[1]);
- /* Return SUCCESS because we do not want to print the general FTDM usage list */
- status = FTDM_SUCCESS;
+
+ stream->write_function(stream, "Usage: %s\n", SANGOMA_ISDN_API_USAGE_SHOW_SPANS);
+ status = FTDM_FAIL;
goto done;
}
- sngisdn_print_span(stream, span);
- status = FTDM_SUCCESS;
+ status = sngisdn_show_span(stream, span);
goto done;
}
- sngisdn_print_spans(stream);
+ status = sngisdn_show_spans(stream);
+ goto done;
}
+
if (!strcasecmp(argv[0], "check_ids")) {
- sngisdn_check_free_ids();
+ status = sngisdn_check_free_ids();
+ goto done;
}
done:
+ switch (status) {
+ case FTDM_SUCCESS:
+ stream->write_function(stream, "Command executed OK\n");
+ break;
+ case FTDM_EINVAL:
+ stream->write_function(stream, "Invalid arguments [%s]\n", mycmd);
+ stream->write_function(stream, "Usage:\n%s\n", SANGOMA_ISDN_API_USAGE);
+ break;
+ default:
+ /* FTDM_FAIL - Do nothing since we already printed the cause of the error */
+ break;
+ }
+
+ /* Return SUCCESS because we do not want to print the general FTDM usage list */
+ status = FTDM_SUCCESS;
+
ftdm_safe_free(mycmd);
return status;
}
diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn.h b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn.h
index 112e7cf27d..ac69fa8d66 100644
--- a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn.h
+++ b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn.h
@@ -292,6 +292,12 @@ typedef struct ftdm_sngisdn_data {
sngisdn_span_data_t *spans[MAX_L1_LINKS+1]; /* spans are indexed by link_id */
}ftdm_sngisdn_data_t;
+typedef struct ftdm2trillium
+{
+ uint8_t ftdm_val;
+ uint8_t trillium_val;
+}ftdm2trillium_t;
+
/* TODO implement these 2 functions */
#define ISDN_FUNC_TRACE_ENTER(a)
@@ -471,9 +477,9 @@ ftdm_status_t sngisdn_stack_start(ftdm_span_t *span);
ftdm_status_t sngisdn_stack_stop(ftdm_span_t *span);
ftdm_status_t sngisdn_wake_up_phy(ftdm_span_t *span);
-void sngisdn_print_phy_stats(ftdm_stream_handle_t *stream, ftdm_span_t *span);
-void sngisdn_print_spans(ftdm_stream_handle_t *stream);
-void sngisdn_print_span(ftdm_stream_handle_t *stream, ftdm_span_t *span);
+ftdm_status_t sngisdn_show_l1_stats(ftdm_stream_handle_t *stream, ftdm_span_t *span);
+ftdm_status_t sngisdn_show_spans(ftdm_stream_handle_t *stream);
+ftdm_status_t sngisdn_show_span(ftdm_stream_handle_t *stream, ftdm_span_t *span);
#endif /* __FTMOD_SNG_ISDN_H__ */
diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_cfg.c b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_cfg.c
index 1bd2753e81..88aa9131b6 100644
--- a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_cfg.c
+++ b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_cfg.c
@@ -745,8 +745,16 @@ ftdm_status_t sngisdn_stack_cfg_q931_dlsap(ftdm_span_t *span)
/* TODO: Fill in these timers with proper values - eventually pass them */
cfg.t.cfg.s.inDLSAP.tmr.t301.enb = TRUE;
cfg.t.cfg.s.inDLSAP.tmr.t301.val = 180;
- cfg.t.cfg.s.inDLSAP.tmr.t302.enb = TRUE;
- cfg.t.cfg.s.inDLSAP.tmr.t302.val = 15;
+
+ /* It looks like ETSI is the only variant that supports Overlap */
+ if (signal_data->switchtype == SNGISDN_SWITCH_EUROISDN) {
+ cfg.t.cfg.s.inDLSAP.tmr.t302.enb = TRUE;
+ cfg.t.cfg.s.inDLSAP.tmr.t302.val = 15;
+ } else {
+ cfg.t.cfg.s.inDLSAP.tmr.t302.enb = FALSE;
+ cfg.t.cfg.s.inDLSAP.tmr.t302.val = 0;
+ }
+
cfg.t.cfg.s.inDLSAP.tmr.t303.enb = TRUE;
cfg.t.cfg.s.inDLSAP.tmr.t303.val = 4;
cfg.t.cfg.s.inDLSAP.tmr.t304.enb = TRUE;
diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_hndl.c b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_hndl.c
index b1af8a61c3..0789c433f9 100644
--- a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_hndl.c
+++ b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_hndl.c
@@ -831,7 +831,7 @@ void sngisdn_process_fac_ind (sngisdn_event_data_t *sngisdn_event)
if (sng_isdn_retrieve_facility_caller_name(&facEvnt->facElmt.facStr.val[2], facEvnt->facElmt.facStr.len, retrieved_str) == 0) {
strcpy(ftdmchan->caller_data.cid_name, retrieved_str);
} else {
- ftdm_log_chan_msg(ftdmchan, FTDM_LOG_WARNING, "Failed to retrieve Caller Name from Facility IE\n");
+ ftdm_log_chan_msg(ftdmchan, FTDM_LOG_DEBUG, "Failed to retrieve Caller Name from Facility IE\n");
}
if (signal_data->facility_timeout) {
/* Cancel facility timeout */
diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_support.c b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_support.c
index 0ac52b085c..edad62fc0d 100644
--- a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_support.c
+++ b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_support.c
@@ -43,11 +43,55 @@ SNGISDN_STR2ENUM(ftdm_str2ftdm_sngisdn_progind_descr, ftdm_sngisdn_progind_descr
SNGISDN_ENUM_NAMES(SNGISDN_PROGIND_LOC_NAMES, SNGISDN_PROGIND_LOC_STRINGS)
SNGISDN_STR2ENUM(ftdm_str2ftdm_sngisdn_progind_loc, ftdm_sngisdn_progind_loc2str, ftdm_sngisdn_progind_loc_t, SNGISDN_PROGIND_LOC_NAMES, SNGISDN_PROGIND_LOC_INVALID)
-ftdm_status_t sngisdn_check_free_ids(void);
+static uint8_t get_trillium_val(ftdm2trillium_t *vals, uint8_t ftdm_val, uint8_t default_val);
+static uint8_t get_ftdm_val(ftdm2trillium_t *vals, uint8_t trillium_val, uint8_t default_val);
extern ftdm_sngisdn_data_t g_sngisdn_data;
void get_memory_info(void);
+ftdm2trillium_t npi_codes[] = {
+ {FTDM_NPI_UNKNOWN, IN_NP_UNK},
+ {FTDM_NPI_ISDN, IN_NP_ISDN},
+ {FTDM_NPI_DATA, IN_NP_DATA},
+ {FTDM_NPI_TELEX, IN_NP_TELEX},
+ {FTDM_NPI_NATIONAL, IN_NP_NATIONAL},
+ {FTDM_NPI_PRIVATE, IN_NP_PRIVATE},
+ {FTDM_NPI_RESERVED, IN_NP_EXT},
+};
+
+ftdm2trillium_t ton_codes[] = {
+ {FTDM_TON_UNKNOWN, IN_TON_UNK},
+ {FTDM_TON_INTERNATIONAL, IN_TON_INT},
+ {FTDM_TON_NATIONAL, IN_TON_NAT},
+ {FTDM_TON_NETWORK_SPECIFIC, IN_TON_NETSPEC},
+ {FTDM_TON_SUBSCRIBER_NUMBER, IN_TON_SUB},
+ {FTDM_TON_ABBREVIATED_NUMBER, IN_TON_ABB},
+ {FTDM_TON_RESERVED, IN_TON_EXT},
+};
+
+static uint8_t get_trillium_val(ftdm2trillium_t *vals, uint8_t ftdm_val, uint8_t default_val)
+{
+ ftdm2trillium_t *val = vals;
+ while(val++) {
+ if (val->ftdm_val == ftdm_val) {
+ return val->trillium_val;
+ }
+ }
+ return default_val;
+}
+
+static uint8_t get_ftdm_val(ftdm2trillium_t *vals, uint8_t trillium_val, uint8_t default_val)
+{
+ ftdm2trillium_t *val = vals;
+ while(val++) {
+ if (val->trillium_val == trillium_val) {
+ return val->ftdm_val;
+ }
+ }
+ return default_val;
+}
+
+
void clear_call_data(sngisdn_chan_data_t *sngisdn_info)
{
uint32_t cc_id = ((sngisdn_span_data_t*)sngisdn_info->ftdmchan->span->signal_data)->cc_id;
@@ -259,11 +303,11 @@ ftdm_status_t get_called_num(ftdm_channel_t *ftdmchan, CdPtyNmb *cdPtyNmb)
}
if (cdPtyNmb->nmbPlanId.pres == PRSNT_NODEF) {
- caller_data->dnis.plan = cdPtyNmb->nmbPlanId.val;
+ caller_data->dnis.plan = get_ftdm_val(npi_codes, cdPtyNmb->nmbPlanId.val, IN_NP_UNK);
}
if (cdPtyNmb->typeNmb0.pres == PRSNT_NODEF) {
- caller_data->dnis.type = cdPtyNmb->typeNmb0.val;
+ caller_data->dnis.type = get_ftdm_val(ton_codes, cdPtyNmb->typeNmb0.val, IN_TON_UNK);
}
if (cdPtyNmb->nmbDigits.pres == PRSNT_NODEF) {
@@ -283,11 +327,11 @@ ftdm_status_t get_redir_num(ftdm_channel_t *ftdmchan, RedirNmb *redirNmb)
}
if (redirNmb->nmbPlanId.pres == PRSNT_NODEF) {
- caller_data->rdnis.plan = redirNmb->nmbPlanId.val;
+ caller_data->rdnis.plan = get_ftdm_val(npi_codes, redirNmb->nmbPlanId.val, IN_NP_UNK);
}
if (redirNmb->typeNmb.pres == PRSNT_NODEF) {
- caller_data->rdnis.type = redirNmb->typeNmb.val;
+ caller_data->rdnis.type = get_ftdm_val(ton_codes, redirNmb->typeNmb.val, IN_TON_UNK);
}
if (redirNmb->nmbDigits.pres == PRSNT_NODEF) {
@@ -382,11 +426,13 @@ ftdm_status_t get_facility_ie_str(ftdm_channel_t *ftdmchan, uint8_t *data, uint8
ftdm_status_t get_prog_ind_ie(ftdm_channel_t *ftdmchan, ProgInd *progInd)
{
uint8_t val;
+
if (!progInd->eh.pres) {
return FTDM_FAIL;
}
if (progInd->progDesc.pres) {
+ /* TODO: use get_ftdm_val function and table here */
switch (progInd->progDesc.val) {
case IN_PD_NOTETEISDN:
val = SNGISDN_PROGIND_DESCR_NETE_ISDN;
@@ -464,19 +510,11 @@ ftdm_status_t set_calling_num(ftdm_channel_t *ftdmchan, CgPtyNmb *cgPtyNmb)
cgPtyNmb->presInd0.val = caller_data->pres;
cgPtyNmb->nmbPlanId.pres = PRSNT_NODEF;
- if (caller_data->cid_num.plan >= FTDM_NPI_INVALID) {
- cgPtyNmb->nmbPlanId.val = FTDM_NPI_UNKNOWN;
- } else {
- cgPtyNmb->nmbPlanId.val = caller_data->cid_num.plan;
- }
+ cgPtyNmb->nmbPlanId.val = get_trillium_val(npi_codes, caller_data->cid_num.plan, IN_NP_UNK);
cgPtyNmb->typeNmb1.pres = PRSNT_NODEF;
- if (caller_data->cid_num.type >= FTDM_TON_INVALID) {
- cgPtyNmb->typeNmb1.val = FTDM_TON_UNKNOWN;
- } else {
- cgPtyNmb->typeNmb1.val = caller_data->cid_num.type;
- }
+ cgPtyNmb->typeNmb1.val = get_trillium_val(ton_codes, caller_data->cid_num.type, IN_TON_UNK);
cgPtyNmb->nmbDigits.pres = PRSNT_NODEF;
cgPtyNmb->nmbDigits.len = len;
@@ -510,7 +548,7 @@ ftdm_status_t set_calling_num2(ftdm_channel_t *ftdmchan, CgPtyNmb *cgPtyNmb)
val = FTDM_SCREENING_INVALID;
string = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "isdn.cg_pty2.screening_ind");
- if ((string != NULL) && (*string)) {
+ if (!ftdm_strlen_zero(string)) {
val = ftdm_str2ftdm_screening(string);
}
@@ -527,7 +565,7 @@ ftdm_status_t set_calling_num2(ftdm_channel_t *ftdmchan, CgPtyNmb *cgPtyNmb)
val = FTDM_PRES_INVALID;
string = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "isdn.cg_pty2.presentation_ind");
- if ((string != NULL) && (*string)) {
+ if (!ftdm_strlen_zero(string)) {
val = ftdm_str2ftdm_presentation(string);
}
@@ -542,14 +580,14 @@ ftdm_status_t set_calling_num2(ftdm_channel_t *ftdmchan, CgPtyNmb *cgPtyNmb)
val = FTDM_NPI_INVALID;
string = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "isdn.cg_pty2.npi");
- if ((string != NULL) && (*string)) {
+ if (!ftdm_strlen_zero(string)) {
val = ftdm_str2ftdm_npi(string);
}
if (val == FTDM_NPI_INVALID) {
cgPtyNmb->nmbPlanId.val = caller_data->cid_num.plan;
} else {
- cgPtyNmb->nmbPlanId.val = val;
+ cgPtyNmb->nmbPlanId.val = get_trillium_val(npi_codes, val, IN_NP_UNK);
}
cgPtyNmb->typeNmb1.pres = PRSNT_NODEF;
@@ -557,14 +595,14 @@ ftdm_status_t set_calling_num2(ftdm_channel_t *ftdmchan, CgPtyNmb *cgPtyNmb)
/* Type of Number */
val = FTDM_TON_INVALID;
string = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "isdn.cg_pty2.ton");
- if ((string != NULL) && (*string)) {
+ if (!ftdm_strlen_zero(string)) {
val = ftdm_str2ftdm_ton(string);
}
if (val == FTDM_TON_INVALID) {
cgPtyNmb->typeNmb1.val = caller_data->cid_num.type;
} else {
- cgPtyNmb->typeNmb1.val = val;
+ cgPtyNmb->typeNmb1.val = get_trillium_val(ton_codes, val, IN_TON_UNK);
}
return FTDM_SUCCESS;
}
@@ -577,21 +615,14 @@ ftdm_status_t set_called_num(ftdm_channel_t *ftdmchan, CdPtyNmb *cdPtyNmb)
if (!len) {
return FTDM_SUCCESS;
}
- cdPtyNmb->eh.pres = PRSNT_NODEF;
-
- cdPtyNmb->nmbPlanId.pres = PRSNT_NODEF;
- if (caller_data->dnis.plan >= FTDM_NPI_INVALID) {
- cdPtyNmb->nmbPlanId.val = FTDM_NPI_UNKNOWN;
- } else {
- cdPtyNmb->nmbPlanId.val = caller_data->dnis.plan;
- }
- cdPtyNmb->typeNmb0.pres = PRSNT_NODEF;
- if (caller_data->dnis.type >= FTDM_TON_INVALID) {
- cdPtyNmb->typeNmb0.val = FTDM_TON_UNKNOWN;
- } else {
- cdPtyNmb->typeNmb0.val = caller_data->dnis.type;
- }
+ cdPtyNmb->eh.pres = PRSNT_NODEF;
+
+ cdPtyNmb->nmbPlanId.pres = PRSNT_NODEF;
+ cdPtyNmb->nmbPlanId.val = get_trillium_val(npi_codes, caller_data->dnis.plan, IN_NP_UNK);
+
+ cdPtyNmb->typeNmb0.pres = PRSNT_NODEF;
+ cdPtyNmb->typeNmb0.val = get_trillium_val(ton_codes, caller_data->dnis.type, IN_TON_UNK);
cdPtyNmb->nmbDigits.pres = PRSNT_NODEF;
cdPtyNmb->nmbDigits.len = len;
@@ -612,18 +643,10 @@ ftdm_status_t set_redir_num(ftdm_channel_t *ftdmchan, RedirNmb *redirNmb)
redirNmb->eh.pres = PRSNT_NODEF;
redirNmb->nmbPlanId.pres = PRSNT_NODEF;
- if (caller_data->rdnis.plan >= FTDM_NPI_INVALID) {
- redirNmb->nmbPlanId.val = FTDM_NPI_UNKNOWN;
- } else {
- redirNmb->nmbPlanId.val = caller_data->rdnis.plan;
- }
+ redirNmb->nmbPlanId.val = get_trillium_val(npi_codes, caller_data->rdnis.plan, IN_NP_UNK);
redirNmb->typeNmb.pres = PRSNT_NODEF;
- if (caller_data->rdnis.type >= FTDM_TON_INVALID) {
- redirNmb->typeNmb.val = FTDM_TON_UNKNOWN;
- } else {
- redirNmb->typeNmb.val = caller_data->rdnis.type;
- }
+ redirNmb->typeNmb.val = get_trillium_val(ton_codes, caller_data->rdnis.type, IN_TON_UNK);
redirNmb->nmbDigits.pres = PRSNT_NODEF;
redirNmb->nmbDigits.len = len;
@@ -1105,9 +1128,9 @@ ftdm_bearer_cap_t sngisdn_get_infoTranCap_from_stack(uint8_t bearer_capability)
{
switch(bearer_capability) {
case IN_ITC_SPEECH:
- return FTDM_BEARER_CAP_SPEECH;
+ return FTDM_BEARER_CAP_SPEECH;
case IN_ITC_UNRDIG:
- return FTDM_BEARER_CAP_64K_UNRESTRICTED;
+ return FTDM_BEARER_CAP_64K_UNRESTRICTED;
case IN_ITC_A31KHZ:
return FTDM_BEARER_CAP_3_1KHZ_AUDIO;
default:
@@ -1131,7 +1154,7 @@ ftdm_user_layer1_prot_t sngisdn_get_usrInfoLyr1Prot_from_stack(uint8_t layer1_pr
return FTDM_USER_LAYER1_PROT_ULAW;
}
-void sngisdn_print_phy_stats(ftdm_stream_handle_t *stream, ftdm_span_t *span)
+ftdm_status_t sngisdn_show_l1_stats(ftdm_stream_handle_t *stream, ftdm_span_t *span)
{
L1Mngmt sts;
sngisdn_span_data_t *signal_data = (sngisdn_span_data_t*)span->signal_data;
@@ -1169,11 +1192,11 @@ void sngisdn_print_phy_stats(ftdm_stream_handle_t *stream, ftdm_span_t *span)
stream->write_function(stream, " TX Errors Details");
stream->write_function(stream, "\n---------------------------------------------------------------------\n");
stream->write_function(stream, "Aborted:\t%u\tFifo:\t\t%u\tCarrier:\t%u\n", sts.t.sts.tx_aborted_errors, sts.t.sts.tx_fifo_errors, sts.t.sts.tx_carrier_errors);
- return;
+ return FTDM_SUCCESS;
}
-void sngisdn_print_span(ftdm_stream_handle_t *stream, ftdm_span_t *span)
+ftdm_status_t sngisdn_show_span(ftdm_stream_handle_t *stream, ftdm_span_t *span)
{
ftdm_signaling_status_t sigstatus;
ftdm_alarm_flag_t alarmbits;
@@ -1188,18 +1211,18 @@ void sngisdn_print_span(ftdm_stream_handle_t *stream, ftdm_span_t *span)
stream->write_function(stream, "span:%s physical:%s signalling:%s\n",
span->name, alarmbits ? "ALARMED" : "OK",
ftdm_signaling_status2str(sigstatus));
- return;
+ return FTDM_SUCCESS;
}
-void sngisdn_print_spans(ftdm_stream_handle_t *stream)
+ftdm_status_t sngisdn_show_spans(ftdm_stream_handle_t *stream)
{
int i;
for(i=1;i<=MAX_L1_LINKS;i++) {
if (g_sngisdn_data.spans[i]) {
- sngisdn_print_span(stream, g_sngisdn_data.spans[i]->ftdm_span);
+ sngisdn_show_span(stream, g_sngisdn_data.spans[i]->ftdm_span);
}
}
- return;
+ return FTDM_SUCCESS;
}
ftdm_status_t sngisdn_add_var(sngisdn_chan_data_t *sngisdn_info, const char* var, const char* val)
diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c
index 40a712f8e2..3348292935 100644
--- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c
+++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c
@@ -185,17 +185,9 @@ ftdm_status_t handle_con_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circ
SS7_INFO_CHAN(ftdmchan,"No Called party (DNIS) information in IAM!%s\n", " ");
}
- /* fill in rdnis information*/
- if (siConEvnt->redirgNum.eh.pres) {
- if (siConEvnt->redirgNum.addrSig.pres) {
- /* fill in the rdnis digits */
- copy_tknStr_from_sngss7(siConEvnt->redirgNum.addrSig,
- ftdmchan->caller_data.rdnis.digits,
- siConEvnt->cgPtyNum.oddEven);
- }
- } else {
- SS7_DEBUG_CHAN(ftdmchan,"No RDNIS party information in IAM!%s\n", " ");
- }
+ copy_redirgNum_from_sngss7(ftdmchan, &siConEvnt->redirgNum);
+
+ copy_genNmb_from_sngss7(ftdmchan, &siConEvnt->genNmb);
/* fill in the TMR/bearer capability */
if (siConEvnt->txMedReq.eh.pres) {
@@ -490,6 +482,47 @@ ftdm_status_t handle_con_sta(uint32_t suInstId, uint32_t spInstId, uint32_t circ
case (SUBDIRNUM):
SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Rx SUB-DIR\n", sngss7_info->circuit->cic);
break;
+#ifdef SANGOMA_SPIROU
+ case (CHARGE_ACK):
+ SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Rx TXA\n", sngss7_info->circuit->cic);
+ break;
+ case (CHARGE_UNIT):
+ {
+ uint32_t charging_unit = 0;
+ uint32_t msg_num = 0;
+ char val[3];
+
+ SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Rx ITX\n", sngss7_info->circuit->cic);
+
+ memset(val, '\0', sizeof(val));
+
+ if (siCnStEvnt->chargUnitNum.eh.pres == PRSNT_NODEF &&
+ siCnStEvnt->chargUnitNum.chargUnitNum.pres == PRSNT_NODEF) {
+
+ charging_unit = siCnStEvnt->chargUnitNum.chargUnitNum.val;
+ }
+
+ if (siCnStEvnt->msgNum.eh.pres == PRSNT_NODEF &&
+ siCnStEvnt->msgNum.msgNum.pres == PRSNT_NODEF) {
+
+ msg_num = siCnStEvnt->msgNum.msgNum.val;
+ }
+
+ ftdm_log_chan(ftdmchan, FTDM_LOG_INFO, "Charging Unit:%d Msg Num:%d\n", charging_unit, msg_num);
+
+ sprintf(val, "%d", charging_unit);
+ sngss7_add_var(sngss7_info, "ss7_itx_charge_unit", val);
+
+ sprintf(val, "%d", msg_num);
+ sngss7_add_var(sngss7_info, "ss7_itx_msg_num", val);
+
+ if (sngss7_info->circuit->itx_auto_reply) {
+ ftdm_log_chan_msg(ftdmchan, FTDM_LOG_INFO, "Auto-reply with TXA msg\n");
+ ft_to_sngss7_txa (ftdmchan);
+ }
+ }
+ break;
+#endif
/**************************************************************************/
default:
SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Rx Unknown Msg\n", sngss7_info->circuit->cic);
@@ -532,7 +565,7 @@ ftdm_status_t handle_con_cfm(uint32_t suInstId, uint32_t spInstId, uint32_t circ
/* go to UP */
ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_UP);
-
+
break;
/**************************************************************************/
case FTDM_CHANNEL_STATE_DIALING:
@@ -609,6 +642,7 @@ ftdm_channel_command(ftdmchan, FTDM_COMMAND_DISABLE_LOOP, NULL);
break;
/**************************************************************************/
case FTDM_CHANNEL_STATE_RING:
+ case FTDM_CHANNEL_STATE_RINGING:
case FTDM_CHANNEL_STATE_PROGRESS:
case FTDM_CHANNEL_STATE_PROGRESS_MEDIA:
case FTDM_CHANNEL_STATE_UP:
diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c
index 4f8c069b71..59660765a1 100644
--- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c
+++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c
@@ -674,6 +674,9 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan)
} else {
/*INBOUND...so FS told us it was going to answer...tell the stack */
ft_to_sngss7_anm(ftdmchan);
+#if 1 /* DAVIDY */
+ ft_to_sngss7_itx(ftdmchan);
+#endif
}
break;
diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h
index ea31a89c5b..a355ee0ee7 100644
--- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h
+++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h
@@ -320,8 +320,18 @@ typedef struct sng_isup_ckt {
uint32_t clg_nadi;
uint32_t cld_nadi;
uint8_t rdnis_nadi;
+
+ /* Generic Number defaults */
+ uint8_t gn_nmbqual; /* Number Qualifier */
+ uint8_t gn_nadi; /* Nature of Address indicator */
+ uint8_t gn_screen_ind; /* Screening Indicator */
+ uint8_t gn_pres_ind; /* Presentation Indicator */
+ uint8_t gn_npi; /* Numbering Plan Indicator */
+ uint8_t gn_num_inc_ind; /* Number Incomplete Indicator */
+ /* END - Generic Number defaults */
uint32_t min_digits;
+ uint8_t itx_auto_reply;
void *obj;
uint16_t t3;
uint16_t t12;
@@ -728,6 +738,9 @@ void ft_to_sngss7_cgba(ftdm_channel_t * ftdmchan);
void ft_to_sngss7_cgua(ftdm_channel_t * ftdmchan);
void ft_to_sngss7_cgb(ftdm_channel_t * ftdmchan);
void ft_to_sngss7_cgu(ftdm_channel_t * ftdmchan);
+void ft_to_sngss7_itx (ftdm_channel_t * ftdmchan);
+void ft_to_sngss7_txa (ftdm_channel_t * ftdmchan);
+
/* in ftmod_sangoma_ss7_in.c */
void sngss7_sta_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, uint8_t globalFlg, uint8_t evntType, SiStaEvnt *siStaEvnt);
@@ -785,12 +798,14 @@ int ftmod_ss7_parse_xml(ftdm_conf_parameter_t *ftdm_parameters, ftdm_span_t *spa
ftdm_status_t ftdm_sngss7_handle_cli_cmd(ftdm_stream_handle_t *stream, const char *data);
/* in ftmod_sangoma_ss7_support.c */
-uint8_t copy_cgPtyNum_from_sngss7(ftdm_caller_data_t *ftdm, SiCgPtyNum *cgPtyNum);
-uint8_t copy_cgPtyNum_to_sngss7(ftdm_caller_data_t *ftdm, SiCgPtyNum *cgPtyNum);
-uint8_t copy_cdPtyNum_from_sngss7(ftdm_caller_data_t *ftdm, SiCdPtyNum *cdPtyNum);
-uint8_t copy_cdPtyNum_to_sngss7(ftdm_caller_data_t *ftdm, SiCdPtyNum *cdPtyNum);
+ftdm_status_t copy_cgPtyNum_from_sngss7(ftdm_channel_t *ftdmchan, SiCgPtyNum *cgPtyNum);
+ftdm_status_t copy_cgPtyNum_to_sngss7(ftdm_channel_t *ftdmchan, SiCgPtyNum *cgPtyNum);
+ftdm_status_t copy_cdPtyNum_from_sngss7(ftdm_channel_t *ftdmchan, SiCdPtyNum *cdPtyNum);
+ftdm_status_t copy_cdPtyNum_to_sngss7(ftdm_channel_t *ftdmchan, SiCdPtyNum *cdPtyNum);
ftdm_status_t copy_redirgNum_to_sngss7(ftdm_channel_t *ftdmchan, SiRedirNum *redirgNum);
-
+ftdm_status_t copy_redirgNum_from_sngss7(ftdm_channel_t *ftdmchan, SiRedirNum *redirgNum);
+ftdm_status_t copy_genNmb_to_sngss7(ftdm_channel_t *ftdmchan, SiGenNum *genNmb);
+ftdm_status_t copy_genNmb_from_sngss7(ftdm_channel_t *ftdmchan, SiGenNum *genNmb);
ftdm_status_t copy_tknStr_from_sngss7(TknStr str, char *ftdm, TknU8 oddEven);
ftdm_status_t append_tknStr_from_sngss7(TknStr str, char *ftdm, TknU8 oddEven);
diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c
index 9fe279d7c5..a746301cd7 100644
--- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c
+++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c
@@ -74,8 +74,6 @@ void ft_to_sngss7_iam (ftdm_channel_t * ftdmchan)
SS7_FUNC_TRACE_ENTER (__FUNCTION__);
sngss7_chan_data_t *sngss7_info = ftdmchan->call_data;;
- const char *clg_nadi = NULL;
- const char *cld_nadi = NULL;
const char *clg_subAddr = NULL;
const char *cld_subAddr = NULL;
char subAddrIE[MAX_SIZEOF_SUBADDR_IE];
@@ -180,33 +178,18 @@ void ft_to_sngss7_iam (ftdm_channel_t * ftdmchan)
} /* if ANSI */
/* copy down the called number information */
- copy_cdPtyNum_to_sngss7 (&ftdmchan->caller_data, &iam.cdPtyNum);
+ copy_cdPtyNum_to_sngss7 (ftdmchan, &iam.cdPtyNum);
/* copy down the calling number information */
- copy_cgPtyNum_to_sngss7 (&ftdmchan->caller_data, &iam.cgPtyNum);
+ copy_cgPtyNum_to_sngss7 (ftdmchan, &iam.cgPtyNum);
- /* check if the user would like a custom NADI value for the calling Pty Num */
- clg_nadi = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_clg_nadi");
- if ((clg_nadi != NULL) && (*clg_nadi)) {
- SS7_DEBUG_CHAN(ftdmchan,"Found user supplied Calling NADI value \"%s\"\n", clg_nadi);
- iam.cgPtyNum.natAddrInd.val = atoi(clg_nadi);
- } else {
- iam.cgPtyNum.natAddrInd.val = g_ftdm_sngss7_data.cfg.isupCkt[sngss7_info->circuit->id].clg_nadi;
- SS7_DEBUG_CHAN(ftdmchan,"No user supplied NADI value found for CLG, using \"%d\"\n", iam.cgPtyNum.natAddrInd.val);
- }
+ /* copy down the generic number information */
+ copy_genNmb_to_sngss7(ftdmchan, &iam.genNmb);
- cld_nadi = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_cld_nadi");
- if ((cld_nadi != NULL) && (*cld_nadi)) {
- SS7_DEBUG_CHAN(ftdmchan,"Found user supplied Called NADI value \"%s\"\n", cld_nadi);
- iam.cdPtyNum.natAddrInd.val = atoi(cld_nadi);
- } else {
- iam.cdPtyNum.natAddrInd.val = g_ftdm_sngss7_data.cfg.isupCkt[sngss7_info->circuit->id].cld_nadi;
- SS7_DEBUG_CHAN(ftdmchan,"No user supplied NADI value found for CLD, using \"%d\"\n", iam.cdPtyNum.natAddrInd.val);
- }
-
+ /* TODO - move this to copy_clg_subAddr_to_sngss7 function */
/* check if the user would like us to send a clg_sub-address */
clg_subAddr = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_clg_subaddr");
- if ((clg_subAddr != NULL) && (*clg_subAddr)) {
+ if (!ftdm_strlen_zero(clg_subAddr)) {
SS7_DEBUG_CHAN(ftdmchan,"Found user supplied Calling Sub-Address value \"%s\"\n", clg_subAddr);
/* clean out the subAddrIE */
@@ -302,7 +285,6 @@ void ft_to_sngss7_iam (ftdm_channel_t * ftdmchan)
return;
}
-/******************************************************************************/
void ft_to_sngss7_acm (ftdm_channel_t * ftdmchan)
{
SS7_FUNC_TRACE_ENTER (__FUNCTION__);
@@ -382,7 +364,6 @@ void ft_to_sngss7_acm (ftdm_channel_t * ftdmchan)
return;
}
-/******************************************************************************/
void ft_to_sngss7_anm (ftdm_channel_t * ftdmchan)
{
SS7_FUNC_TRACE_ENTER (__FUNCTION__);
@@ -892,6 +873,69 @@ void ft_to_sngss7_cgu(ftdm_channel_t * ftdmchan)
return;
}
+/* French SPIROU send Charge Unit */
+/* No one calls this function yet, but it has been implemented to complement TXA messages */
+void ft_to_sngss7_itx (ftdm_channel_t * ftdmchan)
+{
+#ifndef SANGOMA_SPIROU
+ SS7_FUNC_TRACE_ENTER (__FUNCTION__);
+ ftdm_log_chan_msg(ftdmchan, FTDM_LOG_CRIT, "ITX message not supported!, please update your libsng_ss7\n");
+#else
+ const char* var = NULL;
+ sngss7_chan_data_t *sngss7_info = ftdmchan->call_data;
+ SiCnStEvnt itx;
+
+ SS7_FUNC_TRACE_ENTER (__FUNCTION__);
+
+ memset (&itx, 0x0, sizeof (itx));
+
+ itx.msgNum.eh.pres = PRSNT_NODEF;
+ itx.msgNum.msgNum.pres = PRSNT_NODEF;
+ var = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_itx_msg_num");
+ if (!ftdm_strlen_zero(var)) {
+ itx.msgNum.msgNum.val = atoi(var);
+ } else {
+ itx.msgNum.msgNum.val = 0x1;
+ }
+
+ itx.chargUnitNum.eh.pres = PRSNT_NODEF;
+ itx.chargUnitNum.chargUnitNum.pres = PRSNT_NODEF;
+ var = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_itx_charge_unit");
+ if (!ftdm_strlen_zero(var)) {
+ itx.chargUnitNum.chargUnitNum.val = atoi(var);
+ } else {
+ itx.chargUnitNum.chargUnitNum.val = 0x1;
+ }
+
+ ftdm_log_chan(ftdmchan, FTDM_LOG_INFO, "ITX Charging Unit:%d Msg Num:%d\n", itx.chargUnitNum.chargUnitNum.val, itx.msgNum.msgNum.val);
+ sng_cc_con_status (1, sngss7_info->suInstId, sngss7_info->spInstId, sngss7_info->circuit->id, &itx, CHARGE_UNIT);
+
+ SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx ITX\n", sngss7_info->circuit->cic);
+#endif
+ SS7_FUNC_TRACE_EXIT (__FUNCTION__);
+ return;
+}
+
+/* French SPIROU send Charging Acknowledgement */
+void ft_to_sngss7_txa (ftdm_channel_t * ftdmchan)
+{
+#ifndef SANGOMA_SPIROU
+ SS7_FUNC_TRACE_ENTER (__FUNCTION__);
+ ftdm_log_chan_msg(ftdmchan, FTDM_LOG_CRIT, "TXA message not supported!, please update your libsng_ss7\n");
+#else
+ SiCnStEvnt txa;
+ sngss7_chan_data_t *sngss7_info = ftdmchan->call_data;
+ SS7_FUNC_TRACE_ENTER (__FUNCTION__);
+
+ memset (&txa, 0x0, sizeof(txa));
+
+ sng_cc_con_status(1, sngss7_info->suInstId, sngss7_info->spInstId, sngss7_info->circuit->id, &txa, CHARGE_ACK);
+
+ SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx TXA\n", sngss7_info->circuit->cic);
+#endif
+ SS7_FUNC_TRACE_EXIT (__FUNCTION__);
+ return;
+}
/******************************************************************************/
/* For Emacs:
diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c
index 22b522409f..8fafa8995c 100644
--- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c
+++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c
@@ -91,254 +91,241 @@ FTDM_ENUM_NAMES(BLK_FLAGS_NAMES, BLK_FLAGS_STRING)
FTDM_STR2ENUM(ftmod_ss7_blk_state2flag, ftmod_ss7_blk_flag2str, sng_ckt_block_flag_t, BLK_FLAGS_NAMES, 31)
/* FUNCTIONS ******************************************************************/
-uint8_t copy_cgPtyNum_from_sngss7(ftdm_caller_data_t *ftdm, SiCgPtyNum *cgPtyNum)
+ftdm_status_t copy_cgPtyNum_from_sngss7(ftdm_channel_t *ftdmchan, SiCgPtyNum *cgPtyNum)
{
- return 0;
+ return FTDM_SUCCESS;
}
-/******************************************************************************/
-uint8_t copy_cgPtyNum_to_sngss7(ftdm_caller_data_t *ftdm, SiCgPtyNum *cgPtyNum)
+ftdm_status_t copy_cgPtyNum_to_sngss7(ftdm_channel_t *ftdmchan, SiCgPtyNum *cgPtyNum)
{
- int k;
- int j;
- int flag;
- int odd;
- char tmp[2];
- uint8_t lower;
- uint8_t upper;
+ const char *val;
+
+ ftdm_caller_data_t *caller_data = &ftdmchan->caller_data;
- /**************************************************************************/
cgPtyNum->eh.pres = PRSNT_NODEF;
- /**************************************************************************/
+
cgPtyNum->natAddrInd.pres = PRSNT_NODEF;
cgPtyNum->natAddrInd.val = 0x03;
- /**************************************************************************/
+
+
cgPtyNum->scrnInd.pres = PRSNT_NODEF;
- cgPtyNum->scrnInd.val = ftdm->screen;
- /**************************************************************************/
+ val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_screen_ind");
+ if (!ftdm_strlen_zero(val)) {
+ cgPtyNum->scrnInd.val = atoi(val);
+ } else {
+ cgPtyNum->scrnInd.val = caller_data->screen;
+ }
+ ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Calling Party Number Screening Ind %d\n", cgPtyNum->scrnInd.val);
+
cgPtyNum->presRest.pres = PRSNT_NODEF;
- cgPtyNum->presRest.val = ftdm->pres;
- /**************************************************************************/
+ val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_pres_ind");
+ if (!ftdm_strlen_zero(val)) {
+ cgPtyNum->presRest.val = atoi(val);
+ } else {
+ cgPtyNum->presRest.val = caller_data->pres;
+ }
+ ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Calling Party Number Presentation Ind %d\n", cgPtyNum->presRest.val);
+
cgPtyNum->numPlan.pres = PRSNT_NODEF;
cgPtyNum->numPlan.val = 0x01;
- /**************************************************************************/
+
cgPtyNum->niInd.pres = PRSNT_NODEF;
cgPtyNum->niInd.val = 0x00;
- /**************************************************************************/
- cgPtyNum->addrSig.pres = PRSNT_NODEF;
-
- /* atoi will search through memory starting from the pointer it is given until
- * it finds the \0...since tmp is on the stack it will start going through the
- * possibly causing corruption. Hard code a \0 to prevent this
- */
-
- tmp[1] = '\0';
- k = 0;
- j = 0;
- flag = 0;
- odd = 0;
- upper = 0x0;
- lower = 0x0;
- while (1) {
- /* grab a digit from the ftdm digits */
- tmp[0] = ftdm->cid_num.digits[k];
-
- /* check if the digit is a number and that is not null */
- while (!(isxdigit(tmp[0])) && (tmp[0] != '\0')) {
- SS7_INFO("Dropping invalid digit: %c\n", tmp[0]);
- /* move on to the next value */
- k++;
- tmp[0] = ftdm->cid_num.digits[k];
- } /* while(!(isdigit(tmp))) */
-
- /* check if tmp is null or a digit */
- if (tmp[0] != '\0') {
- /* push it into the lower nibble */
- lower = strtol(&tmp[0], (char **)NULL, 16);
- /* move to the next digit */
- k++;
- /* grab a digit from the ftdm digits */
- tmp[0] = ftdm->cid_num.digits[k];
-
- /* check if the digit is a number and that is not null */
- while (!(isxdigit(tmp[0])) && (tmp[0] != '\0')) {
- SS7_INFO("Dropping invalid digit: %c\n", tmp[0]);
- k++;
- tmp[0] = ftdm->cid_num.digits[k];
- } /* while(!(isdigit(tmp))) */
-
- /* check if tmp is null or a digit */
- if (tmp[0] != '\0') {
- /* push the digit into the upper nibble */
- upper = (strtol(&tmp[0], (char **)NULL, 16)) << 4;
- } else {
- /* there is no upper ... fill in 0 */
- upper = 0x0;
- /* throw the odd flag */
- odd = 1;
- /* throw the end flag */
- flag = 1;
- } /* if (tmp != '\0') */
- } else {
- /* keep the odd flag down */
- odd = 0;
- /* break right away since we don't need to write the digits */
- break;
- }
-
- /* push the digits into the trillium structure */
- cgPtyNum->addrSig.val[j] = upper | lower;
-
- /* increment the trillium pointer */
- j++;
-
- /* if the flag is up we're through all the digits */
- if (flag) break;
-
- /* move to the next digit */
- k++;
- } /* while(1) */
-
- cgPtyNum->addrSig.len = j;
-
- /**************************************************************************/
- cgPtyNum->oddEven.pres = PRSNT_NODEF;
- cgPtyNum->oddEven.val = odd;
- /**************************************************************************/
- return 0;
+ return copy_tknStr_to_sngss7(caller_data->cid_num.digits, &cgPtyNum->addrSig, &cgPtyNum->oddEven);
}
-/******************************************************************************/
-uint8_t copy_cdPtyNum_from_sngss7(ftdm_caller_data_t *ftdm, SiCdPtyNum *cdPtyNum)
+ftdm_status_t copy_cdPtyNum_from_sngss7(ftdm_channel_t *ftdmchan, SiCdPtyNum *cdPtyNum)
{
-
- return 0;
+ /* TODO: Implement me */
+ return FTDM_SUCCESS;
}
-/******************************************************************************/
-uint8_t copy_cdPtyNum_to_sngss7(ftdm_caller_data_t *ftdm, SiCdPtyNum *cdPtyNum)
-{
- int k;
- int j;
- int flag;
- int odd;
- char tmp[2];
- uint8_t lower;
- uint8_t upper;
- /**************************************************************************/
+ftdm_status_t copy_cdPtyNum_to_sngss7(ftdm_channel_t *ftdmchan, SiCdPtyNum *cdPtyNum)
+{
+ const char *cld_nadi = NULL;
+ ftdm_caller_data_t *caller_data = &ftdmchan->caller_data;
+ sngss7_chan_data_t *sngss7_info = ftdmchan->call_data;
+
cdPtyNum->eh.pres = PRSNT_NODEF;
- /**************************************************************************/
+
cdPtyNum->natAddrInd.pres = PRSNT_NODEF;
- cdPtyNum->natAddrInd.val = 0x03;
- /**************************************************************************/
+ cld_nadi = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_cld_nadi");
+ if (!ftdm_strlen_zero(cld_nadi)) {
+ ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Found user supplied Called NADI value \"%s\"\n", cld_nadi);
+ cdPtyNum->natAddrInd.val = atoi(cld_nadi);
+ } else {
+ cdPtyNum->natAddrInd.val = g_ftdm_sngss7_data.cfg.isupCkt[sngss7_info->circuit->id].cld_nadi;
+ ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "No user supplied NADI value found for CLD, using \"%d\"\n", cdPtyNum->natAddrInd.val);
+ }
+
cdPtyNum->numPlan.pres = PRSNT_NODEF;
cdPtyNum->numPlan.val = 0x01;
- /**************************************************************************/
+
cdPtyNum->innInd.pres = PRSNT_NODEF;
cdPtyNum->innInd.val = 0x01;
- /**************************************************************************/
- cdPtyNum->addrSig.pres = PRSNT_NODEF;
-
- /* atoi will search through memory starting from the pointer it is given until
- * it finds the \0...since tmp is on the stack it will start going through the
- * possibly causing corruption. Hard code a \0 to prevent this
- */ /* dnis */
- tmp[1] = '\0';
- k = 0;
- j = 0;
- flag = 0;
- odd = 0;
- upper = 0x0;
- lower = 0x0;
-
- while (1) {
- /* grab a digit from the ftdm digits */
- tmp[0] = ftdm->dnis.digits[k];
-
- /* check if the digit is a number and that is not null */
- while (!(isxdigit(tmp[0])) && (tmp[0] != '\0')) {
- SS7_INFO("Dropping invalid digit: %c\n", tmp[0]);
- /* move on to the next value */
- k++;
- tmp[0] = ftdm->dnis.digits[k];
- } /* while(!(isdigit(tmp))) */
-
- /* check if tmp is null or a digit */
- if (tmp[0] != '\0') {
- /* push it into the lower nibble */
- lower = strtol(&tmp[0], (char **)NULL, 16);
- /* move to the next digit */
- k++;
- /* grab a digit from the ftdm digits */
- tmp[0] = ftdm->dnis.digits[k];
-
- /* check if the digit is a number and that is not null */
- while (!(isxdigit(tmp[0])) && (tmp[0] != '\0')) {
- SS7_INFO("Dropping invalid digit: %c\n", tmp[0]);
- k++;
- tmp[0] = ftdm->dnis.digits[k];
- } /* while(!(isdigit(tmp))) */
-
- /* check if tmp is null or a digit */
- if (tmp[0] != '\0') {
- /* push the digit into the upper nibble */
- upper = (strtol(&tmp[0], (char **)NULL, 16)) << 4;
- } else {
- /* there is no upper ... fill in ST */
- upper = 0xF0;
- /* keep the odd flag down */
- odd = 0;
- /* throw the end flag */
- flag = 1;
- } /* if (tmp != '\0') */
- } else {
- /* throw the odd flag */
- odd = 1;
- /* need to add the ST */
- lower = 0xF;
- upper = 0x0;
- /* throw the flag */
- flag = 1;
- }
-
- /* push the digits into the trillium structure */
- cdPtyNum->addrSig.val[j] = upper | lower;
-
- /* increment the trillium pointer */
- j++;
-
- /* if the flag is up we're through all the digits */
- if (flag) break;
-
- /* move to the next digit */
- k++;
- } /* while(1) */
-
- cdPtyNum->addrSig.len = j;
-
- /**************************************************************************/
- cdPtyNum->oddEven.pres = PRSNT_NODEF;
-
- cdPtyNum->oddEven.val = odd;
-
- /**************************************************************************/
- return 0;
+
+ return copy_tknStr_to_sngss7(caller_data->dnis.digits, &cdPtyNum->addrSig, &cdPtyNum->oddEven);
}
+ftdm_status_t copy_genNmb_to_sngss7(ftdm_channel_t *ftdmchan, SiGenNum *genNmb)
+{
+ const char *val = NULL;
+ sngss7_chan_data_t *sngss7_info = ftdmchan->call_data;
+ SS7_FUNC_TRACE_ENTER(__FUNCTION__);
+
+ val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_gn_digits");
+ if (!ftdm_strlen_zero(val)) {
+ ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Found user supplied Generic Number qualifier \"%s\"\n", val);
+ if (copy_tknStr_to_sngss7((char*)val, &genNmb->addrSig, &genNmb->oddEven) != FTDM_SUCCESS) {
+ return FTDM_FAIL;
+ }
+ } else {
+ ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "No user supplied Generic Number qualifier \"%s\"\n", val);
+ return FTDM_SUCCESS;
+ }
+ genNmb->eh.pres = PRSNT_NODEF;
+ genNmb->addrSig.pres = PRSNT_NODEF;
+
+ genNmb->nmbQual.pres = PRSNT_NODEF;
+ val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_gn_numqual");
+ if (!ftdm_strlen_zero(val)) {
+ ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Found user supplied Generic Number \"%s\"\n", val);
+ genNmb->nmbQual.val = atoi(val);
+ } else {
+ genNmb->nmbQual.val = g_ftdm_sngss7_data.cfg.isupCkt[sngss7_info->circuit->id].gn_nmbqual;
+ ftdm_log_chan_msg(ftdmchan, FTDM_LOG_DEBUG, "No user supplied Generic Number \n");
+ }
+ genNmb->natAddrInd.pres = PRSNT_NODEF;
+ val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_gn_nadi");
+ if (!ftdm_strlen_zero(val)) {
+ ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Found user supplied Generic Number \"nature of address\" \"%s\"\n", val);
+ genNmb->natAddrInd.val = atoi(val);
+ } else {
+ genNmb->natAddrInd.val = g_ftdm_sngss7_data.cfg.isupCkt[sngss7_info->circuit->id].gn_nadi;
+ ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "No user supplied Generic Number \"nature of address\" \"%d\"\n", genNmb->natAddrInd.val);
+ }
+ genNmb->scrnInd.pres = PRSNT_NODEF;
+ val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_gn_screen_ind");
+ if (!ftdm_strlen_zero(val)) {
+ ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Found user supplied Generic Number \"screening indicator\" \"%s\"\n", val);
+ genNmb->scrnInd.val = atoi(val);
+ } else {
+ genNmb->natAddrInd.val = g_ftdm_sngss7_data.cfg.isupCkt[sngss7_info->circuit->id].gn_screen_ind;
+ ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "No user supplied Generic Number \"screening indicator\" \"%d\"\n", genNmb->natAddrInd.val);
+ }
+ genNmb->presRest.pres = PRSNT_NODEF;
+ val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_gn_pres_ind");
+ if (!ftdm_strlen_zero(val)) {
+ ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Found user supplied Generic Number \"presentation indicator\" \"%s\"\n", val);
+ genNmb->presRest.val = atoi(val);
+ } else {
+ genNmb->presRest.val = g_ftdm_sngss7_data.cfg.isupCkt[sngss7_info->circuit->id].gn_pres_ind;
+ ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "No user supplied Generic Number \"presentation indicator\" \"%d\"\n", genNmb->presRest.val);
+ }
+ genNmb->numPlan.pres = PRSNT_NODEF;
+ val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_gn_npi");
+ if (!ftdm_strlen_zero(val)) {
+ ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Found user supplied Generic Number \"numbering plan\" \"%s\"\n", val);
+ genNmb->numPlan.val = atoi(val);
+ } else {
+ genNmb->numPlan.val = g_ftdm_sngss7_data.cfg.isupCkt[sngss7_info->circuit->id].gn_npi;
+ ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "No user supplied Generic Number \"numbering plan\" \"%d\"\n", genNmb->numPlan.val);
+ }
+ genNmb->niInd.pres = PRSNT_NODEF;
+ val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_gn_num_inc_ind");
+ if (!ftdm_strlen_zero(val)) {
+ ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Found user supplied Generic Number \"number incomplete indicator\" \"%s\"\n", val);
+ genNmb->niInd.val = atoi(val);
+ } else {
+ genNmb->niInd.val = g_ftdm_sngss7_data.cfg.isupCkt[sngss7_info->circuit->id].gn_num_inc_ind;
+ ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "No user supplied Generic Number \"number incomplete indicator\" \"%d\"\n", genNmb->niInd.val);
+ }
+ SS7_FUNC_TRACE_EXIT(__FUNCTION__);
+ return FTDM_SUCCESS;
+}
+
+ftdm_status_t copy_genNmb_from_sngss7(ftdm_channel_t *ftdmchan, SiGenNum *genNmb)
+{
+ char val[64];
+ sngss7_chan_data_t *sngss7_info = ftdmchan->call_data;
+ SS7_FUNC_TRACE_ENTER(__FUNCTION__);
+
+ memset(val, 0, sizeof(val));
+
+ if (genNmb->eh.pres != PRSNT_NODEF || genNmb->addrSig.pres != PRSNT_NODEF) {
+ ftdm_log_chan_msg(ftdmchan, FTDM_LOG_DEBUG, "No Generic Number available\n");
+ return FTDM_SUCCESS;
+ }
+
+ copy_tknStr_from_sngss7(genNmb->addrSig, val, genNmb->oddEven);
+
+ ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Generic Number:%s\n", val);
+ sngss7_add_var(sngss7_info, "ss7_gn_digits", val);
+
+ if (genNmb->nmbQual.pres == PRSNT_NODEF) {
+ snprintf(val, sizeof(val), "%d", genNmb->nmbQual.val);
+ ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Generic Number \"number qualifier\" \n", val);
+ sngss7_add_var(sngss7_info, "ss7_gn_numqual", val);
+ }
+
+ if (genNmb->natAddrInd.pres == PRSNT_NODEF) {
+ snprintf(val, sizeof(val), "%d", genNmb->natAddrInd.val);
+ ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Generic Number \"nature of address\" \"%s\"\n", val);
+ sngss7_add_var(sngss7_info, "ss7_gn_nadi", val);
+ }
+
+ if (genNmb->scrnInd.pres == PRSNT_NODEF) {
+ snprintf(val, sizeof(val), "%d", genNmb->scrnInd.val);
+ ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Generic Number \"screening indicator\" \"%s\"\n", val);
+ sngss7_add_var(sngss7_info, "ss7_gn_screen_ind", val);
+ }
+
+ if (genNmb->presRest.pres == PRSNT_NODEF) {
+ snprintf(val, sizeof(val), "%d", genNmb->presRest.val);
+ ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Generic Number \"presentation indicator\" \"%s\"\n", val);
+ sngss7_add_var(sngss7_info, "ss7_gn_pres_ind", val);
+ }
+
+ if (genNmb->numPlan.pres == PRSNT_NODEF) {
+ snprintf(val, sizeof(val), "%d", genNmb->numPlan.val);
+ ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Generic Number \"numbering plan\" \"%s\"\n", val);
+ sngss7_add_var(sngss7_info, "ss7_gn_npi", val);
+ }
+
+ if (genNmb->niInd.pres == PRSNT_NODEF) {
+ snprintf(val, sizeof(val), "%d", genNmb->niInd.val);
+ ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Generic Number \"number incomplete indicator\" \"%s\"\n", val);
+ sngss7_add_var(sngss7_info, "ss7_gn_num_inc_ind", val);
+ }
+
+ SS7_FUNC_TRACE_EXIT(__FUNCTION__);
+ return FTDM_SUCCESS;
+}
ftdm_status_t copy_redirgNum_to_sngss7(ftdm_channel_t *ftdmchan, SiRedirNum *redirgNum)
{
const char* val = NULL;
sngss7_chan_data_t *sngss7_info = ftdmchan->call_data;
ftdm_caller_data_t *caller_data = &ftdmchan->caller_data;
- uint8_t len = strlen(caller_data->rdnis.digits);
- if (!len) {
+
+ val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_rdnis_digits");
+ if (!ftdm_strlen_zero(val)) {
+ ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Found user supplied Redirection Number\"%s\"\n", val);
+ if (copy_tknStr_to_sngss7((char*)val, &redirgNum->addrSig, &redirgNum->oddEven) != FTDM_SUCCESS) {
+ return FTDM_FAIL;
+ }
+ } else if (!ftdm_strlen_zero(caller_data->rdnis.digits)) {
+ ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Found user supplied Redirection Number\"%s\"\n", val);
+ if (copy_tknStr_to_sngss7(caller_data->rdnis.digits, &redirgNum->addrSig, &redirgNum->oddEven) != FTDM_SUCCESS) {
+ return FTDM_FAIL;
+ }
+ } else {
+ ftdm_log_chan_msg(ftdmchan, FTDM_LOG_DEBUG, "No user supplied Redirection Number\n");
return FTDM_SUCCESS;
}
- SS7_DEBUG_CHAN(ftdmchan, "Redirecting Number %s\n", caller_data->rdnis.digits);
redirgNum->eh.pres = PRSNT_NODEF;
@@ -351,7 +338,7 @@ ftdm_status_t copy_redirgNum_to_sngss7(ftdm_channel_t *ftdmchan, SiRedirNum *red
} else {
redirgNum->natAddr.val = g_ftdm_sngss7_data.cfg.isupCkt[sngss7_info->circuit->id].rdnis_nadi;
}
- SS7_DEBUG_CHAN(ftdmchan, "Redirecting Number NADI:%d\n", redirgNum->natAddr.val);
+ ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Redirecting Number NADI:%d\n", redirgNum->natAddr.val);
/* Screening indicator */
redirgNum->scrInd.pres = PRSNT_NODEF;
@@ -361,7 +348,7 @@ ftdm_status_t copy_redirgNum_to_sngss7(ftdm_channel_t *ftdmchan, SiRedirNum *red
} else {
redirgNum->scrInd.val = FTDM_SCREENING_VERIFIED_PASSED;
}
- SS7_DEBUG_CHAN(ftdmchan, "Redirecting Number Screening Ind:%d\n", redirgNum->scrInd.val);
+ ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Redirecting Number Screening Ind:%d\n", redirgNum->scrInd.val);
/* Address presentation restricted ind */
redirgNum->presRest.pres = PRSNT_NODEF;
@@ -372,7 +359,7 @@ ftdm_status_t copy_redirgNum_to_sngss7(ftdm_channel_t *ftdmchan, SiRedirNum *red
} else {
redirgNum->presRest.val = FTDM_PRES_ALLOWED;
}
- SS7_DEBUG_CHAN(ftdmchan, "Redirecting Number Address Presentation Restricted Ind:%d\n", redirgNum->presRest.val);
+ ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Redirecting Number Address Presentation Restricted Ind:%d\n", redirgNum->presRest.val);
/* Numbering plan */
redirgNum->numPlan.pres = PRSNT_NODEF;
@@ -384,18 +371,64 @@ ftdm_status_t copy_redirgNum_to_sngss7(ftdm_channel_t *ftdmchan, SiRedirNum *red
redirgNum->numPlan.val = caller_data->rdnis.plan;
}
- SS7_DEBUG_CHAN(ftdmchan, "Redirecting Number Numbering plan:%d\n", redirgNum->numPlan.val);
+ ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Redirecting Number Numbering plan:%d\n", redirgNum->numPlan.val);
return copy_tknStr_to_sngss7(caller_data->rdnis.digits, &redirgNum->addrSig, &redirgNum->oddEven);
}
+ftdm_status_t copy_redirgNum_from_sngss7(ftdm_channel_t *ftdmchan, SiRedirNum *redirgNum)
+{
+ char val[20];
+ sngss7_chan_data_t *sngss7_info = ftdmchan->call_data;
+ ftdm_caller_data_t *caller_data = &ftdmchan->caller_data;
+
+ if (redirgNum->eh.pres != PRSNT_NODEF || redirgNum->addrSig.pres != PRSNT_NODEF) {
+ ftdm_log_chan_msg(ftdmchan, FTDM_LOG_DEBUG, "No Redirecting Number available\n");
+ return FTDM_SUCCESS;
+ }
+
+ copy_tknStr_from_sngss7(redirgNum->addrSig, ftdmchan->caller_data.rdnis.digits, redirgNum->oddEven);
+
+ ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Redirecting Number:%s\n", ftdmchan->caller_data.rdnis.digits);
+ snprintf(val, sizeof(val), "%s", ftdmchan->caller_data.rdnis.digits);
+ sngss7_add_var(sngss7_info, "ss7_rdnis_digits", val);
+
+
+ if (redirgNum->natAddr.pres == PRSNT_NODEF) {
+ snprintf(val, sizeof(val), "%d", redirgNum->natAddr.val);
+ ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Redirecting Number NADI:%s\n", val);
+ sngss7_add_var(sngss7_info, "ss7_rdnis_nadi", val);
+ caller_data->rdnis.type = redirgNum->natAddr.val;
+ }
+
+ if (redirgNum->scrInd.pres == PRSNT_NODEF) {
+ snprintf(val, sizeof(val), "%d", redirgNum->scrInd.val);
+ ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Redirecting Number Screening Ind:%s\n", val);
+ sngss7_add_var(sngss7_info, "ss7_rdnis_screen_ind", val);
+ }
+
+ if (redirgNum->presRest.pres == PRSNT_NODEF) {
+ snprintf(val, sizeof(val), "%d", redirgNum->presRest.val);
+ ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Redirecting Number Presentation Ind:%s\n", val);
+ sngss7_add_var(sngss7_info, "ss7_rdnis_pres_ind", val);
+ }
+
+ if (redirgNum->numPlan.pres == PRSNT_NODEF) {
+ snprintf(val, sizeof(val), "%d", redirgNum->numPlan.val);
+ ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Redirecting Number Numbering plan:%s\n", val);
+ sngss7_add_var(sngss7_info, "ss7_rdnis_plan", val);
+ caller_data->rdnis.plan = redirgNum->numPlan.val;
+ }
+
+ return FTDM_SUCCESS;
+}
+
ftdm_status_t copy_tknStr_from_sngss7(TknStr str, char *ftdm, TknU8 oddEven)
{
uint8_t i;
uint8_t j;
/* check if the token string is present */
-
if (str.pres == 1) {
j = 0;
@@ -564,7 +597,7 @@ int check_for_state_change(ftdm_channel_t *ftdmchan)
if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_STATE_CHANGE)) {
/* the flag is still up...so we have a problem */
- SS7_DEBUG_CHAN(ftdmchan, "FTDM_CHANNEL_STATE_CHANGE flag set for over 500ms, channel state = %s\n",
+ ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "FTDM_CHANNEL_STATE_CHANGE flag set for over 500ms, channel state = %s\n",
ftdm_channel_state2str (ftdmchan->state));
return 1;
@@ -1606,7 +1639,7 @@ void sngss7_set_sig_status(sngss7_chan_data_t *sngss7_info, ftdm_signaling_statu
ftdm_sigmsg_t sig;
ftdm_channel_t *ftdmchan = sngss7_info->ftdmchan;
- SS7_DEBUG_CHAN(ftdmchan, "Signalling link status changed to %s\n",
+ ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Signalling link status changed to %s\n",
ftdm_signaling_status2str(status));
memset(&sig, 0, sizeof(sig));
@@ -1660,12 +1693,12 @@ ftdm_status_t check_for_reconfig_flag(ftdm_span_t *ftdmspan)
/* check if the interface is paused or resumed */
if (sngss7_test_flag(sngss7_intf, SNGSS7_PAUSED)) {
- SS7_DEBUG_CHAN(ftdmchan, "ISUP intf %d is PAUSED\n", sngss7_intf->id);
+ ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "ISUP intf %d is PAUSED\n", sngss7_intf->id);
/* throw the pause flag */
sngss7_clear_ckt_flag(sngss7_info, FLAG_INFID_RESUME);
sngss7_set_ckt_flag(sngss7_info, FLAG_INFID_PAUSED);
} else {
- SS7_DEBUG_CHAN(ftdmchan, "ISUP intf %d is RESUMED\n", sngss7_intf->id);
+ ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "ISUP intf %d is RESUMED\n", sngss7_intf->id);
/* throw the resume flag */
sngss7_clear_ckt_flag(sngss7_info, FLAG_INFID_PAUSED);
sngss7_set_ckt_flag(sngss7_info, FLAG_INFID_RESUME);
diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c
index 815377b476..2df0a88edb 100644
--- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c
+++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c
@@ -124,6 +124,7 @@ typedef struct sng_ccSpan
uint32_t cld_nadi;
uint32_t rdnis_nadi;
uint32_t min_digits;
+ uint32_t itx_auto_reply;
uint32_t t3;
uint32_t t12;
uint32_t t13;
@@ -1892,7 +1893,9 @@ static int ftmod_ss7_parse_cc_span(ftdm_conf_node_t *cc_span)
sng_ccSpan.typeCntrl = sng_cic_cntrl_type_map[ret].tril_type;
SS7_DEBUG("Found an ccSpan typeCntrl = %s\n", sng_cic_cntrl_type_map[ret].sng_type);
}
- /**********************************************************************/
+ } else if (!strcasecmp(parm->var, "itx_auto_reply")) {
+ sng_ccSpan.itx_auto_reply = ftdm_true(parm->val);
+ SS7_DEBUG("Found itx_auto_reply %d\n", sng_ccSpan.itx_auto_reply);
} else if (!strcasecmp(parm->var, "cicbase")) {
/**********************************************************************/
sng_ccSpan.cicbase = atoi(parm->val);
@@ -2913,6 +2916,7 @@ static int ftmod_ss7_fill_in_ccSpan(sng_ccSpan_t *ccSpan)
g_ftdm_sngss7_data.cfg.isupCkt[x].options = ccSpan->options;
g_ftdm_sngss7_data.cfg.isupCkt[x].switchType = ccSpan->switchType;
g_ftdm_sngss7_data.cfg.isupCkt[x].min_digits = ccSpan->min_digits;
+ g_ftdm_sngss7_data.cfg.isupCkt[x].itx_auto_reply = ccSpan->itx_auto_reply;
if (ccSpan->t3 == 0) {
g_ftdm_sngss7_data.cfg.isupCkt[x].t3 = 1200;
diff --git a/libs/freetdm/src/ftmod/ftmod_wanpipe/ftmod_wanpipe.c b/libs/freetdm/src/ftmod/ftmod_wanpipe/ftmod_wanpipe.c
index 20a173abb2..3a2e72e69b 100644
--- a/libs/freetdm/src/ftmod/ftmod_wanpipe/ftmod_wanpipe.c
+++ b/libs/freetdm/src/ftmod/ftmod_wanpipe/ftmod_wanpipe.c
@@ -1269,7 +1269,7 @@ static FIO_GET_ALARMS_FUNCTION(wanpipe_get_alarms)
ftdm_channel_command(ftdmchan, FTDM_COMMAND_GET_LINK_STATUS, &sangoma_status);
ftdmchan->alarm_flags = sangoma_status == FTDM_HW_LINK_DISCONNECTED ? FTDM_ALARM_RED : FTDM_ALARM_NONE;
ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Link status is %d\n", sangoma_status);
- }
+ }
}
if (alarms) {
@@ -1293,6 +1293,7 @@ static __inline__ ftdm_status_t wanpipe_channel_process_event(ftdm_channel_t *fc
switch(tdm_api->wp_tdm_cmd.event.wp_tdm_api_event_type) {
case WP_API_EVENT_LINK_STATUS:
{
+ if (FTDM_IS_DIGITAL_CHANNEL(fchan)) {
switch(tdm_api->wp_tdm_cmd.event.wp_tdm_api_event_link_status) {
case WP_TDMAPI_EVENT_LINK_STATUS_CONNECTED:
/* *event_id = FTDM_OOB_ALARM_CLEAR; */
@@ -1305,6 +1306,22 @@ static __inline__ ftdm_status_t wanpipe_channel_process_event(ftdm_channel_t *fc
};
/* The WP_API_EVENT_ALARM event should be used to clear alarms */
*event_id = FTDM_OOB_NOOP;
+ } else {
+ switch(tdm_api->wp_tdm_cmd.event.wp_tdm_api_event_link_status) {
+ case WP_TDMAPI_EVENT_LINK_STATUS_CONNECTED:
+ /* *event_id = FTDM_OOB_ALARM_CLEAR; */
+ ftdm_log_chan_msg(fchan, FTDM_LOG_DEBUG, "Using analog link connected event as alarm clear\n");
+ *event_id = FTDM_OOB_ALARM_CLEAR;
+ fchan->alarm_flags = FTDM_ALARM_NONE;
+ break;
+ default:
+ /* *event_id = FTDM_OOB_ALARM_TRAP; */
+ ftdm_log_chan_msg(fchan, FTDM_LOG_DEBUG, "Using analog link disconnected event as alarm trap\n");
+ *event_id = FTDM_OOB_ALARM_TRAP;
+ fchan->alarm_flags = FTDM_ALARM_RED;
+ break;
+ };
+ }
}
break;
diff --git a/libs/freetdm/src/include/freetdm.h b/libs/freetdm/src/include/freetdm.h
index 6ab518a6e3..3bc2f5b25d 100755
--- a/libs/freetdm/src/include/freetdm.h
+++ b/libs/freetdm/src/include/freetdm.h
@@ -241,12 +241,12 @@ FTDM_STR2ENUM_P(ftdm_str2ftdm_ton, ftdm_ton2str, ftdm_ton_t)
/*! Numbering Plan Identification (NPI) */
typedef enum {
FTDM_NPI_UNKNOWN = 0,
- FTDM_NPI_ISDN = 1,
- FTDM_NPI_DATA = 3,
- FTDM_NPI_TELEX = 4,
- FTDM_NPI_NATIONAL = 8,
- FTDM_NPI_PRIVATE = 9,
- FTDM_NPI_RESERVED = 10,
+ FTDM_NPI_ISDN,
+ FTDM_NPI_DATA,
+ FTDM_NPI_TELEX,
+ FTDM_NPI_NATIONAL,
+ FTDM_NPI_PRIVATE,
+ FTDM_NPI_RESERVED,
FTDM_NPI_INVALID
} ftdm_npi_t;
#define NPI_STRINGS "unknown", "ISDN", "data", "telex", "national", "private", "reserved", "invalid"
diff --git a/libs/freetdm/src/include/private/ftdm_types.h b/libs/freetdm/src/include/private/ftdm_types.h
index b263b64a2d..e4d2b6900d 100755
--- a/libs/freetdm/src/include/private/ftdm_types.h
+++ b/libs/freetdm/src/include/private/ftdm_types.h
@@ -249,6 +249,8 @@ typedef enum {
#define FTDM_CHANNEL_IND_ACK_PENDING (1ULL << 34)
/*!< There is someone blocking in the channel waiting for state completion */
#define FTDM_CHANNEL_BLOCKING (1ULL << 35)
+/*!< Media is digital */
+#define FTDM_CHANNEL_DIGITAL_MEDIA (1ULL << 36)
#include "ftdm_state.h"
diff --git a/libs/sofia-sip/libsofia-sip-ua/su/su_string.c b/libs/sofia-sip/libsofia-sip-ua/su/su_string.c
index 6774d372b6..249e788389 100644
--- a/libs/sofia-sip/libsofia-sip-ua/su/su_string.c
+++ b/libs/sofia-sip/libsofia-sip-ua/su/su_string.c
@@ -478,7 +478,7 @@ size_t su_memspn(const void *mem, size_t memlen,
* of bytes not in @a reject.
*
* @param mem pointer to memory area
- *Â @param memlen size of @a mem in bytes
+ * @param memlen size of @a mem in bytes
* @param reject pointer to table containing bytes to reject
* @param rejectlen size of @a reject table
*
diff --git a/libs/spandsp/.update b/libs/spandsp/.update
index c79813d90a..bbfb583730 100644
--- a/libs/spandsp/.update
+++ b/libs/spandsp/.update
@@ -1 +1 @@
-Mon Jun 7 20:09:38 EDT 2010
+Wed May 4 10:03:23 CDT 2011
diff --git a/libs/spandsp/src/t38_core.c b/libs/spandsp/src/t38_core.c
index e7ee967e93..55b524af61 100644
--- a/libs/spandsp/src/t38_core.c
+++ b/libs/spandsp/src/t38_core.c
@@ -799,7 +799,11 @@ SPAN_DECLARE(int) t38_core_send_indicator(t38_core_state_t *s, int indicator)
return len;
}
span_log(&s->logging, SPAN_LOG_FLOW, "Tx %5d: indicator %s\n", s->tx_seq_no, t38_indicator_to_str(indicator));
- s->tx_packet_handler(s, s->tx_packet_user_data, buf, len, transmissions);
+ if (s->tx_packet_handler(s, s->tx_packet_user_data, buf, len, transmissions) < 0)
+ {
+ span_log(&s->logging, SPAN_LOG_PROTOCOL_WARNING, "Tx Packet Handler Failure\n");
+ return -1;
+ }
s->tx_seq_no = (s->tx_seq_no + 1) & 0xFFFF;
delay = modem_startup_time[indicator].training;
if (s->allow_for_tep)
@@ -837,7 +841,11 @@ SPAN_DECLARE(int) t38_core_send_data(t38_core_state_t *s, int data_type, int fie
span_log(&s->logging, SPAN_LOG_FLOW, "T.38 data len is %d\n", len);
return len;
}
- s->tx_packet_handler(s, s->tx_packet_user_data, buf, len, s->category_control[category]);
+ if (s->tx_packet_handler(s, s->tx_packet_user_data, buf, len, s->category_control[category]) < 0)
+ {
+ span_log(&s->logging, SPAN_LOG_PROTOCOL_WARNING, "Tx Packet Handler Failure\n");
+ return -1;
+ }
s->tx_seq_no = (s->tx_seq_no + 1) & 0xFFFF;
return 0;
}
@@ -853,7 +861,11 @@ SPAN_DECLARE(int) t38_core_send_data_multi_field(t38_core_state_t *s, int data_t
span_log(&s->logging, SPAN_LOG_FLOW, "T.38 data len is %d\n", len);
return len;
}
- s->tx_packet_handler(s, s->tx_packet_user_data, buf, len, s->category_control[category]);
+ if (s->tx_packet_handler(s, s->tx_packet_user_data, buf, len, s->category_control[category]) < 0)
+ {
+ span_log(&s->logging, SPAN_LOG_PROTOCOL_WARNING, "Tx Packet Handler Failure\n");
+ return -1;
+ }
s->tx_seq_no = (s->tx_seq_no + 1) & 0xFFFF;
return 0;
}
diff --git a/libs/spandsp/src/t38_terminal.c b/libs/spandsp/src/t38_terminal.c
index c9961f665b..64b30f4805 100644
--- a/libs/spandsp/src/t38_terminal.c
+++ b/libs/spandsp/src/t38_terminal.c
@@ -63,10 +63,18 @@
#include "spandsp/v17rx.h"
#include "spandsp/t4_rx.h"
#include "spandsp/t4_tx.h"
-#if defined(SPANDSP_SUPPORT_T85)
+#if defined(SPANDSP_SUPPORT_T42) || defined(SPANDSP_SUPPORT_T43) | defined(SPANDSP_SUPPORT_T85)
#include "spandsp/t81_t82_arith_coding.h"
+#endif
+#if defined(SPANDSP_SUPPORT_T85)
#include "spandsp/t85.h"
#endif
+#if defined(SPANDSP_SUPPORT_T42)
+#include "spandsp/t42.h"
+#endif
+#if defined(SPANDSP_SUPPORT_T43)
+#include "spandsp/t43.h"
+#endif
#include "spandsp/t4_t6_decode.h"
#include "spandsp/t4_t6_encode.h"
#include "spandsp/t30_fcf.h"
@@ -78,10 +86,18 @@
#include "spandsp/t38_terminal.h"
#include "spandsp/private/logging.h"
-#if defined(SPANDSP_SUPPORT_T85)
+#if defined(SPANDSP_SUPPORT_T42) || defined(SPANDSP_SUPPORT_T43) | defined(SPANDSP_SUPPORT_T85)
#include "spandsp/private/t81_t82_arith_coding.h"
+#endif
+#if defined(SPANDSP_SUPPORT_T85)
#include "spandsp/private/t85.h"
#endif
+#if defined(SPANDSP_SUPPORT_T42)
+#include "spandsp/private/t42.h"
+#endif
+#if defined(SPANDSP_SUPPORT_T43)
+#include "spandsp/private/t43.h"
+#endif
#include "spandsp/private/t4_t6_decode.h"
#include "spandsp/private/t4_t6_encode.h"
#include "spandsp/private/t4_rx.h"
@@ -629,7 +645,9 @@ static int set_no_signal(t38_terminal_state_t *s)
if ((s->t38_fe.chunking_modes & T38_CHUNKING_SEND_REGULAR_INDICATORS))
{
- t38_core_send_indicator(&s->t38_fe.t38, 0x100 | T38_IND_NO_SIGNAL);
+ if ((delay = t38_core_send_indicator(&s->t38_fe.t38, 0x100 | T38_IND_NO_SIGNAL)) < 0)
+ return delay;
+ /*endif*/
s->t38_fe.timed_step = T38_TIMED_STEP_NO_SIGNAL;
#if 0
if ((s->t38_fe.chunking_modes & T38_CHUNKING_SEND_2S_REGULAR_INDICATORS))
@@ -641,7 +659,9 @@ static int set_no_signal(t38_terminal_state_t *s)
return s->t38_fe.ms_per_tx_chunk*1000;
}
/*endif*/
- delay = t38_core_send_indicator(&s->t38_fe.t38, T38_IND_NO_SIGNAL);
+ if ((delay = t38_core_send_indicator(&s->t38_fe.t38, T38_IND_NO_SIGNAL)) < 0)
+ return delay;
+ /*endif*/
s->t38_fe.timed_step = T38_TIMED_STEP_NONE;
return delay;
}
@@ -649,7 +669,11 @@ static int set_no_signal(t38_terminal_state_t *s)
static int stream_no_signal(t38_terminal_state_t *s)
{
- t38_core_send_indicator(&s->t38_fe.t38, 0x100 | T38_IND_NO_SIGNAL);
+ int delay;
+
+ if ((delay = t38_core_send_indicator(&s->t38_fe.t38, 0x100 | T38_IND_NO_SIGNAL)) < 0)
+ return delay;
+ /*endif*/
#if 0
if (s->t38_fe.timeout_tx_samples && s->t38_fe.next_tx_samples >= s->t38_fe.timeout_tx_samples)
s->t38_fe.timed_step = T38_TIMED_STEP_NONE;
@@ -663,6 +687,7 @@ static int stream_non_ecm(t38_terminal_state_t *s)
{
t38_terminal_front_end_state_t *fe;
uint8_t buf[MAX_OCTETS_PER_UNPACED_CHUNK + 50];
+ int res;
int delay;
int len;
@@ -674,9 +699,15 @@ static int stream_non_ecm(t38_terminal_state_t *s)
case T38_TIMED_STEP_NON_ECM_MODEM:
/* Create a 75ms silence */
if (fe->t38.current_tx_indicator != T38_IND_NO_SIGNAL)
- delay = t38_core_send_indicator(&fe->t38, T38_IND_NO_SIGNAL);
+ {
+ if ((delay = t38_core_send_indicator(&fe->t38, T38_IND_NO_SIGNAL)) < 0)
+ return delay;
+ /*endif*/
+ }
else
+ {
delay = 75000;
+ }
/*endif*/
fe->timed_step = T38_TIMED_STEP_NON_ECM_MODEM_2;
#if 0
@@ -690,7 +721,9 @@ static int stream_non_ecm(t38_terminal_state_t *s)
#if 0
if ((s->t38_fe.chunking_modes & T38_CHUNKING_SEND_REGULAR_INDICATORS))
{
- delay = t38_core_send_indicator(&fe->t38, 0x100 | fe->next_tx_indicator);
+ if ((delay = t38_core_send_indicator(&fe->t38, 0x100 | fe->next_tx_indicator)) < 0)
+ return delay;
+ /*endif*/
if (fe->next_tx_samples >= fe->timeout_tx_samples)
fe->timed_step = T38_TIMED_STEP_NON_ECM_MODEM_3;
/*endif*/
@@ -698,7 +731,9 @@ static int stream_non_ecm(t38_terminal_state_t *s)
}
/*endif*/
#endif
- delay = t38_core_send_indicator(&fe->t38, fe->next_tx_indicator);
+ if ((delay = t38_core_send_indicator(&fe->t38, fe->next_tx_indicator)) < 0)
+ return delay;
+ /*endif*/
fe->timed_step = T38_TIMED_STEP_NON_ECM_MODEM_3;
break;
case T38_TIMED_STEP_NON_ECM_MODEM_3:
@@ -731,7 +766,9 @@ static int stream_non_ecm(t38_terminal_state_t *s)
else
{
/* If we are sending quickly there seems no point in doing any padding */
- t38_core_send_data(&fe->t38, fe->current_tx_data_type, T38_FIELD_T4_NON_ECM_SIG_END, buf, len, T38_PACKET_CATEGORY_IMAGE_DATA_END);
+ if ((res = t38_core_send_data(&fe->t38, fe->current_tx_data_type, T38_FIELD_T4_NON_ECM_SIG_END, buf, len, T38_PACKET_CATEGORY_IMAGE_DATA_END)) < 0)
+ return res;
+ /*endif*/
fe->timed_step = T38_TIMED_STEP_NON_ECM_MODEM_5;
delay = 0;
break;
@@ -739,7 +776,9 @@ static int stream_non_ecm(t38_terminal_state_t *s)
/*endif*/
}
/*endif*/
- t38_core_send_data(&fe->t38, fe->current_tx_data_type, T38_FIELD_T4_NON_ECM_DATA, buf, len, T38_PACKET_CATEGORY_IMAGE_DATA);
+ if ((res = t38_core_send_data(&fe->t38, fe->current_tx_data_type, T38_FIELD_T4_NON_ECM_DATA, buf, len, T38_PACKET_CATEGORY_IMAGE_DATA)) < 0)
+ return res;
+ /*endif*/
delay = bits_to_us(s, 8*len);
break;
case T38_TIMED_STEP_NON_ECM_MODEM_4:
@@ -750,7 +789,9 @@ static int stream_non_ecm(t38_terminal_state_t *s)
{
len += fe->non_ecm_trailer_bytes;
memset(buf, 0, len);
- t38_core_send_data(&fe->t38, fe->current_tx_data_type, T38_FIELD_T4_NON_ECM_SIG_END, buf, len, T38_PACKET_CATEGORY_IMAGE_DATA_END);
+ if ((res = t38_core_send_data(&fe->t38, fe->current_tx_data_type, T38_FIELD_T4_NON_ECM_SIG_END, buf, len, T38_PACKET_CATEGORY_IMAGE_DATA_END)) < 0)
+ return res;
+ /*endif*/
fe->timed_step = T38_TIMED_STEP_NON_ECM_MODEM_5;
/* Allow a bit more time than the data will take to play out, to ensure the far ATA does not
cut things short. */
@@ -763,7 +804,9 @@ static int stream_non_ecm(t38_terminal_state_t *s)
}
/*endif*/
memset(buf, 0, len);
- t38_core_send_data(&fe->t38, fe->current_tx_data_type, T38_FIELD_T4_NON_ECM_DATA, buf, len, T38_PACKET_CATEGORY_IMAGE_DATA);
+ if ((res = t38_core_send_data(&fe->t38, fe->current_tx_data_type, T38_FIELD_T4_NON_ECM_DATA, buf, len, T38_PACKET_CATEGORY_IMAGE_DATA)) < 0)
+ return res;
+ /*endif*/
delay = bits_to_us(s, 8*len);
break;
case T38_TIMED_STEP_NON_ECM_MODEM_5:
@@ -785,6 +828,7 @@ static int stream_hdlc(t38_terminal_state_t *s)
t38_data_field_t data_fields[2];
int category;
int previous;
+ int res;
int delay;
int i;
@@ -796,9 +840,15 @@ static int stream_hdlc(t38_terminal_state_t *s)
case T38_TIMED_STEP_HDLC_MODEM:
/* Create a 75ms silence */
if (fe->t38.current_tx_indicator != T38_IND_NO_SIGNAL)
- delay = t38_core_send_indicator(&fe->t38, T38_IND_NO_SIGNAL);
+ {
+ if ((delay = t38_core_send_indicator(&fe->t38, T38_IND_NO_SIGNAL)) < 0)
+ return delay;
+ /*endif*/
+ }
else
+ {
delay = 75000;
+ }
/*endif*/
fe->timed_step = T38_TIMED_STEP_HDLC_MODEM_2;
#if 0
@@ -814,7 +864,9 @@ static int stream_hdlc(t38_terminal_state_t *s)
#if 0
if ((s->t38_fe.chunking_modes & T38_CHUNKING_SEND_REGULAR_INDICATORS))
{
- delay = t38_core_send_indicator(&fe->t38, 0x100 | fe->next_tx_indicator);
+ if ((delay = t38_core_send_indicator(&fe->t38, 0x100 | fe->next_tx_indicator)) < 0)
+ return delay;
+ /*endif*/
if (fe->next_tx_samples >= fe->timeout_tx_samples)
fe->timed_step = T38_TIMED_STEP_HDLC_MODEM_3;
/*endif*/
@@ -822,8 +874,10 @@ static int stream_hdlc(t38_terminal_state_t *s)
}
/*endif*/
#endif
- delay = t38_core_send_indicator(&fe->t38, fe->next_tx_indicator)
- + t38_core_send_flags_delay(&fe->t38, fe->next_tx_indicator);
+ if ((delay = t38_core_send_indicator(&fe->t38, fe->next_tx_indicator)) < 0)
+ return delay;
+ /*endif*/
+ delay += t38_core_send_flags_delay(&fe->t38, fe->next_tx_indicator);
fe->timed_step = T38_TIMED_STEP_HDLC_MODEM_3;
break;
case T38_TIMED_STEP_HDLC_MODEM_3:
@@ -852,7 +906,9 @@ static int stream_hdlc(t38_terminal_state_t *s)
data_fields[1].field = NULL;
data_fields[1].field_len = 0;
category = (s->t38_fe.current_tx_data_type == T38_DATA_V21) ? T38_PACKET_CATEGORY_CONTROL_DATA_END : T38_PACKET_CATEGORY_IMAGE_DATA_END;
- t38_core_send_data_multi_field(&fe->t38, fe->current_tx_data_type, data_fields, 2, category);
+ if ((res = t38_core_send_data_multi_field(&fe->t38, fe->current_tx_data_type, data_fields, 2, category)) < 0)
+ return res;
+ /*endif*/
fe->timed_step = T38_TIMED_STEP_HDLC_MODEM_5;
/* We add a bit of extra time here, as with some implementations
the carrier falling too abruptly causes data loss. */
@@ -868,7 +924,9 @@ static int stream_hdlc(t38_terminal_state_t *s)
data_fields[1].field = NULL;
data_fields[1].field_len = 0;
category = (s->t38_fe.current_tx_data_type == T38_DATA_V21) ? T38_PACKET_CATEGORY_CONTROL_DATA : T38_PACKET_CATEGORY_IMAGE_DATA;
- t38_core_send_data_multi_field(&fe->t38, fe->current_tx_data_type, data_fields, 2, category);
+ if ((res = t38_core_send_data_multi_field(&fe->t38, fe->current_tx_data_type, data_fields, 2, category)) < 0)
+ return res;
+ /*endif*/
fe->timed_step = T38_TIMED_STEP_HDLC_MODEM_3;
delay = bits_to_us(s, i*8 + fe->hdlc_tx.extra_bits);
}
@@ -877,14 +935,18 @@ static int stream_hdlc(t38_terminal_state_t *s)
}
/*endif*/
category = (s->t38_fe.current_tx_data_type == T38_DATA_V21) ? T38_PACKET_CATEGORY_CONTROL_DATA : T38_PACKET_CATEGORY_IMAGE_DATA;
- t38_core_send_data(&fe->t38, fe->current_tx_data_type, T38_FIELD_HDLC_DATA, &fe->hdlc_tx.buf[fe->hdlc_tx.ptr], i, category);
+ if ((res = t38_core_send_data(&fe->t38, fe->current_tx_data_type, T38_FIELD_HDLC_DATA, &fe->hdlc_tx.buf[fe->hdlc_tx.ptr], i, category)) < 0)
+ return res;
+ /*endif*/
fe->timed_step = T38_TIMED_STEP_HDLC_MODEM_4;
}
else
{
i = fe->octets_per_data_packet;
category = (s->t38_fe.current_tx_data_type == T38_DATA_V21) ? T38_PACKET_CATEGORY_CONTROL_DATA : T38_PACKET_CATEGORY_IMAGE_DATA;
- t38_core_send_data(&fe->t38, fe->current_tx_data_type, T38_FIELD_HDLC_DATA, &fe->hdlc_tx.buf[fe->hdlc_tx.ptr], i, category);
+ if ((res = t38_core_send_data(&fe->t38, fe->current_tx_data_type, T38_FIELD_HDLC_DATA, &fe->hdlc_tx.buf[fe->hdlc_tx.ptr], i, category)) < 0)
+ return res;
+ /*endif*/
fe->hdlc_tx.ptr += i;
}
/*endif*/
@@ -901,7 +963,9 @@ static int stream_hdlc(t38_terminal_state_t *s)
{
/* End of transmission */
category = (s->t38_fe.current_tx_data_type == T38_DATA_V21) ? T38_PACKET_CATEGORY_CONTROL_DATA_END : T38_PACKET_CATEGORY_IMAGE_DATA_END;
- t38_core_send_data(&fe->t38, previous, T38_FIELD_HDLC_FCS_OK_SIG_END, NULL, 0, category);
+ if ((res = t38_core_send_data(&fe->t38, previous, T38_FIELD_HDLC_FCS_OK_SIG_END, NULL, 0, category)) < 0)
+ return res;
+ /*endif*/
fe->timed_step = T38_TIMED_STEP_HDLC_MODEM_5;
/* We add a bit of extra time here, as with some implementations
the carrier falling too abruptly causes data loss. */
@@ -922,7 +986,9 @@ static int stream_hdlc(t38_terminal_state_t *s)
/*endif*/
/* Finish the current frame off, and prepare for the next one. */
category = (s->t38_fe.current_tx_data_type == T38_DATA_V21) ? T38_PACKET_CATEGORY_CONTROL_DATA : T38_PACKET_CATEGORY_IMAGE_DATA;
- t38_core_send_data(&fe->t38, previous, T38_FIELD_HDLC_FCS_OK, NULL, 0, category);
+ if ((res = t38_core_send_data(&fe->t38, previous, T38_FIELD_HDLC_FCS_OK, NULL, 0, category)) < 0)
+ return res;
+ /*endif*/
fe->timed_step = T38_TIMED_STEP_HDLC_MODEM_3;
/* We should now wait enough time for everything to clear through an analogue modem at the far end. */
delay = bits_to_us(s, fe->hdlc_tx.extra_bits);
@@ -955,14 +1021,18 @@ static int stream_ced(t38_terminal_state_t *s)
of silence, starting the delay with a no signal indication makes sense.
We do need a 200ms delay, as that is a specification requirement. */
fe->timed_step = T38_TIMED_STEP_CED_2;
- delay = t38_core_send_indicator(&fe->t38, T38_IND_NO_SIGNAL);
+ if ((delay = t38_core_send_indicator(&fe->t38, T38_IND_NO_SIGNAL)) < 0)
+ return delay;
+ /*endif*/
delay = 200000;
fe->next_tx_samples = fe->samples;
break;
case T38_TIMED_STEP_CED_2:
/* Initial 200ms delay over. Send the CED indicator */
fe->timed_step = T38_TIMED_STEP_CED_3;
- delay = t38_core_send_indicator(&fe->t38, T38_IND_CED);
+ if ((delay = t38_core_send_indicator(&fe->t38, T38_IND_CED)) < 0)
+ return delay;
+ /*endif*/
fe->current_tx_data_type = T38_DATA_NONE;
break;
case T38_TIMED_STEP_CED_3:
@@ -994,7 +1064,9 @@ static int stream_cng(t38_terminal_state_t *s)
be sending 200ms of silence, according to T.30, starting that delay with
a no signal indication makes sense. */
fe->timed_step = T38_TIMED_STEP_CNG_2;
- delay = t38_core_send_indicator(&fe->t38, T38_IND_NO_SIGNAL);
+ if ((delay = t38_core_send_indicator(&fe->t38, T38_IND_NO_SIGNAL)) < 0)
+ return delay;
+ /*endif*/
delay = 200000;
fe->next_tx_samples = fe->samples;
break;
@@ -1003,7 +1075,9 @@ static int stream_cng(t38_terminal_state_t *s)
coming the other way interrupts it, or a long timeout controlled by the T.30 engine
expires. */
fe->timed_step = T38_TIMED_STEP_NONE;
- delay = t38_core_send_indicator(&fe->t38, T38_IND_CNG);
+ if ((delay = t38_core_send_indicator(&fe->t38, T38_IND_CNG)) < 0)
+ return delay;
+ /*endif*/
fe->current_tx_data_type = T38_DATA_NONE;
return delay;
}
@@ -1067,6 +1141,12 @@ SPAN_DECLARE(int) t38_terminal_send_timeout(t38_terminal_state_t *s, int samples
break;
}
/*endswitch*/
+ if (delay < 0)
+ {
+ t30_terminate(&s->t30);
+ return TRUE;
+ }
+ /*endif*/
fe->next_tx_samples += us_to_samples(delay);
return FALSE;
}
diff --git a/libs/stfu/stfu.c b/libs/stfu/stfu.c
index 9e5fcf3b22..a4c3bb78d3 100644
--- a/libs/stfu/stfu.c
+++ b/libs/stfu/stfu.c
@@ -76,6 +76,7 @@ struct stfu_instance {
uint32_t miss_count;
uint32_t max_plc;
uint32_t qlen;
+ uint32_t most_qlen;
uint32_t max_qlen;
uint32_t orig_qlen;
uint32_t packet_count;
@@ -136,6 +137,11 @@ int32_t stfu_n_get_drift(stfu_instance_t *i)
return i->ts_drift;
}
+int32_t stfu_n_get_most_qlen(stfu_instance_t *i)
+{
+ return i->most_qlen;
+}
+
void stfu_global_set_logger(stfu_logger_t logger)
{
if (logger) {
@@ -253,6 +259,10 @@ stfu_status_t stfu_n_resize(stfu_instance_t *i, uint32_t qlen)
s = stfu_n_resize_aqueue(&i->b_queue, qlen);
s = stfu_n_resize_aqueue(&i->c_queue, qlen);
+ if (qlen > i->most_qlen) {
+ i->most_qlen = qlen;
+ }
+
i->qlen = qlen;
i->max_plc = 5;
i->last_frame = NULL;
diff --git a/libs/stfu/stfu.h b/libs/stfu/stfu.h
index d8fbf447af..b802bbaef6 100644
--- a/libs/stfu/stfu.h
+++ b/libs/stfu/stfu.h
@@ -188,6 +188,7 @@ stfu_status_t stfu_n_sync(stfu_instance_t *i, uint32_t packets);
void stfu_n_call_me(stfu_instance_t *i, stfu_n_call_me_t callback, void *udata);
void stfu_n_debug(stfu_instance_t *i, const char *name);
int32_t stfu_n_get_drift(stfu_instance_t *i);
+int32_t stfu_n_get_most_qlen(stfu_instance_t *i);
#define stfu_im_done(i) stfu_n_add_data(i, 0, NULL, 0, 0, 1)
#define stfu_n_eat(i,t,p,d,l,tt) stfu_n_add_data(i, t, p, d, l, tt, 0)
diff --git a/scripts/lua/sound_test.lua b/scripts/lua/sound_test.lua
new file mode 100644
index 0000000000..e29c2f9ca7
--- /dev/null
+++ b/scripts/lua/sound_test.lua
@@ -0,0 +1,74 @@
+--
+-- sound_test.lua
+--
+-- accepts two args and then rolls through the sound files
+-- arg 1: type
+-- arg 2: rate
+--
+--[[ Use a dialplan entry like this:
+
+
+
+
+
+
+
+
+Note the syntax of the destination number:
+Rate can be 8000, 16000, 32000, or 48000
+Type can be ivr, conference, voicemail, misc, digits, etc.
+
+Using the extension listed above you could call it with mod_portaudio from fs_cli:
+
+ pa call 16000ivr
+ pa call 8000conference
+ pa call 32000conference
+
+ etc.
+
+]]
+
+-- Create tables that hold our rates and types
+
+tbl_types = {
+ ['ascii'] = 1,
+ ['base256'] = 1,
+ ['conference'] = 1,
+ ['currency'] = 1,
+ ['digits'] = 1,
+ ['directory'] = 1,
+ ['ivr'] = 1,
+ ['misc'] = 1,
+ ['phonetic-ascii'] = 1,
+ ['time'] = 1,
+ ['voicemail'] = 1,
+ ['zrtp'] = 1
+};
+
+tbl_rates = {['8000'] = 1 ,['16000'] = 1, ['32000'] = 1, ['48000'] = 1};
+
+stype = argv[1];
+srate = argv[2];
+
+freeswitch.consoleLog("INFO","Args: Type = " .. argv[1] .. ', Rate = ' .. argv[2] .. "\n");
+
+if ( tbl_types[stype] == nil ) then
+ freeswitch.consoleLog("ERR","Type '" .. stype .. "' is not valid.\n");
+elseif ( tbl_rates[srate] == nil ) then
+ freeswitch.consoleLog("ERR","Rate '" .. srate .. "' is not valid.\n");
+else
+ -- Looks good, let's play some sound files
+ sound_base = session:getVariable('sounds_dir') .. '/en/us/callie/' .. stype .. '/' .. srate;
+ input_file = '/tmp/filez.txt';
+ res = os.execute('ls -1 ' .. sound_base .. ' > ' .. input_file);
+ freeswitch.consoleLog("INFO","Result of system call: " .. res .. "\n");
+ if ( res == 0 ) then
+ for fname in io.lines(input_file) do
+ freeswitch.consoleLog("NOTICE","Playing file: " .. fname .. "\n");
+ session:streamFile(sound_base .. '/' .. fname);
+ session:sleep(100);
+ end
+ else
+ freeswitch.consoleLog("ERR","Result of system call: " .. res .. "\n");
+ end
+end
\ No newline at end of file
diff --git a/src/include/switch.h b/src/include/switch.h
index de099f1b94..2f5cf72f30 100644
--- a/src/include/switch.h
+++ b/src/include/switch.h
@@ -137,6 +137,7 @@
#include "switch_odbc.h"
#include "switch_json.h"
#include "switch_limit.h"
+#include "switch_curl.h"
#include
diff --git a/src/include/switch_curl.h b/src/include/switch_curl.h
new file mode 100644
index 0000000000..d3661226e0
--- /dev/null
+++ b/src/include/switch_curl.h
@@ -0,0 +1,58 @@
+/*
+ * FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
+ * Copyright (C) 2005-2011, Anthony Minessale II
+ *
+ * Version: MPL 1.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
+ *
+ * The Initial Developer of the Original Code is
+ * Anthony Minessale II
+ * Portions created by the Initial Developer are Copyright (C)
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ *
+ * Anthony Minessale II
+ *
+ *
+ * switch_curl.h -- Core cURL
+ *
+ */
+/*! \file switch_core.h
+ \brief Core Library
+
+ This module is the main core library and is the intended location of all fundamental operations.
+*/
+
+#ifndef SWITCH_CURL_H
+#define SWITCH_CURL_H
+
+SWITCH_BEGIN_EXTERN_C
+
+SWITCH_DECLARE(void) switch_curl_init(switch_memory_pool_t *pool);
+SWITCH_DECLARE(void) switch_curl_destroy(void);
+
+SWITCH_END_EXTERN_C
+
+#endif
+/* For Emacs:
+ * Local Variables:
+ * mode:c
+ * indent-tabs-mode:t
+ * tab-width:4
+ * c-basic-offset:4
+ * End:
+ * For VIM:
+ * vim:set softtabstop=4 shiftwidth=4 tabstop=4:
+ */
diff --git a/src/include/switch_platform.h b/src/include/switch_platform.h
index 15b3277404..609dde8b7a 100644
--- a/src/include/switch_platform.h
+++ b/src/include/switch_platform.h
@@ -223,15 +223,15 @@ typedef intptr_t switch_ssize_t;
#ifdef WIN32
#ifdef WIN64
-#define SWITCH_SSIZE_T_FMT "I64d"
-#define SWITCH_SIZE_T_FMT "I64d"
+#define SWITCH_SSIZE_T_FMT "lld"
+#define SWITCH_SIZE_T_FMT "lld"
#else
#define SWITCH_SSIZE_T_FMT "d"
#define SWITCH_SIZE_T_FMT "d"
#endif
-#define SWITCH_INT64_T_FMT "I64d"
-#define SWITCH_UINT64_T_FMT "I64u"
+#define SWITCH_INT64_T_FMT "lld"
+#define SWITCH_UINT64_T_FMT "llu"
#ifndef TIME_T_FMT
#define TIME_T_FMT SWITCH_INT64_T_FMT
diff --git a/src/include/switch_types.h b/src/include/switch_types.h
index 988d2da641..6664dc0653 100644
--- a/src/include/switch_types.h
+++ b/src/include/switch_types.h
@@ -489,6 +489,7 @@ typedef struct {
switch_size_t dtmf_packet_count;
switch_size_t cng_packet_count;
switch_size_t flush_packet_count;
+ switch_size_t largest_jb_size;
} switch_rtp_numbers_t;
diff --git a/src/mod/applications/mod_callcenter/mod_callcenter.c b/src/mod/applications/mod_callcenter/mod_callcenter.c
index 552eee9518..e3bf1797dc 100644
--- a/src/mod/applications/mod_callcenter/mod_callcenter.c
+++ b/src/mod/applications/mod_callcenter/mod_callcenter.c
@@ -37,12 +37,6 @@
#define CC_AGENT_TYPE_UUID_STANDBY "uuid-standby"
#define CC_SQLITE_DB_NAME "callcenter"
-#ifdef WIN32
-#define MSWITCH_TIME_T_FMT "lld"
-#else
-#define MSWITCH_TIME_T_FMT SWITCH_TIME_T_FMT
-#endif
-
/* Prototypes */
SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_callcenter_shutdown);
@@ -916,12 +910,12 @@ cc_status_t cc_agent_update(const char *key, const char *value, const char *agen
if (cc_agent_str2status(value) != CC_AGENT_STATUS_UNKNOWN) {
/* Reset values on available only */
if (cc_agent_str2status(value) == CC_AGENT_STATUS_AVAILABLE) {
- sql = switch_mprintf("UPDATE agents SET status = '%q', last_status_change = '%" MSWITCH_TIME_T_FMT "', talk_time = 0, calls_answered = 0, no_answer_count = 0"
+ sql = switch_mprintf("UPDATE agents SET status = '%q', last_status_change = '%" SWITCH_TIME_T_FMT "', talk_time = 0, calls_answered = 0, no_answer_count = 0"
" WHERE name = '%q' AND NOT status = '%q'",
value, local_epoch_time_now(NULL),
agent, value);
} else {
- sql = switch_mprintf("UPDATE agents SET status = '%q', last_status_change = '%" MSWITCH_TIME_T_FMT "' WHERE name = '%q'",
+ sql = switch_mprintf("UPDATE agents SET status = '%q', last_status_change = '%" SWITCH_TIME_T_FMT "' WHERE name = '%q'",
value, local_epoch_time_now(NULL), agent);
}
cc_execute_sql(NULL, sql, NULL);
@@ -957,7 +951,7 @@ cc_status_t cc_agent_update(const char *key, const char *value, const char *agen
if (cc_agent_str2state(value) != CC_AGENT_STATE_RECEIVING) {
sql = switch_mprintf("UPDATE agents SET state = '%q' WHERE name = '%q'", value, agent);
} else {
- sql = switch_mprintf("UPDATE agents SET state = '%q', last_offered_call = '%" MSWITCH_TIME_T_FMT "' WHERE name = '%q'",
+ sql = switch_mprintf("UPDATE agents SET state = '%q', last_offered_call = '%" SWITCH_TIME_T_FMT "' WHERE name = '%q'",
value, local_epoch_time_now(NULL), agent);
}
cc_execute_sql(NULL, sql, NULL);
@@ -1396,7 +1390,7 @@ static void *SWITCH_THREAD_FUNC outbound_agent_thread_run(switch_thread_t *threa
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Member %s <%s> with uuid %s in queue %s is gone just before we assigned an agent\n", h->member_cid_name, h->member_cid_number, h->member_session_uuid, h->queue_name);
- sql = switch_mprintf("UPDATE members SET state = '%q', session_uuid = '', abandoned_epoch = '%" MSWITCH_TIME_T_FMT "' WHERE system = 'single_box' AND uuid = '%q' AND state != '%q'",
+ sql = switch_mprintf("UPDATE members SET state = '%q', session_uuid = '', abandoned_epoch = '%" SWITCH_TIME_T_FMT "' WHERE system = 'single_box' AND uuid = '%q' AND state != '%q'",
cc_member_state2str(CC_MEMBER_STATE_ABANDONED), local_epoch_time_now(NULL), h->member_uuid, cc_member_state2str(CC_MEMBER_STATE_ABANDONED));
cc_execute_sql(NULL, sql, NULL);
@@ -1555,7 +1549,7 @@ static void *SWITCH_THREAD_FUNC outbound_agent_thread_run(switch_thread_t *threa
switch_channel_set_variable_printf(member_channel, "cc_queue_answered_epoch", "%" SWITCH_TIME_T_FMT, local_epoch_time_now(NULL));
/* Set UUID of the Agent channel */
- sql = switch_mprintf("UPDATE agents SET uuid = '%q', last_bridge_start = '%" MSWITCH_TIME_T_FMT "', calls_answered = calls_answered + 1, no_answer_count = 0"
+ sql = switch_mprintf("UPDATE agents SET uuid = '%q', last_bridge_start = '%" SWITCH_TIME_T_FMT "', calls_answered = calls_answered + 1, no_answer_count = 0"
" WHERE name = '%q' AND system = '%q'",
agent_uuid, local_epoch_time_now(NULL),
h->agent_name, h->agent_system);
@@ -1615,7 +1609,7 @@ static void *SWITCH_THREAD_FUNC outbound_agent_thread_run(switch_thread_t *threa
/* Update Agents Items */
/* Do not remove uuid of the agent if we are a standby agent */
- sql = switch_mprintf("UPDATE agents SET %s last_bridge_end = %" MSWITCH_TIME_T_FMT ", talk_time = talk_time + (%" MSWITCH_TIME_T_FMT "-last_bridge_start) WHERE name = '%q' AND system = '%q';"
+ sql = switch_mprintf("UPDATE agents SET %s last_bridge_end = %" SWITCH_TIME_T_FMT ", talk_time = talk_time + (%" SWITCH_TIME_T_FMT "-last_bridge_start) WHERE name = '%q' AND system = '%q';"
, (strcasecmp(h->agent_type, CC_AGENT_TYPE_UUID_STANDBY)?"uuid = '',":""), local_epoch_time_now(NULL), local_epoch_time_now(NULL), h->agent_name, h->agent_system);
cc_execute_sql(NULL, sql, NULL);
switch_safe_free(sql);
@@ -1997,7 +1991,7 @@ static int members_callback(void *pArg, int argc, char **argv, char **columnName
}
/* Once we pass a certain point, we want to get rid of the abandoned call */
if (abandoned_epoch + discard_abandoned_after < (long) local_epoch_time_now(NULL)) {
- sql = switch_mprintf("DELETE FROM members WHERE system = 'single_box' AND uuid = '%q' AND (abandoned_epoch = '%" MSWITCH_TIME_T_FMT "' OR joined_epoch = '%q')", cbt.member_uuid, abandoned_epoch, cbt.member_joined_epoch);
+ sql = switch_mprintf("DELETE FROM members WHERE system = 'single_box' AND uuid = '%q' AND (abandoned_epoch = '%" SWITCH_TIME_T_FMT "' OR joined_epoch = '%q')", cbt.member_uuid, abandoned_epoch, cbt.member_joined_epoch);
cc_execute_sql(NULL, sql, NULL);
switch_safe_free(sql);
}
@@ -2157,7 +2151,7 @@ void *SWITCH_THREAD_FUNC cc_agent_dispatch_thread_run(switch_thread_t *thread, v
while (globals.running == 1) {
char *sql = NULL;
- sql = switch_mprintf("SELECT queue,uuid,session_uuid,cid_number,cid_name,joined_epoch,(%" MSWITCH_TIME_T_FMT "-joined_epoch)+base_score+skill_score AS score, state, abandoned_epoch FROM members"
+ sql = switch_mprintf("SELECT queue,uuid,session_uuid,cid_number,cid_name,joined_epoch,(%" SWITCH_TIME_T_FMT "-joined_epoch)+base_score+skill_score AS score, state, abandoned_epoch FROM members"
" WHERE state = '%q' OR state = '%q' OR (serving_agent = 'ring-all' AND state = '%q') ORDER BY score DESC",
local_epoch_time_now(NULL),
cc_member_state2str(CC_MEMBER_STATE_WAITING), cc_member_state2str(CC_MEMBER_STATE_ABANDONED), cc_member_state2str(CC_MEMBER_STATE_TRYING));
@@ -2342,6 +2336,7 @@ SWITCH_STANDARD_APP(callcenter_function)
char member_uuid[SWITCH_UUID_FORMATTED_LENGTH + 1] = "";
switch_bool_t agent_found = SWITCH_FALSE;
switch_bool_t moh_valid = SWITCH_TRUE;
+ const char *p;
if (!zstr(data)) {
mydata = switch_core_session_strdup(member_session, data);
@@ -2425,7 +2420,7 @@ SWITCH_STANDARD_APP(callcenter_function)
sql = switch_mprintf("INSERT INTO members"
" (queue,system,uuid,session_uuid,system_epoch,joined_epoch,base_score,skill_score,cid_number,cid_name,serving_agent,serving_system,state)"
- " VALUES('%q','single_box','%q','%q','%q','%" MSWITCH_TIME_T_FMT "','%d','%d','%q','%q','%q','','%q')",
+ " VALUES('%q','single_box','%q','%q','%q','%" SWITCH_TIME_T_FMT "','%d','%d','%q','%q','%q','','%q')",
queue_name,
member_uuid,
member_session_uuid,
@@ -2445,7 +2440,7 @@ SWITCH_STANDARD_APP(callcenter_function)
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(member_session), SWITCH_LOG_DEBUG, "Member %s <%s> restoring it previous position in queue %s\n", switch_str_nil(switch_channel_get_variable(member_channel, "caller_id_name")), switch_str_nil(switch_channel_get_variable(member_channel, "caller_id_number")), queue_name);
/* Update abandoned member */
- sql = switch_mprintf("UPDATE members SET session_uuid = '%q', state = '%q', rejoined_epoch = '%" MSWITCH_TIME_T_FMT "' WHERE uuid = '%q' AND state = '%q'",
+ sql = switch_mprintf("UPDATE members SET session_uuid = '%q', state = '%q', rejoined_epoch = '%" SWITCH_TIME_T_FMT "' WHERE uuid = '%q' AND state = '%q'",
member_session_uuid, cc_member_state2str(CC_MEMBER_STATE_WAITING), local_epoch_time_now(NULL), member_uuid, cc_member_state2str(CC_MEMBER_STATE_ABANDONED));
cc_execute_sql(queue, sql, NULL);
switch_safe_free(sql);
@@ -2498,7 +2493,6 @@ SWITCH_STANDARD_APP(callcenter_function)
while (switch_channel_ready(member_channel)) {
switch_input_args_t args = { 0 };
struct moh_dtmf_helper ht;
- const char *p;
ht.dtmf = '\0';
args.input_callback = moh_on_dtmf;
@@ -2519,7 +2513,8 @@ SWITCH_STANDARD_APP(callcenter_function)
if (moh_valid && cur_moh) {
switch_status_t status = switch_ivr_play_file(member_session, NULL, cur_moh, &args);
- if (status == SWITCH_STATUS_FALSE /* Invalid Recording */) {
+ if (status == SWITCH_STATUS_FALSE /* Invalid Recording */ && SWITCH_READ_ACCEPTABLE(status)) {
+ /* Sadly, there doesn't seem to be a return to switch_ivr_play_file that tell you the file wasn't found. FALSE also mean that the channel got switch to BRAKE state, so we check for read acceptable */
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(member_session), SWITCH_LOG_WARNING, "Couldn't play file '%s', continuing wait with no audio\n", cur_moh);
moh_valid = SWITCH_FALSE;
@@ -2535,6 +2530,11 @@ SWITCH_STANDARD_APP(callcenter_function)
}
+ /* Make sure that an agent was not found, since we could have break out before settign it previously */
+ if (!agent_found && (p = switch_channel_get_variable(member_channel, "cc_agent_found"))) {
+ agent_found = switch_true(p);
+ }
+
/* Stop Member Thread */
if (h) {
h->running = 0;
@@ -2551,7 +2551,7 @@ SWITCH_STANDARD_APP(callcenter_function)
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(member_session), SWITCH_LOG_DEBUG, "Member %s <%s> abandoned waiting in queue %s\n", switch_str_nil(switch_channel_get_variable(member_channel, "caller_id_name")), switch_str_nil(switch_channel_get_variable(member_channel, "caller_id_number")), queue_name);
/* Update member state */
- sql = switch_mprintf("UPDATE members SET state = '%q', session_uuid = '', abandoned_epoch = '%" MSWITCH_TIME_T_FMT "' WHERE system = 'single_box' AND uuid = '%q'",
+ sql = switch_mprintf("UPDATE members SET state = '%q', session_uuid = '', abandoned_epoch = '%" SWITCH_TIME_T_FMT "' WHERE system = 'single_box' AND uuid = '%q'",
cc_member_state2str(CC_MEMBER_STATE_ABANDONED), local_epoch_time_now(NULL), member_uuid);
cc_execute_sql(NULL, sql, NULL);
switch_safe_free(sql);
@@ -2590,7 +2590,7 @@ SWITCH_STANDARD_APP(callcenter_function)
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(member_session), SWITCH_LOG_DEBUG, "Member %s <%s> is answered by an agent in queue %s\n", switch_str_nil(switch_channel_get_variable(member_channel, "caller_id_name")), switch_str_nil(switch_channel_get_variable(member_channel, "caller_id_number")), queue_name);
/* Update member state */
- sql = switch_mprintf("UPDATE members SET state = '%q', bridge_epoch = '%" MSWITCH_TIME_T_FMT "' WHERE system = 'single_box' AND uuid = '%q'",
+ sql = switch_mprintf("UPDATE members SET state = '%q', bridge_epoch = '%" SWITCH_TIME_T_FMT "' WHERE system = 'single_box' AND uuid = '%q'",
cc_member_state2str(CC_MEMBER_STATE_ANSWERED), local_epoch_time_now(NULL), member_uuid);
cc_execute_sql(NULL, sql, NULL);
switch_safe_free(sql);
diff --git a/src/mod/applications/mod_cidlookup/Makefile b/src/mod/applications/mod_cidlookup/Makefile
index 5ffe1d8476..24790d0d39 100644
--- a/src/mod/applications/mod_cidlookup/Makefile
+++ b/src/mod/applications/mod_cidlookup/Makefile
@@ -1,4 +1,3 @@
-WANT_CURL=yes
BASE=../../../..
include $(BASE)/build/modmake.rules
diff --git a/src/mod/applications/mod_curl/Makefile b/src/mod/applications/mod_curl/Makefile
index b276633355..6cae5a8595 100644
--- a/src/mod/applications/mod_curl/Makefile
+++ b/src/mod/applications/mod_curl/Makefile
@@ -1,6 +1,5 @@
json-c=json-c-0.9
BASE=../../../..
-WANT_CURL=yes
JSON_DIR=$(switch_srcdir)/libs/$(json-c)
JSON_BUILDDIR=$(switch_builddir)/libs/$(json-c)
diff --git a/src/mod/applications/mod_enum/mod_enum.c b/src/mod/applications/mod_enum/mod_enum.c
index 043dbab16f..c7766d250a 100644
--- a/src/mod/applications/mod_enum/mod_enum.c
+++ b/src/mod/applications/mod_enum/mod_enum.c
@@ -109,6 +109,8 @@ static switch_status_t load_config(void)
goto done;
}
+ globals.timeout = 5000;
+
if ((settings = switch_xml_child(cfg, "settings"))) {
for (param = switch_xml_child(settings, "param"); param; param = param->next) {
const char *var = switch_xml_attr_soft(param, "name");
@@ -120,6 +122,8 @@ static switch_status_t load_config(void)
} else if (!strcasecmp(var, "auto-reload")) {
globals.auto_reload = switch_true(val);
} else if (!strcasecmp(var, "query-timeout")) {
+ globals.timeout = atoi(val) * 1000;
+ } else if (!strcasecmp(var, "query-timeout-ms")) {
globals.timeout = atoi(val);
} else if (!strcasecmp(var, "default-isn-root")) {
set_global_isn_root(val);
@@ -404,6 +408,7 @@ switch_status_t ldns_lookup(const char *number, const char *root, const char *se
ldns_rdf *serv_rdf;
switch_status_t status = SWITCH_STATUS_FALSE;
char *name = NULL;
+ struct timeval to = { 0, 0};
if (!(name = reverse_number(number, root))) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Parse Error!\n");
@@ -431,6 +436,11 @@ switch_status_t ldns_lookup(const char *number, const char *root, const char *se
goto end;
}
+ to.tv_sec = globals.timeout / 1000;
+ to.tv_usec = (globals.timeout % 1000) * 1000;
+
+ ldns_resolver_set_timeout(res, to);
+
if ((p = ldns_resolver_query(res,
domain,
LDNS_RR_TYPE_NAPTR,
diff --git a/src/mod/applications/mod_lcr/mod_lcr.c b/src/mod/applications/mod_lcr/mod_lcr.c
index fcb75ef4d5..c0d99dfc35 100644
--- a/src/mod/applications/mod_lcr/mod_lcr.c
+++ b/src/mod/applications/mod_lcr/mod_lcr.c
@@ -1664,7 +1664,7 @@ static void write_data(switch_stream_handle_t *stream, switch_bool_t as_xml, con
SWITCH_STANDARD_API(dialplan_lcr_function)
{
- char *argv[4] = { 0 };
+ char *argv[9] = { 0 };
int argc;
char *mydata = NULL;
//char *dialstring = NULL;
@@ -1825,7 +1825,7 @@ SWITCH_STANDARD_API(dialplan_lcr_function)
if (as_xml) {
event_xml = switch_event_xmlize(current->fields, SWITCH_VA_NONE);
event_str = switch_xml_toxml(event_xml, SWITCH_FALSE);
- stream->write_function(stream, event_str);
+ stream->write_function(stream, "%s", event_str);
switch_xml_free(event_xml);
switch_safe_free(event_str);
}
diff --git a/src/mod/applications/mod_memcache/Makefile b/src/mod/applications/mod_memcache/Makefile
index 80c1d2b936..0f469ff9e2 100644
--- a/src/mod/applications/mod_memcache/Makefile
+++ b/src/mod/applications/mod_memcache/Makefile
@@ -1,8 +1,6 @@
MEMCACHED=libmemcached-0.32
BASE=../../../..
-WANT_CURL=yes
-
MEMCACHED_DIR=$(switch_srcdir)/libs/$(MEMCACHED)
MEMCACHED_BUILDDIR=$(switch_builddir)/libs/$(MEMCACHED)
diff --git a/src/mod/applications/mod_mongo/Makefile b/src/mod/applications/mod_mongo/Makefile
new file mode 100644
index 0000000000..26687b5ac6
--- /dev/null
+++ b/src/mod/applications/mod_mongo/Makefile
@@ -0,0 +1,29 @@
+BASE=../../../..
+
+MONGO_CXX_DRIVER_VERSION=v1.8
+MONGO_CXX_DRIVER_URL=http://downloads.mongodb.org/cxx-driver
+MONGO_CXX_DRIVER_TARBALL=mongodb-linux-x86_64-$(MONGO_CXX_DRIVER_VERSION)-latest.tgz
+MONGO_CXX_DRIVER_SRC=$(BASE)/libs/mongo-cxx-driver-$(MONGO_CXX_DRIVER_VERSION)
+LIBMONGOCLIENT_A =$(MONGO_CXX_DRIVER_SRC)/libmongoclient.a
+
+LOCAL_SOURCES=mongo_conn.cpp
+LOCAL_OBJS=mongo_conn.o
+
+LOCAL_CFLAGS=-I$(MONGO_CXX_DRIVER_SRC)/mongo
+LOCAL_LIBADD=$(LIBMONGOCLIENT_A)
+LOCAL_LDFLAGS=-lboost_thread -lboost_filesystem-mt -lboost_system-mt
+MODDIR=$(shell pwd)
+
+
+include $(BASE)/build/modmake.rules
+
+$(MONGO_CXX_DRIVER_SRC):
+ $(GETLIB) $(MONGO_CXX_DRIVER_URL) $(MONGO_CXX_DRIVER_TARBALL)
+ cd $(MONGO_CXX_DRIVER_SRC) && patch -p0 -i $(MODDIR)/fpic_hack.diff
+ $(TOUCH_TARGET)
+
+
+$(LIBMONGOCLIENT_A): $(MONGO_CXX_DRIVER_SRC)
+ cd $(MONGO_CXX_DRIVER_SRC) && scons
+ $(TOUCH_TARGET)
+
diff --git a/src/mod/applications/mod_mongo/fpic_hack.diff b/src/mod/applications/mod_mongo/fpic_hack.diff
new file mode 100644
index 0000000000..882f3c899a
--- /dev/null
+++ b/src/mod/applications/mod_mongo/fpic_hack.diff
@@ -0,0 +1,11 @@
+--- SConstruct.orig 2011-04-28 19:00:36.000000000 +0200
++++ SConstruct 2011-04-28 19:01:19.000000000 +0200
+@@ -45,7 +45,7 @@
+ linux = True
+
+ if nix:
+- env.Append( CPPFLAGS=" -O3" )
++ env.Append( CPPFLAGS=" -I../pcre -fPIC -O3" )
+ env.Append( LIBS=["pthread"] )
+ if linux:
+ env.Append( LINKFLAGS=" -Wl,--as-needed -Wl,-zdefs " )
diff --git a/src/mod/applications/mod_mongo/mod_mongo.cpp b/src/mod/applications/mod_mongo/mod_mongo.cpp
new file mode 100644
index 0000000000..bb82c840e0
--- /dev/null
+++ b/src/mod/applications/mod_mongo/mod_mongo.cpp
@@ -0,0 +1,151 @@
+#include
+#include "mod_mongo.h"
+
+
+static struct {
+ mongo_connection_pool_t *conn_pool;
+} globals;
+
+
+static const char *SYNTAX = "mongo_find_one ns; query; fields";
+
+SWITCH_STANDARD_API(mongo_find_one_function)
+{
+ switch_status_t status = SWITCH_STATUS_SUCCESS;
+ char *ns = NULL, *json_query = NULL, *json_fields = NULL;
+ char delim = ';';
+
+ ns = strdup(cmd);
+ switch_assert(ns != NULL);
+
+ if ((json_query = strchr(ns, delim))) {
+ *json_query++ = '\0';
+ if ((json_fields = strchr(json_query, delim))) {
+ *json_fields++ = '\0';
+ }
+ }
+
+ if (!zstr(ns) && !zstr(json_query) && !zstr(json_fields)) {
+
+ DBClientConnection *conn = NULL;
+
+ try {
+ BSONObj query = fromjson(json_query);
+ BSONObj fields = fromjson(json_fields);
+
+ conn = mongo_connection_pool_get(globals.conn_pool);
+ if (conn) {
+ BSONObj res = conn->findOne(ns, Query(query), &fields);
+ mongo_connection_pool_put(globals.conn_pool, conn);
+
+ stream->write_function(stream, "-OK\n%s\n", res.toString().c_str());
+ } else {
+ stream->write_function(stream, "-ERR\nNo connection\n");
+ }
+ } catch (DBException &e) {
+ if (conn) {
+ mongo_connection_destroy(&conn);
+ }
+ stream->write_function(stream, "-ERR\n%s\n", e.toString().c_str());
+ }
+
+
+ } else {
+ stream->write_function(stream, "-ERR\n%s\n", SYNTAX);
+ }
+
+ switch_safe_free(ns);
+
+ return status;
+}
+
+static switch_status_t config(void)
+{
+ const char *cf = "mongo.conf";
+ switch_xml_t cfg, xml, settings, param;
+ switch_status_t status = SWITCH_STATUS_SUCCESS;
+ const char *host = "127.0.0.1";
+ switch_size_t min_connections = 1, max_connections = 1;
+
+ if (!(xml = switch_xml_open_cfg(cf, &cfg, NULL))) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Open of %s failed\n", cf);
+ return SWITCH_STATUS_GENERR;
+ }
+
+ if ((settings = switch_xml_child(cfg, "settings"))) {
+ for (param = switch_xml_child(settings, "param"); param; param = param->next) {
+ char *var = (char *) switch_xml_attr_soft(param, "name");
+ char *val = (char *) switch_xml_attr_soft(param, "value");
+ int tmp;
+
+ if (!strcmp(var, "host")) {
+ host = val;
+ } else if (!strcmp(var, "min-connections")) {
+ if ((tmp = atoi(val)) > 0) {
+ min_connections = tmp;
+ }
+ } else if (!strcmp(var, "max-connections")) {
+ if ((tmp = atoi(val)) > 0) {
+ max_connections = tmp;
+ }
+ }
+ }
+ }
+
+ if (mongo_connection_pool_create(&globals.conn_pool, min_connections, max_connections, host) != SWITCH_STATUS_SUCCESS) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Can't create connection pool\n");
+ status = SWITCH_STATUS_GENERR;
+ } else {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Mongo connection pool created [%s %d/%d]\n", host, (int)min_connections, (int)max_connections);
+ }
+
+ switch_xml_free(xml);
+
+ return status;
+}
+
+
+SWITCH_BEGIN_EXTERN_C
+
+SWITCH_MODULE_LOAD_FUNCTION(mod_mongo_load);
+SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_mongo_shutdown);
+SWITCH_MODULE_DEFINITION(mod_mongo, mod_mongo_load, mod_mongo_shutdown, NULL);
+
+
+SWITCH_MODULE_LOAD_FUNCTION(mod_mongo_load)
+{
+ switch_api_interface_t *api_interface;
+ switch_application_interface_t *app_interface;
+
+ *module_interface = switch_loadable_module_create_module_interface(pool, modname);
+
+ memset(&globals, 0, sizeof(globals));
+
+ if (config() != SWITCH_STATUS_SUCCESS) {
+ return SWITCH_STATUS_TERM;
+ }
+
+ SWITCH_ADD_API(api_interface, "mongo_find_one", "mongo", mongo_find_one_function, SYNTAX);
+
+ return SWITCH_STATUS_SUCCESS;
+}
+
+SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_mongo_shutdown)
+{
+ mongo_connection_pool_destroy(&globals.conn_pool);
+ return SWITCH_STATUS_SUCCESS;
+}
+
+SWITCH_END_EXTERN_C
+
+/* For Emacs:
+ * Local Variables:
+ * mode:c
+ * indent-tabs-mode:t
+ * tab-width:4
+ * c-basic-offset:4
+ * End:
+ * For VIM:
+ * vim:set softtabstop=4 shiftwidth=4 tabstop=4
+ */
+
diff --git a/src/mod/applications/mod_mongo/mod_mongo.h b/src/mod/applications/mod_mongo/mod_mongo.h
new file mode 100644
index 0000000000..91c14bb29b
--- /dev/null
+++ b/src/mod/applications/mod_mongo/mod_mongo.h
@@ -0,0 +1,38 @@
+#ifndef MOD_MONGO_H
+#define MOD_MONGO_H
+
+
+#include
+#include
+#include
+#include
+
+using namespace mongo;
+
+typedef struct {
+ char *host;
+
+ switch_size_t min_connections;
+ switch_size_t max_connections;
+ switch_size_t size;
+ switch_queue_t *connections;
+ switch_mutex_t *mutex;
+ switch_memory_pool_t *pool;
+
+} mongo_connection_pool_t;
+
+
+switch_status_t mongo_connection_create(DBClientConnection **connection, const char *host);
+void mongo_connection_destroy(DBClientConnection **conn);
+
+switch_status_t mongo_connection_pool_create(mongo_connection_pool_t **conn_pool, switch_size_t min_connections, switch_size_t max_connections,
+ const char *host);
+void mongo_connection_pool_destroy(mongo_connection_pool_t **conn_pool);
+
+
+DBClientConnection *mongo_connection_pool_get(mongo_connection_pool_t *conn_pool);
+switch_status_t mongo_connection_pool_put(mongo_connection_pool_t *conn_pool, DBClientConnection *conn);
+
+
+#endif
+
diff --git a/src/mod/applications/mod_mongo/mongo_conn.cpp b/src/mod/applications/mod_mongo/mongo_conn.cpp
new file mode 100644
index 0000000000..ee702b8470
--- /dev/null
+++ b/src/mod/applications/mod_mongo/mongo_conn.cpp
@@ -0,0 +1,161 @@
+#include
+#include "mod_mongo.h"
+
+ /*
+ we could use the driver's connection pool,
+ if we could set the max connections (PoolForHost::setMaxPerHost)
+
+ ScopedDbConnection scoped_conn("host");
+ DBClientConnection *conn = dynamic_cast< DBClientConnection* >(&scoped_conn.conn());
+ scoped_conn.done();
+ */
+
+switch_status_t mongo_connection_create(DBClientConnection **connection, const char *host)
+{
+ DBClientConnection *conn = new DBClientConnection();
+
+ try {
+ conn->connect(host);
+ } catch (DBException &e) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Can't connect to mongo [%s]\n", host);
+ return SWITCH_STATUS_GENERR;
+ }
+
+ *connection = conn;
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Connected to mongo [%s]\n", host);
+
+ return SWITCH_STATUS_SUCCESS;
+}
+
+void mongo_connection_destroy(DBClientConnection **conn)
+{
+ switch_assert(*conn != NULL);
+ delete *conn;
+
+ *conn = NULL;
+}
+
+switch_status_t mongo_connection_pool_create(mongo_connection_pool_t **conn_pool, switch_size_t min_connections, switch_size_t max_connections,
+ const char *host)
+{
+ switch_memory_pool_t *pool = NULL;
+ switch_status_t status = SWITCH_STATUS_SUCCESS;
+ mongo_connection_pool_t *cpool = NULL;
+ DBClientConnection *conn = NULL;
+
+ if ((status = switch_core_new_memory_pool(&pool)) != SWITCH_STATUS_SUCCESS) {
+ return status;
+ }
+
+ if (!(cpool = (mongo_connection_pool_t *)switch_core_alloc(pool, sizeof(mongo_connection_pool_t)))) {
+ switch_goto_status(SWITCH_STATUS_MEMERR, done);
+ }
+
+ if ((status = switch_mutex_init(&cpool->mutex, SWITCH_MUTEX_NESTED, pool)) != SWITCH_STATUS_SUCCESS) {
+ goto done;
+ }
+
+ if ((status = switch_queue_create(&cpool->connections, max_connections, pool)) != SWITCH_STATUS_SUCCESS) {
+ goto done;
+ }
+
+ cpool->min_connections = min_connections;
+ cpool->max_connections = max_connections;
+ cpool->host = switch_core_strdup(pool, host);
+
+ cpool->pool = pool;
+
+ for (cpool->size = 0; cpool->size < min_connections; cpool->size++) {
+
+ if (mongo_connection_create(&conn, host) == SWITCH_STATUS_SUCCESS) {
+ mongo_connection_pool_put(cpool, conn);
+ } else {
+ break;
+ }
+ }
+
+ done:
+
+ if (status == SWITCH_STATUS_SUCCESS) {
+ *conn_pool = cpool;
+ } else {
+ switch_core_destroy_memory_pool(&pool);
+ }
+
+
+ return status;
+}
+
+void mongo_connection_pool_destroy(mongo_connection_pool_t **conn_pool)
+{
+ mongo_connection_pool_t *cpool = *conn_pool;
+ void *data = NULL;
+
+ switch_assert(cpool != NULL);
+
+ while (switch_queue_trypop(cpool->connections, &data) == SWITCH_STATUS_SUCCESS) {
+ mongo_connection_destroy((DBClientConnection **)&data);
+ }
+
+ switch_mutex_destroy(cpool->mutex);
+ switch_core_destroy_memory_pool(&cpool->pool);
+
+ *conn_pool = NULL;
+}
+
+
+DBClientConnection *mongo_connection_pool_get(mongo_connection_pool_t *conn_pool)
+{
+ DBClientConnection *conn = NULL;
+ void *data = NULL;
+
+ switch_assert(conn_pool != NULL);
+
+ switch_mutex_lock(conn_pool->mutex);
+
+ if (switch_queue_trypop(conn_pool->connections, &data) == SWITCH_STATUS_SUCCESS) {
+ conn = (DBClientConnection *) data;
+ } else if (mongo_connection_create(&conn, conn_pool->host) == SWITCH_STATUS_SUCCESS) {
+ if (++conn_pool->size > conn_pool->max_connections) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Connection pool is empty. You may want to increase 'max-connections'\n");
+ }
+ }
+
+ switch_mutex_unlock(conn_pool->mutex);
+
+#ifdef MONGO_POOL_DEBUG
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "POOL get: size %d conn: %p\n", (int) switch_queue_size(conn_pool->connections), conn);
+#endif
+
+ return conn;
+}
+
+switch_status_t mongo_connection_pool_put(mongo_connection_pool_t *conn_pool, DBClientConnection *conn)
+{
+ switch_status_t status = SWITCH_STATUS_SUCCESS;
+
+ switch_assert(conn_pool != NULL);
+ switch_assert(conn != NULL);
+
+ switch_mutex_lock(conn_pool->mutex);
+ if (conn_pool->size > conn_pool->max_connections) {
+#ifdef MONGO_POOL_DEBUG
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "POOL: Destroy connection %p\n", conn);
+#endif
+ mongo_connection_destroy(&conn);
+ conn_pool->size--;
+ } else {
+#ifdef MONGO_POOL_DEBUG
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "POOL: push connection %p\n", conn);
+#endif
+ status = switch_queue_push(conn_pool->connections, conn);
+ }
+
+ switch_mutex_unlock(conn_pool->mutex);
+
+#ifdef MONGO_POOL_DEBUG
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "POOL: put size %d conn: %p\n", (int) switch_queue_size(conn_pool->connections), conn);
+#endif
+
+ return status;
+}
diff --git a/src/mod/applications/mod_nibblebill/mod_nibblebill.c b/src/mod/applications/mod_nibblebill/mod_nibblebill.c
index 068a31f5f3..2cd772ece0 100755
--- a/src/mod/applications/mod_nibblebill/mod_nibblebill.c
+++ b/src/mod/applications/mod_nibblebill/mod_nibblebill.c
@@ -902,7 +902,7 @@ switch_state_handler_table_t nibble_state_handler = {
/* on_hibernate */ NULL,
/* on_reset */ NULL,
/* on_park */ NULL,
- /* on_reporting */ process_hangup, /* force billing event on b-leg if we can */
+ /* on_reporting */ NULL,
/* on_destroy */ NULL
};
diff --git a/src/mod/applications/mod_spandsp/mod_spandsp_fax.c b/src/mod/applications/mod_spandsp/mod_spandsp_fax.c
index 94d6bc752b..119294f4bd 100644
--- a/src/mod/applications/mod_spandsp/mod_spandsp_fax.c
+++ b/src/mod/applications/mod_spandsp/mod_spandsp_fax.c
@@ -220,7 +220,7 @@ static void *SWITCH_THREAD_FUNC timer_thread_run(switch_thread_t *thread, void *
}
for (pvt = t38_state_list.head; pvt; pvt = pvt->next) {
- if (pvt->udptl_state) {
+ if (pvt->udptl_state && pvt->session && switch_channel_ready(switch_core_session_get_channel(pvt->session))) {
t38_terminal_send_timeout(pvt->t38_state, samples);
}
}
@@ -414,18 +414,19 @@ static void phase_e_handler(t30_state_t *s, void *user_data, int result)
/* Fire event */
if (switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, pvt->app_mode == FUNCTION_TX ? SPANDSP_EVENT_TXFAXRESULT : SPANDSP_EVENT_RXFAXRESULT) == SWITCH_STATUS_SUCCESS) {
+ switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "fax-success", (result == T30_ERR_OK) ? "1" : "0");
+ switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "fax-result-code", fax_result_code);
+ switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "fax-result-text", t30_completion_code_to_str(result));
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "fax-document-transferred-pages", fax_document_transferred_pages);
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "fax-document-total-pages", fax_document_total_pages);
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "fax-image-resolution", fax_image_resolution);
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "fax-image-size", fax_image_size);
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "fax-bad-rows", fax_bad_rows);
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "fax-transfer-rate", fax_transfer_rate);
- switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "fax-result-code", fax_result_code);
- switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "fax-result-text", t30_completion_code_to_str(result));
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "fax-ecm-used", (t.error_correcting_mode) ? "on" : "off");
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "fax-local-station-id", local_ident);
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "fax-remote-station-id", far_ident);
- switch_core_session_queue_private_event(session, &event, SWITCH_FALSE);
+ switch_event_fire(&event);
}
}
@@ -450,6 +451,7 @@ static int t38_tx_packet_handler(t38_core_state_t *s, void *user_data, const uin
for (x = 0; x < count; x++) {
if (switch_core_session_write_frame(session, &out_frame, SWITCH_IO_FLAG_NONE, 0) != SWITCH_STATUS_SUCCESS) {
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "INVALID WRITE: %d:%d\n", out_frame.packetlen, count);
r = -1;
break;
}
@@ -460,14 +462,16 @@ static int t38_tx_packet_handler(t38_core_state_t *s, void *user_data, const uin
if (r < 0) {
t30_state_t *t30;
+
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "TERMINATING T30 STATE\n");
+
if (pvt->t38_state && (t30 = t38_terminal_get_t30_state(pvt->t38_state))) {
t30_terminate(t30);
}
+ switch_yield(10000);
}
-
- return r;
+ return r < 0 ? r : 0;
}
static switch_status_t spanfax_init(pvt_t *pvt, transport_mode_t trans_mode)
diff --git a/src/mod/codecs/mod_sangoma_codec/mod_sangoma_codec.c b/src/mod/codecs/mod_sangoma_codec/mod_sangoma_codec.c
index dd97453c7a..b6cfbb0c54 100644
--- a/src/mod/codecs/mod_sangoma_codec/mod_sangoma_codec.c
+++ b/src/mod/codecs/mod_sangoma_codec/mod_sangoma_codec.c
@@ -89,7 +89,7 @@ vocallo_codec_t g_codec_map[] =
{ SNGTC_CODEC_PCMA, IANA_PCMA_A_8000_1, "PCMA", "Sangoma PCMA", 40, 64000, 10000, 80, 160, 80, 8000, 8000, 1 },
{ SNGTC_CODEC_L16_1, IANA_L16_A_8000_1, "L16", "Sangoma L16", 40, 120000, 10000, 80, 160, 160, 8000, 8000, 0 },
{ SNGTC_CODEC_L16_2, IANA_L16_A_16000_1, "L16", "Sangoma L16 2", 40, 320000, 10000, 160, 320, 320, 16000, 16000, 0 },
- { SNGTC_CODEC_G729AB, IANA_G729_AB_8000_1, "G729", "Sangoma G729", 40, 8000, 10000, 80, 160, 10, 8000, 8000, 1 },
+ { SNGTC_CODEC_G729AB, IANA_G729_AB_8000_1, "G729", "Sangoma G729", 200, 8000, 10000, 80, 160, 10, 8000, 8000, 1 },
{ SNGTC_CODEC_G726_32, IANA_G726_32_8000_1, "G726-32", "Sangoma G.726 32k", 40, 32000, 10000, 80, 160, 40, 8000, 8000, 1 },
{ SNGTC_CODEC_G722, IANA_G722_A_8000_1, "G722", "Sangoma G722", 20, 64000, 10000, 80, 160, 80, 8000, 8000, 1 },
diff --git a/src/mod/endpoints/mod_gsmopen/Makefile.am b/src/mod/endpoints/mod_gsmopen/Makefile.am
index bde175df8f..8879a4616d 100644
--- a/src/mod/endpoints/mod_gsmopen/Makefile.am
+++ b/src/mod/endpoints/mod_gsmopen/Makefile.am
@@ -1,7 +1,24 @@
include $(top_srcdir)/build/modmake.rulesam
MODNAME=mod_gsmopen
+
+TIFF_DIR=$(switch_srcdir)/libs/tiff-3.8.2
+TIFF_BUILDDIR=$(switch_builddir)/libs/tiff-3.8.2
+TIFF_LA=$(TIFF_BUILDDIR)/libtiff/libtiff.la
+
+SPANDSP_DIR=$(switch_srcdir)/libs/spandsp
+SPANDSP_BUILDDIR=$(switch_builddir)/libs/spandsp
+SPANDSP_LA=$(SPANDSP_BUILDDIR)/src/libspandsp.la
+
mod_LTLIBRARIES = mod_gsmopen.la
mod_gsmopen_la_SOURCES = mod_gsmopen.cpp gsmopen_protocol.cpp
-mod_gsmopen_la_CFLAGS = $(AM_CFLAGS) -DGSMOPEN_SVN_VERSION=\"`cat $(switch_builddir)/.version`\"
-mod_gsmopen_la_LIBADD = $(switch_builddir)/libfreeswitch.la
-mod_gsmopen_la_LDFLAGS = -avoid-version -module -no-undefined -lasound -lgsmme -lspandsp
+mod_gsmopen_la_CFLAGS = $(AM_CFLAGS) -I$(SPANDSP_DIR)/src -I$(TIFF_DIR)/libtiff -I$(SPANDSP_BUILDDIR)/src -I$(TIFF_BUILDDIR)/libtiff -I. -DGSMOPEN_SVN_VERSION=\"`cat $(switch_builddir)/.version`\"
+mod_gsmopen_la_LIBADD = $(switch_builddir)/libfreeswitch.la $(SPANDSP_LA) $(TIFF_LA)
+mod_gsmopen_la_LDFLAGS = -avoid-version -module -no-undefined -lasound -lgsmme
+
+$(SPANDSP_LA): $(TIFF_LA) $(SPANDSP_DIR) $(SPANDSP_DIR)/.update
+ cd $(SPANDSP_BUILDDIR) && $(MAKE) -j1
+ $(TOUCH_TARGET)
+
+$(TIFF_LA): $(TIFF_DIR) $(TIFF_DIR)/.update
+ cd $(TIFF_BUILDDIR) && $(MAKE) -j1
+ $(TOUCH_TARGET)
diff --git a/src/mod/endpoints/mod_loopback/mod_loopback.c b/src/mod/endpoints/mod_loopback/mod_loopback.c
index be9b4994d6..8fb8384e6b 100644
--- a/src/mod/endpoints/mod_loopback/mod_loopback.c
+++ b/src/mod/endpoints/mod_loopback/mod_loopback.c
@@ -48,7 +48,7 @@ typedef enum {
TFLAG_LINKED = (1 << 0),
TFLAG_OUTBOUND = (1 << 1),
TFLAG_WRITE = (1 << 2),
- TFLAG_CNG = (1 << 3),
+ TFLAG_USEME = (1 << 3),
TFLAG_BRIDGE = (1 << 4),
TFLAG_BOWOUT = (1 << 5),
TFLAG_BLEG = (1 << 6),
@@ -158,7 +158,7 @@ static switch_status_t tech_init(private_t *tech_pvt, switch_core_session_t *ses
tech_pvt->cng_frame.data = tech_pvt->cng_databuf;
tech_pvt->cng_frame.buflen = sizeof(tech_pvt->cng_databuf);
- //switch_set_flag((&tech_pvt->cng_frame), SFF_CNG);
+
tech_pvt->cng_frame.datalen = 2;
tech_pvt->bowout_frame_count = (tech_pvt->read_codec.implementation->actual_samples_per_second /
@@ -297,12 +297,10 @@ static switch_status_t channel_on_init(switch_core_session_t *session)
static void do_reset(private_t *tech_pvt)
{
switch_clear_flag_locked(tech_pvt, TFLAG_WRITE);
- switch_set_flag_locked(tech_pvt, TFLAG_CNG);
switch_mutex_lock(tech_pvt->mutex);
if (tech_pvt->other_tech_pvt) {
switch_clear_flag_locked(tech_pvt->other_tech_pvt, TFLAG_WRITE);
- switch_set_flag_locked(tech_pvt->other_tech_pvt, TFLAG_CNG);
}
switch_mutex_unlock(tech_pvt->mutex);
}
@@ -446,12 +444,6 @@ static switch_status_t channel_kill_channel(switch_core_session_t *session, int
switch (sig) {
case SWITCH_SIG_BREAK:
- switch_set_flag_locked(tech_pvt, TFLAG_CNG);
- switch_mutex_lock(tech_pvt->mutex);
- if (tech_pvt->other_tech_pvt) {
- switch_set_flag_locked(tech_pvt->other_tech_pvt, TFLAG_CNG);
- }
- switch_mutex_unlock(tech_pvt->mutex);
break;
case SWITCH_SIG_KILL:
switch_channel_hangup(channel, SWITCH_CAUSE_NORMAL_CLEARING);
@@ -583,18 +575,12 @@ static switch_status_t channel_read_frame(switch_core_session_t *session, switch
tech_pvt->write_frame->codec = &tech_pvt->read_codec;
*frame = tech_pvt->write_frame;
tech_pvt->packet_count++;
- switch_clear_flag_locked(tech_pvt, TFLAG_CNG);
switch_clear_flag(tech_pvt->write_frame, SFF_CNG);
} else {
- switch_set_flag(tech_pvt, TFLAG_CNG);
- }
-
- if (switch_test_flag(tech_pvt, TFLAG_CNG)) {
*frame = &tech_pvt->cng_frame;
tech_pvt->cng_frame.codec = &tech_pvt->read_codec;
tech_pvt->cng_frame.datalen = tech_pvt->read_codec.implementation->decoded_bytes_per_packet;
switch_set_flag((&tech_pvt->cng_frame), SFF_CNG);
- switch_clear_flag_locked(tech_pvt, TFLAG_CNG);
}
@@ -613,6 +599,17 @@ static switch_status_t channel_read_frame(switch_core_session_t *session, switch
return status;
}
+static void clear_queue(private_t *tech_pvt)
+{
+ void *pop;
+
+ while (switch_queue_trypop(tech_pvt->frame_queue, &pop) == SWITCH_STATUS_SUCCESS && pop) {
+ switch_frame_t *frame = (switch_frame_t *) pop;
+ switch_frame_free(&frame);
+ }
+}
+
+
static switch_status_t channel_write_frame(switch_core_session_t *session, switch_frame_t *frame, switch_io_flag_t flags, int stream_id)
{
switch_channel_t *channel = NULL;
@@ -626,7 +623,7 @@ static switch_status_t channel_write_frame(switch_core_session_t *session, switc
switch_assert(tech_pvt != NULL);
if (switch_test_flag(frame, SFF_CNG) ||
- switch_test_flag(tech_pvt, TFLAG_CNG) || (switch_test_flag(tech_pvt, TFLAG_BOWOUT) && switch_test_flag(tech_pvt, TFLAG_BOWOUT_USED))) {
+ (switch_test_flag(tech_pvt, TFLAG_BOWOUT) && switch_test_flag(tech_pvt, TFLAG_BOWOUT_USED))) {
switch_core_timer_sync(&tech_pvt->timer);
switch_core_timer_sync(&tech_pvt->other_tech_pvt->timer);
return SWITCH_STATUS_SUCCESS;
@@ -672,23 +669,27 @@ static switch_status_t channel_write_frame(switch_core_session_t *session, switc
if (switch_test_flag(tech_pvt, TFLAG_LINKED) && tech_pvt->other_tech_pvt) {
switch_frame_t *clone;
-
+
if (frame->codec->implementation != tech_pvt->write_codec.implementation) {
/* change codecs to match */
tech_init(tech_pvt, session, frame->codec);
tech_init(tech_pvt->other_tech_pvt, tech_pvt->other_session, frame->codec);
}
- if (switch_queue_size(tech_pvt->other_tech_pvt->frame_queue) < FRAME_QUEUE_LEN) {
- if (switch_frame_dup(frame, &clone) != SWITCH_STATUS_SUCCESS) {
- abort();
- }
- if (switch_queue_trypush(tech_pvt->other_tech_pvt->frame_queue, clone) != SWITCH_STATUS_SUCCESS) {
- switch_frame_free(&clone);
- }
+ if (switch_frame_dup(frame, &clone) != SWITCH_STATUS_SUCCESS) {
+ abort();
+ }
+
+ if ((status = switch_queue_trypush(tech_pvt->other_tech_pvt->frame_queue, clone)) != SWITCH_STATUS_SUCCESS) {
+ clear_queue(tech_pvt->other_tech_pvt);
+ status = switch_queue_trypush(tech_pvt->other_tech_pvt->frame_queue, clone);
+ }
+ if (status == SWITCH_STATUS_SUCCESS) {
switch_set_flag_locked(tech_pvt->other_tech_pvt, TFLAG_WRITE);
+ } else {
+ switch_frame_free(&clone);
}
status = SWITCH_STATUS_SUCCESS;
@@ -747,22 +748,13 @@ static switch_status_t channel_receive_message(switch_core_session_t *session, s
case SWITCH_MESSAGE_INDICATE_UNBRIDGE:
case SWITCH_MESSAGE_INDICATE_AUDIO_SYNC:
{
- void *pop;
done = 1;
- while (switch_queue_trypop(tech_pvt->frame_queue, &pop) == SWITCH_STATUS_SUCCESS && pop) {
- switch_frame_t *frame = (switch_frame_t *) pop;
- switch_frame_free(&frame);
- }
-
- while (switch_queue_trypop(tech_pvt->other_tech_pvt->frame_queue, &pop) == SWITCH_STATUS_SUCCESS && pop) {
- switch_frame_t *frame = (switch_frame_t *) pop;
- switch_frame_free(&frame);
- }
-
+ clear_queue(tech_pvt);
+ clear_queue(tech_pvt->other_tech_pvt);
switch_core_timer_sync(&tech_pvt->timer);
-
+ switch_core_timer_sync(&tech_pvt->other_tech_pvt->timer);
}
break;
default:
diff --git a/src/mod/endpoints/mod_skypopen/Makefile.am b/src/mod/endpoints/mod_skypopen/Makefile.am
index b572b58e20..ab1909817b 100644
--- a/src/mod/endpoints/mod_skypopen/Makefile.am
+++ b/src/mod/endpoints/mod_skypopen/Makefile.am
@@ -1,7 +1,24 @@
include $(top_srcdir)/build/modmake.rulesam
MODNAME=mod_skypopen
+
+TIFF_DIR=$(switch_srcdir)/libs/tiff-3.8.2
+TIFF_BUILDDIR=$(switch_builddir)/libs/tiff-3.8.2
+TIFF_LA=$(TIFF_BUILDDIR)/libtiff/libtiff.la
+
+SPANDSP_DIR=$(switch_srcdir)/libs/spandsp
+SPANDSP_BUILDDIR=$(switch_builddir)/libs/spandsp
+SPANDSP_LA=$(SPANDSP_BUILDDIR)/src/libspandsp.la
+
mod_LTLIBRARIES = mod_skypopen.la
mod_skypopen_la_SOURCES = mod_skypopen.c skypopen_protocol.c
-mod_skypopen_la_CFLAGS = $(AM_CFLAGS) -DSKYPOPEN_C_VER=\"`git log -1 --format="%h" skypopen_protocol.c`\" -DMODSKYPOPEN_C_VER=\"`git log -1 --format="%h" mod_skypopen.c`\" -I../../../../libs/spandsp/src -I../../../..//libs/tiff-3.8.2/libtiff
-mod_skypopen_la_LIBADD = $(switch_builddir)/libfreeswitch.la
-mod_skypopen_la_LDFLAGS = -L../../../../libs/spandsp/src -avoid-version -module -no-undefined -shared -lX11 -lspandsp
+mod_skypopen_la_CFLAGS = $(AM_CFLAGS) -I$(SPANDSP_DIR)/src -I$(TIFF_DIR)/libtiff -I$(SPANDSP_BUILDDIR)/src -I$(TIFF_BUILDDIR)/libtiff -I. -DSKYPOPEN_C_VER=\"`git log -1 --format="%h" skypopen_protocol.c`\" -DMODSKYPOPEN_C_VER=\"`git log -1 --format="%h" mod_skypopen.c`\"
+mod_skypopen_la_LIBADD = $(switch_builddir)/libfreeswitch.la $(SPANDSP_LA) $(TIFF_LA)
+mod_skypopen_la_LDFLAGS = -avoid-version -module -no-undefined -shared -lX11
+
+$(SPANDSP_LA): $(TIFF_LA) $(SPANDSP_DIR) $(SPANDSP_DIR)/.update
+ cd $(SPANDSP_BUILDDIR) && $(MAKE) -j1
+ $(TOUCH_TARGET)
+
+$(TIFF_LA): $(TIFF_DIR) $(TIFF_DIR)/.update
+ cd $(TIFF_BUILDDIR) && $(MAKE) -j1
+ $(TOUCH_TARGET)
diff --git a/src/mod/endpoints/mod_skypopen/mod_skypopen.c b/src/mod/endpoints/mod_skypopen/mod_skypopen.c
index eac0a67943..7b8bc16507 100644
--- a/src/mod/endpoints/mod_skypopen/mod_skypopen.c
+++ b/src/mod/endpoints/mod_skypopen/mod_skypopen.c
@@ -462,6 +462,7 @@ static switch_status_t channel_on_init(switch_core_session_t *session)
left in the initial state, nothing will happen. */
switch_channel_set_state(channel, CS_ROUTING);
DEBUGA_SKYPE("%s CHANNEL INIT %s\n", SKYPOPEN_P_LOG, tech_pvt->name, switch_core_session_get_uuid(session));
+ switch_copy_string(tech_pvt->session_uuid_str, switch_core_session_get_uuid(session), sizeof(tech_pvt->session_uuid_str));
return SWITCH_STATUS_SUCCESS;
}
@@ -1733,6 +1734,7 @@ static switch_status_t load_config(int reload_type)
switch_threadattr_create(&skypopen_api_thread_attr, skypopen_module_pool);
switch_threadattr_detach_set(skypopen_api_thread_attr, 0);
switch_threadattr_stacksize_set(skypopen_api_thread_attr, SWITCH_THREAD_STACKSIZE);
+ //switch_threadattr_priority_increase(skypopen_api_thread_attr);
switch_thread_create(&globals.SKYPOPEN_INTERFACES[interface_id].skypopen_api_thread,
skypopen_api_thread_attr, skypopen_do_skypeapi_thread, &globals.SKYPOPEN_INTERFACES[interface_id],
skypopen_module_pool);
@@ -1742,6 +1744,7 @@ static switch_status_t load_config(int reload_type)
switch_threadattr_create(&skypopen_signaling_thread_attr, skypopen_module_pool);
switch_threadattr_detach_set(skypopen_signaling_thread_attr, 0);
switch_threadattr_stacksize_set(skypopen_signaling_thread_attr, SWITCH_THREAD_STACKSIZE);
+ //switch_threadattr_priority_increase(skypopen_signaling_thread_attr);
switch_thread_create(&globals.SKYPOPEN_INTERFACES[interface_id].
skypopen_signaling_thread, skypopen_signaling_thread_attr,
skypopen_signaling_thread_func, &globals.SKYPOPEN_INTERFACES[interface_id], skypopen_module_pool);
@@ -2168,7 +2171,8 @@ int dtmf_received(private_t *tech_pvt, char *value)
int start_audio_threads(private_t *tech_pvt)
{
- switch_threadattr_t *thd_attr = NULL;
+ switch_threadattr_t *tcp_srv_thread_thd_attr = NULL;
+ switch_threadattr_t *tcp_cli_thread_thd_attr = NULL;
tech_pvt->begin_to_write = 0;
tech_pvt->begin_to_read = 0;
@@ -2194,12 +2198,13 @@ int start_audio_threads(private_t *tech_pvt)
switch_core_timer_sync(&tech_pvt->timer_write);
- switch_threadattr_create(&thd_attr, skypopen_module_pool);
- switch_threadattr_detach_set(thd_attr, 0);
- switch_threadattr_stacksize_set(thd_attr, SWITCH_THREAD_STACKSIZE);
+ switch_threadattr_create(&tcp_srv_thread_thd_attr, skypopen_module_pool);
+ switch_threadattr_detach_set(tcp_srv_thread_thd_attr, 0);
+ switch_threadattr_stacksize_set(tcp_srv_thread_thd_attr, SWITCH_THREAD_STACKSIZE);
+ switch_threadattr_priority_increase(tcp_srv_thread_thd_attr);
switch_mutex_lock(tech_pvt->mutex_thread_audio_srv);
//DEBUGA_SKYPE("debugging_hangup srv lock\n", SKYPOPEN_P_LOG);
- if (switch_thread_create(&tech_pvt->tcp_srv_thread, thd_attr, skypopen_do_tcp_srv_thread, tech_pvt, skypopen_module_pool) == SWITCH_STATUS_SUCCESS) {
+ if (switch_thread_create(&tech_pvt->tcp_srv_thread, tcp_srv_thread_thd_attr, skypopen_do_tcp_srv_thread, tech_pvt, skypopen_module_pool) == SWITCH_STATUS_SUCCESS) {
DEBUGA_SKYPE("started tcp_srv_thread thread.\n", SKYPOPEN_P_LOG);
} else {
ERRORA("failed to start tcp_srv_thread thread.\n", SKYPOPEN_P_LOG);
@@ -2210,12 +2215,13 @@ int start_audio_threads(private_t *tech_pvt)
switch_mutex_unlock(tech_pvt->mutex_thread_audio_srv);
//DEBUGA_SKYPE("debugging_hangup srv unlock\n", SKYPOPEN_P_LOG);
- switch_threadattr_create(&thd_attr, skypopen_module_pool);
- switch_threadattr_detach_set(thd_attr, 0);
- switch_threadattr_stacksize_set(thd_attr, SWITCH_THREAD_STACKSIZE);
+ switch_threadattr_create(&tcp_cli_thread_thd_attr, skypopen_module_pool);
+ switch_threadattr_detach_set(tcp_cli_thread_thd_attr, 0);
+ switch_threadattr_stacksize_set(tcp_cli_thread_thd_attr, SWITCH_THREAD_STACKSIZE);
+ switch_threadattr_priority_increase(tcp_cli_thread_thd_attr);
switch_mutex_lock(tech_pvt->mutex_thread_audio_cli);
//DEBUGA_SKYPE("debugging_hangup cli lock\n", SKYPOPEN_P_LOG);
- if (switch_thread_create(&tech_pvt->tcp_cli_thread, thd_attr, skypopen_do_tcp_cli_thread, tech_pvt, skypopen_module_pool) == SWITCH_STATUS_SUCCESS) {
+ if (switch_thread_create(&tech_pvt->tcp_cli_thread, tcp_cli_thread_thd_attr, skypopen_do_tcp_cli_thread, tech_pvt, skypopen_module_pool) == SWITCH_STATUS_SUCCESS) {
DEBUGA_SKYPE("started tcp_cli_thread thread.\n", SKYPOPEN_P_LOG);
} else {
ERRORA("failed to start tcp_cli_thread thread.\n", SKYPOPEN_P_LOG);
diff --git a/src/mod/endpoints/mod_sofia/mod_sofia.c b/src/mod/endpoints/mod_sofia/mod_sofia.c
index c1431c28e9..c9ea6790b7 100644
--- a/src/mod/endpoints/mod_sofia/mod_sofia.c
+++ b/src/mod/endpoints/mod_sofia/mod_sofia.c
@@ -1241,6 +1241,7 @@ static void start_udptl(private_object_t *tech_pvt, switch_t38_options_t *t38_op
switch_port_t remote_port = switch_rtp_get_remote_port(tech_pvt->rtp_session);
const char *err, *val;
+ sofia_clear_flag(tech_pvt, TFLAG_NOTIMER_DURING_BRIDGE);
switch_rtp_udptl_mode(tech_pvt->rtp_session);
if (!t38_options || !t38_options->remote_ip) {
@@ -1527,8 +1528,11 @@ static switch_status_t sofia_receive_message(switch_core_session_t *session, swi
}
if (sofia_test_flag(tech_pvt, TFLAG_NOTIMER_DURING_BRIDGE)) {
- switch_rtp_set_flag(tech_pvt->rtp_session, SWITCH_RTP_FLAG_USE_TIMER);
- switch_rtp_set_flag(tech_pvt->rtp_session, SWITCH_RTP_FLAG_NOBLOCK);
+ if (!switch_rtp_test_flag(tech_pvt->rtp_session, SWITCH_RTP_FLAG_UDPTL) &&
+ !switch_rtp_test_flag(tech_pvt->rtp_session, SWITCH_RTP_FLAG_PROXY_MEDIA)) {
+ switch_rtp_set_flag(tech_pvt->rtp_session, SWITCH_RTP_FLAG_USE_TIMER);
+ switch_rtp_set_flag(tech_pvt->rtp_session, SWITCH_RTP_FLAG_NOBLOCK);
+ }
sofia_clear_flag(tech_pvt, TFLAG_NOTIMER_DURING_BRIDGE);
}
@@ -2153,6 +2157,7 @@ static switch_status_t sofia_receive_message(switch_core_session_t *session, swi
if (t38_options) {
sofia_glue_set_image_sdp(tech_pvt, t38_options, 0);
if (switch_rtp_ready(tech_pvt->rtp_session)) {
+ sofia_clear_flag(tech_pvt, TFLAG_NOTIMER_DURING_BRIDGE);
switch_rtp_udptl_mode(tech_pvt->rtp_session);
}
}
diff --git a/src/mod/endpoints/mod_sofia/sofia.c b/src/mod/endpoints/mod_sofia/sofia.c
index 3682260809..8156061376 100644
--- a/src/mod/endpoints/mod_sofia/sofia.c
+++ b/src/mod/endpoints/mod_sofia/sofia.c
@@ -4514,6 +4514,7 @@ static void sofia_handle_sip_r_invite(switch_core_session_t *session, int status
if (status == 200 && sofia_test_flag(tech_pvt, TFLAG_T38_PASSTHRU) && has_t38) {
if (switch_rtp_ready(tech_pvt->rtp_session) && switch_rtp_ready(other_tech_pvt->rtp_session)) {
+ sofia_clear_flag(tech_pvt, TFLAG_NOTIMER_DURING_BRIDGE);
switch_rtp_udptl_mode(tech_pvt->rtp_session);
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_INFO, "Activating T38 Passthru\n");
}
diff --git a/src/mod/endpoints/mod_sofia/sofia_glue.c b/src/mod/endpoints/mod_sofia/sofia_glue.c
index 74da94b2c4..69bc4d1e7d 100644
--- a/src/mod/endpoints/mod_sofia/sofia_glue.c
+++ b/src/mod/endpoints/mod_sofia/sofia_glue.c
@@ -2171,6 +2171,15 @@ switch_status_t sofia_glue_do_invite(switch_core_session_t *session)
if (!strncasecmp(url_str, "sips:", 5)) {
s = url_str + 5;
}
+
+ /* tel: patch from jaybinks, added by MC
+ It compiles but I don't have a way to test it
+ */
+ if (!strncasecmp(url_str, "tel:", 4)) {
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(tech_pvt->session),
+ SWITCH_LOG_ERROR, "URL Error! tel: uri's not supported at this time\n");
+ return SWITCH_STATUS_FALSE;
+ }
if (!s) {
s = url_str;
}
@@ -2554,6 +2563,7 @@ static void set_stats(switch_rtp_t *rtp_session, private_object_t *tech_pvt, con
add_stat(stats->inbound.dtmf_packet_count, "in_dtmf_packet_count");
add_stat(stats->inbound.cng_packet_count, "in_cng_packet_count");
add_stat(stats->inbound.flush_packet_count, "in_flush_packet_count");
+ add_stat(stats->inbound.largest_jb_size, "in_largest_jb_size");
add_stat(stats->outbound.raw_bytes, "out_raw_bytes");
add_stat(stats->outbound.media_bytes, "out_media_bytes");
@@ -3435,9 +3445,9 @@ switch_status_t sofia_glue_activate_rtp(private_object_t *tech_pvt, switch_rtp_f
if (!sofia_test_pflag(tech_pvt->profile, PFLAG_DISABLE_RTP_AUTOADJ) && !switch_channel_test_flag(tech_pvt->channel, CF_PROXY_MODE) &&
!((val = switch_channel_get_variable(tech_pvt->channel, "disable_rtp_auto_adjust")) && switch_true(val))) {
- flags = (switch_rtp_flag_t) (SWITCH_RTP_FLAG_USE_TIMER | SWITCH_RTP_FLAG_AUTOADJ | SWITCH_RTP_FLAG_DATAWAIT | SWITCH_RTP_FLAG_RAW_WRITE);
+ flags = (switch_rtp_flag_t) (SWITCH_RTP_FLAG_AUTOADJ | SWITCH_RTP_FLAG_DATAWAIT | SWITCH_RTP_FLAG_RAW_WRITE);
} else {
- flags = (switch_rtp_flag_t) (SWITCH_RTP_FLAG_USE_TIMER | SWITCH_RTP_FLAG_DATAWAIT | SWITCH_RTP_FLAG_RAW_WRITE);
+ flags = (switch_rtp_flag_t) (SWITCH_RTP_FLAG_DATAWAIT | SWITCH_RTP_FLAG_RAW_WRITE);
}
if (switch_channel_test_flag(tech_pvt->channel, CF_PROXY_MEDIA)) {
diff --git a/src/mod/endpoints/mod_sofia/sofia_presence.c b/src/mod/endpoints/mod_sofia/sofia_presence.c
index fdc3bd4d9a..c6ba6ce749 100644
--- a/src/mod/endpoints/mod_sofia/sofia_presence.c
+++ b/src/mod/endpoints/mod_sofia/sofia_presence.c
@@ -1417,6 +1417,11 @@ static int sofia_presence_sub_callback(void *pArg, int argc, char **argv, char *
}
if (!(nh = nua_handle_by_call_id(profile->nua, call_id))) {
+
+ if (mod_sofia_globals.debug_presence > 0) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Failed to find handle for call id %s\n", call_id);
+ }
+
goto end;
}
@@ -1468,12 +1473,18 @@ static int sofia_presence_sub_callback(void *pArg, int argc, char **argv, char *
const char *astate = switch_str_nil(switch_event_get_header(helper->event, "astate"));
const char *answer_state = switch_str_nil(switch_event_get_header(helper->event, "answer-state"));
const char *dft_state;
- const char *from_id = switch_str_nil(switch_event_get_header(helper->event, "Other-Leg-Caller-ID-Number"));
+ const char *from_id;
const char *to_user = switch_str_nil(switch_event_get_header(helper->event, "variable_sip_to_user"));
const char *from_user = switch_str_nil(switch_event_get_header(helper->event, "variable_sip_from_user"));
char *clean_to_user = NULL;
char *clean_from_user = NULL;
int force_status = 0;
+
+ if (!strcasecmp(direction, "inbound")) {
+ from_id = switch_str_nil(switch_event_get_header(helper->event, "Caller-Destination-Number"));
+ } else {
+ from_id = switch_str_nil(switch_event_get_header(helper->event, "Other-Leg-Caller-ID-Number"));
+ }
#if 0
char *buf;
switch_event_serialize(helper->event, &buf, SWITCH_FALSE);
diff --git a/src/mod/event_handlers/mod_erlang_event/mod_erlang_event.c b/src/mod/event_handlers/mod_erlang_event/mod_erlang_event.c
index 900b9655ff..9a09e802c3 100644
--- a/src/mod/event_handlers/mod_erlang_event/mod_erlang_event.c
+++ b/src/mod/event_handlers/mod_erlang_event/mod_erlang_event.c
@@ -1106,7 +1106,7 @@ static int config(void)
} else {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invalid encoding strategy '%s' specified\n", val);
}
- } else if (!strcasecmp(var, "apply-inbound-acl")) {
+ } else if (!strcasecmp(var, "apply-inbound-acl") && ! zstr(val)) {
if (prefs.acl_count < MAX_ACL) {
prefs.acl[prefs.acl_count++] = strdup(val);
} else {
diff --git a/src/mod/event_handlers/mod_json_cdr/Makefile b/src/mod/event_handlers/mod_json_cdr/Makefile
index d5043e017d..1819f0a4c3 100644
--- a/src/mod/event_handlers/mod_json_cdr/Makefile
+++ b/src/mod/event_handlers/mod_json_cdr/Makefile
@@ -1,6 +1,5 @@
json-c=json-c-0.9
BASE=../../../..
-WANT_CURL=yes
JSON_DIR=$(switch_srcdir)/libs/$(json-c)
JSON_BUILDDIR=$(switch_builddir)/libs/$(json-c)
diff --git a/src/mod/event_handlers/mod_radius_cdr/mod_radius_cdr.c b/src/mod/event_handlers/mod_radius_cdr/mod_radius_cdr.c
index 440cbf90a7..d42914d061 100644
--- a/src/mod/event_handlers/mod_radius_cdr/mod_radius_cdr.c
+++ b/src/mod/event_handlers/mod_radius_cdr/mod_radius_cdr.c
@@ -24,6 +24,7 @@
* Contributor(s):
*
* Chris Parker
+ * Mathieu Rene
*
*
* mod_radius_cdr.c -- RADIUS CDR Module
@@ -145,13 +146,14 @@ static switch_status_t my_on_routing(switch_core_session_t *session)
switch_time_t callanswerdate = 0;
switch_time_t callenddate = 0;
switch_time_t calltransferdate = 0;
+ const char *signal_bond = NULL;
char *uuid_str;
switch_time_exp_t tm;
char buffer[32];
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "[mod_radius_cdr] Entering my_on_routing\n");
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "[mod_radius_cdr] Entering my_on_routing\n");
if (globals.shutdown) {
return SWITCH_STATUS_FALSE;
@@ -160,7 +162,7 @@ static switch_status_t my_on_routing(switch_core_session_t *session)
if (channel) {
const char *disable_flag = switch_channel_get_variable(channel, "disable_radius_start");
if (switch_true(disable_flag)) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "[mod_radius_cdr] Not Sending RADIUS Start\n");
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "[mod_radius_cdr] Not Sending RADIUS Start\n");
return SWITCH_STATUS_SUCCESS;
}
}
@@ -170,14 +172,14 @@ static switch_status_t my_on_routing(switch_core_session_t *session)
rad_config = my_radius_init();
if (rad_config == NULL) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "[mod_radius_cdr] Error initializing radius, Start packet not logged.\n");
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "[mod_radius_cdr] Error initializing radius, Start packet not logged.\n");
goto end;
}
if (switch_ivr_generate_xml_cdr(session, &cdr) == SWITCH_STATUS_SUCCESS) {
uuid_str = switch_core_session_get_uuid(session);
} else {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "[mod_radius_cdr] Error Generating Data!\n");
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "[mod_radius_cdr] Error Generating Data!\n");
goto end;
}
@@ -185,13 +187,13 @@ static switch_status_t my_on_routing(switch_core_session_t *session)
/* Set Status Type */
if (rc_avpair_add(rad_config, &send, PW_ACCT_STATUS_TYPE, &status_type, -1, 0) == NULL) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "[mod_radius_cdr] Failed setting Acct-Status-Type: Start\n");
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "[mod_radius_cdr] Failed setting Acct-Status-Type: Start\n");
rc_destroy(rad_config);
goto end;
}
if (rc_avpair_add(rad_config, &send, PW_ACCT_SESSION_ID, uuid_str, -1, 0) == NULL) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "[mod_radius_cdr] Failed adding Acct-Session-ID: %s\n", uuid_str);
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "[mod_radius_cdr] Failed adding Acct-Session-ID: %s\n", uuid_str);
rc_destroy(rad_config);
goto end;
}
@@ -205,11 +207,19 @@ static switch_status_t my_on_routing(switch_core_session_t *session)
/*
cause = switch_channel_get_cause(channel);
if (rc_avpair_add(rad_config, &send, PW_FS_HANGUPCAUSE, &cause, -1, PW_FS_PEC) == NULL) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "failed adding Freeswitch-Hangupcause: %d\n", cause);
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "failed adding Freeswitch-Hangupcause: %d\n", cause);
rc_destroy(rad_config);
return SWITCH_STATUS_TERM;
}
*/
+
+ if ((signal_bond = switch_channel_get_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE)) && !zstr(signal_bond)) {
+ if (rc_avpair_add(rad_config, &send, PW_FS_OTHER_LEG_ID, (void*) signal_bond, -1, PW_FS_PEC) == NULL) {
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "[mod_radius_cdr] Failed adding Freeswitch-Other-Leg-Id: %s\n", uuid_str);
+ rc_destroy(rad_config);
+ goto end;
+ }
+ }
profile = switch_channel_get_caller_profile(channel);
@@ -222,35 +232,35 @@ static switch_status_t my_on_routing(switch_core_session_t *session)
if (profile->username) {
if (rc_avpair_add(rad_config, &send, PW_USER_NAME, (void *) profile->username, -1, 0) == NULL) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "failed adding User-Name: %s\n", profile->username);
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "failed adding User-Name: %s\n", profile->username);
rc_destroy(rad_config);
goto end;
}
}
if (profile->caller_id_number) {
if (rc_avpair_add(rad_config, &send, PW_FS_SRC, (void *) profile->caller_id_number, -1, PW_FS_PEC) == NULL) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "failed adding Freeswitch-Src: %s\n", profile->caller_id_number);
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "failed adding Freeswitch-Src: %s\n", profile->caller_id_number);
rc_destroy(rad_config);
goto end;
}
}
if (profile->caller_id_name) {
if (rc_avpair_add(rad_config, &send, PW_FS_CLID, (void *) profile->caller_id_name, -1, PW_FS_PEC) == NULL) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "failed adding Freeswitch-CLID: %s\n", profile->caller_id_name);
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "failed adding Freeswitch-CLID: %s\n", profile->caller_id_name);
rc_destroy(rad_config);
goto end;
}
}
if (profile->destination_number) {
if (rc_avpair_add(rad_config, &send, PW_FS_DST, (void *) profile->destination_number, -1, PW_FS_PEC) == NULL) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "failed adding Freeswitch-Dst: %s\n", profile->destination_number);
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "failed adding Freeswitch-Dst: %s\n", profile->destination_number);
rc_destroy(rad_config);
goto end;
}
}
if (profile->dialplan) {
if (rc_avpair_add(rad_config, &send, PW_FS_DIALPLAN, (void *) profile->dialplan, -1, PW_FS_PEC) == NULL) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "failed adding Freeswitch-Dialplan: %s\n", profile->dialplan);
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "failed adding Freeswitch-Dialplan: %s\n", profile->dialplan);
rc_destroy(rad_config);
goto end;
}
@@ -259,42 +269,42 @@ static switch_status_t my_on_routing(switch_core_session_t *session)
inet_pton(AF_INET, (void *) profile->network_addr, &framed_addr);
framed_addr = htonl(framed_addr);
if (rc_avpair_add(rad_config, &send, PW_FRAMED_IP_ADDRESS, &framed_addr, -1, 0) == NULL) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "failed adding Framed-IP-Address: %s\n", profile->network_addr);
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "failed adding Framed-IP-Address: %s\n", profile->network_addr);
rc_destroy(rad_config);
goto end;
}
}
if (profile->rdnis) {
if (rc_avpair_add(rad_config, &send, PW_FS_RDNIS, (void *) profile->rdnis, -1, PW_FS_PEC) == NULL) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "failed adding Freeswitch-RDNIS: %s\n", profile->rdnis);
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "failed adding Freeswitch-RDNIS: %s\n", profile->rdnis);
rc_destroy(rad_config);
goto end;
}
}
if (profile->context) {
if (rc_avpair_add(rad_config, &send, PW_FS_CONTEXT, (void *) profile->context, -1, PW_FS_PEC) == NULL) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "failed adding Freeswitch-Context: %s\n", profile->context);
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "failed adding Freeswitch-Context: %s\n", profile->context);
rc_destroy(rad_config);
goto end;
}
}
if (profile->ani) {
if (rc_avpair_add(rad_config, &send, PW_FS_ANI, (void *) profile->ani, -1, PW_FS_PEC) == NULL) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "failed adding Freeswitch-ANI: %s\n", profile->ani);
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "failed adding Freeswitch-ANI: %s\n", profile->ani);
rc_destroy(rad_config);
goto end;
}
}
if (profile->aniii) {
if (rc_avpair_add(rad_config, &send, PW_FS_ANIII, (void *) profile->aniii, -1, PW_FS_PEC) == NULL) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "failed adding Freeswitch-ANIII: %s\n", profile->aniii);
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "failed adding Freeswitch-ANIII: %s\n", profile->aniii);
rc_destroy(rad_config);
goto end;
}
}
if (profile->source) {
if (rc_avpair_add(rad_config, &send, PW_FS_SOURCE, (void *) profile->source, -1, PW_FS_PEC) == NULL) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "failed adding Freeswitch-Source: %s\n", profile->source);
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "failed adding Freeswitch-Source: %s\n", profile->source);
rc_destroy(rad_config);
goto end;
}
@@ -305,7 +315,7 @@ static switch_status_t my_on_routing(switch_core_session_t *session)
tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday,
tm.tm_hour, tm.tm_min, tm.tm_sec, tm.tm_usec, tm.tm_gmtoff / 3600, tm.tm_gmtoff % 3600);
if (rc_avpair_add(rad_config, &send, PW_FS_CALLSTARTDATE, &buffer, -1, PW_FS_PEC) == NULL) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "failed adding Freeswitch-Callstartdate: %s\n", buffer);
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "failed adding Freeswitch-Callstartdate: %s\n", buffer);
rc_destroy(rad_config);
goto end;
}
@@ -317,7 +327,7 @@ static switch_status_t my_on_routing(switch_core_session_t *session)
tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday,
tm.tm_hour, tm.tm_min, tm.tm_sec, tm.tm_usec, tm.tm_gmtoff / 3600, tm.tm_gmtoff % 3600);
if (rc_avpair_add(rad_config, &send, PW_FS_CALLANSWERDATE, &buffer, -1, PW_FS_PEC) == NULL) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "failed adding Freeswitch-Callanswerdate: %s\n", buffer);
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "failed adding Freeswitch-Callanswerdate: %s\n", buffer);
rc_destroy(rad_config);
goto end;
}
@@ -329,7 +339,7 @@ static switch_status_t my_on_routing(switch_core_session_t *session)
tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday,
tm.tm_hour, tm.tm_min, tm.tm_sec, tm.tm_usec, tm.tm_gmtoff / 3600, tm.tm_gmtoff % 3600);
if (rc_avpair_add(rad_config, &send, PW_FS_CALLTRANSFERDATE, &buffer, -1, PW_FS_PEC) == NULL) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "failed adding Freeswitch-Calltransferdate: %s\n", buffer);
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "failed adding Freeswitch-Calltransferdate: %s\n", buffer);
rc_destroy(rad_config);
goto end;
}
@@ -341,7 +351,7 @@ static switch_status_t my_on_routing(switch_core_session_t *session)
tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday,
tm.tm_hour, tm.tm_min, tm.tm_sec, tm.tm_usec, tm.tm_gmtoff / 3600, tm.tm_gmtoff % 3600);
if (rc_avpair_add(rad_config, &send, PW_FS_CALLENDDATE, &buffer, -1, PW_FS_PEC) == NULL) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "failed adding Freeswitch-Callenddate: %s\n", buffer);
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "failed adding Freeswitch-Callenddate: %s\n", buffer);
rc_destroy(rad_config);
goto end;
}
@@ -350,21 +360,21 @@ static switch_status_t my_on_routing(switch_core_session_t *session)
if (profile->caller_extension && profile->caller_extension->last_application && profile->caller_extension->last_application->application_name) {
if (rc_avpair_add(rad_config, &send, PW_FS_LASTAPP,
(void *) profile->caller_extension->last_application->application_name, -1, PW_FS_PEC) == NULL) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "failed adding Freeswitch-Lastapp: %s\n", profile->source);
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "failed adding Freeswitch-Lastapp: %s\n", profile->source);
rc_destroy(rad_config);
goto end;
}
}
} else {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "profile == NULL\n");
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "profile == NULL\n");
}
}
if (rc_acct(rad_config, client_port, send) == OK_RC) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "[mod_radius_cdr] RADIUS Accounting OK\n");
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "[mod_radius_cdr] RADIUS Accounting OK\n");
retval = SWITCH_STATUS_SUCCESS;
} else {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "[mod_radius_cdr] RADIUS Accounting Failed\n");
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "[mod_radius_cdr] RADIUS Accounting Failed\n");
retval = SWITCH_STATUS_TERM;
}
rc_avpair_free(send);
@@ -404,26 +414,26 @@ static switch_status_t my_on_reporting(switch_core_session_t *session)
if (channel) {
const char *disable_flag = switch_channel_get_variable(channel, "disable_radius_stop");
if (switch_true(disable_flag)) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "[mod_radius_cdr] Not Sending RADIUS Stop\n");
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "[mod_radius_cdr] Not Sending RADIUS Stop\n");
return SWITCH_STATUS_SUCCESS;
}
}
switch_thread_rwlock_rdlock(globals.rwlock);
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "[mod_radius_cdr] Entering my_on_reporting\n");
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "[mod_radius_cdr] Entering my_on_reporting\n");
rad_config = my_radius_init();
if (rad_config == NULL) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "[mod_radius_cdr] Error initializing radius, session not logged.\n");
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "[mod_radius_cdr] Error initializing radius, session not logged.\n");
goto end;
}
if (switch_ivr_generate_xml_cdr(session, &cdr) == SWITCH_STATUS_SUCCESS) {
uuid_str = switch_core_session_get_uuid(session);
} else {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "[mod_radius_cdr] Error Generating Data!\n");
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "[mod_radius_cdr] Error Generating Data!\n");
goto end;
}
@@ -431,13 +441,13 @@ static switch_status_t my_on_reporting(switch_core_session_t *session)
/* Set Status Type */
if (rc_avpair_add(rad_config, &send, PW_ACCT_STATUS_TYPE, &status_type, -1, 0) == NULL) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "failed adding Acct-Session-ID: %s\n", uuid_str);
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "failed adding Acct-Session-ID: %s\n", uuid_str);
rc_destroy(rad_config);
goto end;
}
if (rc_avpair_add(rad_config, &send, PW_ACCT_SESSION_ID, uuid_str, -1, 0) == NULL) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "failed adding Acct-Session-ID: %s\n", uuid_str);
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "failed adding Acct-Session-ID: %s\n", uuid_str);
rc_destroy(rad_config);
goto end;
}
@@ -450,7 +460,7 @@ static switch_status_t my_on_reporting(switch_core_session_t *session)
cause = switch_channel_get_cause(channel);
if (rc_avpair_add(rad_config, &send, PW_FS_HANGUPCAUSE, &cause, -1, PW_FS_PEC) == NULL) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "failed adding Freeswitch-Hangupcause: %d\n", cause);
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "failed adding Freeswitch-Hangupcause: %d\n", cause);
rc_destroy(rad_config);
goto end;
}
@@ -459,7 +469,7 @@ static switch_status_t my_on_reporting(switch_core_session_t *session)
if (profile) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "[mod_radius_cdr] Calculating billable time\n");
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "[mod_radius_cdr] Calculating billable time\n");
/* calculate billable time */
callstartdate = profile->times->created;
@@ -480,39 +490,39 @@ static switch_status_t my_on_reporting(switch_core_session_t *session)
}
billsec = (billusec / 1000000);
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "[mod_radius_cdr] Finished calculating billable time\n");
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "[mod_radius_cdr] Finished calculating billable time\n");
if (profile->username) {
if (rc_avpair_add(rad_config, &send, PW_USER_NAME, (void *) profile->username, -1, 0) == NULL) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "failed adding User-Name: %s\n", profile->username);
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "failed adding User-Name: %s\n", profile->username);
rc_destroy(rad_config);
goto end;
}
}
if (profile->caller_id_number) {
if (rc_avpair_add(rad_config, &send, PW_FS_SRC, (void *) profile->caller_id_number, -1, PW_FS_PEC) == NULL) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "failed adding Freeswitch-Src: %s\n", profile->caller_id_number);
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "failed adding Freeswitch-Src: %s\n", profile->caller_id_number);
rc_destroy(rad_config);
goto end;
}
}
if (profile->caller_id_name) {
if (rc_avpair_add(rad_config, &send, PW_FS_CLID, (void *) profile->caller_id_name, -1, PW_FS_PEC) == NULL) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "failed adding Freeswitch-CLID: %s\n", profile->caller_id_name);
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "failed adding Freeswitch-CLID: %s\n", profile->caller_id_name);
rc_destroy(rad_config);
goto end;
}
}
if (profile->destination_number) {
if (rc_avpair_add(rad_config, &send, PW_FS_DST, (void *) profile->destination_number, -1, PW_FS_PEC) == NULL) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "failed adding Freeswitch-Dst: %s\n", profile->destination_number);
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "failed adding Freeswitch-Dst: %s\n", profile->destination_number);
rc_destroy(rad_config);
goto end;
}
}
if (profile->dialplan) {
if (rc_avpair_add(rad_config, &send, PW_FS_DIALPLAN, (void *) profile->dialplan, -1, PW_FS_PEC) == NULL) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "failed adding Freeswitch-Dialplan: %s\n", profile->dialplan);
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "failed adding Freeswitch-Dialplan: %s\n", profile->dialplan);
rc_destroy(rad_config);
goto end;
}
@@ -521,42 +531,42 @@ static switch_status_t my_on_reporting(switch_core_session_t *session)
inet_pton(AF_INET, (void *) profile->network_addr, &framed_addr);
framed_addr = htonl(framed_addr);
if (rc_avpair_add(rad_config, &send, PW_FRAMED_IP_ADDRESS, &framed_addr, -1, 0) == NULL) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "failed adding Framed-IP-Address: %s\n", profile->network_addr);
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "failed adding Framed-IP-Address: %s\n", profile->network_addr);
rc_destroy(rad_config);
goto end;
}
}
if (profile->rdnis) {
if (rc_avpair_add(rad_config, &send, PW_FS_RDNIS, (void *) profile->rdnis, -1, PW_FS_PEC) == NULL) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "failed adding Freeswitch-RDNIS: %s\n", profile->rdnis);
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "failed adding Freeswitch-RDNIS: %s\n", profile->rdnis);
rc_destroy(rad_config);
goto end;
}
}
if (profile->context) {
if (rc_avpair_add(rad_config, &send, PW_FS_CONTEXT, (void *) profile->context, -1, PW_FS_PEC) == NULL) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "failed adding Freeswitch-Context: %s\n", profile->context);
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "failed adding Freeswitch-Context: %s\n", profile->context);
rc_destroy(rad_config);
goto end;
}
}
if (profile->ani) {
if (rc_avpair_add(rad_config, &send, PW_FS_ANI, (void *) profile->ani, -1, PW_FS_PEC) == NULL) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "failed adding Freeswitch-ANI: %s\n", profile->ani);
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "failed adding Freeswitch-ANI: %s\n", profile->ani);
rc_destroy(rad_config);
goto end;
}
}
if (profile->aniii) {
if (rc_avpair_add(rad_config, &send, PW_FS_ANIII, (void *) profile->aniii, -1, PW_FS_PEC) == NULL) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "failed adding Freeswitch-ANIII: %s\n", profile->aniii);
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "failed adding Freeswitch-ANIII: %s\n", profile->aniii);
rc_destroy(rad_config);
goto end;
}
}
if (profile->source) {
if (rc_avpair_add(rad_config, &send, PW_FS_SOURCE, (void *) profile->source, -1, PW_FS_PEC) == NULL) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "failed adding Freeswitch-Source: %s\n", profile->source);
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "failed adding Freeswitch-Source: %s\n", profile->source);
rc_destroy(rad_config);
goto end;
}
@@ -564,13 +574,13 @@ static switch_status_t my_on_reporting(switch_core_session_t *session)
if (profile->caller_extension && profile->caller_extension->last_application && profile->caller_extension->last_application->application_name) {
if (rc_avpair_add(rad_config, &send, PW_FS_LASTAPP,
(void *) profile->caller_extension->last_application->application_name, -1, PW_FS_PEC) == NULL) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "failed adding Freeswitch-Lastapp: %s\n", profile->source);
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "failed adding Freeswitch-Lastapp: %s\n", profile->source);
rc_destroy(rad_config);
goto end;
}
}
if (rc_avpair_add(rad_config, &send, PW_FS_BILLUSEC, &billusec, -1, PW_FS_PEC) == NULL) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "failed adding Freeswitch-Billusec: %u\n", (uint32_t) billusec);
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "failed adding Freeswitch-Billusec: %u\n", (uint32_t) billusec);
rc_destroy(rad_config);
goto end;
}
@@ -581,7 +591,7 @@ static switch_status_t my_on_reporting(switch_core_session_t *session)
tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday,
tm.tm_hour, tm.tm_min, tm.tm_sec, tm.tm_usec, tm.tm_gmtoff / 3600, tm.tm_gmtoff % 3600);
if (rc_avpair_add(rad_config, &send, PW_FS_CALLSTARTDATE, &buffer, -1, PW_FS_PEC) == NULL) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "failed adding Freeswitch-Callstartdate: %s\n", buffer);
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "failed adding Freeswitch-Callstartdate: %s\n", buffer);
rc_destroy(rad_config);
goto end;
}
@@ -593,7 +603,7 @@ static switch_status_t my_on_reporting(switch_core_session_t *session)
tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday,
tm.tm_hour, tm.tm_min, tm.tm_sec, tm.tm_usec, tm.tm_gmtoff / 3600, tm.tm_gmtoff % 3600);
if (rc_avpair_add(rad_config, &send, PW_FS_CALLANSWERDATE, &buffer, -1, PW_FS_PEC) == NULL) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "failed adding Freeswitch-Callanswerdate: %s\n", buffer);
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "failed adding Freeswitch-Callanswerdate: %s\n", buffer);
rc_destroy(rad_config);
goto end;
}
@@ -605,7 +615,7 @@ static switch_status_t my_on_reporting(switch_core_session_t *session)
tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday,
tm.tm_hour, tm.tm_min, tm.tm_sec, tm.tm_usec, tm.tm_gmtoff / 3600, tm.tm_gmtoff % 3600);
if (rc_avpair_add(rad_config, &send, PW_FS_CALLTRANSFERDATE, &buffer, -1, PW_FS_PEC) == NULL) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "failed adding Freeswitch-Calltransferdate: %s\n", buffer);
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "failed adding Freeswitch-Calltransferdate: %s\n", buffer);
rc_destroy(rad_config);
goto end;
}
@@ -617,27 +627,38 @@ static switch_status_t my_on_reporting(switch_core_session_t *session)
tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday,
tm.tm_hour, tm.tm_min, tm.tm_sec, tm.tm_usec, tm.tm_gmtoff / 3600, tm.tm_gmtoff % 3600);
if (rc_avpair_add(rad_config, &send, PW_FS_CALLENDDATE, &buffer, -1, PW_FS_PEC) == NULL) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "failed adding Freeswitch-Callenddate: %s\n", buffer);
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "failed adding Freeswitch-Callenddate: %s\n", buffer);
rc_destroy(rad_config);
goto end;
}
}
if (rc_avpair_add(rad_config, &send, PW_ACCT_SESSION_TIME, &billsec, -1, 0) == NULL) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "failed adding Acct-Session-Time: %u\n", billsec);
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "failed adding Acct-Session-Time: %u\n", billsec);
rc_destroy(rad_config);
goto end;
}
+
+ {
+ const char *direction_str = profile->direction == SWITCH_CALL_DIRECTION_INBOUND ? "inbound" : "outbound";
+
+ if (rc_avpair_add(rad_config, &send, PW_FS_DIRECTION, (void *) direction_str, -1, PW_FS_PEC) == NULL) {
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "failed adding Freeswitch-Direction: %s\n", direction_str);
+ rc_destroy(rad_config);
+ goto end;
+ }
+ }
+
} else { /* no profile, can't create data to send */
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "profile == NULL\n");
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "profile == NULL\n");
}
}
if (rc_acct(rad_config, client_port, send) == OK_RC) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "RADIUS Accounting OK\n");
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "RADIUS Accounting OK\n");
retval = SWITCH_STATUS_SUCCESS;
} else {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "RADIUS Accounting Failed\n");
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "RADIUS Accounting Failed\n");
retval = SWITCH_STATUS_TERM;
}
rc_avpair_free(send);
diff --git a/src/mod/event_handlers/mod_radius_cdr/mod_radius_cdr.h b/src/mod/event_handlers/mod_radius_cdr/mod_radius_cdr.h
index e4e5a38afc..a3effad005 100644
--- a/src/mod/event_handlers/mod_radius_cdr/mod_radius_cdr.h
+++ b/src/mod/event_handlers/mod_radius_cdr/mod_radius_cdr.h
@@ -58,6 +58,8 @@
#define PW_FS_CALLANSWERDATE 21
#define PW_FS_CALLTRANSFERDATE 22
#define PW_FS_CALLENDDATE 23
+#define PW_FS_DIRECTION 24
+#define PW_FS_OTHER_LEG_ID 25
#endif
diff --git a/src/mod/event_handlers/mod_radius_cdr/radius/dictionary b/src/mod/event_handlers/mod_radius_cdr/radius/dictionary
index 8c04c6dd93..c126e685d4 100644
--- a/src/mod/event_handlers/mod_radius_cdr/radius/dictionary
+++ b/src/mod/event_handlers/mod_radius_cdr/radius/dictionary
@@ -276,6 +276,8 @@ ATTRIBUTE Freeswitch-Callstartdate 20 string Freeswitch
ATTRIBUTE Freeswitch-Callanswerdate 21 string Freeswitch
ATTRIBUTE Freeswitch-Calltransferdate 22 string Freeswitch
ATTRIBUTE Freeswitch-Callenddate 23 string Freeswitch
+ATTRIBUTE Freeswitch-Direction 24 string Freeswitch
+ATTRIBUTE Freeswitch-Other-Leg-Id 25 string Freeswitch
#
# Freeswitch-Hangupcause
diff --git a/src/mod/formats/mod_shout/Makefile b/src/mod/formats/mod_shout/Makefile
index 7388bc0c67..50dc9d5b3a 100644
--- a/src/mod/formats/mod_shout/Makefile
+++ b/src/mod/formats/mod_shout/Makefile
@@ -3,8 +3,6 @@ SHOUT=libshout-2.2.2
MPG123=mpg123-1.13.2
BASE=../../../..
-WANT_CURL=yes
-
LAME_DIR=$(switch_srcdir)/libs/$(LAME)
SHOUT_DIR=$(switch_srcdir)/libs/$(SHOUT)
MPG123_DIR=$(switch_srcdir)/libs/$(MPG123)
diff --git a/src/mod/formats/mod_shout/mod_shout.c b/src/mod/formats/mod_shout/mod_shout.c
index 377cfe520c..c506e18933 100644
--- a/src/mod/formats/mod_shout/mod_shout.c
+++ b/src/mod/formats/mod_shout/mod_shout.c
@@ -1480,8 +1480,6 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_shout_load)
supported_formats[0] = "shout";
supported_formats[1] = "mp3";
- curl_global_init(CURL_GLOBAL_ALL);
-
/* connect my internal structure to the blank pointer passed to me */
*module_interface = switch_loadable_module_create_module_interface(pool, modname);
file_interface = switch_loadable_module_create_interface(*module_interface, SWITCH_FILE_INTERFACE);
@@ -1507,7 +1505,6 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_shout_load)
SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_shout_shutdown)
{
- curl_global_cleanup();
mpg123_exit();
return SWITCH_STATUS_SUCCESS;
}
diff --git a/src/mod/languages/mod_managed/freeswitch_wrap.2010.cxx b/src/mod/languages/mod_managed/freeswitch_wrap.2010.cxx
index 7165efc483..a0bf23dbfb 100644
--- a/src/mod/languages/mod_managed/freeswitch_wrap.2010.cxx
+++ b/src/mod/languages/mod_managed/freeswitch_wrap.2010.cxx
@@ -7257,6 +7257,16 @@ SWIGEXPORT char * SWIGSTDCALL CSharp_switch_core_get_hostname() {
}
+SWIGEXPORT char * SWIGSTDCALL CSharp_switch_core_get_switchname() {
+ char * jresult ;
+ char *result = 0 ;
+
+ result = (char *)switch_core_get_switchname();
+ jresult = SWIG_csharp_string_callback((const char *)result);
+ return jresult;
+}
+
+
SWIGEXPORT void SWIGSTDCALL CSharp_switch_core_set_variable(char * jarg1, char * jarg2) {
char *arg1 = (char *) 0 ;
char *arg2 = (char *) 0 ;
@@ -12105,6 +12115,42 @@ SWIGEXPORT int SWIGSTDCALL CSharp_switch_frame_free(void * jarg1) {
}
+SWIGEXPORT int SWIGSTDCALL CSharp_switch_is_number(char * jarg1) {
+ int jresult ;
+ char *arg1 = (char *) 0 ;
+ switch_bool_t result;
+
+ arg1 = (char *)jarg1;
+ result = (switch_bool_t)switch_is_number((char const *)arg1);
+ jresult = result;
+ return jresult;
+}
+
+
+SWIGEXPORT int SWIGSTDCALL CSharp_switch_true(char * jarg1) {
+ int jresult ;
+ char *arg1 = (char *) 0 ;
+ int result;
+
+ arg1 = (char *)jarg1;
+ result = (int)switch_true((char const *)arg1);
+ jresult = result;
+ return jresult;
+}
+
+
+SWIGEXPORT int SWIGSTDCALL CSharp_switch_false(char * jarg1) {
+ int jresult ;
+ char *arg1 = (char *) 0 ;
+ int result;
+
+ arg1 = (char *)jarg1;
+ result = (int)switch_false((char const *)arg1);
+ jresult = result;
+ return jresult;
+}
+
+
SWIGEXPORT int SWIGSTDCALL CSharp_switch_resolve_host(char * jarg1, char * jarg2, unsigned long jarg3) {
int jresult ;
char *arg1 = (char *) 0 ;
@@ -12473,18 +12519,6 @@ SWIGEXPORT unsigned int SWIGSTDCALL CSharp_switch_separate_string_string(char *
}
-SWIGEXPORT int SWIGSTDCALL CSharp_switch_is_number(char * jarg1) {
- int jresult ;
- char *arg1 = (char *) 0 ;
- switch_bool_t result;
-
- arg1 = (char *)jarg1;
- result = (switch_bool_t)switch_is_number((char const *)arg1);
- jresult = result;
- return jresult;
-}
-
-
SWIGEXPORT char * SWIGSTDCALL CSharp_switch_strip_spaces(char * jarg1, int jarg2) {
char * jresult ;
char *arg1 = (char *) 0 ;
@@ -22614,6 +22648,34 @@ SWIGEXPORT void * SWIGSTDCALL CSharp_switch_channel_timetable_resurrected_get(vo
}
+SWIGEXPORT void SWIGSTDCALL CSharp_switch_channel_timetable_bridged_set(void * jarg1, void * jarg2) {
+ switch_channel_timetable *arg1 = (switch_channel_timetable *) 0 ;
+ switch_time_t arg2 ;
+ switch_time_t *argp2 ;
+
+ arg1 = (switch_channel_timetable *)jarg1;
+ argp2 = (switch_time_t *)jarg2;
+ if (!argp2) {
+ SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "Attempt to dereference null switch_time_t", 0);
+ return ;
+ }
+ arg2 = *argp2;
+ if (arg1) (arg1)->bridged = arg2;
+}
+
+
+SWIGEXPORT void * SWIGSTDCALL CSharp_switch_channel_timetable_bridged_get(void * jarg1) {
+ void * jresult ;
+ switch_channel_timetable *arg1 = (switch_channel_timetable *) 0 ;
+ switch_time_t result;
+
+ arg1 = (switch_channel_timetable *)jarg1;
+ result = ((arg1)->bridged);
+ jresult = new switch_time_t((const switch_time_t &)result);
+ return jresult;
+}
+
+
SWIGEXPORT void SWIGSTDCALL CSharp_switch_channel_timetable_next_set(void * jarg1, void * jarg2) {
switch_channel_timetable *arg1 = (switch_channel_timetable *) 0 ;
switch_channel_timetable *arg2 = (switch_channel_timetable *) 0 ;
@@ -23993,6 +24055,14 @@ SWIGEXPORT int SWIGSTDCALL CSharp_switch_channel_test_app_flag_key(char * jarg1,
}
+SWIGEXPORT void SWIGSTDCALL CSharp_switch_channel_set_bridge_time(void * jarg1) {
+ switch_channel_t *arg1 = (switch_channel_t *) 0 ;
+
+ arg1 = (switch_channel_t *)jarg1;
+ switch_channel_set_bridge_time(arg1);
+}
+
+
SWIGEXPORT void SWIGSTDCALL CSharp_switch_channel_set_hangup_time(void * jarg1) {
switch_channel_t *arg1 = (switch_channel_t *) 0 ;
@@ -30660,6 +30730,30 @@ SWIGEXPORT int SWIGSTDCALL CSharp_switch_xml_std_datetime_check(void * jarg1) {
}
+SWIGEXPORT int SWIGSTDCALL CSharp_switch_xml_locate_language(void * jarg1, void * jarg2, void * jarg3, void * jarg4, void * jarg5, void * jarg6, char * jarg7) {
+ int jresult ;
+ switch_xml_t *arg1 = (switch_xml_t *) 0 ;
+ switch_xml_t *arg2 = (switch_xml_t *) 0 ;
+ switch_event_t *arg3 = (switch_event_t *) 0 ;
+ switch_xml_t *arg4 = (switch_xml_t *) 0 ;
+ switch_xml_t *arg5 = (switch_xml_t *) 0 ;
+ switch_xml_t *arg6 = (switch_xml_t *) 0 ;
+ char *arg7 = (char *) 0 ;
+ switch_status_t result;
+
+ arg1 = (switch_xml_t *)jarg1;
+ arg2 = (switch_xml_t *)jarg2;
+ arg3 = (switch_event_t *)jarg3;
+ arg4 = (switch_xml_t *)jarg4;
+ arg5 = (switch_xml_t *)jarg5;
+ arg6 = (switch_xml_t *)jarg6;
+ arg7 = (char *)jarg7;
+ result = (switch_status_t)switch_xml_locate_language(arg1,arg2,arg3,arg4,arg5,arg6,(char const *)arg7);
+ jresult = result;
+ return jresult;
+}
+
+
SWIGEXPORT void SWIGSTDCALL CSharp_switch_io_event_hook_outgoing_channel_outgoing_channel_set(void * jarg1, void * jarg2) {
switch_io_event_hook_outgoing_channel *arg1 = (switch_io_event_hook_outgoing_channel *) 0 ;
switch_outgoing_channel_hook_t arg2 = (switch_outgoing_channel_hook_t) 0 ;
diff --git a/src/mod/languages/mod_managed/freeswitch_wrap.cxx b/src/mod/languages/mod_managed/freeswitch_wrap.cxx
index c0402e142d..d1c0dfcb31 100644
--- a/src/mod/languages/mod_managed/freeswitch_wrap.cxx
+++ b/src/mod/languages/mod_managed/freeswitch_wrap.cxx
@@ -3023,6 +3023,35 @@ SWIGEXPORT void * SWIGSTDCALL CSharp_switch_rtp_numbers_t_flush_packet_count_get
}
+SWIGEXPORT void SWIGSTDCALL CSharp_switch_rtp_numbers_t_largest_jb_size_set(void * jarg1, void * jarg2) {
+ switch_rtp_numbers_t *arg1 = (switch_rtp_numbers_t *) 0 ;
+ switch_size_t arg2 ;
+ switch_size_t *argp2 ;
+
+ arg1 = (switch_rtp_numbers_t *)jarg1;
+ argp2 = (switch_size_t *)jarg2;
+ if (!argp2) {
+ SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "Attempt to dereference null switch_size_t", 0);
+ return ;
+ }
+ arg2 = *argp2;
+ if (arg1) (arg1)->largest_jb_size = arg2;
+
+}
+
+
+SWIGEXPORT void * SWIGSTDCALL CSharp_switch_rtp_numbers_t_largest_jb_size_get(void * jarg1) {
+ void * jresult ;
+ switch_rtp_numbers_t *arg1 = (switch_rtp_numbers_t *) 0 ;
+ switch_size_t result;
+
+ arg1 = (switch_rtp_numbers_t *)jarg1;
+ result = ((arg1)->largest_jb_size);
+ jresult = new switch_size_t((switch_size_t &)result);
+ return jresult;
+}
+
+
SWIGEXPORT void * SWIGSTDCALL CSharp_new_switch_rtp_numbers_t() {
void * jresult ;
switch_rtp_numbers_t *result = 0 ;
@@ -7549,6 +7578,16 @@ SWIGEXPORT char * SWIGSTDCALL CSharp_switch_core_get_hostname() {
}
+SWIGEXPORT char * SWIGSTDCALL CSharp_switch_core_get_switchname() {
+ char * jresult ;
+ char *result = 0 ;
+
+ result = (char *)switch_core_get_switchname();
+ jresult = SWIG_csharp_string_callback((const char *)result);
+ return jresult;
+}
+
+
SWIGEXPORT void SWIGSTDCALL CSharp_switch_core_set_variable(char * jarg1, char * jarg2) {
char *arg1 = (char *) 0 ;
char *arg2 = (char *) 0 ;
@@ -12430,6 +12469,42 @@ SWIGEXPORT int SWIGSTDCALL CSharp_switch_frame_free(void * jarg1) {
}
+SWIGEXPORT int SWIGSTDCALL CSharp_switch_is_number(char * jarg1) {
+ int jresult ;
+ char *arg1 = (char *) 0 ;
+ switch_bool_t result;
+
+ arg1 = (char *)jarg1;
+ result = (switch_bool_t)switch_is_number((char const *)arg1);
+ jresult = result;
+ return jresult;
+}
+
+
+SWIGEXPORT int SWIGSTDCALL CSharp_switch_true(char * jarg1) {
+ int jresult ;
+ char *arg1 = (char *) 0 ;
+ int result;
+
+ arg1 = (char *)jarg1;
+ result = (int)switch_true((char const *)arg1);
+ jresult = result;
+ return jresult;
+}
+
+
+SWIGEXPORT int SWIGSTDCALL CSharp_switch_false(char * jarg1) {
+ int jresult ;
+ char *arg1 = (char *) 0 ;
+ int result;
+
+ arg1 = (char *)jarg1;
+ result = (int)switch_false((char const *)arg1);
+ jresult = result;
+ return jresult;
+}
+
+
SWIGEXPORT int SWIGSTDCALL CSharp_switch_resolve_host(char * jarg1, char * jarg2, unsigned long jarg3) {
int jresult ;
char *arg1 = (char *) 0 ;
@@ -12798,18 +12873,6 @@ SWIGEXPORT unsigned int SWIGSTDCALL CSharp_switch_separate_string_string(char *
}
-SWIGEXPORT int SWIGSTDCALL CSharp_switch_is_number(char * jarg1) {
- int jresult ;
- char *arg1 = (char *) 0 ;
- switch_bool_t result;
-
- arg1 = (char *)jarg1;
- result = (switch_bool_t)switch_is_number((char const *)arg1);
- jresult = result;
- return jresult;
-}
-
-
SWIGEXPORT char * SWIGSTDCALL CSharp_switch_strip_spaces(char * jarg1, int jarg2) {
char * jresult ;
char *arg1 = (char *) 0 ;
@@ -23277,6 +23340,35 @@ SWIGEXPORT void * SWIGSTDCALL CSharp_switch_channel_timetable_resurrected_get(vo
}
+SWIGEXPORT void SWIGSTDCALL CSharp_switch_channel_timetable_bridged_set(void * jarg1, void * jarg2) {
+ switch_channel_timetable *arg1 = (switch_channel_timetable *) 0 ;
+ switch_time_t arg2 ;
+ switch_time_t *argp2 ;
+
+ arg1 = (switch_channel_timetable *)jarg1;
+ argp2 = (switch_time_t *)jarg2;
+ if (!argp2) {
+ SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "Attempt to dereference null switch_time_t", 0);
+ return ;
+ }
+ arg2 = *argp2;
+ if (arg1) (arg1)->bridged = arg2;
+
+}
+
+
+SWIGEXPORT void * SWIGSTDCALL CSharp_switch_channel_timetable_bridged_get(void * jarg1) {
+ void * jresult ;
+ switch_channel_timetable *arg1 = (switch_channel_timetable *) 0 ;
+ switch_time_t result;
+
+ arg1 = (switch_channel_timetable *)jarg1;
+ result = ((arg1)->bridged);
+ jresult = new switch_time_t((switch_time_t &)result);
+ return jresult;
+}
+
+
SWIGEXPORT void SWIGSTDCALL CSharp_switch_channel_timetable_next_set(void * jarg1, void * jarg2) {
switch_channel_timetable *arg1 = (switch_channel_timetable *) 0 ;
switch_channel_timetable *arg2 = (switch_channel_timetable *) 0 ;
@@ -24658,6 +24750,14 @@ SWIGEXPORT int SWIGSTDCALL CSharp_switch_channel_test_app_flag_key(char * jarg1,
}
+SWIGEXPORT void SWIGSTDCALL CSharp_switch_channel_set_bridge_time(void * jarg1) {
+ switch_channel_t *arg1 = (switch_channel_t *) 0 ;
+
+ arg1 = (switch_channel_t *)jarg1;
+ switch_channel_set_bridge_time(arg1);
+}
+
+
SWIGEXPORT void SWIGSTDCALL CSharp_switch_channel_set_hangup_time(void * jarg1) {
switch_channel_t *arg1 = (switch_channel_t *) 0 ;
@@ -31382,6 +31482,30 @@ SWIGEXPORT int SWIGSTDCALL CSharp_switch_xml_std_datetime_check(void * jarg1) {
}
+SWIGEXPORT int SWIGSTDCALL CSharp_switch_xml_locate_language(void * jarg1, void * jarg2, void * jarg3, void * jarg4, void * jarg5, void * jarg6, char * jarg7) {
+ int jresult ;
+ switch_xml_t *arg1 = (switch_xml_t *) 0 ;
+ switch_xml_t *arg2 = (switch_xml_t *) 0 ;
+ switch_event_t *arg3 = (switch_event_t *) 0 ;
+ switch_xml_t *arg4 = (switch_xml_t *) 0 ;
+ switch_xml_t *arg5 = (switch_xml_t *) 0 ;
+ switch_xml_t *arg6 = (switch_xml_t *) 0 ;
+ char *arg7 = (char *) 0 ;
+ switch_status_t result;
+
+ arg1 = (switch_xml_t *)jarg1;
+ arg2 = (switch_xml_t *)jarg2;
+ arg3 = (switch_event_t *)jarg3;
+ arg4 = (switch_xml_t *)jarg4;
+ arg5 = (switch_xml_t *)jarg5;
+ arg6 = (switch_xml_t *)jarg6;
+ arg7 = (char *)jarg7;
+ result = (switch_status_t)switch_xml_locate_language(arg1,arg2,arg3,arg4,arg5,arg6,(char const *)arg7);
+ jresult = result;
+ return jresult;
+}
+
+
SWIGEXPORT void SWIGSTDCALL CSharp_switch_io_event_hook_outgoing_channel_outgoing_channel_set(void * jarg1, void * jarg2) {
switch_io_event_hook_outgoing_channel *arg1 = (switch_io_event_hook_outgoing_channel *) 0 ;
switch_outgoing_channel_hook_t arg2 = (switch_outgoing_channel_hook_t) 0 ;
diff --git a/src/mod/languages/mod_managed/managed/swig.2010.cs b/src/mod/languages/mod_managed/managed/swig.2010.cs
index 6d8c374d44..9a1f30fd9b 100644
--- a/src/mod/languages/mod_managed/managed/swig.2010.cs
+++ b/src/mod/languages/mod_managed/managed/swig.2010.cs
@@ -1409,6 +1409,11 @@ public class freeswitch {
return ret;
}
+ public static string switch_core_get_switchname() {
+ string ret = freeswitchPINVOKE.switch_core_get_switchname();
+ return ret;
+ }
+
public static void switch_core_set_variable(string varname, string value) {
freeswitchPINVOKE.switch_core_set_variable(varname, value);
}
@@ -2872,6 +2877,21 @@ public class freeswitch {
return ret;
}
+ public static switch_bool_t switch_is_number(string str) {
+ switch_bool_t ret = (switch_bool_t)freeswitchPINVOKE.switch_is_number(str);
+ return ret;
+ }
+
+ public static int switch_true(string expr) {
+ int ret = freeswitchPINVOKE.switch_true(expr);
+ return ret;
+ }
+
+ public static int switch_false(string expr) {
+ int ret = freeswitchPINVOKE.switch_false(expr);
+ return ret;
+ }
+
public static switch_status_t switch_resolve_host(string host, string buf, uint buflen) {
switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_resolve_host(host, buf, buflen);
return ret;
@@ -2995,11 +3015,6 @@ public class freeswitch {
return ret;
}
- public static switch_bool_t switch_is_number(string str) {
- switch_bool_t ret = (switch_bool_t)freeswitchPINVOKE.switch_is_number(str);
- return ret;
- }
-
public static string switch_strip_spaces(string str, switch_bool_t dup) {
string ret = freeswitchPINVOKE.switch_strip_spaces(str, (int)dup);
return ret;
@@ -3707,6 +3722,10 @@ public class freeswitch {
return ret;
}
+ public static void switch_channel_set_bridge_time(SWIGTYPE_p_switch_channel channel) {
+ freeswitchPINVOKE.switch_channel_set_bridge_time(SWIGTYPE_p_switch_channel.getCPtr(channel));
+ }
+
public static void switch_channel_set_hangup_time(SWIGTYPE_p_switch_channel channel) {
freeswitchPINVOKE.switch_channel_set_hangup_time(SWIGTYPE_p_switch_channel.getCPtr(channel));
}
@@ -5293,6 +5312,11 @@ public class freeswitch {
return ret;
}
+ public static switch_status_t switch_xml_locate_language(SWIGTYPE_p_p_switch_xml root, SWIGTYPE_p_p_switch_xml node, switch_event arg2, SWIGTYPE_p_p_switch_xml language, SWIGTYPE_p_p_switch_xml phrases, SWIGTYPE_p_p_switch_xml macros, string str_language) {
+ switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_xml_locate_language(SWIGTYPE_p_p_switch_xml.getCPtr(root), SWIGTYPE_p_p_switch_xml.getCPtr(node), switch_event.getCPtr(arg2), SWIGTYPE_p_p_switch_xml.getCPtr(language), SWIGTYPE_p_p_switch_xml.getCPtr(phrases), SWIGTYPE_p_p_switch_xml.getCPtr(macros), str_language);
+ return ret;
+ }
+
public static switch_status_t switch_core_event_hook_add_outgoing_channel(SWIGTYPE_p_switch_core_session session, SWIGTYPE_p_f_p_switch_core_session_p_switch_event_p_switch_caller_profile_p_switch_core_session_unsigned_long__switch_status_t outgoing_channel) {
switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_core_event_hook_add_outgoing_channel(SWIGTYPE_p_switch_core_session.getCPtr(session), SWIGTYPE_p_f_p_switch_core_session_p_switch_event_p_switch_caller_profile_p_switch_core_session_unsigned_long__switch_status_t.getCPtr(outgoing_channel));
return ret;
@@ -7697,6 +7721,9 @@ class freeswitchPINVOKE {
[DllImport("mod_managed", EntryPoint="CSharp_switch_core_get_hostname")]
public static extern string switch_core_get_hostname();
+ [DllImport("mod_managed", EntryPoint="CSharp_switch_core_get_switchname")]
+ public static extern string switch_core_get_switchname();
+
[DllImport("mod_managed", EntryPoint="CSharp_switch_core_set_variable")]
public static extern void switch_core_set_variable(string jarg1, string jarg2);
@@ -8798,6 +8825,15 @@ class freeswitchPINVOKE {
[DllImport("mod_managed", EntryPoint="CSharp_switch_frame_free")]
public static extern int switch_frame_free(HandleRef jarg1);
+ [DllImport("mod_managed", EntryPoint="CSharp_switch_is_number")]
+ public static extern int switch_is_number(string jarg1);
+
+ [DllImport("mod_managed", EntryPoint="CSharp_switch_true")]
+ public static extern int switch_true(string jarg1);
+
+ [DllImport("mod_managed", EntryPoint="CSharp_switch_false")]
+ public static extern int switch_false(string jarg1);
+
[DllImport("mod_managed", EntryPoint="CSharp_switch_resolve_host")]
public static extern int switch_resolve_host(string jarg1, string jarg2, uint jarg3);
@@ -8870,9 +8906,6 @@ class freeswitchPINVOKE {
[DllImport("mod_managed", EntryPoint="CSharp_switch_separate_string_string")]
public static extern uint switch_separate_string_string(string jarg1, string jarg2, ref string jarg3, uint jarg4);
- [DllImport("mod_managed", EntryPoint="CSharp_switch_is_number")]
- public static extern int switch_is_number(string jarg1);
-
[DllImport("mod_managed", EntryPoint="CSharp_switch_strip_spaces")]
public static extern string switch_strip_spaces(string jarg1, int jarg2);
@@ -11453,6 +11486,12 @@ class freeswitchPINVOKE {
[DllImport("mod_managed", EntryPoint="CSharp_switch_channel_timetable_resurrected_get")]
public static extern IntPtr switch_channel_timetable_resurrected_get(HandleRef jarg1);
+ [DllImport("mod_managed", EntryPoint="CSharp_switch_channel_timetable_bridged_set")]
+ public static extern void switch_channel_timetable_bridged_set(HandleRef jarg1, HandleRef jarg2);
+
+ [DllImport("mod_managed", EntryPoint="CSharp_switch_channel_timetable_bridged_get")]
+ public static extern IntPtr switch_channel_timetable_bridged_get(HandleRef jarg1);
+
[DllImport("mod_managed", EntryPoint="CSharp_switch_channel_timetable_next_set")]
public static extern void switch_channel_timetable_next_set(HandleRef jarg1, HandleRef jarg2);
@@ -11762,6 +11801,9 @@ class freeswitchPINVOKE {
[DllImport("mod_managed", EntryPoint="CSharp_switch_channel_test_app_flag_key")]
public static extern int switch_channel_test_app_flag_key(string jarg1, HandleRef jarg2, uint jarg3);
+ [DllImport("mod_managed", EntryPoint="CSharp_switch_channel_set_bridge_time")]
+ public static extern void switch_channel_set_bridge_time(HandleRef jarg1);
+
[DllImport("mod_managed", EntryPoint="CSharp_switch_channel_set_hangup_time")]
public static extern void switch_channel_set_hangup_time(HandleRef jarg1);
@@ -13184,6 +13226,9 @@ class freeswitchPINVOKE {
[DllImport("mod_managed", EntryPoint="CSharp_switch_xml_std_datetime_check")]
public static extern int switch_xml_std_datetime_check(HandleRef jarg1);
+ [DllImport("mod_managed", EntryPoint="CSharp_switch_xml_locate_language")]
+ public static extern int switch_xml_locate_language(HandleRef jarg1, HandleRef jarg2, HandleRef jarg3, HandleRef jarg4, HandleRef jarg5, HandleRef jarg6, string jarg7);
+
[DllImport("mod_managed", EntryPoint="CSharp_switch_io_event_hook_outgoing_channel_outgoing_channel_set")]
public static extern void switch_io_event_hook_outgoing_channel_outgoing_channel_set(HandleRef jarg1, HandleRef jarg2);
@@ -22100,6 +22145,18 @@ public class switch_channel_timetable : IDisposable {
}
}
+ public SWIGTYPE_p_switch_time_t bridged {
+ set {
+ freeswitchPINVOKE.switch_channel_timetable_bridged_set(swigCPtr, SWIGTYPE_p_switch_time_t.getCPtr(value));
+ if (freeswitchPINVOKE.SWIGPendingException.Pending) throw freeswitchPINVOKE.SWIGPendingException.Retrieve();
+ }
+ get {
+ SWIGTYPE_p_switch_time_t ret = new SWIGTYPE_p_switch_time_t(freeswitchPINVOKE.switch_channel_timetable_bridged_get(swigCPtr), true);
+ if (freeswitchPINVOKE.SWIGPendingException.Pending) throw freeswitchPINVOKE.SWIGPendingException.Retrieve();
+ return ret;
+ }
+ }
+
public switch_channel_timetable next {
set {
freeswitchPINVOKE.switch_channel_timetable_next_set(swigCPtr, switch_channel_timetable.getCPtr(value));
diff --git a/src/mod/languages/mod_managed/managed/swig.cs b/src/mod/languages/mod_managed/managed/swig.cs
index 497630fd26..d06e9881d4 100644
--- a/src/mod/languages/mod_managed/managed/swig.cs
+++ b/src/mod/languages/mod_managed/managed/swig.cs
@@ -1399,6 +1399,11 @@ public class freeswitch {
return ret;
}
+ public static string switch_core_get_switchname() {
+ string ret = freeswitchPINVOKE.switch_core_get_switchname();
+ return ret;
+ }
+
public static void switch_core_set_variable(string varname, string value) {
freeswitchPINVOKE.switch_core_set_variable(varname, value);
}
@@ -2862,6 +2867,21 @@ public class freeswitch {
return ret;
}
+ public static switch_bool_t switch_is_number(string str) {
+ switch_bool_t ret = (switch_bool_t)freeswitchPINVOKE.switch_is_number(str);
+ return ret;
+ }
+
+ public static int switch_true(string expr) {
+ int ret = freeswitchPINVOKE.switch_true(expr);
+ return ret;
+ }
+
+ public static int switch_false(string expr) {
+ int ret = freeswitchPINVOKE.switch_false(expr);
+ return ret;
+ }
+
public static switch_status_t switch_resolve_host(string host, string buf, uint buflen) {
switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_resolve_host(host, buf, buflen);
return ret;
@@ -2985,11 +3005,6 @@ public class freeswitch {
return ret;
}
- public static switch_bool_t switch_is_number(string str) {
- switch_bool_t ret = (switch_bool_t)freeswitchPINVOKE.switch_is_number(str);
- return ret;
- }
-
public static string switch_strip_spaces(string str, switch_bool_t dup) {
string ret = freeswitchPINVOKE.switch_strip_spaces(str, (int)dup);
return ret;
@@ -3697,6 +3712,10 @@ public class freeswitch {
return ret;
}
+ public static void switch_channel_set_bridge_time(SWIGTYPE_p_switch_channel channel) {
+ freeswitchPINVOKE.switch_channel_set_bridge_time(SWIGTYPE_p_switch_channel.getCPtr(channel));
+ }
+
public static void switch_channel_set_hangup_time(SWIGTYPE_p_switch_channel channel) {
freeswitchPINVOKE.switch_channel_set_hangup_time(SWIGTYPE_p_switch_channel.getCPtr(channel));
}
@@ -5283,6 +5302,11 @@ public class freeswitch {
return ret;
}
+ public static switch_status_t switch_xml_locate_language(SWIGTYPE_p_p_switch_xml root, SWIGTYPE_p_p_switch_xml node, switch_event arg2, SWIGTYPE_p_p_switch_xml language, SWIGTYPE_p_p_switch_xml phrases, SWIGTYPE_p_p_switch_xml macros, string str_language) {
+ switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_xml_locate_language(SWIGTYPE_p_p_switch_xml.getCPtr(root), SWIGTYPE_p_p_switch_xml.getCPtr(node), switch_event.getCPtr(arg2), SWIGTYPE_p_p_switch_xml.getCPtr(language), SWIGTYPE_p_p_switch_xml.getCPtr(phrases), SWIGTYPE_p_p_switch_xml.getCPtr(macros), str_language);
+ return ret;
+ }
+
public static switch_status_t switch_core_event_hook_add_outgoing_channel(SWIGTYPE_p_switch_core_session session, SWIGTYPE_p_f_p_switch_core_session_p_switch_event_p_switch_caller_profile_p_switch_core_session_unsigned_long__switch_status_t outgoing_channel) {
switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_core_event_hook_add_outgoing_channel(SWIGTYPE_p_switch_core_session.getCPtr(session), SWIGTYPE_p_f_p_switch_core_session_p_switch_event_p_switch_caller_profile_p_switch_core_session_unsigned_long__switch_status_t.getCPtr(outgoing_channel));
return ret;
@@ -6573,6 +6597,12 @@ class freeswitchPINVOKE {
[DllImport("mod_managed", EntryPoint="CSharp_switch_rtp_numbers_t_flush_packet_count_get")]
public static extern IntPtr switch_rtp_numbers_t_flush_packet_count_get(HandleRef jarg1);
+ [DllImport("mod_managed", EntryPoint="CSharp_switch_rtp_numbers_t_largest_jb_size_set")]
+ public static extern void switch_rtp_numbers_t_largest_jb_size_set(HandleRef jarg1, HandleRef jarg2);
+
+ [DllImport("mod_managed", EntryPoint="CSharp_switch_rtp_numbers_t_largest_jb_size_get")]
+ public static extern IntPtr switch_rtp_numbers_t_largest_jb_size_get(HandleRef jarg1);
+
[DllImport("mod_managed", EntryPoint="CSharp_new_switch_rtp_numbers_t")]
public static extern IntPtr new_switch_rtp_numbers_t();
@@ -7683,6 +7713,9 @@ class freeswitchPINVOKE {
[DllImport("mod_managed", EntryPoint="CSharp_switch_core_get_hostname")]
public static extern string switch_core_get_hostname();
+ [DllImport("mod_managed", EntryPoint="CSharp_switch_core_get_switchname")]
+ public static extern string switch_core_get_switchname();
+
[DllImport("mod_managed", EntryPoint="CSharp_switch_core_set_variable")]
public static extern void switch_core_set_variable(string jarg1, string jarg2);
@@ -8784,6 +8817,15 @@ class freeswitchPINVOKE {
[DllImport("mod_managed", EntryPoint="CSharp_switch_frame_free")]
public static extern int switch_frame_free(HandleRef jarg1);
+ [DllImport("mod_managed", EntryPoint="CSharp_switch_is_number")]
+ public static extern int switch_is_number(string jarg1);
+
+ [DllImport("mod_managed", EntryPoint="CSharp_switch_true")]
+ public static extern int switch_true(string jarg1);
+
+ [DllImport("mod_managed", EntryPoint="CSharp_switch_false")]
+ public static extern int switch_false(string jarg1);
+
[DllImport("mod_managed", EntryPoint="CSharp_switch_resolve_host")]
public static extern int switch_resolve_host(string jarg1, string jarg2, uint jarg3);
@@ -8856,9 +8898,6 @@ class freeswitchPINVOKE {
[DllImport("mod_managed", EntryPoint="CSharp_switch_separate_string_string")]
public static extern uint switch_separate_string_string(string jarg1, string jarg2, ref string jarg3, uint jarg4);
- [DllImport("mod_managed", EntryPoint="CSharp_switch_is_number")]
- public static extern int switch_is_number(string jarg1);
-
[DllImport("mod_managed", EntryPoint="CSharp_switch_strip_spaces")]
public static extern string switch_strip_spaces(string jarg1, int jarg2);
@@ -11439,6 +11478,12 @@ class freeswitchPINVOKE {
[DllImport("mod_managed", EntryPoint="CSharp_switch_channel_timetable_resurrected_get")]
public static extern IntPtr switch_channel_timetable_resurrected_get(HandleRef jarg1);
+ [DllImport("mod_managed", EntryPoint="CSharp_switch_channel_timetable_bridged_set")]
+ public static extern void switch_channel_timetable_bridged_set(HandleRef jarg1, HandleRef jarg2);
+
+ [DllImport("mod_managed", EntryPoint="CSharp_switch_channel_timetable_bridged_get")]
+ public static extern IntPtr switch_channel_timetable_bridged_get(HandleRef jarg1);
+
[DllImport("mod_managed", EntryPoint="CSharp_switch_channel_timetable_next_set")]
public static extern void switch_channel_timetable_next_set(HandleRef jarg1, HandleRef jarg2);
@@ -11748,6 +11793,9 @@ class freeswitchPINVOKE {
[DllImport("mod_managed", EntryPoint="CSharp_switch_channel_test_app_flag_key")]
public static extern int switch_channel_test_app_flag_key(string jarg1, HandleRef jarg2, uint jarg3);
+ [DllImport("mod_managed", EntryPoint="CSharp_switch_channel_set_bridge_time")]
+ public static extern void switch_channel_set_bridge_time(HandleRef jarg1);
+
[DllImport("mod_managed", EntryPoint="CSharp_switch_channel_set_hangup_time")]
public static extern void switch_channel_set_hangup_time(HandleRef jarg1);
@@ -13170,6 +13218,9 @@ class freeswitchPINVOKE {
[DllImport("mod_managed", EntryPoint="CSharp_switch_xml_std_datetime_check")]
public static extern int switch_xml_std_datetime_check(HandleRef jarg1);
+ [DllImport("mod_managed", EntryPoint="CSharp_switch_xml_locate_language")]
+ public static extern int switch_xml_locate_language(HandleRef jarg1, HandleRef jarg2, HandleRef jarg3, HandleRef jarg4, HandleRef jarg5, HandleRef jarg6, string jarg7);
+
[DllImport("mod_managed", EntryPoint="CSharp_switch_io_event_hook_outgoing_channel_outgoing_channel_set")]
public static extern void switch_io_event_hook_outgoing_channel_outgoing_channel_set(HandleRef jarg1, HandleRef jarg2);
@@ -22046,6 +22097,18 @@ public class switch_channel_timetable : IDisposable {
}
}
+ public SWIGTYPE_p_switch_time_t bridged {
+ set {
+ freeswitchPINVOKE.switch_channel_timetable_bridged_set(swigCPtr, SWIGTYPE_p_switch_time_t.getCPtr(value));
+ if (freeswitchPINVOKE.SWIGPendingException.Pending) throw freeswitchPINVOKE.SWIGPendingException.Retrieve();
+ }
+ get {
+ SWIGTYPE_p_switch_time_t ret = new SWIGTYPE_p_switch_time_t(freeswitchPINVOKE.switch_channel_timetable_bridged_get(swigCPtr), true);
+ if (freeswitchPINVOKE.SWIGPendingException.Pending) throw freeswitchPINVOKE.SWIGPendingException.Retrieve();
+ return ret;
+ }
+ }
+
public switch_channel_timetable next {
set {
freeswitchPINVOKE.switch_channel_timetable_next_set(swigCPtr, switch_channel_timetable.getCPtr(value));
@@ -29165,6 +29228,18 @@ public class switch_rtp_numbers_t : IDisposable {
}
}
+ public SWIGTYPE_p_switch_size_t largest_jb_size {
+ set {
+ freeswitchPINVOKE.switch_rtp_numbers_t_largest_jb_size_set(swigCPtr, SWIGTYPE_p_switch_size_t.getCPtr(value));
+ if (freeswitchPINVOKE.SWIGPendingException.Pending) throw freeswitchPINVOKE.SWIGPendingException.Retrieve();
+ }
+ get {
+ SWIGTYPE_p_switch_size_t ret = new SWIGTYPE_p_switch_size_t(freeswitchPINVOKE.switch_rtp_numbers_t_largest_jb_size_get(swigCPtr), true);
+ if (freeswitchPINVOKE.SWIGPendingException.Pending) throw freeswitchPINVOKE.SWIGPendingException.Retrieve();
+ return ret;
+ }
+ }
+
public switch_rtp_numbers_t() : this(freeswitchPINVOKE.new_switch_rtp_numbers_t(), true) {
}
diff --git a/src/mod/languages/mod_spidermonkey/mod_spidermonkey.c b/src/mod/languages/mod_spidermonkey/mod_spidermonkey.c
index 7341a2b1e1..30ec8789d6 100644
--- a/src/mod/languages/mod_spidermonkey/mod_spidermonkey.c
+++ b/src/mod/languages/mod_spidermonkey/mod_spidermonkey.c
@@ -2551,7 +2551,6 @@ static JSBool js_fetchurl_file(JSContext * cx, JSObject * obj, uintN argc, jsval
url = JS_GetStringBytes(JS_ValueToString(cx, argv[0]));
filename = JS_GetStringBytes(JS_ValueToString(cx, argv[1]));
- curl_global_init(CURL_GLOBAL_ALL);
curl_handle = curl_easy_init();
if (!strncasecmp(url, "https", 5)) {
curl_easy_setopt(curl_handle, CURLOPT_SSL_VERIFYPEER, 0);
@@ -2600,7 +2599,6 @@ static JSBool js_fetchurl(JSContext * cx, JSObject * obj, uintN argc, jsval * ar
JS_ValueToInt32(cx, argv[1], &buffer_size);
}
- curl_global_init(CURL_GLOBAL_ALL);
curl_handle = curl_easy_init();
if (!strncasecmp(url, "https", 5)) {
curl_easy_setopt(curl_handle, CURLOPT_SSL_VERIFYPEER, 0);
@@ -3803,8 +3801,6 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_spidermonkey_load)
SWITCH_ADD_APP(app_interface, "javascript", "Launch JS ivr", "Run a javascript ivr on a channel", js_dp_function, "