[Build-System] Remove freetdm from the FreeSWITCH tree. Use out-of-tree module https://github.com/freeswitch/freetdm instead.
This commit is contained in:
parent
53be1ab148
commit
380fd060ef
|
@ -115,15 +115,6 @@ Release/
|
||||||
/libs/esl/fs_ivrd
|
/libs/esl/fs_ivrd
|
||||||
/libs/esl/testclient
|
/libs/esl/testclient
|
||||||
/libs/esl/testserver
|
/libs/esl/testserver
|
||||||
/libs/freetdm/detect_dtmf
|
|
||||||
/libs/freetdm/detect_tones
|
|
||||||
/libs/freetdm/testanalog
|
|
||||||
/libs/freetdm/testapp
|
|
||||||
/libs/freetdm/testcid
|
|
||||||
/libs/freetdm/testpri
|
|
||||||
/libs/freetdm/testr2
|
|
||||||
/libs/freetdm/testsangomaboost
|
|
||||||
/libs/freetdm/testtones
|
|
||||||
/libs/fsg729-*-installer
|
/libs/fsg729-*-installer
|
||||||
/libs/g729/
|
/libs/g729/
|
||||||
/libs/libcodec2/compile
|
/libs/libcodec2/compile
|
||||||
|
|
|
@ -10,7 +10,7 @@ BGJOB=false
|
||||||
VERBOSE=false
|
VERBOSE=false
|
||||||
BASEDIR=`pwd`;
|
BASEDIR=`pwd`;
|
||||||
LIBDIR=${BASEDIR}/libs;
|
LIBDIR=${BASEDIR}/libs;
|
||||||
SUBDIRS="apr libzrtp iksemel libdingaling srtp freetdm unimrcp fs";
|
SUBDIRS="apr libzrtp iksemel libdingaling srtp unimrcp fs";
|
||||||
|
|
||||||
while getopts 'jhd:v' o; do
|
while getopts 'jhd:v' o; do
|
||||||
case "$o" in
|
case "$o" in
|
||||||
|
|
|
@ -168,7 +168,7 @@ xml_int/mod_xml_cdr
|
||||||
xml_int/mod_xml_rpc
|
xml_int/mod_xml_rpc
|
||||||
xml_int/mod_xml_scgi
|
xml_int/mod_xml_scgi
|
||||||
|
|
||||||
#../../libs/freetdm/mod_freetdm
|
#mod_freetdm|https://github.com/freeswitch/freetdm.git -b master
|
||||||
|
|
||||||
## Experimental Modules (don't cry if they're broken)
|
## Experimental Modules (don't cry if they're broken)
|
||||||
#../../contrib/mod/xml_int/mod_xml_odbc
|
#../../contrib/mod/xml_int/mod_xml_odbc
|
||||||
|
|
|
@ -2124,7 +2124,6 @@ if test "$use_system_aprutil" != "yes"; then
|
||||||
fi
|
fi
|
||||||
AC_CONFIG_SUBDIRS([libs/iksemel])
|
AC_CONFIG_SUBDIRS([libs/iksemel])
|
||||||
AC_CONFIG_SUBDIRS([libs/libdingaling])
|
AC_CONFIG_SUBDIRS([libs/libdingaling])
|
||||||
AC_CONFIG_SUBDIRS([libs/freetdm])
|
|
||||||
AC_CONFIG_SUBDIRS([libs/unimrcp])
|
AC_CONFIG_SUBDIRS([libs/unimrcp])
|
||||||
if test "x${enable_zrtp}" = "xyes"; then
|
if test "x${enable_zrtp}" = "xyes"; then
|
||||||
AC_CONFIG_SUBDIRS([libs/libzrtp])
|
AC_CONFIG_SUBDIRS([libs/libzrtp])
|
||||||
|
|
|
@ -85,12 +85,6 @@ opal
|
||||||
/esl/Release/
|
/esl/Release/
|
||||||
/flite-*/
|
/flite-*/
|
||||||
/freeradius-client-*/
|
/freeradius-client-*/
|
||||||
/freetdm/build/compile
|
|
||||||
/freetdm/COPYING
|
|
||||||
/freetdm/INSTALL
|
|
||||||
/freetdm/Makefile.in
|
|
||||||
/freetdm/msvc/Debug/
|
|
||||||
/freetdm/msvc/Release/
|
|
||||||
/iksemel/build/compile
|
/iksemel/build/compile
|
||||||
/iksemel/doc/Makefile
|
/iksemel/doc/Makefile
|
||||||
/iksemel/doc/Makefile.in
|
/iksemel/doc/Makefile.in
|
||||||
|
|
|
@ -1,39 +0,0 @@
|
||||||
*.o
|
|
||||||
*.lo
|
|
||||||
*.so
|
|
||||||
*.a
|
|
||||||
*.orig
|
|
||||||
*.rej
|
|
||||||
*.log
|
|
||||||
|
|
||||||
Makefile
|
|
||||||
config.*
|
|
||||||
configure
|
|
||||||
libtool
|
|
||||||
aclocal.m4
|
|
||||||
build/libtool.m4
|
|
||||||
build/ltoptions.m4
|
|
||||||
build/ltsugar.m4
|
|
||||||
build/ltversion.m4
|
|
||||||
build/lt~obsolete.m4
|
|
||||||
|
|
||||||
testanalog
|
|
||||||
testapp
|
|
||||||
testboost
|
|
||||||
testcid
|
|
||||||
testpri
|
|
||||||
testr2
|
|
||||||
testsangomaboost
|
|
||||||
testtones
|
|
||||||
|
|
||||||
!/msvc/testanalog/
|
|
||||||
!/msvc/testboost/
|
|
||||||
|
|
||||||
!/sample/boost/Makefile
|
|
||||||
!/sample/dso/Makefile
|
|
||||||
|
|
||||||
freetdm.2010.sdf
|
|
||||||
/mod_freetdm/Win32/
|
|
||||||
/msvc/Win32/
|
|
||||||
/src/ftmod/*/Win32/
|
|
||||||
/src/ftmod/*/x64/
|
|
|
@ -1 +0,0 @@
|
||||||
Fri Feb 3 11:55:29 PST 2012
|
|
|
@ -1,244 +0,0 @@
|
||||||
#
|
|
||||||
# cmake file that generate build files for freetdm.
|
|
||||||
# this automatically includes the tests and also
|
|
||||||
# mod_freetdm
|
|
||||||
#
|
|
||||||
# Arnaldo M Pereira <arnaldo@sangoma.com>
|
|
||||||
#
|
|
||||||
CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
|
|
||||||
PROJECT(freetdm)
|
|
||||||
|
|
||||||
ADD_SUBDIRECTORY(sample)
|
|
||||||
ADD_SUBDIRECTORY(mod_freetdm)
|
|
||||||
|
|
||||||
# includes
|
|
||||||
SET(freetdm_INCLUDES
|
|
||||||
${PROJECT_SOURCE_DIR}/src/include
|
|
||||||
${PROJECT_SOURCE_DIR}/src/isdn/include
|
|
||||||
${PROJECT_SOURCE_DIR}/src/include/private
|
|
||||||
${PROJECT_SOURCE_DIR}/src/ftmod/ftmod_sangoma_boost
|
|
||||||
)
|
|
||||||
INCLUDE_DIRECTORIES(${freetdm_INCLUDES})
|
|
||||||
LINK_DIRECTORIES(${freetdm_BINARY_DIR})
|
|
||||||
|
|
||||||
# optional includes
|
|
||||||
IF(DEFINED SNGSS7)
|
|
||||||
SET(freetdm_INCLUDES ${freetdm_INCLUDES} /usr/include/sng_ss7)
|
|
||||||
ENDIF(DEFINED SNGSS7)
|
|
||||||
|
|
||||||
IF(DEFINED SNGISDN)
|
|
||||||
SET(freetdm_INCLUDES ${freetdm_INCLUDES} /usr/include/sng_isdn)
|
|
||||||
ENDIF(DEFINED SNGISDN)
|
|
||||||
|
|
||||||
# definitions / CFLAGS
|
|
||||||
ADD_DEFINITIONS(-DFTDM_CONFIG_DIR="/FIXME" -DFTDM_MOD_DIR="/FIXME")
|
|
||||||
IF(DEFINED WIN32)
|
|
||||||
ADD_DEFINITIONS(-DFREETDM_EXPORTS -DTELETONE_EXPORTS -DMOD_EXPORTS -DDLL_EXPORTS)
|
|
||||||
ENDIF(DEFINED WIN32)
|
|
||||||
IF(DEFINED SNGISDN)
|
|
||||||
SET(freetdm_INCLUDES ${freetdm_INCLUDES} /usr/include/sng_isdn)
|
|
||||||
ENDIF(DEFINED SNGISDN)
|
|
||||||
|
|
||||||
# lib sources
|
|
||||||
SET(freetdm_SOURCES
|
|
||||||
${PROJECT_SOURCE_DIR}/src/hashtable.c
|
|
||||||
${PROJECT_SOURCE_DIR}/src/hashtable_itr.c
|
|
||||||
${PROJECT_SOURCE_DIR}/src/ftdm_io.c
|
|
||||||
${PROJECT_SOURCE_DIR}/src/ftdm_queue.c
|
|
||||||
${PROJECT_SOURCE_DIR}/src/ftdm_sched.c
|
|
||||||
${PROJECT_SOURCE_DIR}/src/ftdm_call_utils.c
|
|
||||||
${PROJECT_SOURCE_DIR}/src/ftdm_config.c
|
|
||||||
${PROJECT_SOURCE_DIR}/src/ftdm_callerid.c
|
|
||||||
${PROJECT_SOURCE_DIR}/src/fsk.c
|
|
||||||
${PROJECT_SOURCE_DIR}/src/uart.c
|
|
||||||
${PROJECT_SOURCE_DIR}/src/g711.c
|
|
||||||
${PROJECT_SOURCE_DIR}/src/libteletone_detect.c
|
|
||||||
${PROJECT_SOURCE_DIR}/src/libteletone_generate.c
|
|
||||||
${PROJECT_SOURCE_DIR}/src/ftdm_buffer.c
|
|
||||||
${PROJECT_SOURCE_DIR}/src/ftdm_threadmutex.c
|
|
||||||
${PROJECT_SOURCE_DIR}/src/ftdm_dso.c
|
|
||||||
${PROJECT_SOURCE_DIR}/src/ftdm_cpu_monitor.c
|
|
||||||
)
|
|
||||||
|
|
||||||
# libfreetdm.so
|
|
||||||
ADD_LIBRARY(${PROJECT_NAME} SHARED ${freetdm_SOURCES})
|
|
||||||
|
|
||||||
IF(NOT DEFINED WIN32)
|
|
||||||
TARGET_LINK_LIBRARIES(${PROJECT_NAME} m pthread dl)
|
|
||||||
ENDIF(NOT DEFINED WIN32)
|
|
||||||
|
|
||||||
REMOVE_DEFINITIONS(-DLL_EXPORTS)
|
|
||||||
|
|
||||||
# tools & tests
|
|
||||||
IF(NOT DEFINED WIN32)
|
|
||||||
FOREACH(TOOL testtones testpri testr2 testapp testcid)
|
|
||||||
ADD_EXECUTABLE(${TOOL} ${PROJECT_SOURCE_DIR}/src/${TOOL}.c)
|
|
||||||
TARGET_LINK_LIBRARIES(${TOOL} -l${PROJECT_NAME})
|
|
||||||
ADD_DEPENDENCIES(${TOOL} ${PROJECT_NAME})
|
|
||||||
ENDFOREACH(TOOL)
|
|
||||||
|
|
||||||
ADD_EXECUTABLE(detect_dtmf
|
|
||||||
${PROJECT_SOURCE_DIR}/src/detect_dtmf.c
|
|
||||||
${PROJECT_SOURCE_DIR}/src/libteletone_detect.c
|
|
||||||
)
|
|
||||||
TARGET_LINK_LIBRARIES(detect_dtmf ${PROJECT_NAME})
|
|
||||||
ADD_DEPENDENCIES(detect_dtmf ${PROJECT_NAME})
|
|
||||||
|
|
||||||
ADD_EXECUTABLE(detect_tones
|
|
||||||
${PROJECT_SOURCE_DIR}/src/detect_tones.c
|
|
||||||
${PROJECT_SOURCE_DIR}/src/libteletone_detect.c
|
|
||||||
)
|
|
||||||
TARGET_LINK_LIBRARIES(detect_tones ${PROJECT_NAME})
|
|
||||||
ADD_DEPENDENCIES(detect_tones ${PROJECT_NAME})
|
|
||||||
|
|
||||||
ADD_EXECUTABLE(testanalog
|
|
||||||
${PROJECT_SOURCE_DIR}/src/testanalog.c
|
|
||||||
)
|
|
||||||
TARGET_LINK_LIBRARIES(testanalog -l${PROJECT_NAME})
|
|
||||||
ADD_DEPENDENCIES(testanalog ${PROJECT_NAME})
|
|
||||||
|
|
||||||
# optional tests/tools
|
|
||||||
IF(HAVE_SCTP)
|
|
||||||
ADD_EXECUTABLE(testboost src/testboost.c)
|
|
||||||
TARGET_LINK_LIBRARIES(testboost ${PROJECT_NAME})
|
|
||||||
ENDIF(HAVE_SCTP)
|
|
||||||
ELSE(NOT DEFINED WIN32)
|
|
||||||
MESSAGE(WARNING "Not building tools/tests on WIN32 yet.")
|
|
||||||
ENDIF(NOT DEFINED WIN32)
|
|
||||||
|
|
||||||
#
|
|
||||||
# ftmod modules
|
|
||||||
#
|
|
||||||
SET(ftmod_DIR ${PROJECT_SOURCE_DIR}/src/ftmod)
|
|
||||||
|
|
||||||
IF(DEFINED WIN32)
|
|
||||||
SET(ftmod_ADDITIONAL_SOURCES
|
|
||||||
${PROJECT_SOURCE_DIR}/src/ftdm_io.c
|
|
||||||
${PROJECT_SOURCE_DIR}/src/ftdm_config.c
|
|
||||||
${PROJECT_SOURCE_DIR}/src/ftdm_queue.c
|
|
||||||
${PROJECT_SOURCE_DIR}/src/g711.c
|
|
||||||
)
|
|
||||||
SET(module_list skel analog analog_em)
|
|
||||||
ELSE(DEFINED WIN32)
|
|
||||||
SET(module_list skel analog analog_em zt)
|
|
||||||
ENDIF(DEFINED WIN32)
|
|
||||||
|
|
||||||
# build default modules
|
|
||||||
FOREACH(module ${module_list})
|
|
||||||
ADD_LIBRARY(ftmod_${module} MODULE ${ftmod_DIR}/ftmod_${module}/ftmod_${module}.c ${ftmod_ADDITIONAL_SOURCES})
|
|
||||||
TARGET_LINK_LIBRARIES(ftmod_${module} ${PROJECT_NAME})
|
|
||||||
ENDFOREACH(module)
|
|
||||||
|
|
||||||
# build isdn ftmod
|
|
||||||
IF(DEFINED BUILD_FTMOD_ISDN)
|
|
||||||
SET(ftmod_isdn_SOURCES
|
|
||||||
${PROJECT_SOURCE_DIR}/src/isdn/EuroISDNStateNT.c
|
|
||||||
${PROJECT_SOURCE_DIR}/src/isdn/EuroISDNStateTE.c
|
|
||||||
${PROJECT_SOURCE_DIR}/src/isdn/mfifo.c
|
|
||||||
${PROJECT_SOURCE_DIR}/src/isdn/Q921.c
|
|
||||||
${PROJECT_SOURCE_DIR}/src/isdn/Q931api.c
|
|
||||||
${PROJECT_SOURCE_DIR}/src/isdn/Q931.c
|
|
||||||
${PROJECT_SOURCE_DIR}/src/isdn/Q931ie.c
|
|
||||||
${PROJECT_SOURCE_DIR}/src/isdn/Q931mes.c
|
|
||||||
${PROJECT_SOURCE_DIR}/src/isdn/Q931StateNT.c
|
|
||||||
${PROJECT_SOURCE_DIR}/src/isdn/Q931StateTE.c
|
|
||||||
${PROJECT_SOURCE_DIR}/src/isdn/nationalmes.c
|
|
||||||
${PROJECT_SOURCE_DIR}/src/isdn/nationalStateNT.c
|
|
||||||
${PROJECT_SOURCE_DIR}/src/isdn/nationalStateTE.c
|
|
||||||
${PROJECT_SOURCE_DIR}/src/isdn/DMSmes.c
|
|
||||||
${PROJECT_SOURCE_DIR}/src/isdn/DMSStateNT.c
|
|
||||||
${PROJECT_SOURCE_DIR}/src/isdn/DMSStateTE.c
|
|
||||||
${PROJECT_SOURCE_DIR}/src/isdn/5ESSmes.c
|
|
||||||
${PROJECT_SOURCE_DIR}/src/isdn/5ESSStateNT.c
|
|
||||||
${PROJECT_SOURCE_DIR}/src/isdn/5ESSStateTE.c
|
|
||||||
${PROJECT_SOURCE_DIR}/src/isdn/Q932mes.c
|
|
||||||
${ftmod_DIR}/ftmod_isdn/ftmod_isdn.c
|
|
||||||
)
|
|
||||||
IF(NOT DEFINED WIN32)
|
|
||||||
ADD_DEFINITIONS(-D_GNU_SOURCE)
|
|
||||||
ENDIF(NOT DEFINED WIN32)
|
|
||||||
ADD_LIBRARY(ftmod_isdn MODULE ${ftmod_isdn_SOURCES})
|
|
||||||
TARGET_LINK_LIBRARIES(ftmod_isdn ${PROJECT_NAME})
|
|
||||||
ENDIF(DEFINED BUILD_FTMOD_ISDN)
|
|
||||||
|
|
||||||
# from now on, optionals
|
|
||||||
IF(DEFINED LIBSANGOMA)
|
|
||||||
ADD_LIBRARY(ftmod_wanpipe MODULE ${ftmod_DIR}/ftmod_wanpipe/ftmod_wanpipe.c)
|
|
||||||
IF(DEFINED WIN32)
|
|
||||||
MESSAGE(WARNING "FIXME: look for wanpipe headers on win32")
|
|
||||||
ELSE(DEFINED WIN32)
|
|
||||||
ADD_DEFINITIONS(-D__LINUX__)
|
|
||||||
INCLUDE_DIRECTORIES(/usr/include/wanpipe)
|
|
||||||
ENDIF(DEFINED WIN32)
|
|
||||||
TARGET_LINK_LIBRARIES(ftmod_wanpipe sangoma ${PROJECT_NAME})
|
|
||||||
ENDIF(DEFINED LIBSANGOMA)
|
|
||||||
|
|
||||||
IF(DEFINED HAVE_SCTP)
|
|
||||||
ADD_LIBRARY(ftmod_sangoma_boost MODULE
|
|
||||||
${ftmod_DIR}/ftmod_sangoma_boost/sangoma_boost_client.c
|
|
||||||
${ftmod_DIR}/ftmod_sangoma_boost/ftmod_sangoma_boost.c
|
|
||||||
)
|
|
||||||
TARGET_LINK_LIBRARIES(ftmod_sangoma_boost ${PROJECT_NAME})
|
|
||||||
ENDIF(DEFINED HAVE_SCTP)
|
|
||||||
|
|
||||||
IF(DEFINED LIBPRI)
|
|
||||||
ADD_LIBRARY(ftmod_libpri MODULE
|
|
||||||
${ftmod_DIR}/ftmod_libpri/libpri_client.c
|
|
||||||
${ftmod_DIR}/ftmod_libpri/ftmod_libpri.c
|
|
||||||
)
|
|
||||||
TARGET_LINK_LIBRARIES(ftmod_libpri ${PROJECT_NAME})
|
|
||||||
ENDIF(DEFINED LIBPRI)
|
|
||||||
|
|
||||||
IF(DEFINED PRITAP)
|
|
||||||
ADD_LIBRARY(ftmod_pritap MODULE
|
|
||||||
${ftmod_DIR}/ftmod_pritap/pritap_client.c
|
|
||||||
${ftmod_DIR}/ftmod_pritap/ftmod_pritap.c
|
|
||||||
)
|
|
||||||
TARGET_LINK_LIBRARIES(ftmod_pritap ${PROJECT_NAME} pri)
|
|
||||||
ENDIF(DEFINED PRITAP)
|
|
||||||
|
|
||||||
IF(DEFINED SNGSS7)
|
|
||||||
ADD_LIBRARY(ftmod_sangoma_ss7 MODULE
|
|
||||||
${ftmod_DIR}/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c
|
|
||||||
${ftmod_DIR}/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c
|
|
||||||
${ftmod_DIR}/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c
|
|
||||||
${ftmod_DIR}/ftmod_sangoma_ss7/ftmod_sangoma_ss7_in.c
|
|
||||||
${ftmod_DIR}/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c
|
|
||||||
${ftmod_DIR}/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cntrl.c
|
|
||||||
${ftmod_DIR}/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c
|
|
||||||
${ftmod_DIR}/ftmod_sangoma_ss7/ftmod_sangoma_ss7_timers.c
|
|
||||||
${ftmod_DIR}/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c
|
|
||||||
${ftmod_DIR}/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cfg.c
|
|
||||||
${ftmod_DIR}/ftmod_sangoma_ss7/ftmod_sangoma_ss7_sta.c
|
|
||||||
${ftmod_DIR}/ftmod_sangoma_ss7/ftmod_sangoma_ss7_sts.c
|
|
||||||
${ftmod_DIR}/ftmod_sangoma_ss7/ftmod_sangoma_ss7_logger.c
|
|
||||||
)
|
|
||||||
IF(NOT DEFINED WIN32)
|
|
||||||
ADD_DEFINITIONS(-D_GNU_SOURCE)
|
|
||||||
ENDIF(NOT DEFINED WIN32)
|
|
||||||
TARGET_LINK_LIBRARIES(ftmod_sangoma_ss7 ${PROJECT_NAME} sng_ss7)
|
|
||||||
ENDIF(DEFINED SNGSS7)
|
|
||||||
|
|
||||||
IF(DEFINED SNGISDN)
|
|
||||||
ADD_LIBRARY(ftmod_sangoma_isdn MODULE
|
|
||||||
${ftmod_DIR}/ftmod_sangoma_isdn/ftmod_sangoma_isdn.c
|
|
||||||
${ftmod_DIR}/ftmod_sangoma_isdn/ftmod_sangoma_isdn_cfg.c
|
|
||||||
${ftmod_DIR}/ftmod_sangoma_isdn/ftmod_sangoma_isdn_cntrl.c
|
|
||||||
${ftmod_DIR}/ftmod_sangoma_isdn/ftmod_sangoma_isdn_trace.c
|
|
||||||
${ftmod_DIR}/ftmod_sangoma_isdn/ftmod_sangoma_isdn_support.c
|
|
||||||
${ftmod_DIR}/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_cntrl.c
|
|
||||||
${ftmod_DIR}/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_cfg.c
|
|
||||||
${ftmod_DIR}/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_rcv.c
|
|
||||||
${ftmod_DIR}/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_hndl.c
|
|
||||||
${ftmod_DIR}/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_out.c
|
|
||||||
)
|
|
||||||
IF(NOT DEFINED WIN32)
|
|
||||||
ADD_DEFINITIONS(-D_GNU_SOURCE)
|
|
||||||
ENDIF(NOT DEFINED WIN32)
|
|
||||||
TARGET_LINK_LIBRARIES(ftmod_sangoma_isdn ${PROJECT_NAME} sng_isdn)
|
|
||||||
ENDIF(DEFINED SNGISDN)
|
|
||||||
|
|
||||||
IF(DEFINED OPENR2)
|
|
||||||
ADD_LIBRARY(ftmod_r2 MODULE ${ftmod_DIR}/ftmod_r2/ftmod_r2.c)
|
|
||||||
TARGET_LINK_LIBRARIES(ftmod_r2 ${PROJECT_NAME} openr2)
|
|
||||||
ENDIF(DEFINED OPENR2)
|
|
|
@ -1,290 +0,0 @@
|
||||||
# Copyright (c) 2007-2014, Anthony Minessale II
|
|
||||||
# All rights reserved.
|
|
||||||
#
|
|
||||||
# Redistribution and use in source and binary forms, with or without
|
|
||||||
# modification, are permitted provided that the following conditions
|
|
||||||
# are met:
|
|
||||||
#
|
|
||||||
# * Redistributions of source code must retain the above copyright
|
|
||||||
# notice, this list of conditions and the following disclaimer.
|
|
||||||
#
|
|
||||||
# * Redistributions in binary form must reproduce the above copyright
|
|
||||||
# notice, this list of conditions and the following disclaimer in the
|
|
||||||
# documentation and/or other materials provided with the distribution.
|
|
||||||
#
|
|
||||||
# * Neither the name of the original author; nor the names of any contributors
|
|
||||||
# may be used to endorse or promote products derived from this software
|
|
||||||
# without specific prior written permission.
|
|
||||||
#
|
|
||||||
#
|
|
||||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
|
||||||
# OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
|
||||||
# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
||||||
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
|
||||||
# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
||||||
# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
||||||
# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
||||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
ACLOCAL_AMFLAGS = -I build
|
|
||||||
AUTOMAKE_OPTIONS = foreign
|
|
||||||
|
|
||||||
SRC = src
|
|
||||||
|
|
||||||
moddir = @modinstdir@
|
|
||||||
libdir = @libdir@
|
|
||||||
library_includedir = $(prefix)/include
|
|
||||||
|
|
||||||
INCS = -I$(FT_SRCDIR)/$(SRC)/include -I$(FT_SRCDIR)/$(SRC)/include/private
|
|
||||||
|
|
||||||
# we needed to separate CFLAGS in FTDM_COMPAT_CFLAGS and FTDM_CFLAGS due to -c99 which causes problems with wanpipe headers
|
|
||||||
FTDM_COMPAT_CFLAGS = $(INCS) -DFTDM_CONFIG_DIR=\"@confdir@\" -DFTDM_MOD_DIR=\"$(moddir)\" @COMP_VENDOR_COMPAT_CFLAGS@ @DEFS@
|
|
||||||
FTDM_CFLAGS = $(INCS) -DFTDM_CONFIG_DIR=\"@confdir@\" -DFTDM_MOD_DIR=\"$(moddir)\" @COMP_VENDOR_CFLAGS@ @DEFS@
|
|
||||||
COMPILE = $(CC) $(FTDM_CFLAGS)
|
|
||||||
LTCOMPILE = $(LIBTOOL) --mode=compile --tag=CC $(COMPILE)
|
|
||||||
LINK = $(LIBTOOL) --mode=link --tag=CC $(CC) $(FTDM_CFLAGS) $(LDFLAGS) -o $@
|
|
||||||
|
|
||||||
|
|
||||||
#
|
|
||||||
# GNU pkgconfig file
|
|
||||||
#
|
|
||||||
EXTRA_DIST = freetdm.pc.in
|
|
||||||
|
|
||||||
pkgconfigdir = @pkgconfigdir@
|
|
||||||
pkgconfig_DATA = freetdm.pc
|
|
||||||
|
|
||||||
|
|
||||||
#
|
|
||||||
# libfreetdm
|
|
||||||
#
|
|
||||||
libfreetdm_la_SOURCES = \
|
|
||||||
$(SRC)/hashtable.c \
|
|
||||||
$(SRC)/hashtable_itr.c \
|
|
||||||
$(SRC)/ftdm_io.c \
|
|
||||||
$(SRC)/ftdm_state.c \
|
|
||||||
$(SRC)/ftdm_queue.c \
|
|
||||||
$(SRC)/ftdm_sched.c \
|
|
||||||
$(SRC)/ftdm_call_utils.c \
|
|
||||||
$(SRC)/ftdm_variables.c \
|
|
||||||
$(SRC)/ftdm_config.c \
|
|
||||||
$(SRC)/ftdm_callerid.c \
|
|
||||||
$(SRC)/fsk.c \
|
|
||||||
$(SRC)/uart.c \
|
|
||||||
$(SRC)/g711.c \
|
|
||||||
$(SRC)/libteletone_detect.c \
|
|
||||||
$(SRC)/libteletone_generate.c \
|
|
||||||
$(SRC)/ftdm_buffer.c \
|
|
||||||
$(SRC)/ftdm_threadmutex.c \
|
|
||||||
$(SRC)/ftdm_dso.c \
|
|
||||||
$(SRC)/ftdm_cpu_monitor.c \
|
|
||||||
$(SRC)/ftdm_backtrace.c
|
|
||||||
|
|
||||||
library_include_HEADERS = \
|
|
||||||
$(SRC)/include/freetdm.h \
|
|
||||||
$(SRC)/include/ftdm_declare.h \
|
|
||||||
$(SRC)/include/ftdm_threadmutex.h \
|
|
||||||
$(SRC)/include/ftdm_os.h \
|
|
||||||
$(SRC)/include/ftdm_call_utils.h \
|
|
||||||
$(SRC)/include/ftdm_dso.h
|
|
||||||
|
|
||||||
lib_LTLIBRARIES = libfreetdm.la
|
|
||||||
libfreetdm_la_CFLAGS = $(FTDM_CFLAGS) $(AM_CFLAGS)
|
|
||||||
libfreetdm_la_LDFLAGS = -version-info 1:0:0 $(AM_LDFLAGS)
|
|
||||||
libfreetdm_la_LIBADD = $(LIBS)
|
|
||||||
|
|
||||||
core: libfreetdm.la
|
|
||||||
core-install: install-libLTLIBRARIES
|
|
||||||
|
|
||||||
#
|
|
||||||
# tools & test programs
|
|
||||||
#
|
|
||||||
noinst_PROGRAMS = testtones detect_tones detect_dtmf testpri testr2 testanalog testapp testcid
|
|
||||||
|
|
||||||
testapp_SOURCES = $(SRC)/testapp.c
|
|
||||||
testapp_LDADD = libfreetdm.la
|
|
||||||
testapp_CFLAGS = $(FTDM_CFLAGS) $(AM_CFLAGS)
|
|
||||||
|
|
||||||
testcid_SOURCES = $(SRC)/testcid.c
|
|
||||||
testcid_LDADD = libfreetdm.la
|
|
||||||
testcid_CFLAGS = $(FTDM_CFLAGS) $(AM_CFLAGS)
|
|
||||||
|
|
||||||
testtones_SOURCES = $(SRC)/testtones.c
|
|
||||||
testtones_LDADD = libfreetdm.la
|
|
||||||
testtones_CFLAGS = $(FTDM_CFLAGS) $(AM_CFLAGS)
|
|
||||||
|
|
||||||
detect_tones_SOURCES = $(SRC)/detect_tones.c
|
|
||||||
detect_tones_LDADD = libfreetdm.la
|
|
||||||
detect_tones_CFLAGS = $(FTDM_CFLAGS) $(AM_CFLAGS)
|
|
||||||
|
|
||||||
detect_dtmf_SOURCES = $(SRC)/detect_dtmf.c
|
|
||||||
detect_dtmf_LDADD = libfreetdm.la
|
|
||||||
detect_dtmf_CFLAGS = $(FTDM_CFLAGS) $(AM_CFLAGS)
|
|
||||||
|
|
||||||
#testisdn_SOURCES = $(SRC)/testisdn.c
|
|
||||||
#testisdn_LDADD = libfreetdm.la
|
|
||||||
#testisdn_CFLAGS = $(FTDM_CFLAGS) $(AM_CFLAGS)
|
|
||||||
|
|
||||||
testpri_SOURCES = $(SRC)/testpri.c
|
|
||||||
testpri_LDADD = libfreetdm.la
|
|
||||||
testpri_CFLAGS = $(FTDM_CFLAGS) $(AM_CFLAGS)
|
|
||||||
|
|
||||||
testr2_SOURCES = $(SRC)/testr2.c
|
|
||||||
testr2_LDADD = libfreetdm.la
|
|
||||||
testr2_CFLAGS = $(FTDM_CFLAGS) $(AM_CFLAGS)
|
|
||||||
|
|
||||||
testanalog_SOURCES = $(SRC)/testanalog.c
|
|
||||||
testanalog_LDADD = libfreetdm.la
|
|
||||||
testanalog_CFLAGS = $(FTDM_CFLAGS) $(AM_CFLAGS)
|
|
||||||
|
|
||||||
#
|
|
||||||
# ftmod modules
|
|
||||||
#
|
|
||||||
mod_LTLIBRARIES = ftmod_zt.la ftmod_skel.la ftmod_analog.la ftmod_analog_em.la
|
|
||||||
|
|
||||||
ftmod_zt_la_SOURCES = $(SRC)/ftmod/ftmod_zt/ftmod_zt.c
|
|
||||||
ftmod_zt_la_CFLAGS = $(FTDM_CFLAGS) $(AM_CFLAGS)
|
|
||||||
ftmod_zt_la_LDFLAGS = -shared -module -avoid-version
|
|
||||||
ftmod_zt_la_LIBADD = libfreetdm.la
|
|
||||||
|
|
||||||
ftmod_skel_la_SOURCES = $(SRC)/ftmod/ftmod_skel/ftmod_skel.c
|
|
||||||
ftmod_skel_la_CFLAGS = $(FTDM_CFLAGS) $(AM_CFLAGS)
|
|
||||||
ftmod_skel_la_LDFLAGS = -shared -module -avoid-version
|
|
||||||
ftmod_skel_la_LIBADD = libfreetdm.la
|
|
||||||
|
|
||||||
ftmod_analog_la_SOURCES = $(SRC)/ftmod/ftmod_analog/ftmod_analog.c
|
|
||||||
ftmod_analog_la_CFLAGS = $(FTDM_CFLAGS) $(AM_CFLAGS)
|
|
||||||
ftmod_analog_la_LDFLAGS = -shared -module -avoid-version
|
|
||||||
ftmod_analog_la_LIBADD = libfreetdm.la
|
|
||||||
|
|
||||||
ftmod_analog_em_la_SOURCES = $(SRC)/ftmod/ftmod_analog_em/ftmod_analog_em.c
|
|
||||||
ftmod_analog_em_la_CFLAGS = $(FTDM_CFLAGS) $(AM_CFLAGS)
|
|
||||||
ftmod_analog_em_la_LDFLAGS = -shared -module -avoid-version
|
|
||||||
ftmod_analog_em_la_LIBADD = libfreetdm.la
|
|
||||||
|
|
||||||
if HAVE_LIBSANGOMA
|
|
||||||
mod_LTLIBRARIES += ftmod_wanpipe.la
|
|
||||||
ftmod_wanpipe_la_SOURCES = $(SRC)/ftmod/ftmod_wanpipe/ftmod_wanpipe.c
|
|
||||||
# some structures within Wanpipe drivers are not c99 compatible, so we need to compile ftmod_wanpipe
|
|
||||||
# without c99 flags, use FTDM_COMPAT_CFLAGS instead
|
|
||||||
ftmod_wanpipe_la_CFLAGS = $(FTDM_COMPAT_CFLAGS) $(AM_CFLAGS) -D__LINUX__ -I/usr/include/wanpipe
|
|
||||||
ftmod_wanpipe_la_LDFLAGS = -shared -module -avoid-version
|
|
||||||
ftmod_wanpipe_la_LIBADD = libfreetdm.la -lsangoma
|
|
||||||
endif
|
|
||||||
|
|
||||||
if HAVE_LIBISDN
|
|
||||||
mod_LTLIBRARIES += ftmod_isdn.la
|
|
||||||
ftmod_isdn_la_SOURCES = $(SRC)/ftmod/ftmod_isdn/ftmod_isdn.c
|
|
||||||
ftmod_isdn_la_CFLAGS = $(FTDM_CFLAGS) $(AM_CFLAGS) -D_GNU_SOURCE $(LIBISDN_CPPFLAGS) $(PCAP_CPPFLAGS)
|
|
||||||
ftmod_isdn_la_LDFLAGS = -shared -module -avoid-version $(LIBISDN_LDFLAGS) $(PCAP_LDFLAGS)
|
|
||||||
ftmod_isdn_la_LIBADD = libfreetdm.la $(LIBISDN_LIBS) $(PCAP_LIBS)
|
|
||||||
endif
|
|
||||||
|
|
||||||
if HAVE_LIBPRI
|
|
||||||
mod_LTLIBRARIES += ftmod_libpri.la
|
|
||||||
ftmod_libpri_la_SOURCES = $(SRC)/ftmod/ftmod_libpri/ftmod_libpri.c $(SRC)/ftmod/ftmod_libpri/lpwrap_pri.c
|
|
||||||
ftmod_libpri_la_CFLAGS = $(FTDM_CFLAGS) $(AM_CFLAGS) $(LIBPRI_CPPFLAGS)
|
|
||||||
ftmod_libpri_la_LDFLAGS = -shared -module -avoid-version $(LIBPRI_LDFLAGS)
|
|
||||||
ftmod_libpri_la_LIBADD = libfreetdm.la $(LIBPRI_LIBS)
|
|
||||||
endif
|
|
||||||
|
|
||||||
if HAVE_PRITAP
|
|
||||||
mod_LTLIBRARIES += ftmod_pritap.la
|
|
||||||
ftmod_pritap_la_SOURCES = $(SRC)/ftmod/ftmod_pritap/ftmod_pritap.c
|
|
||||||
ftmod_pritap_la_CFLAGS = $(FTDM_CFLAGS) $(AM_CFLAGS)
|
|
||||||
ftmod_pritap_la_LDFLAGS = -shared -module -avoid-version
|
|
||||||
ftmod_pritap_la_LIBADD = libfreetdm.la -lpri
|
|
||||||
endif
|
|
||||||
|
|
||||||
if HAVE_SNG_SS7
|
|
||||||
mod_LTLIBRARIES += ftmod_sangoma_ss7.la
|
|
||||||
ftmod_sangoma_ss7_la_SOURCES = \
|
|
||||||
$(SRC)/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c \
|
|
||||||
$(SRC)/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c \
|
|
||||||
$(SRC)/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c \
|
|
||||||
$(SRC)/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_in.c \
|
|
||||||
$(SRC)/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c \
|
|
||||||
$(SRC)/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cntrl.c \
|
|
||||||
$(SRC)/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c \
|
|
||||||
$(SRC)/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_timers.c \
|
|
||||||
$(SRC)/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c \
|
|
||||||
$(SRC)/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cfg.c \
|
|
||||||
$(SRC)/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_sta.c \
|
|
||||||
$(SRC)/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_sts.c \
|
|
||||||
$(SRC)/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_logger.c \
|
|
||||||
$(SRC)/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua_xml.c \
|
|
||||||
$(SRC)/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_m2ua.c \
|
|
||||||
$(SRC)/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_relay.c
|
|
||||||
|
|
||||||
ftmod_sangoma_ss7_la_CFLAGS = $(FTDM_CFLAGS) $(AM_CFLAGS) -D_GNU_SOURCE
|
|
||||||
ftmod_sangoma_ss7_la_LDFLAGS = -shared -module -avoid-version
|
|
||||||
ftmod_sangoma_ss7_la_LIBADD = libfreetdm.la -lsng_ss7
|
|
||||||
endif
|
|
||||||
|
|
||||||
if HAVE_SNG_ISDN
|
|
||||||
mod_LTLIBRARIES += ftmod_sangoma_isdn.la
|
|
||||||
ftmod_sangoma_isdn_la_SOURCES = \
|
|
||||||
$(SRC)/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn.c \
|
|
||||||
$(SRC)/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_cfg.c \
|
|
||||||
$(SRC)/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_cntrl.c \
|
|
||||||
$(SRC)/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_trace.c \
|
|
||||||
$(SRC)/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_transfer.c \
|
|
||||||
$(SRC)/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_support.c \
|
|
||||||
$(SRC)/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_cntrl.c \
|
|
||||||
$(SRC)/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_cfg.c \
|
|
||||||
$(SRC)/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_rcv.c \
|
|
||||||
$(SRC)/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_hndl.c \
|
|
||||||
$(SRC)/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_out.c
|
|
||||||
|
|
||||||
ftmod_sangoma_isdn_la_CFLAGS = $(FTDM_CFLAGS) $(AM_CFLAGS) -D_GNU_SOURCE
|
|
||||||
ftmod_sangoma_isdn_la_LDFLAGS = -shared -module -avoid-version
|
|
||||||
ftmod_sangoma_isdn_la_LIBADD = libfreetdm.la -lsng_isdn
|
|
||||||
endif
|
|
||||||
|
|
||||||
if HAVE_OPENR2
|
|
||||||
mod_LTLIBRARIES += ftmod_r2.la
|
|
||||||
ftmod_r2_la_SOURCES = $(SRC)/ftmod/ftmod_r2/ftmod_r2.c $(SRC)/ftmod/ftmod_r2/ftmod_r2_io_mf_lib.c
|
|
||||||
ftmod_r2_la_CFLAGS = $(FTDM_CFLAGS) $(AM_CFLAGS)
|
|
||||||
ftmod_r2_la_LDFLAGS = -shared -module -avoid-version
|
|
||||||
ftmod_r2_la_LIBADD = libfreetdm.la -lopenr2
|
|
||||||
endif
|
|
||||||
|
|
||||||
if HAVE_WAT
|
|
||||||
mod_LTLIBRARIES += ftmod_gsm.la
|
|
||||||
ftmod_gsm_la_SOURCES = $(SRC)/ftmod/ftmod_gsm/ftmod_gsm.c
|
|
||||||
ftmod_gsm_la_CFLAGS = $(FTDM_CFLAGS) $(AM_CFLAGS)
|
|
||||||
ftmod_gsm_la_LDFLAGS = -shared -module -avoid-version
|
|
||||||
ftmod_gsm_la_LIBADD = libfreetdm.la -lwat
|
|
||||||
endif
|
|
||||||
|
|
||||||
if HAVE_MISDN
|
|
||||||
mod_LTLIBRARIES += ftmod_misdn.la
|
|
||||||
ftmod_misdn_la_SOURCES = $(SRC)/ftmod/ftmod_misdn/ftmod_misdn.c
|
|
||||||
ftmod_misdn_la_CFLAGS = $(FTDM_CFLAGS) $(AM_CFLAGS) $(MISDN_CFLAGS) -D_GNU_SOURCE
|
|
||||||
ftmod_misdn_la_LDFLAGS = -shared -module -avoid-version
|
|
||||||
ftmod_misdn_la_LIBADD = libfreetdm.la
|
|
||||||
endif
|
|
||||||
|
|
||||||
dox doxygen:
|
|
||||||
doxygen $(FT_SRCDIR)/docs/Doxygen.conf
|
|
||||||
|
|
||||||
mod_freetdm/mod_freetdm.so: libfreetdm.la mod_freetdm/mod_freetdm.c
|
|
||||||
$(MAKE) -C mod_freetdm
|
|
||||||
|
|
||||||
mod_freetdm: mod_freetdm/mod_freetdm.so
|
|
||||||
|
|
||||||
mod_freetdm-install: mod_freetdm
|
|
||||||
$(MAKE) -C mod_freetdm install
|
|
||||||
|
|
||||||
mod_freetdm-clean:
|
|
||||||
@if [ -f mod_freetdm/mod_freetdm.so ] ; then \
|
|
||||||
$(MAKE) -C mod_freetdm clean ; \
|
|
||||||
fi
|
|
||||||
|
|
||||||
install-data-local:
|
|
||||||
$(mkinstalldirs) $(DESTDIR)$(prefix)
|
|
||||||
$(mkinstalldirs) $(DESTDIR)@confdir@
|
|
||||||
@[ -f "$(DESTDIR)@confdir@/freetdm.conf" ] || ( cp conf/*.conf $(DESTDIR)@confdir@)
|
|
||||||
@echo FreeTDM Installed
|
|
|
@ -1,3 +0,0 @@
|
||||||
FreeTDM
|
|
||||||
http://wiki.freeswitch.org/wiki/FreeTDM
|
|
||||||
|
|
|
@ -1,22 +0,0 @@
|
||||||
== Interface inconsistency ==
|
|
||||||
- enum_id member of ftdm_event_t is inconsistent. Most of the time is just for OOB events, the only other
|
|
||||||
type of event as of now is FTDM_EVENT_DTMF and is not using the enum_id member. I think we can get rid
|
|
||||||
of the FTDM_EVENT_DTMF and create ftdm_dtmf_event_t type instead of reusing ftdm_event_t
|
|
||||||
then ftdm_event_t would be renamed to ftdm_oob_event_t and the enum_id renamed to type, then ftdm_span_next_event()
|
|
||||||
will only return OOB events
|
|
||||||
|
|
||||||
- Deprecate last_error members.
|
|
||||||
It requires a lot of discipline to set the last_error string for every failure.
|
|
||||||
It does not add much value to the user either, most of the errors are criptic and
|
|
||||||
cannot be shown to end users, we already provide extensive logging for problem
|
|
||||||
troubleshooting.
|
|
||||||
|
|
||||||
- Implement threaded IO.
|
|
||||||
Currently IO modules only work on-demand, where the user (ie, FreeSWITCH) drives the read/write
|
|
||||||
of media. If the user stops reading, some functions are not possible
|
|
||||||
(DTMF detection or Hangup tone detection). It would be useful to implement a FreeTDM mode
|
|
||||||
where the media is driven by a group of threads that are always reading (and possibly writing)
|
|
||||||
then when the user does ftdm_channel_read(), the media would be read from the buffers filled
|
|
||||||
by the media thread and not from the underlying IO device, this gives a chance to FreeTDM to
|
|
||||||
still perform hangup detection or other media services even if the application is not reading.
|
|
||||||
|
|
|
@ -1,2 +0,0 @@
|
||||||
m4_include([build/ax_compiler_vendor.m4])
|
|
||||||
m4_include([build/libpcap.m4])
|
|
|
@ -1,6 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
autoheader
|
|
||||||
libtoolize --force --copy
|
|
||||||
aclocal
|
|
||||||
automake -f --copy --add-missing
|
|
||||||
autoconf
|
|
|
@ -1,15 +0,0 @@
|
||||||
AC_DEFUN([AX_COMPILER_VENDOR],
|
|
||||||
[
|
|
||||||
AC_CACHE_CHECK([for _AC_LANG compiler vendor], ax_cv_[]_AC_LANG_ABBREV[]_compiler_vendor,
|
|
||||||
[ax_cv_[]_AC_LANG_ABBREV[]_compiler_vendor=unknown
|
|
||||||
# note: don't check for gcc first since some other compilers define __GNUC__
|
|
||||||
for ventest in intel:__ICC,__ECC,__INTEL_COMPILER ibm:__xlc__,__xlC__,__IBMC__,__IBMCPP__ gnu:__GNUC__ sun:__SUNPRO_C,__SUNPRO_CC hp:__HP_cc,__HP_aCC dec:__DECC,__DECCXX,__DECC_VER,__DECCXX_VER borland:__BORLANDC__,__TURBOC__ comeau:__COMO__ cray:_CRAYC kai:__KCC lcc:__LCC__ metrowerks:__MWERKS__ sgi:__sgi,sgi microsoft:_MSC_VER watcom:__WATCOMC__ portland:__PGI; do
|
|
||||||
vencpp="defined("`echo $ventest | cut -d: -f2 | sed 's/,/) || defined(/g'`")"
|
|
||||||
AC_COMPILE_IFELSE([AC_LANG_PROGRAM(,[
|
|
||||||
#if !($vencpp)
|
|
||||||
thisisanerror;
|
|
||||||
#endif
|
|
||||||
])], [ax_cv_]_AC_LANG_ABBREV[_compiler_vendor=`echo $ventest | cut -d: -f1`; break])
|
|
||||||
done
|
|
||||||
])
|
|
||||||
])
|
|
|
@ -1,150 +0,0 @@
|
||||||
dnl libpcap.m4--PCAP libraries and includes
|
|
||||||
dnl Derrick Brashear
|
|
||||||
dnl from KTH krb and Arla
|
|
||||||
dnl $Id: libpcap.m4,v 1.4 2006/01/20 20:21:09 snsimon Exp $
|
|
||||||
dnl 2010/10/31 (stkn):
|
|
||||||
dnl rename: PCAP_INC_FLAGS -> PCAP_CPPFLAGS
|
|
||||||
dnl rename: PCAP_LIB_FLAGS -> PCAP_LDFLAGS (-L flags only)
|
|
||||||
dnl add: PCAP_LIBS (libs only)
|
|
||||||
|
|
||||||
AC_DEFUN([PCAP_INC_WHERE1], [
|
|
||||||
ac_cv_found_pcap_inc=no
|
|
||||||
if test -f "$1/pcap.h" ; then
|
|
||||||
ac_cv_found_pcap_inc=yes
|
|
||||||
fi
|
|
||||||
])
|
|
||||||
|
|
||||||
AC_DEFUN([PCAP_INC_WHERE], [
|
|
||||||
for i in $1; do
|
|
||||||
AC_MSG_CHECKING(for pcap header in $i)
|
|
||||||
PCAP_INC_WHERE1($i)
|
|
||||||
if test "$ac_cv_found_pcap_inc" = "yes"; then
|
|
||||||
ac_cv_pcap_where_inc=$i
|
|
||||||
AC_MSG_RESULT(found)
|
|
||||||
break
|
|
||||||
else
|
|
||||||
AC_MSG_RESULT(no found)
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
])
|
|
||||||
|
|
||||||
AC_DEFUN([PCAP_LIB_WHERE1], [
|
|
||||||
saved_LIBS=$LIBS
|
|
||||||
LIBS="$saved_LIBS -L$1 -lpcap"
|
|
||||||
AC_TRY_LINK(,
|
|
||||||
[pcap_lookupdev("");],
|
|
||||||
[ac_cv_found_pcap_lib=yes],
|
|
||||||
ac_cv_found_pcap_lib=no)
|
|
||||||
LIBS=$saved_LIBS
|
|
||||||
])
|
|
||||||
|
|
||||||
AC_DEFUN([TEST_LIBPATH], [
|
|
||||||
changequote(<<, >>)
|
|
||||||
define(<<AC_CV_FOUND>>, translit(ac_cv_found_$2_lib, <<- *>>, <<__p>>))
|
|
||||||
changequote([, ])
|
|
||||||
if test "$AC_CV_FOUND" = "yes"; then
|
|
||||||
if test \! -r "$1/lib$2.a" -a \! -r "$1/lib$2.so" -a \! -r "$1/lib$2.sl" -a \! -r "$1/lib$2.dylib"; then
|
|
||||||
AC_CV_FOUND=no
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
])
|
|
||||||
|
|
||||||
|
|
||||||
AC_DEFUN([PCAP_LIB_WHERE], [
|
|
||||||
for i in $1; do
|
|
||||||
AC_MSG_CHECKING(for pcap library in $i)
|
|
||||||
PCAP_LIB_WHERE1($i)
|
|
||||||
TEST_LIBPATH($i, pcap)
|
|
||||||
if test "$ac_cv_found_pcap_lib" = "yes" ; then
|
|
||||||
ac_cv_pcap_where_lib=$i
|
|
||||||
AC_MSG_RESULT(found)
|
|
||||||
break
|
|
||||||
else
|
|
||||||
AC_MSG_RESULT(no found)
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
])
|
|
||||||
|
|
||||||
AC_DEFUN([FIND_LIB_SUBDIR],
|
|
||||||
[dnl
|
|
||||||
AC_ARG_WITH([lib-subdir], AC_HELP_STRING([--with-lib-subdir=DIR],[Find libraries in DIR instead of lib]))
|
|
||||||
AC_CHECK_SIZEOF(long)
|
|
||||||
AC_CACHE_CHECK([what directory libraries are found in], [ac_cv_cmu_lib_subdir],
|
|
||||||
[test "X$with_lib_subdir" = "Xyes" && with_lib_subdir=
|
|
||||||
test "X$with_lib_subdir" = "Xno" && with_lib_subdir=
|
|
||||||
if test "X$with_lib_subdir" = "X" ; then
|
|
||||||
ac_cv_cmu_lib_subdir=lib
|
|
||||||
if test $ac_cv_sizeof_long -eq 4 ; then
|
|
||||||
test -d /usr/lib32 && ac_cv_cmu_lib_subdir=lib32
|
|
||||||
test -r /usr/lib/libpcap.so && ac_cv_cmu_lib_subdir=lib
|
|
||||||
fi
|
|
||||||
if test $ac_cv_sizeof_long -eq 8 ; then
|
|
||||||
test -d /usr/lib64 && ac_cv_cmu_lib_subdir=lib64
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
ac_cv_cmu_lib_subdir=$with_lib_subdir
|
|
||||||
fi])
|
|
||||||
AC_SUBST(LIB_SUBDIR, $ac_cv_cmu_lib_subdir)
|
|
||||||
])
|
|
||||||
|
|
||||||
|
|
||||||
AC_DEFUN([AX_LIB_PCAP], [
|
|
||||||
AC_REQUIRE([FIND_LIB_SUBDIR])
|
|
||||||
AC_ARG_WITH(pcap,
|
|
||||||
[ --with-pcap=PREFIX Compile with PCAP support],
|
|
||||||
[if test "X$with_pcap" = "X"; then
|
|
||||||
with_pcap=yes
|
|
||||||
fi])
|
|
||||||
AC_ARG_WITH(pcap-lib,
|
|
||||||
[ --with-pcap-lib=dir use pcap libraries in dir],
|
|
||||||
[if test "$withval" = "yes" -o "$withval" = "no"; then
|
|
||||||
AC_MSG_ERROR([No argument for --with-pcap-lib])
|
|
||||||
fi])
|
|
||||||
AC_ARG_WITH(pcap-include,
|
|
||||||
[ --with-pcap-include=dir use pcap headers in dir],
|
|
||||||
[if test "$withval" = "yes" -o "$withval" = "no"; then
|
|
||||||
AC_MSG_ERROR([No argument for --with-pcap-include])
|
|
||||||
fi])
|
|
||||||
|
|
||||||
if test "X$with_pcap" != "X"; then
|
|
||||||
if test "$with_pcap" != "yes"; then
|
|
||||||
ac_cv_pcap_where_lib=$with_pcap
|
|
||||||
ac_cv_pcap_where_inc=$with_pcap/include
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test "X$with_pcap_lib" != "X"; then
|
|
||||||
ac_cv_pcap_where_lib=$with_pcap_lib
|
|
||||||
fi
|
|
||||||
if test "X$ac_cv_pcap_where_lib" = "X"; then
|
|
||||||
PCAP_LIB_WHERE(/usr/$LIB_SUBDIR /usr/local/$LIB_SUBDIR)
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test "X$with_pcap_include" != "X"; then
|
|
||||||
ac_cv_pcap_where_inc=$with_pcap_include
|
|
||||||
fi
|
|
||||||
if test "X$ac_cv_pcap_where_inc" = "X"; then
|
|
||||||
PCAP_INC_WHERE(/usr/ng/include /usr/include /usr/local/include)
|
|
||||||
fi
|
|
||||||
|
|
||||||
AC_MSG_CHECKING(whether to include pcap)
|
|
||||||
if test "X$ac_cv_pcap_where_lib" != "X" -a "X$ac_cv_pcap_where_inc" != "X"; then
|
|
||||||
ac_cv_found_pcap=yes
|
|
||||||
AC_MSG_RESULT(yes)
|
|
||||||
PCAP_INC_DIR=$ac_cv_pcap_where_inc
|
|
||||||
PCAP_LIB_DIR=$ac_cv_pcap_where_lib
|
|
||||||
PCAP_CPPFLAGS="-I${PCAP_INC_DIR}"
|
|
||||||
PCAP_LDFLAGS="-L${PCAP_LIB_DIR}"
|
|
||||||
PCAP_LIBS="-lpcap"
|
|
||||||
AC_SUBST(PCAP_INC_DIR)
|
|
||||||
AC_SUBST(PCAP_LIB_DIR)
|
|
||||||
AC_SUBST(PCAP_CPPFLAGS)
|
|
||||||
AC_SUBST(PCAP_LDFLAGS)
|
|
||||||
AC_SUBST(PCAP_LIBS)
|
|
||||||
AC_DEFINE([HAVE_LIBPCAP],[1],[libpcap])
|
|
||||||
else
|
|
||||||
ac_cv_found_pcap=no
|
|
||||||
AC_MSG_RESULT(no)
|
|
||||||
fi
|
|
||||||
])
|
|
||||||
|
|
|
@ -1,82 +0,0 @@
|
||||||
; !! THIS IS A SAMPLE CONFIGURATION ONLY !!
|
|
||||||
|
|
||||||
; refer to http://wiki.freeswitch.org/wiki/FreeTDM for further documentation
|
|
||||||
|
|
||||||
[general]
|
|
||||||
; whether to launch a thread for CPU usage monitoring
|
|
||||||
cpu_monitor => no
|
|
||||||
|
|
||||||
; How often (in milliseconds) monitor CPU usage
|
|
||||||
cpu_monitoring_interval => 1000
|
|
||||||
|
|
||||||
; At what CPU percentage raise a CPU alarm
|
|
||||||
cpu_set_alarm_threshold => 80
|
|
||||||
|
|
||||||
; At what CPU percentage stop the CPU alarm
|
|
||||||
cpu_clear_alarm_threshold => 70
|
|
||||||
|
|
||||||
; Which action to take when the CPU alarm is raised
|
|
||||||
; it can be warn and/or reject calls
|
|
||||||
; cpu_alarm_action => warn,reject
|
|
||||||
cpu_alarm_action => warn
|
|
||||||
|
|
||||||
; Where to dump DTMF debug files (see per span debugdtmf=yes option)
|
|
||||||
debugdtmf_directory=/full/path/to/dtmf/directory
|
|
||||||
|
|
||||||
; spans are defined with [span <span type> <span name>]
|
|
||||||
; the span type can either be zt, wanpipe or pika
|
|
||||||
; the span name can be any unique string
|
|
||||||
[span wanpipe myWanpipe]
|
|
||||||
|
|
||||||
; valid trunk types are: FXO, FXS, EM, E1, T1, J1, BRI, BRI_PTMP
|
|
||||||
trunk_type => FXS
|
|
||||||
|
|
||||||
; add FXS channels from 3 to 4 at wanpipe span 1 to this freetdm span
|
|
||||||
fxs-channel => 1:3-4
|
|
||||||
|
|
||||||
; IO stats. Defaults to yes, you can print the stats with ftdm iostats print <span> <chan>
|
|
||||||
; This feature depends on the span IO type, currently only Wanpipe spans support it
|
|
||||||
; This may cause a warning to be printed once in a while if audio is not provided fast enough
|
|
||||||
; and causes the driver to transmit an idle frame (when there is no data provided by the application)
|
|
||||||
iostats => yes
|
|
||||||
|
|
||||||
[span wanpipe myWanpipe2]
|
|
||||||
trunk_type => FXO
|
|
||||||
; This number will be used as DNIS for FXO devices
|
|
||||||
fxo-channel => 1:1-2
|
|
||||||
|
|
||||||
[span zt myZaptelSpan]
|
|
||||||
number => 9999
|
|
||||||
fxs-channel => 1
|
|
||||||
|
|
||||||
[span zt mySecondZaptelSpan]
|
|
||||||
; This number will be used as DNIS for FXO devices
|
|
||||||
number => 2
|
|
||||||
fxo-channel => 3
|
|
||||||
|
|
||||||
; MFC-R2 typical span configuration
|
|
||||||
|
|
||||||
; MFC-R2 with wanpipe (Sangoma)
|
|
||||||
[span wanpipe myWanpipeSpan]
|
|
||||||
trunk_type => E1
|
|
||||||
cas-channel => 1-15:1101
|
|
||||||
cas-channel => 17-31:1101
|
|
||||||
|
|
||||||
; MFC-R2 with Zaptel/DAHDI
|
|
||||||
[span zt myWanpipeSpan]
|
|
||||||
trunk_type => E1
|
|
||||||
cas-channel => 1-15:1101
|
|
||||||
cas-channel => 17-31:1101
|
|
||||||
|
|
||||||
; generic channel parameters
|
|
||||||
; this parameters are accepted by any type of span/channel
|
|
||||||
; remember that for generic channel parameters only channels
|
|
||||||
; below the parameter within the span will be affected
|
|
||||||
|
|
||||||
; Channel audio gain
|
|
||||||
; rxgain => 0.0
|
|
||||||
; txgain => 0.0
|
|
||||||
|
|
||||||
; Whether to perform media dumps for DTMF debugging
|
|
||||||
; debugdtmf => yes
|
|
||||||
|
|
|
@ -1,633 +0,0 @@
|
||||||
<!-- Please refer to http://wiki.freeswitch.org/wiki/FreeTDM for further documentation -->
|
|
||||||
|
|
||||||
<!--
|
|
||||||
This is a sample FreeSWITCH XML configuration for FreeTDM
|
|
||||||
Remember you still need to configure freetdm.conf (no XML extension) in $prefix/conf/
|
|
||||||
directory of FreeSWITCH. The freetdm.conf (no XML extension) is a simple text file
|
|
||||||
definining the I/O interfaces (Sangoma, DAHDI etc). This file (freetdm.conf.xml) deals
|
|
||||||
with the signaling protocols that you can run on top of your I/O interfaces.
|
|
||||||
-->
|
|
||||||
<configuration name="freetdm.conf" description="FreeTDM Configuration">
|
|
||||||
|
|
||||||
<settings>
|
|
||||||
<param name="debug" value="0"/>
|
|
||||||
<!--<param name="hold-music" value="$${moh_uri}"/>-->
|
|
||||||
<!-- Analog global options (they apply to all spans)
|
|
||||||
Remember you can only choose between either call-swap
|
|
||||||
or 3-way, not both!
|
|
||||||
-->
|
|
||||||
<!--<param name="enable-analog-option" value="call-swap"/>-->
|
|
||||||
<!--<param name="enable-analog-option" value="3-way"/>-->
|
|
||||||
<!--
|
|
||||||
Refuse to load the module if there is configuration errors
|
|
||||||
Defaults to 'no'
|
|
||||||
-->
|
|
||||||
<!--<param name="fail-on-error" value="no"/>-->
|
|
||||||
</settings>
|
|
||||||
|
|
||||||
<!-- Sample analog configuration (The analog_spans tag is for ftmod_analog) -->
|
|
||||||
<analog_spans>
|
|
||||||
<!-- The span name must match the name in your freetdm.conf -->
|
|
||||||
<span name="myAnalog">
|
|
||||||
<!--<param name="hold-music" value="$${moh_uri}"/>-->
|
|
||||||
<!--
|
|
||||||
3-way allows you to flash your FXS line and dial
|
|
||||||
another number and put all the parties in a conference
|
|
||||||
|
|
||||||
call-swap allows you to flash your FXS line and swap
|
|
||||||
between one call and another
|
|
||||||
|
|
||||||
Remember you can only choose between either call-swap
|
|
||||||
or 3-way, not both!
|
|
||||||
|
|
||||||
<param name="enable-analog-option" value="call-swap"/>
|
|
||||||
<param name="enable-analog-option" value="3-way"/>
|
|
||||||
-->
|
|
||||||
|
|
||||||
<!-- Tones are defined in tones.conf
|
|
||||||
This setting is very important for analog lines to
|
|
||||||
work properly
|
|
||||||
-->
|
|
||||||
<param name="tonegroup" value="us"/>
|
|
||||||
|
|
||||||
<!-- How much time to wait for digits (in FXS lines) -->
|
|
||||||
<param name="digit-timeout" value="2000"/>
|
|
||||||
|
|
||||||
<!-- Maximum number of digits to wait for (in FXS lines) -->
|
|
||||||
<param name="max-digits" value="11"/>
|
|
||||||
|
|
||||||
<!-- whether you want to wait for caller id -->
|
|
||||||
<param name="enable-callerid" value="true"/>
|
|
||||||
|
|
||||||
<!-- How much to wait for dial tone (0 if you just want to dial out immediately without waiting for dial tone) -->
|
|
||||||
<!--<param name="wait-dialtone-timeout" value="5000"/>-->
|
|
||||||
|
|
||||||
<!-- whether you want to enable callwaiting feature -->
|
|
||||||
<!--<param name="callwaiting" value="true"/>-->
|
|
||||||
|
|
||||||
<!-- whether you want to answer/hangup on polarity reverse for outgoing calls in FXO devices
|
|
||||||
and send polarity reverse on answer/hangup for incoming calls in FXS devices -->
|
|
||||||
<!--<param name="answer-polarity-reverse" value="false"/>-->
|
|
||||||
<!--<param name="hangup-polarity-reverse" value="false"/>-->
|
|
||||||
<!--
|
|
||||||
Minimum delay (in milliseconds) required between an answer polarity reverse
|
|
||||||
and hangup polarity reverse in order to assume the second polarity reverse is a real hangup
|
|
||||||
<param name="polarity-delay" value="600"/>
|
|
||||||
-->
|
|
||||||
|
|
||||||
<!-- Retrieve caller id on polarity reverse -->
|
|
||||||
<!--
|
|
||||||
<param name="polarity-callerid" value="true"/>
|
|
||||||
-->
|
|
||||||
|
|
||||||
<!-- regex to stop dialing when it matches -->
|
|
||||||
<!--<param name="dial-regex" value="5555"/>-->
|
|
||||||
|
|
||||||
<!-- regex to stop dialing when it does not match -->
|
|
||||||
<!--<param name="fail-dial-regex" value="^5"/>-->
|
|
||||||
|
|
||||||
<!-- FreeSWITCH dialplan type and context to send the calls -->
|
|
||||||
<param name="dialplan" value="XML"/>
|
|
||||||
<param name="context" value="default"/>
|
|
||||||
</span>
|
|
||||||
</analog_spans>
|
|
||||||
|
|
||||||
<!--
|
|
||||||
|
|
||||||
openr2 (MFC-R2 signaling) spans (ftmod_r2)
|
|
||||||
|
|
||||||
In order to use this type of spans your FreeTDM must have been compiled with ftmod_r2 module.
|
|
||||||
The module is compiled if the openr2 library is present when running the ./configure script
|
|
||||||
in the FreeTDM source code
|
|
||||||
|
|
||||||
MFC-R2 signaling has lots of variants from country to country and even sometimes
|
|
||||||
minor variants inside the same country. The only mandatory parameters here are:
|
|
||||||
variant, but typically you also want to set max_ani and max_dnis.
|
|
||||||
IT IS RECOMMENDED that you leave the default values (leaving them commented) for the
|
|
||||||
other parameters unless you have problems or you have been instructed to change some
|
|
||||||
parameter. OpenR2 library uses the 'variant' parameter to try to determine the
|
|
||||||
best defaults for your country. If you want to contribute your configs for a particular
|
|
||||||
country send them to the e-mail of the primary OpenR2 developer that you can find in the
|
|
||||||
AUTHORS file of the OpenR2 package, they will be added to the samples directory of openr2.
|
|
||||||
|
|
||||||
-->
|
|
||||||
<r2_spans>
|
|
||||||
<span name="wp1" cfgprofile="testr2">
|
|
||||||
|
|
||||||
<!--
|
|
||||||
MFC/R2 variant. This depends on the OpenR2 supported variants
|
|
||||||
A list of values can be found by executing the openr2 command r2test -l
|
|
||||||
some valid values are:
|
|
||||||
mx (Mexico)
|
|
||||||
ar (Argentina)
|
|
||||||
br (Brazil)
|
|
||||||
ph (Philippines)
|
|
||||||
itu (per ITU spec)
|
|
||||||
-->
|
|
||||||
<param name="variant" value="mx"/>
|
|
||||||
|
|
||||||
<!-- switch parameters (required), where to send calls to -->
|
|
||||||
<param name="dialplan" value="XML"/>
|
|
||||||
<param name="context" value="default"/>
|
|
||||||
|
|
||||||
<!--
|
|
||||||
Max amount of ANI (caller id digits) to ask for
|
|
||||||
<param name="max_ani" value="4"/>
|
|
||||||
-->
|
|
||||||
<!--
|
|
||||||
Max amount of DNIS to ask for
|
|
||||||
<param name="max_dnis" value="4"/>
|
|
||||||
-->
|
|
||||||
|
|
||||||
<!-- Do not set parameters below this line unless you desire to tweak it because is not working -->
|
|
||||||
|
|
||||||
<!--
|
|
||||||
Whether or not to get the ANI before getting DNIS (only affects incoming calls)
|
|
||||||
Some telcos require ANI first some others do not care, if default go wrong on
|
|
||||||
incoming calls, change this value
|
|
||||||
<param name="get_ani_first" value="yes"/>
|
|
||||||
-->
|
|
||||||
|
|
||||||
<!--
|
|
||||||
Caller Category to send. Accepted values:
|
|
||||||
- national_subscriber
|
|
||||||
- national_priority_subscriber
|
|
||||||
- international_subscriber
|
|
||||||
- international_priority_subscriber
|
|
||||||
- collect_call
|
|
||||||
Usually national_subscriber (the default) works just fine
|
|
||||||
<param name="category" value="national_subscriber"/>
|
|
||||||
-->
|
|
||||||
|
|
||||||
<!--
|
|
||||||
Brazil uses a special calling party category for collect calls (llamadas por cobrar)
|
|
||||||
instead of using the operator (as in Mexico). The R2 spec in Brazil says a special GB tone
|
|
||||||
should be used to reject collect calls. If you want to ALLOW collect calls specify 'yes',
|
|
||||||
if you want to BLOCK collect calls then say 'no'. Default is to block collect calls.
|
|
||||||
(see also 'double_answer')
|
|
||||||
<param name="allow_collect_calls" value="yes"/>
|
|
||||||
-->
|
|
||||||
|
|
||||||
<!--
|
|
||||||
This feature is related but independent of allow_collect_calls
|
|
||||||
Some PBX's require a double-answer process to block collect calls, if
|
|
||||||
you ever have problems blocking collect calls using Group B signals (allow_collect_calls=no)
|
|
||||||
then you may want to try with double_answer=yes, this will cause that every answer signal
|
|
||||||
is changed to perform 'answer -> clear back -> answer' (sort of a flash)
|
|
||||||
(see also 'allow_collect_calls')
|
|
||||||
<param name="double_answer" value="yes"/>
|
|
||||||
-->
|
|
||||||
|
|
||||||
<!--
|
|
||||||
This feature allows to skip the use of Group B/II signals and go directly
|
|
||||||
to the accepted state for incoming calls
|
|
||||||
<param name="immediate_accept" value="yes"/>
|
|
||||||
-->
|
|
||||||
|
|
||||||
<!--
|
|
||||||
Skip request of calling party category and ANI
|
|
||||||
<param name="skip_category" value="yes"/>
|
|
||||||
-->
|
|
||||||
|
|
||||||
<!--
|
|
||||||
Brazil use a special signal to force the release of the line (hangup) from the
|
|
||||||
backward perspective. When forced_release=no, the normal clear back signal
|
|
||||||
will be sent on hangup, which is OK for all mfcr2 variants I know of, except for
|
|
||||||
Brazilian variant, where the central will leave the line up for several seconds (30, 60)
|
|
||||||
which sometimes is not what people really want. When forced_release=yes, a different
|
|
||||||
signal will be sent to hangup the call indicating that the line should be released immediately
|
|
||||||
<param name="forced_release" value="yes"/>
|
|
||||||
-->
|
|
||||||
|
|
||||||
<!--
|
|
||||||
Whether or not report to the other end 'accept call with charge'
|
|
||||||
This setting has no effect with most telecos, usually is safe
|
|
||||||
leave the default (yes), but once in a while when interconnecting with
|
|
||||||
old PBXs this may be useful.
|
|
||||||
Concretely this affects the Group B signal used to accept calls
|
|
||||||
<param name="charge_calls" value="yes"/>
|
|
||||||
-->
|
|
||||||
|
|
||||||
<!--
|
|
||||||
MFC/R2 value in milliseconds for the MF timeout. Any negative value
|
|
||||||
means 'default', smaller values than 500ms are not recommended
|
|
||||||
and can cause malfunctioning. If you experience protocol error
|
|
||||||
due to MF timeout try incrementing this value in 500ms steps
|
|
||||||
<param name="mfback_timeout" value="1500"/>
|
|
||||||
-->
|
|
||||||
|
|
||||||
<!--
|
|
||||||
MFC/R2 value in milliseconds for the metering pulse timeout.
|
|
||||||
Metering pulses are sent by some telcos for some R2 variants
|
|
||||||
during a call presumably for billing purposes to indicate costs,
|
|
||||||
however this pulses use the same signal that is used to indicate
|
|
||||||
call hangup, therefore a timeout is sometimes required to distinguish
|
|
||||||
between a *real* hangup and a billing pulse that should not
|
|
||||||
last more than 500ms, If you experience call drops after some
|
|
||||||
minutes of being stablished try setting a value of some ms here,
|
|
||||||
values greater than 500ms are not recommended.
|
|
||||||
BE AWARE that choosing the proper protocol variant parameter
|
|
||||||
implicitly sets a good recommended value for this timer, use this
|
|
||||||
parameter only when you *really* want to override the default, otherwise
|
|
||||||
just comment out this value.
|
|
||||||
<param name="metering_pulse_timeout" value="1000"/>
|
|
||||||
-->
|
|
||||||
|
|
||||||
<!--
|
|
||||||
WARNING: advanced users only! I really mean it
|
|
||||||
this parameter is commented by default because
|
|
||||||
YOU DON'T NEED IT UNLESS YOU REALLY GROK MFC/R2
|
|
||||||
READ COMMENTS on doc/r2proto.conf in openr2 package
|
|
||||||
for more info
|
|
||||||
<param name="advanced_protocol_file" value="/usr/local/freeswitch/conf/r2proto.conf"/>
|
|
||||||
-->
|
|
||||||
|
|
||||||
<!-- USE THIS FOR DEBUGGING MFC-R2 PROTOCOL -->
|
|
||||||
<!--
|
|
||||||
Where to dump advanced call file protocol logs
|
|
||||||
<param name="logdir" value="$${base_dir}/log/mfcr2"/>
|
|
||||||
-->
|
|
||||||
|
|
||||||
<!--
|
|
||||||
MFC/R2 valid logging values are: all,error,warning,debug,notice,cas,mf,nothing
|
|
||||||
error,warning,debug and notice are self-descriptive
|
|
||||||
'cas' is for logging ABCD CAS tx and rx
|
|
||||||
'mf' is for logging of the Multi Frequency tones
|
|
||||||
You can mix up values, like: loglevel=error,debug,mf to log just error, debug and
|
|
||||||
multi frequency messages
|
|
||||||
'all' is a special value to log all the activity
|
|
||||||
'nothing' is a clean-up value, in case you want to not log any activity for
|
|
||||||
a channel or group of channels
|
|
||||||
BE AWARE that the level of output logged will ALSO depend on
|
|
||||||
the value you have in FreeSWITCH logging configurations, if you disable output FreeSWITCH
|
|
||||||
then it does not matter if you specify 'all' here, nothing will be logged
|
|
||||||
so FreeSWITCH has the last word on what is going to be logged
|
|
||||||
<param name="logging" value="debug,notice,warning,error,mf,cas"/>
|
|
||||||
-->
|
|
||||||
|
|
||||||
<!--
|
|
||||||
whether or not to drop protocol call files into 'logdir'
|
|
||||||
<param name="call_files" value="yes"/>
|
|
||||||
-->
|
|
||||||
|
|
||||||
<!--
|
|
||||||
Use only for very technical debugging
|
|
||||||
This is the size (if 0, dumps are disabled) of MF dump files. MF dump files
|
|
||||||
are audio files that are dumped when a protocol error occurs.
|
|
||||||
The files are dumped in whatever you set in the logdir parameter.
|
|
||||||
Value -1 uses a default recommended size (which stores 5 seconds of audio)
|
|
||||||
<param name="mf_dump_size" value="-1"/>
|
|
||||||
-->
|
|
||||||
</span>
|
|
||||||
</r2_spans>
|
|
||||||
|
|
||||||
<!-- Sangoma ISDN PRI/BRI spans. Requires libsng_isdn to be installed -->
|
|
||||||
<sangoma_pri_spans>
|
|
||||||
<span name="wp1">
|
|
||||||
<!--
|
|
||||||
Switch emulation/Variant
|
|
||||||
Possible values are:
|
|
||||||
national
|
|
||||||
4ess
|
|
||||||
5ess
|
|
||||||
qsig
|
|
||||||
euroisdn
|
|
||||||
ntt
|
|
||||||
|
|
||||||
<param name="switchtype" value="national"/>
|
|
||||||
-->
|
|
||||||
<!--
|
|
||||||
Signalling
|
|
||||||
Possible values are:
|
|
||||||
net
|
|
||||||
cpe
|
|
||||||
|
|
||||||
<param name="signalling" value="cpe"/>
|
|
||||||
-->
|
|
||||||
<!--
|
|
||||||
Overlap - whether to support overlap receive
|
|
||||||
Possible values are: Yes/No
|
|
||||||
|
|
||||||
<param name="overlap" value="yes"/>
|
|
||||||
-->
|
|
||||||
<!--
|
|
||||||
Facility - whether to support facility messages
|
|
||||||
Possible values are: Yes/No
|
|
||||||
|
|
||||||
<param name="facility" value="yes"/>
|
|
||||||
-->
|
|
||||||
<!--
|
|
||||||
Minimum Digits
|
|
||||||
In overlap receive mode.
|
|
||||||
Minimum number of digits to receive before sending notification
|
|
||||||
to the dialplan
|
|
||||||
Possible values are: <Any digit>
|
|
||||||
|
|
||||||
<param name="min-digits" value="8"/>
|
|
||||||
-->
|
|
||||||
<!--
|
|
||||||
TEI - default value for Terminal Equipment Identifier.
|
|
||||||
Used in Point-to-point connections
|
|
||||||
Possible values are: <1-127>
|
|
||||||
|
|
||||||
<param name="tei" value="0"/>
|
|
||||||
-->
|
|
||||||
<!--
|
|
||||||
Type of Number (TON)
|
|
||||||
Set the TON on outbound calls
|
|
||||||
Possible values are:
|
|
||||||
unknown
|
|
||||||
international
|
|
||||||
national
|
|
||||||
network-specific
|
|
||||||
subscriber-number
|
|
||||||
abbreviated-number
|
|
||||||
|
|
||||||
<param name="outbound-called-ton" value="unknown"/>
|
|
||||||
<param name="outbound-calling-ton" value="unknown"/>
|
|
||||||
<param name="outbound-rdnis-ton" value="unknown"/>
|
|
||||||
-->
|
|
||||||
<!--
|
|
||||||
Numbering Plan Indendification (NPI)
|
|
||||||
Set the NPI on outbound calls
|
|
||||||
Possible values are:
|
|
||||||
unknown
|
|
||||||
isdn
|
|
||||||
data
|
|
||||||
telex
|
|
||||||
national
|
|
||||||
private
|
|
||||||
reserved
|
|
||||||
|
|
||||||
<param name="outbound-called-npi" value="unknown"/>
|
|
||||||
<param name="outbound-calling-npi" value="unknown"/>
|
|
||||||
<param name="outbound-rdnis-npi" value="unknown"/>
|
|
||||||
-->
|
|
||||||
<!--
|
|
||||||
Bearer Capability - Transfer Capability
|
|
||||||
Set the Bearer Capability - Transfer Capability on outbound calls
|
|
||||||
Possible values are:
|
|
||||||
speech
|
|
||||||
unrestricted-digital-information
|
|
||||||
restricted-digital-information
|
|
||||||
3.1-Khz-audio
|
|
||||||
7-Khz-audio
|
|
||||||
15-Khz-audio
|
|
||||||
video
|
|
||||||
|
|
||||||
<param name="outbound-bc-transfer-cap" value="speech"/>
|
|
||||||
-->
|
|
||||||
<!--
|
|
||||||
Bearer Capability - User Layer 1
|
|
||||||
Set the Bearer Capability - User Layer 1 on outbound calls
|
|
||||||
Possible values are:
|
|
||||||
|
|
||||||
V.110
|
|
||||||
ulaw
|
|
||||||
alaw
|
|
||||||
|
|
||||||
<param name="outbound-bc-user-layer1" value="speech"/>
|
|
||||||
-->
|
|
||||||
<!--
|
|
||||||
Channel Restart Timeout
|
|
||||||
If we do not receive a RESTART message within this timeout on link
|
|
||||||
UP, we will send a channel restart.
|
|
||||||
|
|
||||||
|
|
||||||
<param name="channel-restart-timeout" value="20"/>
|
|
||||||
-->
|
|
||||||
<!--
|
|
||||||
Local Number (MSN)
|
|
||||||
On incoming calls, we will only respond to this call if
|
|
||||||
the Called Party Number matches this value.
|
|
||||||
|
|
||||||
Note: Up to 8 local numbers can be added per span.
|
|
||||||
<param name="local-number" value="9054741990"/>
|
|
||||||
-->
|
|
||||||
<!--
|
|
||||||
Facility Timeout
|
|
||||||
Amount of time to wait for the FACILITY message after a SETUP message is
|
|
||||||
received
|
|
||||||
<param name="facility-timeout" value="1"/>
|
|
||||||
-->
|
|
||||||
<!--
|
|
||||||
Transfer Timeout
|
|
||||||
Amount of time to wait for the remote switch to respond to a transfer request
|
|
||||||
<param name="transfer-timeout" value="20"/>
|
|
||||||
-->
|
|
||||||
<!--
|
|
||||||
AT&T Transfer - Remove DTMF
|
|
||||||
Whether to remove DTMF tones received from remote switch when performing
|
|
||||||
AT&T Transfer.
|
|
||||||
|
|
||||||
<param name="att-remove-dtmf" value="yes/no"/>
|
|
||||||
-->
|
|
||||||
<!--
|
|
||||||
Facility Information Element Decoding
|
|
||||||
Whether to decode contents within Facility IE. You should only disable this option if your custom application has its own Facility IE decoding.
|
|
||||||
|
|
||||||
<param name="facility-ie-decode" value="yes/no"/>
|
|
||||||
-->
|
|
||||||
<!--
|
|
||||||
Ignore cause value
|
|
||||||
When using 5ESS switchtype, whether or not do initiate disconnects based on cause code.
|
|
||||||
|
|
||||||
<param name="ignore-cause-value" value="yes/no"/>
|
|
||||||
-->
|
|
||||||
<!--
|
|
||||||
Trace (Interpreted)
|
|
||||||
Whether or not to enable Q921/Q931 trace on start
|
|
||||||
|
|
||||||
<param name="q931-trace" value="yes/no"/>
|
|
||||||
<param name="q921-trace" value="yes/no"/>
|
|
||||||
-->
|
|
||||||
<!--
|
|
||||||
Trace (Raw)
|
|
||||||
Whether or not to enable Q921/Q931 trace on start
|
|
||||||
|
|
||||||
<param name="q931-raw-trace" value="yes/no"/>
|
|
||||||
<param name="q921-raw-trace" value="yes/no"/>
|
|
||||||
-->
|
|
||||||
<!--
|
|
||||||
Force sending complete
|
|
||||||
Will add Sending Complete IE to outgoing SETUP message
|
|
||||||
By default, enabled on EuroISDN, disabled on US variants.
|
|
||||||
|
|
||||||
<param name="force-sending-complete" value="yes/no"/>
|
|
||||||
-->
|
|
||||||
<!--
|
|
||||||
Early Media Override
|
|
||||||
Assume early media is available, even if Q.931 message does not have
|
|
||||||
progress indicator IE = in-band data ready
|
|
||||||
|
|
||||||
Possible values
|
|
||||||
on-proceed
|
|
||||||
on-progress
|
|
||||||
on-alert
|
|
||||||
|
|
||||||
<param name="early-media-override" value="on-alert"/>
|
|
||||||
-->
|
|
||||||
<!--
|
|
||||||
Invert Channel ID Invert Bit
|
|
||||||
|
|
||||||
Invert the Channel ID Extend Bit
|
|
||||||
|
|
||||||
<param name="chan-id-invert-extend-bit" value="yes/no"/>
|
|
||||||
-->
|
|
||||||
<!--
|
|
||||||
CID Name transmit method
|
|
||||||
|
|
||||||
How to transmit Caller ID Name
|
|
||||||
|
|
||||||
Possible values:
|
|
||||||
display-ie
|
|
||||||
user-user-ie
|
|
||||||
facility-ie
|
|
||||||
default (will transmit CID-Name based on variant)
|
|
||||||
|
|
||||||
<param name="cid-name-transmit-method" value="default"/>
|
|
||||||
-->
|
|
||||||
<!--
|
|
||||||
CID Name transmit
|
|
||||||
|
|
||||||
Whether to transmit Caller ID Name
|
|
||||||
|
|
||||||
Possible values:
|
|
||||||
yes - always send CID-name
|
|
||||||
no - nether send CID-name
|
|
||||||
default (will transmit CID-Name based on variant)
|
|
||||||
|
|
||||||
<param name="cid-name-transmit-method" value="default"/>
|
|
||||||
-->
|
|
||||||
<!--
|
|
||||||
Send CONNECT ACK
|
|
||||||
Whether to send a Connect Ack
|
|
||||||
|
|
||||||
Possible values:
|
|
||||||
yes - send connect ack
|
|
||||||
no - do not send connect ack
|
|
||||||
default (will transmit Connect Ack based on variant + signaling)
|
|
||||||
|
|
||||||
<param name="send-connect-ack" value="yes"/>
|
|
||||||
-->
|
|
||||||
|
|
||||||
<!--
|
|
||||||
Q.931 Timers in seconds
|
|
||||||
|
|
||||||
Override default Q.931 values
|
|
||||||
|
|
||||||
timers:
|
|
||||||
timer-t301
|
|
||||||
timer-t302
|
|
||||||
timer-t303
|
|
||||||
timer-t304
|
|
||||||
timer-t305
|
|
||||||
timer-t306
|
|
||||||
timer-t307
|
|
||||||
timer-t308
|
|
||||||
timer-t310
|
|
||||||
timer-t312
|
|
||||||
timer-t313
|
|
||||||
timer-t314
|
|
||||||
timer-t316
|
|
||||||
timer-t318
|
|
||||||
timer-t319
|
|
||||||
timer-t322
|
|
||||||
|
|
||||||
<param name="timer-t301" value="10"/>
|
|
||||||
-->
|
|
||||||
</span>
|
|
||||||
</sangoma_pri_spans>
|
|
||||||
|
|
||||||
|
|
||||||
<!--
|
|
||||||
PRI passive tapping spans. Requires patched version from libpri at http://svn.digium.com/svn/libpri/team/moy/tap-1.4
|
|
||||||
You must also configure FreeTDM with "-with-pritap" (see ./configure help for details)
|
|
||||||
-->
|
|
||||||
<pritap_spans>
|
|
||||||
<span name="tapped1">
|
|
||||||
<!-- The peer span name used to tap the link -->
|
|
||||||
<param name="peerspan" value="tapped2"/>
|
|
||||||
|
|
||||||
<!--
|
|
||||||
Whether to mix the audio from the peerspan with the audio from this span
|
|
||||||
This is most likely what you want (and therefore the default) so you can hear
|
|
||||||
the full conversation being tapped instead of just one side
|
|
||||||
-->
|
|
||||||
<!-- <param name="mixaudio" value="yes"/> -->
|
|
||||||
|
|
||||||
<!-- switch parameters (required), where to send calls to -->
|
|
||||||
<param name="dialplan" value="XML"/>
|
|
||||||
<param name="context" value="default"/>
|
|
||||||
</span>
|
|
||||||
|
|
||||||
<span name="tapped2">
|
|
||||||
<!-- This span is linked to "tapped1" through its peerspan parameter -->
|
|
||||||
<param name="peerspan" value="tapped1"/>
|
|
||||||
<!-- <param name="mixaudio" value="yes"/> -->
|
|
||||||
|
|
||||||
<!-- switch parameters (required), where to send calls to -->
|
|
||||||
<param name="dialplan" value="XML"/>
|
|
||||||
<param name="context" value="default"/>
|
|
||||||
</span>
|
|
||||||
</pritap_spans>
|
|
||||||
|
|
||||||
<!--
|
|
||||||
GSM spans (libwat must be installed when configuring the freetdm build)
|
|
||||||
-->
|
|
||||||
<gsm_spans>
|
|
||||||
<span name="gsm01">
|
|
||||||
<!-- where to send inbound calls to -->
|
|
||||||
<param name="dialplan" value="XML" />
|
|
||||||
<param name="context" value="module1" />
|
|
||||||
|
|
||||||
<!--
|
|
||||||
GSM module type
|
|
||||||
Accepted values: "telit", "telit-gc864", "telit-he910", "telit-cc864", "telit-de910", "motorola"
|
|
||||||
-->
|
|
||||||
<param name="moduletype" value="telit-gc864" />
|
|
||||||
|
|
||||||
<!--
|
|
||||||
Debug mask (accepted values: all, uart_raw, uart_raw, call_state, span_state, at_parse, at_handle, sms_encode, sms_decode, none)
|
|
||||||
comma-separated values are accepted to combine those levels
|
|
||||||
-->
|
|
||||||
<param name="debug" value="all" />
|
|
||||||
|
|
||||||
<!--
|
|
||||||
Whether to enable HW DTMF in the hardware module
|
|
||||||
Accepted values: true, generate, detect, false
|
|
||||||
-->
|
|
||||||
<param name="hwdtmf" value="true" />
|
|
||||||
|
|
||||||
<!--
|
|
||||||
This enables conditional forwarding on module startup
|
|
||||||
-->
|
|
||||||
<!-- <param name="conditional-forwarding-prefix" value="*71" /> -->
|
|
||||||
<!-- <param name="conditional-forwarding-number" value="123456789" /> -->
|
|
||||||
|
|
||||||
<!--
|
|
||||||
This enables immediate forwarding logic to simulate hunt groups
|
|
||||||
The syntax for immediate-forwarding-numbers ia a comma-separated
|
|
||||||
list of elements in the form [<span-name>:]<number>
|
|
||||||
|
|
||||||
if span-name is specified, the span will be checked for availability
|
|
||||||
before enabling forwarding to that span number
|
|
||||||
|
|
||||||
The span-name must be a defined freetdm span name
|
|
||||||
|
|
||||||
If the span-name is not specified then only first number specified is used for
|
|
||||||
forwarding whenever this span is busy
|
|
||||||
-->
|
|
||||||
<!-- <param name="immediate-forwarding-prefix" value="*72" /> -->
|
|
||||||
<!-- <param name="immediate-forwarding-numbers" value="gsm02:123456789" /> -->
|
|
||||||
|
|
||||||
<!-- Number to dial to disable forwarding when the call ends (if immediate forwarding was enabled) -->
|
|
||||||
<!-- <param name="disable-forwarding-number" value="*73" /> -->
|
|
||||||
|
|
||||||
<!-- Startup raw AT commands to run, you can repeat this parameter as many times as needed -->
|
|
||||||
<!-- <param name="startup-command" value="AT$GPSP=1" /> -->
|
|
||||||
<!-- <param name="startup-command" value="AT$GPSAT=1" /> -->
|
|
||||||
</span>
|
|
||||||
</gsm_spans>
|
|
||||||
</configuration>
|
|
||||||
|
|
|
@ -1,43 +0,0 @@
|
||||||
; you dont need this file unless you use PIKA boards
|
|
||||||
|
|
||||||
; each category is a config profile
|
|
||||||
; to apply the profile append it to a channel def in
|
|
||||||
; freetdm.conf with @<profile_name>
|
|
||||||
; e.g.
|
|
||||||
; [span pika]
|
|
||||||
; name => pika
|
|
||||||
; number => pika
|
|
||||||
; fxs-channel => 1:0:1-12@default
|
|
||||||
|
|
||||||
[default]
|
|
||||||
; region is na or eu
|
|
||||||
;region => na
|
|
||||||
;rx-gain => 0.00
|
|
||||||
;rx-agc-enabled => false
|
|
||||||
;rx-agc-targetPower => -15.00
|
|
||||||
;rx-agc-minGain => -6.00
|
|
||||||
;rx-agc-maxGain => 18.00
|
|
||||||
;rx-agc-attackRate => 170
|
|
||||||
;rx-agc-decayRate => 750
|
|
||||||
;rx-agc-speechThreshold => -36.00
|
|
||||||
;rx-vad-enabled => false
|
|
||||||
;rx-vad-activationThreshold => -40.00
|
|
||||||
;rx-vad-activationDebounceTime => 72
|
|
||||||
;rx-vad-deactivationThreshold => -40.00
|
|
||||||
;rx-vad-deactivationDebounceTime => 984
|
|
||||||
;rx-vad-preSpeechBufferSize => 240
|
|
||||||
;tx-gain => 0.00
|
|
||||||
;tx-agc-enabled => true
|
|
||||||
;tx-agc-targetPower => -15.00
|
|
||||||
;tx-agc-minGain => -6.00
|
|
||||||
;tx-agc-maxGain => 18.00
|
|
||||||
;tx-agc-attackRate => 170
|
|
||||||
;tx-agc-decayRate => 750
|
|
||||||
;tx-agc-speechThreshold => -36.00
|
|
||||||
;ec-enabled => false
|
|
||||||
;ec-doubleTalkerThreshold => -6.00
|
|
||||||
;ec-speechPresentThreshold => -40.00
|
|
||||||
;ec-echoSuppressionThreshold => -18.00
|
|
||||||
;ec-echoSuppressionEnabled => true
|
|
||||||
;ec-comfortNoiseEnabled => true
|
|
||||||
;ec-adaptationModeEnabled => true
|
|
|
@ -1,142 +0,0 @@
|
||||||
[us]
|
|
||||||
generate-dial => v=-7;%(1000,0,350,440)
|
|
||||||
detect-dial => 350,440
|
|
||||||
|
|
||||||
generate-ring => v=-7;%(2000,4000,440,480)
|
|
||||||
detect-ring => 440,480
|
|
||||||
|
|
||||||
generate-busy => v=-7;%(500,500,480,620)
|
|
||||||
detect-busy => 480,620
|
|
||||||
|
|
||||||
generate-attn => v=0;%(100,100,1400,2060,2450,2600)
|
|
||||||
detect-attn => 1400,2060,2450,2600
|
|
||||||
|
|
||||||
generate-callwaiting-sas => v=0;%(300,0,440)
|
|
||||||
detect-callwaiting-sas => 440
|
|
||||||
|
|
||||||
generate-callwaiting-cas => v=0;%(80,0,2750,2130)
|
|
||||||
detect-callwaiting-cas => 2750,2130
|
|
||||||
|
|
||||||
detect-fail1 => 913.8
|
|
||||||
detect-fail2 => 1370.6
|
|
||||||
detect-fail3 => 1776.7
|
|
||||||
|
|
||||||
|
|
||||||
[sg]
|
|
||||||
generate-dial => v=-7;%(1000,0,425)
|
|
||||||
detect-dial => 425
|
|
||||||
|
|
||||||
generate-ring => v=-7;%(2000,4000,425)
|
|
||||||
detect-ring => 425
|
|
||||||
|
|
||||||
generate-busy => v=-7;%(750,750,425)
|
|
||||||
detect-busy => 425
|
|
||||||
|
|
||||||
generate-attn => v=0;%(100,100,1400,2060,2450,2600)
|
|
||||||
detect-attn => 1400,2060,2450,2600
|
|
||||||
|
|
||||||
generate-callwaiting-sas => v=0;%(300,0,440)
|
|
||||||
detect-callwaiting-sas => 440
|
|
||||||
|
|
||||||
generate-callwaiting-cas => v=0;%(80,0,2750,2130)
|
|
||||||
detect-callwaiting-cas => 2750,2130
|
|
||||||
|
|
||||||
detect-fail1 => 913.8
|
|
||||||
detect-fail2 => 1370.6
|
|
||||||
detect-fail3 => 1776.7
|
|
||||||
|
|
||||||
|
|
||||||
[ru]
|
|
||||||
generate-dial => v=-7;%(1000,425)
|
|
||||||
detect-dial => 0
|
|
||||||
|
|
||||||
generate-ring => v=-7;%(800,5000,425,0)
|
|
||||||
detect-ring => 425,0
|
|
||||||
|
|
||||||
generate-busy => v=-7;%(350,350,425,0)
|
|
||||||
detect-busy => 425,0
|
|
||||||
|
|
||||||
generate-attn => v=0;%(100,100,1400,2060,2450,2600)
|
|
||||||
detect-attn => 1400,2060,2450,2600
|
|
||||||
|
|
||||||
generate-callwaiting-sas => v=0;%(300,0,440)
|
|
||||||
detect-callwaiting-sas => 440,480
|
|
||||||
|
|
||||||
generate-callwaiting-cas => v=0;%(80,0,2750,2130)
|
|
||||||
detect-callwaiting-cas => 2750,2130
|
|
||||||
|
|
||||||
detect-fail1 => 913.8
|
|
||||||
detect-fail2 => 1370.6
|
|
||||||
detect-fail3 => 1776.7
|
|
||||||
|
|
||||||
|
|
||||||
[in]
|
|
||||||
generate-dial => v=-7;%(1000,0,375,425)
|
|
||||||
detect-dial => 375,425
|
|
||||||
|
|
||||||
generate-ring => v=-7;%(2000,4000,440,480)
|
|
||||||
detect-ring => 440,480
|
|
||||||
|
|
||||||
generate-busy => v=-7;%(500,500,480,620)
|
|
||||||
detect-busy => 480,620
|
|
||||||
|
|
||||||
generate-attn => v=0;%(100,100,1400,2060,2450,2600)
|
|
||||||
detect-attn => 1400,2060,2450,2600
|
|
||||||
|
|
||||||
generate-callwaiting-sas => v=0;%(300,0,440)
|
|
||||||
detect-callwaiting-sas => 440
|
|
||||||
|
|
||||||
generate-callwaiting-cas => v=0;%(80,0,2750,2130)
|
|
||||||
detect-callwaiting-cas => 2750,2130
|
|
||||||
|
|
||||||
detect-fail1 => 913.8
|
|
||||||
detect-fail2 => 1370.6
|
|
||||||
detect-fail3 => 776.7
|
|
||||||
|
|
||||||
|
|
||||||
[th]
|
|
||||||
generate-dial => v=-7;%(1000,0,400,400)
|
|
||||||
detect-dial => 400,400
|
|
||||||
|
|
||||||
generate-ring => v=-7;%(2000,4000,400,400)
|
|
||||||
detect-ring => 400,400
|
|
||||||
|
|
||||||
generate-busy => v=-7;%(500,500,480,620)
|
|
||||||
detect-busy => 480,620
|
|
||||||
|
|
||||||
generate-attn => v=0;%(100,100,1400,2060,2450,2600)
|
|
||||||
detect-attn => 1400,2060,2450,2600
|
|
||||||
|
|
||||||
generate-callwaiting-sas => v=0;%(300,0,440)
|
|
||||||
detect-callwaiting-sas => 440
|
|
||||||
|
|
||||||
generate-callwaiting-cas => v=0;%(80,0,2750,2130)
|
|
||||||
detect-callwaiting-cas => 2750,2130
|
|
||||||
|
|
||||||
detect-fail1 => 913.8
|
|
||||||
detect-fail2 => 1370.6
|
|
||||||
detect-fail3 => 1776.7
|
|
||||||
|
|
||||||
|
|
||||||
[au]
|
|
||||||
generate-dial => v=-7;%(1000,0,413,438)
|
|
||||||
detect-dial => 413,438
|
|
||||||
|
|
||||||
generate-ring => v=-7;%(400,200,413,438);%(400,2000,413,438)
|
|
||||||
detect-ring => 413,438
|
|
||||||
|
|
||||||
generate-busy => v=-7;%(375,375,425)
|
|
||||||
detect-busy => 425
|
|
||||||
|
|
||||||
generate-attn => v=0;%(100,100,1400,2060,2450,2600)
|
|
||||||
detect-attn => 1400,2060,2450,2600
|
|
||||||
|
|
||||||
generate-callwaiting-sas => v=0;%(300,0,440)
|
|
||||||
detect-callwaiting-sas => 440
|
|
||||||
|
|
||||||
generate-callwaiting-cas => v=0;%(80,0,2750,2130)
|
|
||||||
detect-callwaiting-cas => 2750,2130
|
|
||||||
|
|
||||||
detect-fail1 => 913.8
|
|
||||||
detect-fail2 => 1370.6
|
|
||||||
detect-fail3 => 776.7
|
|
|
@ -1,13 +0,0 @@
|
||||||
[defaults]
|
|
||||||
; User space interval at which data will be delivered
|
|
||||||
codec_ms => 20
|
|
||||||
|
|
||||||
; wink and flash interval
|
|
||||||
wink_ms => 150
|
|
||||||
flash_ms => 750
|
|
||||||
|
|
||||||
; size of the driver queue of elements of MTU size
|
|
||||||
; typical case is 10 elements of 80 bytes each (10ms of ulaw/alaw)
|
|
||||||
; don't mess with this if you don't know what you're doing
|
|
||||||
; txqueue_size => 10
|
|
||||||
; rxqueue_size => 10
|
|
|
@ -1,8 +0,0 @@
|
||||||
[defaults]
|
|
||||||
codec_ms => 20
|
|
||||||
wink_ms => 150
|
|
||||||
flash_ms => 750
|
|
||||||
echo_cancel_level => 64
|
|
||||||
rxgain => 0.0
|
|
||||||
txgain => 0.0
|
|
||||||
|
|
|
@ -1,480 +0,0 @@
|
||||||
# -*- Autoconf -*-
|
|
||||||
# Process this file with autoconf to produce a configure script.
|
|
||||||
|
|
||||||
AC_PREREQ([2.59])
|
|
||||||
AC_INIT([freetdm], [0.1], [bugs@freeswitch.org])
|
|
||||||
AC_CONFIG_SRCDIR([src/ftdm_io.c])
|
|
||||||
|
|
||||||
AC_CONFIG_AUX_DIR([build])
|
|
||||||
AC_CONFIG_MACRO_DIR([build])
|
|
||||||
AM_INIT_AUTOMAKE
|
|
||||||
|
|
||||||
# >=automake-1.11
|
|
||||||
m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
|
|
||||||
|
|
||||||
# override some default libtool behavior and invoke AC_PROG_LIBTOOL
|
|
||||||
# (see http://lists.gnu.org/archive/html/libtool/2007-03/msg00000.html)
|
|
||||||
m4_defun([_LT_AC_LANG_F77_CONFIG], [:])
|
|
||||||
m4_defun([_LT_AC_LANG_GCJ_CONFIG], [:])
|
|
||||||
m4_defun([_LT_AC_LANG_RC_CONFIG], [:])
|
|
||||||
|
|
||||||
# Checks for programs.
|
|
||||||
AC_PROG_CC
|
|
||||||
AC_PROG_MAKE_SET
|
|
||||||
AM_PROG_CC_C_O
|
|
||||||
AC_PROG_LIBTOOL
|
|
||||||
AC_PROG_INSTALL
|
|
||||||
|
|
||||||
# NOTE: pkg-config is used to detect libisdn
|
|
||||||
m4_ifdef([PKG_PROG_PKG_CONFIG],
|
|
||||||
[PKG_PROG_PKG_CONFIG],
|
|
||||||
[AC_MSG_WARN([pkg-config missing (required for libisdn detection)])]
|
|
||||||
)
|
|
||||||
|
|
||||||
AX_COMPILER_VENDOR
|
|
||||||
|
|
||||||
# AC_PREFIX_DEFAULT does not get expanded until too late so we need
|
|
||||||
# to do this to use prefix in this script
|
|
||||||
AC_PREFIX_DEFAULT([/usr/local/freetdm])
|
|
||||||
if test "x${prefix}" = "xNONE" ; then
|
|
||||||
prefix='/usr/local/freetdm'
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Absolute source/build directory
|
|
||||||
FT_SRCDIR=`(cd $srcdir && pwd)`
|
|
||||||
ft_builddir=`pwd`
|
|
||||||
AC_SUBST([FT_SRCDIR])
|
|
||||||
AC_SUBST([ft_builddir])
|
|
||||||
|
|
||||||
if test "$sysconfdir" = "\${prefix}/etc" ; then
|
|
||||||
confdir="$prefix/conf"
|
|
||||||
else
|
|
||||||
confdir="$sysconfdir"
|
|
||||||
fi
|
|
||||||
|
|
||||||
AC_SUBST([confdir])
|
|
||||||
|
|
||||||
DEFAULT_INCLUDES="-I. -I./src/include -I\$(srcdir)"
|
|
||||||
AC_SUBST([DEFAULT_INCLUDES])
|
|
||||||
|
|
||||||
# Where to install the modules
|
|
||||||
AC_ARG_WITH([modinstdir],
|
|
||||||
[AS_HELP_STRING([--with-modinstdir=DIR], [Install modules into this location (default: ${prefix}/mod)])],
|
|
||||||
[case "${withval}" in
|
|
||||||
no|yes) AC_MSG_ERROR([Invalid value \"${withval}\", option requires a valid path]) ;;
|
|
||||||
*) modinstdir="${withval}" ;;
|
|
||||||
esac],
|
|
||||||
[modinstdir="${prefix}/mod"]
|
|
||||||
)
|
|
||||||
AC_SUBST([modinstdir])
|
|
||||||
|
|
||||||
# freetdm.pc pkgconfig file
|
|
||||||
AC_ARG_WITH([pkgconfigdir],
|
|
||||||
[AS_HELP_STRING([--with-pkgconfigdir=DIR], [Installation directory for pkgconfig file (default: ${libdir}/pkgconfig)])],
|
|
||||||
[case "${withval}" in
|
|
||||||
yes|no) AC_MSG_ERROR([Invalid value ${withval} for option --with-pkgconfigdir]) ;;
|
|
||||||
*) pkgconfigdir="${withval}" ;;
|
|
||||||
esac
|
|
||||||
],
|
|
||||||
[pkgconfigdir="${libdir}/pkgconfig"]
|
|
||||||
)
|
|
||||||
AC_SUBST([pkgconfigdir])
|
|
||||||
|
|
||||||
AC_ARG_ENABLE([enable_64],
|
|
||||||
[AS_HELP_STRING([--enable-64], [Enable 64bit compilation])],
|
|
||||||
[enable_64="${enableval}"],
|
|
||||||
[enable_64="no"]
|
|
||||||
)
|
|
||||||
|
|
||||||
case "${ax_cv_c_compiler_vendor}" in
|
|
||||||
gnu)
|
|
||||||
COMP_VENDOR_CFLAGS="-ffast-math -Wall -Werror -Wunused-variable -Wwrite-strings -Wstrict-prototypes -Wmissing-prototypes -O0"
|
|
||||||
;;
|
|
||||||
sun)
|
|
||||||
COMP_VENDOR_CFLAGS="-xc99=all -mt -xCC -xvpara"
|
|
||||||
if test "$enable_64" != "no" ; then
|
|
||||||
COMP_VENDOR_CFLAGS="-m64 $COMP_VENDOR_CFLAGS"
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
COMP_VENDOR_COMPAT_CFLAGS="-Wall -Werror -Wunused-variable -Wwrite-strings -Wstrict-prototypes -Wmissing-prototypes"
|
|
||||||
COMP_VENDOR_CFLAGS="-std=c99 $COMP_VENDOR_COMPAT_CFLAGS"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
AC_SUBST([COMP_VENDOR_COMPAT_CFLAGS])
|
|
||||||
AC_SUBST([COMP_VENDOR_CFLAGS])
|
|
||||||
|
|
||||||
|
|
||||||
# Enable debugging
|
|
||||||
AC_ARG_ENABLE([debug],
|
|
||||||
[AC_HELP_STRING([--enable-debug], [build with debug information])],
|
|
||||||
[enable_debug="${enableval}"],
|
|
||||||
[enable_debug="yes"]
|
|
||||||
)
|
|
||||||
if test "${enable_debug}" != "no"; then
|
|
||||||
AC_DEFINE([DEBUG], [], [Enable extra debugging.])
|
|
||||||
|
|
||||||
if test "x${ax_cv_c_compiler_vendor}" = "xgnu" ; then
|
|
||||||
COMP_VENDOR_CFLAGS="$COMP_VENDOR_CFLAGS -g -ggdb"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
AC_SUBST([COMP_VENDOR_CFLAGS])
|
|
||||||
|
|
||||||
AC_CHECK_LIB([dl], [dlopen])
|
|
||||||
AC_CHECK_LIB([pthread], [pthread_create])
|
|
||||||
AC_CHECK_LIB([m], [cos])
|
|
||||||
|
|
||||||
AC_CHECK_HEADERS([netdb.h sys/select.h execinfo.h])
|
|
||||||
|
|
||||||
AC_CHECK_FUNC([gethostbyname_r],
|
|
||||||
[], [AC_CHECK_LIB([nsl], [gethostbyname_r])]
|
|
||||||
)
|
|
||||||
if test "$ac_cv_func_gethostbyname_r" = "yes" -o "$ac_cv_lib_nsl_gethostbyname_r" = "yes"
|
|
||||||
then
|
|
||||||
AC_MSG_CHECKING([whether gethostbyname_r requires five arguments])
|
|
||||||
|
|
||||||
ac_cv_func_gethostbyname_r_five_args="no"
|
|
||||||
|
|
||||||
AC_TRY_COMPILE([#include <netdb.h>],
|
|
||||||
[char *name;
|
|
||||||
struct hostent *he, *res;
|
|
||||||
char buffer[2048];
|
|
||||||
int buflen = 2048;
|
|
||||||
(void)gethostbyname_r(name, he, buffer, buflen, &res)],
|
|
||||||
[ac_cv_func_gethostbyname_r_five_args="yes"
|
|
||||||
AC_DEFINE([HAVE_GETHOSTBYNAME_R_FIVE], [1], [gethostbyname_r has five arguments])]
|
|
||||||
)
|
|
||||||
|
|
||||||
AC_MSG_RESULT([$ac_cv_func_gethostbyname_r_five_args])
|
|
||||||
AC_DEFINE([HAVE_GETHOSTBYNAME_R], [1], [threadsafe gethostbyname])
|
|
||||||
fi
|
|
||||||
|
|
||||||
##
|
|
||||||
## Modules and optional features
|
|
||||||
##
|
|
||||||
AC_MSG_RESULT([${as_nl}<<>> Modules and optional features])
|
|
||||||
|
|
||||||
##
|
|
||||||
# pritap (TODO: add checks)
|
|
||||||
#
|
|
||||||
HAVE_PRITAP="no"
|
|
||||||
AC_ARG_WITH([pritap],
|
|
||||||
[AS_HELP_STRING([--with-pritap], [Install ftmod_pritap])],
|
|
||||||
[case "${withval}" in
|
|
||||||
no) enable_pritap="no" ;;
|
|
||||||
*) enable_pritap="yes" ;;
|
|
||||||
esac],
|
|
||||||
[enable_pritap="no"]
|
|
||||||
)
|
|
||||||
HAVE_PRITAP="${enable_pritap}"
|
|
||||||
AM_CONDITIONAL([HAVE_PRITAP],[test "${enable_pritap}" = "yes"])
|
|
||||||
|
|
||||||
##
|
|
||||||
# OpenR2 stack
|
|
||||||
#
|
|
||||||
HAVE_OPENR2="no"
|
|
||||||
AC_CHECK_LIB([openr2], [openr2_context_set_io_type], [HAVE_OPENR2="yes"])
|
|
||||||
AC_MSG_RESULT([checking whether to build ftmod_r2... ${HAVE_OPENR2}])
|
|
||||||
AM_CONDITIONAL([HAVE_OPENR2], [test "${HAVE_OPENR2}" = "yes"])
|
|
||||||
|
|
||||||
##
|
|
||||||
# WAT GSM stack
|
|
||||||
#
|
|
||||||
HAVE_WAT="no"
|
|
||||||
AC_CHECK_LIB([wat], [wat_version], [HAVE_WAT="yes"])
|
|
||||||
AC_MSG_RESULT([checking whether to build ftmod_wat... ${HAVE_WAT}])
|
|
||||||
AM_CONDITIONAL([HAVE_WAT], [test "${HAVE_WAT}" = "yes"])
|
|
||||||
|
|
||||||
##
|
|
||||||
# Digium libpri (TODO: add checks)
|
|
||||||
#
|
|
||||||
HAVE_LIBPRI="no"
|
|
||||||
AC_ARG_WITH([libpri],
|
|
||||||
[AS_HELP_STRING([--with-libpri@<:@=PREFIX@:>@], [Install ftmod_libpri])],
|
|
||||||
[case "${withval}" in
|
|
||||||
no|yes) with_libpri="${withval}" ;;
|
|
||||||
*) AS_IF([test -d "${withval}"],
|
|
||||||
[with_libpri="${withval}"],
|
|
||||||
[AC_MSG_ERROR([Invalid argument for --with-libpri, \"${withval}\" is not a directory])]
|
|
||||||
) ;;
|
|
||||||
esac],
|
|
||||||
[with_libpri="no"]
|
|
||||||
)
|
|
||||||
if test "x${with_libpri}" != "xno"
|
|
||||||
then
|
|
||||||
save_LIBS="${LIBS}"
|
|
||||||
save_CPPFLAGS="${CPPFLAGS}"
|
|
||||||
save_LDFLAGS="${LDFLAGS}"
|
|
||||||
|
|
||||||
LIBPRI_CPPFLAGS=""
|
|
||||||
LIBPRI_LDFLAGS=""
|
|
||||||
|
|
||||||
AC_MSG_RESULT([${as_nl}<<>> Digium libpri])
|
|
||||||
|
|
||||||
AS_IF([test "x${with_libpri}" != "xyes"],
|
|
||||||
[LIBPRI_CPPFLAGS="-I${with_libpri}/include"
|
|
||||||
LIBPRI_LDFLAGS="-L${with_libpri}/lib"],
|
|
||||||
)
|
|
||||||
|
|
||||||
LDFLAGS="${save_LDFLAGS} ${LIBPRI_LDFLAGS}"
|
|
||||||
CPPFLAGS="${save_CPPFLAGS} ${LIBPRI_CPPFLAGS}"
|
|
||||||
LIBS="${LIBS} -lpri"
|
|
||||||
|
|
||||||
AC_MSG_CHECKING([whether libpri is usable])
|
|
||||||
AC_LINK_IFELSE(
|
|
||||||
[AC_LANG_PROGRAM(
|
|
||||||
[#include <libpri.h>],
|
|
||||||
[const char *version = pri_get_version();
|
|
||||||
(void)version;]
|
|
||||||
)],
|
|
||||||
[AC_MSG_RESULT([yes])
|
|
||||||
HAVE_LIBPRI="yes"],
|
|
||||||
[AC_MSG_RESULT([no])
|
|
||||||
AC_MSG_ERROR([libpri not found or unusable (see config.log for details)])]
|
|
||||||
)
|
|
||||||
|
|
||||||
AC_MSG_CHECKING([whether libpri is too old])
|
|
||||||
AC_PREPROC_IFELSE(
|
|
||||||
[AC_LANG_PROGRAM(
|
|
||||||
[#include <libpri.h>],
|
|
||||||
[#if !defined(PRI_IO_FUNCS)
|
|
||||||
#error "libpri is lacking PRI_IO_FUNCS"
|
|
||||||
#elif !defined(PRI_NEW_SET_API)
|
|
||||||
#error "libpri is lacking PRI_NEW_SET_API"
|
|
||||||
#endif]
|
|
||||||
)],
|
|
||||||
[AC_MSG_RESULT([no])],
|
|
||||||
[AC_MSG_RESULT([yes])
|
|
||||||
AC_MSG_ERROR([Your version of libpri is too old (pre 1.2), please update!])]
|
|
||||||
)
|
|
||||||
|
|
||||||
AC_MSG_CHECKING([whether libpri has BRI support])
|
|
||||||
AC_LINK_IFELSE(
|
|
||||||
[AC_LANG_PROGRAM(
|
|
||||||
[extern void pri_new_bri_cb(void);],
|
|
||||||
[pri_new_bri_cb();]
|
|
||||||
)],
|
|
||||||
[AC_DEFINE([HAVE_LIBPRI_BRI], [1], [libpri has BRI support])
|
|
||||||
AC_MSG_RESULT([yes])],
|
|
||||||
[AC_MSG_RESULT([no])
|
|
||||||
AC_MSG_NOTICE([You will need libpri-1.4.12_beta1 or newer for BRI support])]
|
|
||||||
)
|
|
||||||
|
|
||||||
AC_MSG_CHECKING([whether libpri has AOC event support])
|
|
||||||
AC_LINK_IFELSE(
|
|
||||||
[AC_LANG_PROGRAM(
|
|
||||||
[extern void pri_aoc_events_enable(void);],
|
|
||||||
[pri_aoc_events_enable();]
|
|
||||||
)],
|
|
||||||
[AC_DEFINE([HAVE_LIBPRI_AOC], [1], [libpri has AOC event support])
|
|
||||||
AC_MSG_RESULT([yes])],
|
|
||||||
[AC_MSG_RESULT([no])
|
|
||||||
AC_MSG_NOTICE([You will need libpri-1.4.12_beta1 or newer for AOC event support])]
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
AC_MSG_CHECKING([whether libpri has pri_maintenance_service()])
|
|
||||||
AC_LINK_IFELSE(
|
|
||||||
[AC_LANG_PROGRAM(
|
|
||||||
[extern int pri_maintenance_service(void);],
|
|
||||||
[pri_maintenance_service();]
|
|
||||||
)],
|
|
||||||
[AC_DEFINE([HAVE_LIBPRI_MAINT_SERVICE], [1], [libpri has pri_maintenance_service()])
|
|
||||||
AC_MSG_RESULT([yes])],
|
|
||||||
[AC_MSG_RESULT([no])
|
|
||||||
AC_MSG_NOTICE([You will need libpri-1.4.11 or newer for the ftdm libpri maintenance set of commands])]
|
|
||||||
)
|
|
||||||
|
|
||||||
# libpri is available, set variables for Makefile(.am)
|
|
||||||
AC_SUBST([LIBPRI_LIBS], [-lpri])
|
|
||||||
AC_SUBST([LIBPRI_LDFLAGS])
|
|
||||||
AC_SUBST([LIBPRI_CPPFLAGS])
|
|
||||||
|
|
||||||
LIBS="${save_LIBS}"
|
|
||||||
LDFLAGS="${save_LDFLAGS}"
|
|
||||||
CPPFLAGS="${save_CPPFLAGS}"
|
|
||||||
fi
|
|
||||||
AM_CONDITIONAL([HAVE_LIBPRI],[test "x${HAVE_LIBPRI}" = "xyes"])
|
|
||||||
|
|
||||||
##
|
|
||||||
# Sangoma Wanpipe
|
|
||||||
#
|
|
||||||
HAVE_LIBSANGOMA="no"
|
|
||||||
AC_MSG_RESULT([${as_nl}<<>> Sangoma Wanpipe])
|
|
||||||
AC_CHECK_LIB([sangoma], [sangoma_span_chan_toif], [HAVE_LIBSANGOMA="yes"])
|
|
||||||
AC_MSG_RESULT([checking whether to build ftmod_wanpipe... ${HAVE_LIBSANGOMA}])
|
|
||||||
AM_CONDITIONAL([HAVE_LIBSANGOMA], [test "${HAVE_LIBSANGOMA}" = "yes"])
|
|
||||||
|
|
||||||
##
|
|
||||||
# Sangoma ISDN stack
|
|
||||||
#
|
|
||||||
HAVE_SNG_ISDN="no"
|
|
||||||
AC_MSG_RESULT([${as_nl}<<>> Sangoma ISDN stack])
|
|
||||||
AC_CHECK_LIB([sng_isdn], [sng_isdn_init], [HAVE_SNG_ISDN="yes"])
|
|
||||||
AC_MSG_RESULT([checking whether to build ftmod_sangoma_isdn... ${HAVE_SNG_ISDN}])
|
|
||||||
AM_CONDITIONAL([HAVE_SNG_ISDN], [test "${HAVE_SNG_ISDN}" = "yes"])
|
|
||||||
|
|
||||||
if test "${HAVE_SNG_ISDN}" = "yes"; then
|
|
||||||
if test "${build}" = "${host}"
|
|
||||||
then
|
|
||||||
case "${host}" in
|
|
||||||
x86_64-*)
|
|
||||||
# X86_64 machines need additional flags when compiling against libsng_isdn
|
|
||||||
CFLAGS="$CFLAGS -DBIT_64 -DALIGN_64BIT"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
##
|
|
||||||
# Sangoma SS7 stack
|
|
||||||
#
|
|
||||||
HAVE_SNG_SS7="no"
|
|
||||||
AC_MSG_RESULT([${as_nl}<<>> Sangoma SS7 stack])
|
|
||||||
AC_CHECK_LIB([sng_ss7], [sng_isup_init_gen], [HAVE_SNG_SS7="yes"])
|
|
||||||
AC_MSG_RESULT([checking whether to build ftmod_sangoma_ss7... ${HAVE_SNG_SS7}])
|
|
||||||
AM_CONDITIONAL([HAVE_SNG_SS7], [test "${HAVE_SNG_SS7}" = "yes"])
|
|
||||||
|
|
||||||
if test "${HAVE_SNG_SS7}" = "yes"; then
|
|
||||||
if test "${build}" = "${host}"
|
|
||||||
then
|
|
||||||
case "${host}" in
|
|
||||||
x86_64-*)
|
|
||||||
# X86_64 machines need additional flags when compiling against libsng_isdn
|
|
||||||
CFLAGS="$CFLAGS -DBIT_64 -DALIGN_64BIT"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
##
|
|
||||||
# zlib (required for Sangoma SS7 Transparent IAM)
|
|
||||||
#
|
|
||||||
HAVE_ZLIB="no"
|
|
||||||
AC_MSG_RESULT([${as_nl}<<>> zlib])
|
|
||||||
AC_CHECK_LIB([z], [compress], [HAVE_ZLIB="yes"])
|
|
||||||
AC_MSG_RESULT([checking whether zlib is installed... ${HAVE_ZLIB}])
|
|
||||||
AM_CONDITIONAL([HAVE_ZLIB], [test "{HAVE_ZLIB]" = "yes"])
|
|
||||||
if test "${HAVE_ZLIB}" = "yes"; then
|
|
||||||
CFLAGS="$CFLAGS -DHAVE_ZLIB"
|
|
||||||
fi
|
|
||||||
|
|
||||||
##
|
|
||||||
# libisdn
|
|
||||||
#
|
|
||||||
HAVE_LIBISDN="no"
|
|
||||||
AC_ARG_WITH([libisdn],
|
|
||||||
[AS_HELP_STRING([--with-libisdn], [Install ftmod_isdn (libisdn stack)])],
|
|
||||||
[case "${withval}" in
|
|
||||||
no) with_libisdn="no" ;;
|
|
||||||
*) with_libisdn="yes" ;;
|
|
||||||
esac
|
|
||||||
],
|
|
||||||
[with_libisdn="no"]
|
|
||||||
)
|
|
||||||
if test "${with_libisdn}" != "no"
|
|
||||||
then
|
|
||||||
AC_MSG_RESULT([${as_nl}<<>> ftmod_isdn (libisdn stack)])
|
|
||||||
m4_ifdef([PKG_CHECK_MODULES],
|
|
||||||
[PKG_CHECK_MODULES([libisdn],
|
|
||||||
[libisdn >= 0.0.1],
|
|
||||||
[AC_MSG_CHECKING([libisdn version])
|
|
||||||
LIBISDN_VERSION="`${PKG_CONFIG} --modversion libisdn`"
|
|
||||||
if test -z "${LIBISDN_VERSION}"; then
|
|
||||||
AC_MSG_ERROR([Failed to retrieve libisdn version])
|
|
||||||
fi
|
|
||||||
AC_MSG_RESULT([${LIBISDN_VERSION}])
|
|
||||||
|
|
||||||
# check features
|
|
||||||
AC_MSG_CHECKING([for new experimental API])
|
|
||||||
AC_COMPILE_IFELSE(
|
|
||||||
[AC_LANG_PROGRAM(
|
|
||||||
[#include <libisdn/version.h>
|
|
||||||
#if !LIBISDN_FEATURE(API2)
|
|
||||||
#error "libisdn API v2 not available"
|
|
||||||
#endif
|
|
||||||
],
|
|
||||||
[;]
|
|
||||||
)],
|
|
||||||
[AC_MSG_RESULT([yes])],
|
|
||||||
[AC_MSG_RESULT([no])]
|
|
||||||
)
|
|
||||||
|
|
||||||
HAVE_LIBISDN="yes"
|
|
||||||
AC_DEFINE([HAVE_LIBISDN], [1], [libisdn support])
|
|
||||||
AC_SUBST([LIBISDN_CFLAGS], [${libisdn_CFLAGS}])
|
|
||||||
AC_SUBST([LIBISDN_CPPFLAGS],[${libisdn_CPPFLAGS}])
|
|
||||||
AC_SUBST([LIBISDN_LDFLAGS], [${libisdn_LDFLAGS}])
|
|
||||||
AC_SUBST([LIBISDN_LIBS], [${libisdn_LIBS}])
|
|
||||||
AC_SUBST([LIBISDN_VERSION])
|
|
||||||
],
|
|
||||||
[AC_MSG_ERROR([Need libisdn-0.0.1 or higher])]
|
|
||||||
)
|
|
||||||
AX_LIB_PCAP],
|
|
||||||
[AC_MSG_WARN([pkg-config missing (required for libisdn detection)])]
|
|
||||||
)
|
|
||||||
fi
|
|
||||||
AM_CONDITIONAL([HAVE_LIBISDN], [test "${HAVE_LIBISDN}" = "yes"])
|
|
||||||
|
|
||||||
|
|
||||||
##
|
|
||||||
# mISDN dependencies
|
|
||||||
#
|
|
||||||
HAVE_MISDN="no"
|
|
||||||
AC_ARG_WITH([misdn],
|
|
||||||
[AS_HELP_STRING([--with-misdn], [Install ftmod_misdn (mISDN I/O plugin)])],
|
|
||||||
[case "${withval}" in
|
|
||||||
no|yes) with_misdn="${withval}" ;;
|
|
||||||
*) AC_MSG_ERROR([Invalid value \"${with_misdn}\" for --with-misdn option]) ;;
|
|
||||||
esac],
|
|
||||||
[with_misdn="auto"]
|
|
||||||
)
|
|
||||||
AS_IF([test "${with_misdn}" != "no"],
|
|
||||||
[AC_MSG_RESULT([${as_nl}<<>> ftmod_misdn (Linux mISDN I/O plugin)])
|
|
||||||
AC_CHECK_HEADER([mISDN/mISDNif.h],
|
|
||||||
[HAVE_MISDN="yes"
|
|
||||||
AC_CHECK_LIB([rt], [clock_gettime])],
|
|
||||||
[AS_IF([test "${with_misdn}" = "yes"],
|
|
||||||
[AC_MSG_ERROR([mISDN/mISDNif.h not found])],
|
|
||||||
[AC_MSG_NOTICE([mISDN/mISDNif.h not found])]
|
|
||||||
)],
|
|
||||||
[#include <sys/socket.h>]
|
|
||||||
)]
|
|
||||||
)
|
|
||||||
AM_CONDITIONAL([HAVE_MISDN], [test "${HAVE_MISDN}" = "yes"])
|
|
||||||
|
|
||||||
|
|
||||||
AC_MSG_RESULT([${as_nl}<<>> Creating output files])
|
|
||||||
AC_CONFIG_FILES([
|
|
||||||
Makefile
|
|
||||||
freetdm.pc
|
|
||||||
mod_freetdm/Makefile
|
|
||||||
])
|
|
||||||
AC_OUTPUT
|
|
||||||
|
|
||||||
#
|
|
||||||
# summary screen
|
|
||||||
#
|
|
||||||
AC_MSG_RESULT([
|
|
||||||
============================ FreeTDM configuration ============================
|
|
||||||
|
|
||||||
+ Modules
|
|
||||||
|
|
||||||
Signalling:
|
|
||||||
ftmod_analog....................... yes
|
|
||||||
ftmod_analog_em.................... yes
|
|
||||||
ftmod_isdn......................... ${HAVE_LIBISDN}
|
|
||||||
ftmod_libpri....................... ${HAVE_LIBPRI}
|
|
||||||
ftmod_sangoma_isdn................. ${HAVE_SNG_ISDN}
|
|
||||||
ftmod_sangoma_ss7.................. ${HAVE_SNG_SS7}
|
|
||||||
ftmod_r2........................... ${HAVE_OPENR2}
|
|
||||||
ftmod_gsm.......................... ${HAVE_WAT}
|
|
||||||
ftmod_pritap....................... ${HAVE_PRITAP}
|
|
||||||
I/O:
|
|
||||||
ftmod_zt........................... yes
|
|
||||||
ftmod_wanpipe...................... ${HAVE_LIBSANGOMA}
|
|
||||||
ftmod_misdn........................ ${HAVE_MISDN}
|
|
||||||
|
|
||||||
===============================================================================
|
|
||||||
])
|
|
|
@ -1,3 +0,0 @@
|
||||||
#! /bin/sh
|
|
||||||
srcpath=$(dirname $0 2>/dev/null ) || srcpath="."
|
|
||||||
$srcpath/configure "$@" --with-pic
|
|
|
@ -1,14 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
# this script must be run from freetdm root dir and it is assuming
|
|
||||||
# FreeSWITCH is trunk is located at ../../
|
|
||||||
fsdir=../..
|
|
||||||
set -x
|
|
||||||
cp Debug/mod/*.dll $fsdir/Debug/mod/
|
|
||||||
cp mod_freetdm/Debug/*.pdb $fsdir/Debug/mod/
|
|
||||||
cp Debug/freetdm.dll $fsdir/Debug/
|
|
||||||
cp Debug/ftmod_*.dll $fsdir/Debug/mod/
|
|
||||||
cp Debug/*.pdb $fsdir/Debug/mod/
|
|
||||||
#cp Debug/testsangomaboost.exe $fsdir/Debug/
|
|
||||||
echo "FRIENDLY REMINDER: RECOMPILE ftmod_wanpipe WHENEVER YOU INSTALL NEW DRIVERS"
|
|
||||||
set +x
|
|
||||||
|
|
|
@ -1,265 +0,0 @@
|
||||||
# Doxyfile 1.4.6
|
|
||||||
|
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
# Project related configuration options
|
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
PROJECT_NAME = FreeTDM
|
|
||||||
PROJECT_NUMBER =
|
|
||||||
OUTPUT_DIRECTORY = docs/
|
|
||||||
CREATE_SUBDIRS = NO
|
|
||||||
OUTPUT_LANGUAGE = English
|
|
||||||
USE_WINDOWS_ENCODING = YES
|
|
||||||
BRIEF_MEMBER_DESC = YES
|
|
||||||
REPEAT_BRIEF = YES
|
|
||||||
ABBREVIATE_BRIEF = "The $name class" \
|
|
||||||
"The $name widget" \
|
|
||||||
"The $name file" \
|
|
||||||
is \
|
|
||||||
provides \
|
|
||||||
specifies \
|
|
||||||
contains \
|
|
||||||
represents \
|
|
||||||
a \
|
|
||||||
an \
|
|
||||||
the
|
|
||||||
ALWAYS_DETAILED_SEC = NO
|
|
||||||
INLINE_INHERITED_MEMB = NO
|
|
||||||
FULL_PATH_NAMES = NO
|
|
||||||
STRIP_FROM_PATH =
|
|
||||||
STRIP_FROM_INC_PATH =
|
|
||||||
SHORT_NAMES = NO
|
|
||||||
JAVADOC_AUTOBRIEF = NO
|
|
||||||
MULTILINE_CPP_IS_BRIEF = NO
|
|
||||||
DETAILS_AT_TOP = NO
|
|
||||||
INHERIT_DOCS = YES
|
|
||||||
SEPARATE_MEMBER_PAGES = NO
|
|
||||||
TAB_SIZE = 8
|
|
||||||
ALIASES =
|
|
||||||
OPTIMIZE_OUTPUT_FOR_C = YES
|
|
||||||
OPTIMIZE_OUTPUT_JAVA = NO
|
|
||||||
DISTRIBUTE_GROUP_DOC = NO
|
|
||||||
SUBGROUPING = YES
|
|
||||||
IGNORE_PREFIX = ftdm_ FTDM_ Q921 Q931
|
|
||||||
|
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
# Build related configuration options
|
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
EXTRACT_ALL = YES
|
|
||||||
EXTRACT_PRIVATE = YES
|
|
||||||
EXTRACT_STATIC = YES
|
|
||||||
EXTRACT_LOCAL_CLASSES = YES
|
|
||||||
EXTRACT_LOCAL_METHODS = YES
|
|
||||||
HIDE_UNDOC_MEMBERS = YES
|
|
||||||
HIDE_UNDOC_CLASSES = YES
|
|
||||||
HIDE_FRIEND_COMPOUNDS = NO
|
|
||||||
HIDE_IN_BODY_DOCS = NO
|
|
||||||
INTERNAL_DOCS = NO
|
|
||||||
CASE_SENSE_NAMES = NO
|
|
||||||
HIDE_SCOPE_NAMES = NO
|
|
||||||
SHOW_INCLUDE_FILES = YES
|
|
||||||
INLINE_INFO = YES
|
|
||||||
SORT_MEMBER_DOCS = YES
|
|
||||||
SORT_BRIEF_DOCS = NO
|
|
||||||
SORT_BY_SCOPE_NAME = NO
|
|
||||||
GENERATE_TODOLIST = YES
|
|
||||||
GENERATE_TESTLIST = YES
|
|
||||||
GENERATE_BUGLIST = YES
|
|
||||||
GENERATE_DEPRECATEDLIST= YES
|
|
||||||
ENABLED_SECTIONS =
|
|
||||||
MAX_INITIALIZER_LINES = 30
|
|
||||||
SHOW_USED_FILES = YES
|
|
||||||
SHOW_DIRECTORIES = YES
|
|
||||||
FILE_VERSION_FILTER =
|
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
# configuration options related to warning and progress messages
|
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
QUIET = NO
|
|
||||||
WARNINGS = YES
|
|
||||||
WARN_IF_UNDOCUMENTED = YES
|
|
||||||
WARN_IF_DOC_ERROR = YES
|
|
||||||
WARN_NO_PARAMDOC = NO
|
|
||||||
WARN_FORMAT = "$file:$line: $text"
|
|
||||||
WARN_LOGFILE =
|
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
# configuration options related to the input files
|
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
INPUT = src/include/freetdm.h
|
|
||||||
|
|
||||||
FILE_PATTERNS = *.c \
|
|
||||||
*.cc \
|
|
||||||
*.cxx \
|
|
||||||
*.cpp \
|
|
||||||
*.c++ \
|
|
||||||
*.d \
|
|
||||||
*.java \
|
|
||||||
*.ii \
|
|
||||||
*.ixx \
|
|
||||||
*.ipp \
|
|
||||||
*.i++ \
|
|
||||||
*.inl \
|
|
||||||
*.h \
|
|
||||||
*.hh \
|
|
||||||
*.hxx \
|
|
||||||
*.hpp \
|
|
||||||
*.h++ \
|
|
||||||
*.idl \
|
|
||||||
*.odl \
|
|
||||||
*.cs \
|
|
||||||
*.php \
|
|
||||||
*.php3 \
|
|
||||||
*.inc \
|
|
||||||
*.m \
|
|
||||||
*.mm \
|
|
||||||
*.dox \
|
|
||||||
*.py
|
|
||||||
RECURSIVE = NO
|
|
||||||
EXCLUDE =
|
|
||||||
EXCLUDE_SYMLINKS = NO
|
|
||||||
EXCLUDE_PATTERNS =
|
|
||||||
EXAMPLE_PATH =
|
|
||||||
EXAMPLE_PATTERNS =
|
|
||||||
EXAMPLE_RECURSIVE = NO
|
|
||||||
IMAGE_PATH =
|
|
||||||
INPUT_FILTER =
|
|
||||||
FILTER_PATTERNS =
|
|
||||||
FILTER_SOURCE_FILES = NO
|
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
# configuration options related to source browsing
|
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
SOURCE_BROWSER = NO
|
|
||||||
INLINE_SOURCES = YES
|
|
||||||
STRIP_CODE_COMMENTS = YES
|
|
||||||
REFERENCED_BY_RELATION = YES
|
|
||||||
REFERENCES_RELATION = YES
|
|
||||||
USE_HTAGS = YES
|
|
||||||
VERBATIM_HEADERS = NO
|
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
# configuration options related to the alphabetical class index
|
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
ALPHABETICAL_INDEX = YES
|
|
||||||
COLS_IN_ALPHA_INDEX = 1
|
|
||||||
IGNORE_PREFIX = ftdm_
|
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
# configuration options related to the HTML output
|
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
GENERATE_HTML = YES
|
|
||||||
HTML_OUTPUT = html
|
|
||||||
HTML_FILE_EXTENSION = .html
|
|
||||||
HTML_HEADER =
|
|
||||||
HTML_FOOTER =
|
|
||||||
HTML_STYLESHEET =
|
|
||||||
HTML_ALIGN_MEMBERS = YES
|
|
||||||
GENERATE_HTMLHELP = NO
|
|
||||||
CHM_FILE = freetdm.chm
|
|
||||||
HHC_LOCATION =
|
|
||||||
GENERATE_CHI = YES
|
|
||||||
BINARY_TOC = NO
|
|
||||||
TOC_EXPAND = NO
|
|
||||||
DISABLE_INDEX = NO
|
|
||||||
ENUM_VALUES_PER_LINE = 4
|
|
||||||
GENERATE_TREEVIEW = YES
|
|
||||||
TREEVIEW_WIDTH = 250
|
|
||||||
|
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
# configuration options related to the LaTeX output
|
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
GENERATE_LATEX = NO
|
|
||||||
LATEX_OUTPUT = latex
|
|
||||||
LATEX_CMD_NAME = latex
|
|
||||||
MAKEINDEX_CMD_NAME = makeindex
|
|
||||||
COMPACT_LATEX = NO
|
|
||||||
PAPER_TYPE = a4wide
|
|
||||||
EXTRA_PACKAGES =
|
|
||||||
LATEX_HEADER =
|
|
||||||
PDF_HYPERLINKS = NO
|
|
||||||
USE_PDFLATEX = NO
|
|
||||||
LATEX_BATCHMODE = NO
|
|
||||||
LATEX_HIDE_INDICES = NO
|
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
# configuration options related to the RTF output
|
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
GENERATE_RTF = NO
|
|
||||||
RTF_OUTPUT = rtf
|
|
||||||
COMPACT_RTF = NO
|
|
||||||
RTF_HYPERLINKS = NO
|
|
||||||
RTF_STYLESHEET_FILE =
|
|
||||||
RTF_EXTENSIONS_FILE =
|
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
# configuration options related to the man page output
|
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
GENERATE_MAN = NO
|
|
||||||
MAN_OUTPUT = man
|
|
||||||
MAN_EXTENSION = .3
|
|
||||||
MAN_LINKS = NO
|
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
# configuration options related to the XML output
|
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
GENERATE_XML = NO
|
|
||||||
XML_OUTPUT = xml
|
|
||||||
XML_SCHEMA =
|
|
||||||
XML_DTD =
|
|
||||||
XML_PROGRAMLISTING = YES
|
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
# configuration options for the AutoGen Definitions output
|
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
GENERATE_AUTOGEN_DEF = NO
|
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
# configuration options related to the Perl module output
|
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
GENERATE_PERLMOD = NO
|
|
||||||
PERLMOD_LATEX = NO
|
|
||||||
PERLMOD_PRETTY = YES
|
|
||||||
PERLMOD_MAKEVAR_PREFIX =
|
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
# Configuration options related to the preprocessor
|
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
ENABLE_PREPROCESSING = YES
|
|
||||||
MACRO_EXPANSION = YES
|
|
||||||
EXPAND_ONLY_PREDEF = NO
|
|
||||||
SEARCH_INCLUDES = NO
|
|
||||||
INCLUDE_PATH =
|
|
||||||
INCLUDE_FILE_PATTERNS = *.h
|
|
||||||
PREDEFINED = FT_DECLARE(x)=x \
|
|
||||||
FT_MOD_DECLARE(x)=x \
|
|
||||||
DoxyDefine(x)=x
|
|
||||||
|
|
||||||
EXPAND_AS_DEFINED = NO
|
|
||||||
SKIP_FUNCTION_MACROS = NO
|
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
# Configuration::additions related to external references
|
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
TAGFILES =
|
|
||||||
GENERATE_TAGFILE =
|
|
||||||
ALLEXTERNALS = NO
|
|
||||||
EXTERNAL_GROUPS = YES
|
|
||||||
PERL_PATH = /usr/bin/perl
|
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
# Configuration options related to the dot tool
|
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
CLASS_DIAGRAMS = YES
|
|
||||||
HIDE_UNDOC_RELATIONS = YES
|
|
||||||
HAVE_DOT = YES
|
|
||||||
CLASS_GRAPH = YES
|
|
||||||
COLLABORATION_GRAPH = YES
|
|
||||||
GROUP_GRAPHS = YES
|
|
||||||
UML_LOOK = YES
|
|
||||||
TEMPLATE_RELATIONS = YES
|
|
||||||
INCLUDE_GRAPH = YES
|
|
||||||
INCLUDED_BY_GRAPH = YES
|
|
||||||
CALL_GRAPH = YES
|
|
||||||
GRAPHICAL_HIERARCHY = YES
|
|
||||||
DIRECTORY_GRAPH = YES
|
|
||||||
DOT_IMAGE_FORMAT = jpg
|
|
||||||
DOT_PATH =
|
|
||||||
DOTFILE_DIRS =
|
|
||||||
MAX_DOT_GRAPH_WIDTH = 1024
|
|
||||||
MAX_DOT_GRAPH_HEIGHT = 1024
|
|
||||||
MAX_DOT_GRAPH_DEPTH = 1000
|
|
||||||
DOT_TRANSPARENT = NO
|
|
||||||
DOT_MULTI_TARGETS = NO
|
|
||||||
GENERATE_LEGEND = YES
|
|
||||||
DOT_CLEANUP = YES
|
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
# Configuration::additions related to the search engine
|
|
||||||
#---------------------------------------------------------------------------
|
|
||||||
SEARCHENGINE = NO
|
|
Binary file not shown.
|
@ -1,15 +0,0 @@
|
||||||
APIs that result in an event when the API returns FTDM_SUCCESS
|
|
||||||
|
|
||||||
ftdm_channel_call_answer()
|
|
||||||
ftdm_channel_call_indicate()
|
|
||||||
ftdm_channel_call_transfer()
|
|
||||||
FTDM_SIGEVENT_INDICATION_COMPLETED
|
|
||||||
*note that FTDM_SIGEVENT_INDICATION_COMPLETED has associated data to indicate the result of the indication
|
|
||||||
*note this event is only delivered on non-blocking channels
|
|
||||||
|
|
||||||
ftdm_call_place
|
|
||||||
FTDM_SIGEVENT_DIALING
|
|
||||||
|
|
||||||
ftdm_channel_call_hangup
|
|
||||||
FTDM_SIGEVENT_RELEASED
|
|
||||||
|
|
|
@ -1,76 +0,0 @@
|
||||||
== This is an email sent to stkn responding to his post http://stkn.techmage.de/archives/200 ==
|
|
||||||
|
|
||||||
1. FreeTDM open channels immediately.
|
|
||||||
|
|
||||||
Yes, this seems to come from the early days of Freetdm where probably the analog modules were implemented first and was dragged incorrectly to ISDN.
|
|
||||||
The open API also sets the flag in use so others cannot use it. We should decouple this open and reserve operations. Does not seem very hard to do,
|
|
||||||
I'll take a look at it on my way back to Toronto this week or earlier if possible, I'll create a git branch for it and send you the url for peer review.
|
|
||||||
Feel free to do the opposite if you are in a hurry.
|
|
||||||
|
|
||||||
2. FreeTDM does not completely close the channel on hangup.
|
|
||||||
|
|
||||||
As long as the signaling module calls ftdm_channel_close() the fio->close API will be called where the IO module is responsible
|
|
||||||
for turning off ec or any other operations to leave the channel unused/idle (not really closed). There was indeed a bug where ftdm_zt module
|
|
||||||
was not properly closing the channel, if that is what you mean, then it means that was already fixed by you with your audio mode turn off patch.
|
|
||||||
|
|
||||||
Now, a more lengthy response ...
|
|
||||||
|
|
||||||
When we, Sangoma, took over freetdm and renamed it to freetdm, it was not just a name change, many API cleanups were done so API users cannot access
|
|
||||||
|
|
||||||
the internal data structures and cannot explicitly move between channel states. Also, some order on the state transitions has been put into place.
|
|
||||||
|
|
||||||
We've tried to keep backwards compatibility though, so old modules may not follow all of the conventions. Some unwritten conventions are:
|
|
||||||
|
|
||||||
1. Signaling modules are responsible for calling ftdm_channel_close() when done with the channel. In fact, signaling modules should not
|
|
||||||
call ftdm_channel_done unless they really know what they're doing. ftdm_channel_close will call ftdm_channel_done anyways.
|
|
||||||
|
|
||||||
2. When remote end hangs up a call, signaling module should go to TERMINATING state and send SIGEVENT_STOP to the user. The signaling stack
|
|
||||||
should not acknowledge the hangup until the user implicitly moves us to HANGUP (via ftdm_channel_call_hangup()). There is a core timer
|
|
||||||
that will ensure we move from TERMINATING to HANGUP if the user does not moves us fast enough (arbitrarely 3000ms), although that is considered
|
|
||||||
a bug in the user application (at some point we saw that in FreeSWITCH) and we complain loudly when that happens.
|
|
||||||
|
|
||||||
3. Signaling modules should leave the channel with NO pending states once they unlock it. This means, whenever you have a message to process
|
|
||||||
you must lock the channel, check its current state (the user may have already changed the state to something else), process any pending
|
|
||||||
state set by the user, then process your message and if required move the channel to a new state and process that state before releasing the lock.
|
|
||||||
There is a chance of a deadlock due to the callbacks we use to notify users of messages if we call those callbacks with the channel lock held and
|
|
||||||
that is why new signaling modules should use the FTDM_SPAN_USE_SIGNALS_QUEUE to defer the notification to the user when the ftdm_channel_t is not
|
|
||||||
locked calling ftdm_span_trigger_signals() at the end of their processing loop which delivers the callback notifications to users.
|
|
||||||
|
|
||||||
Having said that, there is a major architectural change coming, probably early 2011, and I'd like to have your input.
|
|
||||||
|
|
||||||
== Decoupling calls from IO channels ==
|
|
||||||
|
|
||||||
We've also found that the concept of a channel and a call are unnecesarily coupled together in FreeTDM. I've never asked Anthony the reasoning
|
|
||||||
for this, but it seems the API was meant to be used with, or without calls. That is, a user should be able to just 'open' a channel and start
|
|
||||||
reading and writing raw data without ever launching one of the provided signaling stacks on top, may be just because the user is using their
|
|
||||||
own signaling stack and just needs freetdm as an I/O API. In fact, signaling modules work like this (but there are defects there).
|
|
||||||
The problem is, as you have noticed, the way ftdm_channel_open_xx APIs has been implemented is abusing this concept.
|
|
||||||
|
|
||||||
Problems with current implementation.
|
|
||||||
|
|
||||||
1. Exclusive channel is the only way we can request channels to the ISDN network. There is no room to change the channel later on easily.
|
|
||||||
2. Multi-rate calls cannot be done. We need to associate multiple B-channels to a single call.
|
|
||||||
3. Low-bit-rate calls (not sure what is the proper name for them) where a single B-channel can feed media to multiple calls with a low bit-rate
|
|
||||||
codec (I know of at least one request from a big company for this to support some Q.SIG stuff for Eurocontrol).
|
|
||||||
|
|
||||||
|
|
||||||
What do we need?
|
|
||||||
|
|
||||||
I think there should be only one open() API that wraps calls around fio->open(), the other current open_xx functions that do hunting, should
|
|
||||||
be eliminated and some extra arguments provided to ftdm_channel_call_place to provide information about the channel where we would like to
|
|
||||||
place the call or group hunting information and the API would return immediately providing a ftdm_call_t reference pointer that can be used
|
|
||||||
to further track the status of that call, or in the case where a channel exclusivity was requested and we know for a fact is not available,
|
|
||||||
just return failure. At that point there is no I/O channel involved yet. Eventually after the signaling stack hunts the channel and
|
|
||||||
negotiaties its availability with the network, an I/O channel can be attached to that call, or even attach multiple channels (for the case
|
|
||||||
of multi rate calls?).
|
|
||||||
|
|
||||||
This involves heavy changes. The state machine should be moved out of the ftdm_channel_t structure along with probably some other members
|
|
||||||
and stuffed into a new ftdm_call_t structure. Signaling modules would have to be updated to run their state machines with this call
|
|
||||||
structure and then at some point attach IO channels to the call. There would be 2 type of read/write APIs, one low level ftdm_channel_read
|
|
||||||
which receives an ftdm_channel_t as parameter and an ftdm_call_read() which receives an ftdm_call_t as parameter, for the case of multi-rate
|
|
||||||
calls or low-bit-rate multiplexed calls in the same B-channel this API would return just the media corresponding to that call already
|
|
||||||
demultiplexed or concatenated, or whatever needs to be done with the media from the multiple low-level IO channels.
|
|
||||||
|
|
||||||
This is fairly disruptive, but I believe should be done sooner or later.
|
|
||||||
|
|
||||||
|
|
|
@ -1,25 +0,0 @@
|
||||||
Glare is a PITA.
|
|
||||||
|
|
||||||
Although configuration of ISDN links can be done to minimize glare, we also must have a clear policy
|
|
||||||
on how the FreeTDM API is supposed to behave on glare across signaling modules.
|
|
||||||
|
|
||||||
There is a well-known race in the FreeTDM API since the beginning. When a user wants to place a call with
|
|
||||||
the old APIs:
|
|
||||||
|
|
||||||
1. ftdm_channel_open_xx (to hunt the channel by group, span or select a channel individually)
|
|
||||||
2. ftdm_channel_call_place() to place the actual call.
|
|
||||||
|
|
||||||
Since the user has no access to channel locking, between opening a channel and placing a call, an incoming call could be
|
|
||||||
received. Therefore things can get complicated and that is why you should STOP USING those 2 deprecated functions.
|
|
||||||
|
|
||||||
The replacement is ftdm_call_place().
|
|
||||||
|
|
||||||
ftdm_call_place receives the information required to hunt the channel and place the call.
|
|
||||||
|
|
||||||
If glare is detected after placing the call and the signaling stack decides to drop the local call, a regular
|
|
||||||
SIGEVENT_STOP will be sent with the hangup cause FTDM_CAUSE_REQUESTED_CHAN_UNAVAIL.
|
|
||||||
|
|
||||||
ftdm_call_place may return FTDM_BREAK if glare is detected while placing the call, in such cases you can try
|
|
||||||
calling ftdm_call_place again to hunt another channel.
|
|
||||||
|
|
||||||
|
|
|
@ -1,13 +0,0 @@
|
||||||
Last Updated: Jan 19, 2011
|
|
||||||
|
|
||||||
== BACKGROUND ==
|
|
||||||
|
|
||||||
The IO module provides an abstracted IO interface to FreeTDM.
|
|
||||||
|
|
||||||
== SHUTDOWN ==
|
|
||||||
Upon global shutdown, for each channel FIO_CLOSE_FUNCTION will be called.
|
|
||||||
When FIO_CLOSE_FUNCTION is called, all waiters on this channel shall be signalled.
|
|
||||||
If FIO_WAIT_FUNCTION is called on a function that has already been closed, this function shall return FTDM_TIMEOUT without blocking.
|
|
||||||
FIO_CHANNEL_DESTROY will eventually be called, and IO module is responsible for clearing all internal states and free allocated memory upon channel destroy.
|
|
||||||
|
|
||||||
|
|
|
@ -1,125 +0,0 @@
|
||||||
Last Updated: Fri 30 Dec, 2010
|
|
||||||
|
|
||||||
== Background ==
|
|
||||||
|
|
||||||
FreeTDM is a threaded library. As such, locking considerations must be taken when using it and when writing code inside the library.
|
|
||||||
|
|
||||||
At the moment locks are not exposed to users. This means API users cannot acquire a lock on a channel or span structure. There is no
|
|
||||||
need for users to lock channels or spans since all their interactions with those structures should be done thru the FreeTDM API which
|
|
||||||
can (and in most cases must) internally lock on their behalf.
|
|
||||||
|
|
||||||
Internally, locking can be done either by the core or the signaling modules. To better understand the locking considerations we must
|
|
||||||
understand first the threading model of FreeTDM.
|
|
||||||
|
|
||||||
== Threading Model ==
|
|
||||||
|
|
||||||
At startup, when the user calls ftdm_global_init(), just one timing thread is created to dispatch internal timers. If you write
|
|
||||||
a signaling module or any other code using the scheduling API, you can choose to run your schedule in this timing thread or in
|
|
||||||
a thread of your choice. This is the only thread launched at initialization.
|
|
||||||
|
|
||||||
If the application decides to use ftdm_global_configuration(), which reads freetdm.conf to create the spans and channels data
|
|
||||||
structures, then possibly another thread will be launched for CPU usage monitoring (only if enabled in the configuration cpu_monitor=yes
|
|
||||||
This thread sole purpose is to check the CPU and raise an alarm if reaches a configurable threshold, the alarm then is checked to avoid
|
|
||||||
placing or receiving further calls.
|
|
||||||
|
|
||||||
At this point FreeTDM has initialized and configured its channels input output configuration.
|
|
||||||
|
|
||||||
The user is then supposed to configure the signaling via ftdm_configure_span_signaling() and then start the signaling work
|
|
||||||
using ftdm_span_start(). This will typically launch at least 1 thread per span. Some signaling modules (actually just the analog one)
|
|
||||||
launches another thread per channel when receiving a call. The rest of the signaling modules currently launch only one thread per
|
|
||||||
span and the signaling for all channels within the span is handled in that thread. We call that thread 'the signaling thread'.
|
|
||||||
|
|
||||||
At this point the user can start placing calls using the FreeTDM call API ftdm_channel_call_place(). Any of the possible threads in
|
|
||||||
which the user calls the FreeTDM API is called 'the user thread', depending on the application thread model (the application using FreeTDM)
|
|
||||||
this user thread may be different each time or the same all the time, we cannot make any assumptions. In the case of FreeSWITCH, the most
|
|
||||||
common user of FreeTDM, the user thread is most of the cases a thread for each new call leg.
|
|
||||||
|
|
||||||
At this point we have identified 4 types of threads.
|
|
||||||
|
|
||||||
1. The timing thread (the core thread that triggers timers).
|
|
||||||
Its responsibility is simply check for timers that were scheduled and trigger them when the time comes. This means that if you decide
|
|
||||||
to use the scheduling API in freerun mode (where you use the core timer thread) you callbacks will be executed in this global thread
|
|
||||||
and you MUST not block at all since there might be other events waiting.
|
|
||||||
|
|
||||||
2. The CPU thread (we don't really care about this one as it does not interact with channels or spans).
|
|
||||||
|
|
||||||
3. The signaling thread.
|
|
||||||
There is one thread of this per span. This thread takes care of reading signaling specific messages from the network (ISDN network, etc) and
|
|
||||||
changing the channel call state accordingly and processing state changes caused by user API calls (like ftdm_channel_call_hangup for example).
|
|
||||||
|
|
||||||
4. The user thread.
|
|
||||||
This is a thread in which the user decides to execute FreeTDM APIs, in some cases it might even be the same than the signaling thread (because
|
|
||||||
most SIGEVENT notifications are delivered by the signaling thread, however we are advicing users to not use FreeTDM unsafe APIs from the
|
|
||||||
thread where they receive SIGEVENT notifications as some APIs may block for a few milliseconds, effectively blocking the whole signaling thread
|
|
||||||
that is servicing a span.
|
|
||||||
|
|
||||||
== Application Locking ==
|
|
||||||
|
|
||||||
Users of the FreeTDM API will typically have locking of their own for their own application-specific data structures (in the case of FreeSWITCH, the
|
|
||||||
session lock for example). Other application-specific locks may be involved.
|
|
||||||
|
|
||||||
== DeadLocks ==
|
|
||||||
|
|
||||||
As soon as we think of application locks, and we mix them with the FreeTDM internal locks, the possibility of deadlocks arise.
|
|
||||||
|
|
||||||
A typical deadlock scenario when 2 locks are involved is:
|
|
||||||
|
|
||||||
- User Thread - - Signaling Thread -
|
|
||||||
1. Application locks applock. 1. A network message is received for a channel.
|
|
||||||
|
|
||||||
2. Aplication invokes a FreeTDM call API (ie: ftdm_channel_call_hangup()). 2. The involved channel is locked.
|
|
||||||
|
|
||||||
3. The FreeTDM API attempts to acquire the channel lock and stalls because 3. The message processing results in a notification
|
|
||||||
the signaling thread just acquired it. to be delivered to the user via the callback function
|
|
||||||
provided for that purpose. The callback is then called.
|
|
||||||
|
|
||||||
4. The thread is now deadlocked because the signaling thread will never 4. The application callback attempts to acquire its application
|
|
||||||
release the channel lock. lock but deadlocks because the user thread already has it.
|
|
||||||
|
|
||||||
To avoid this signaling modules should not deliver signals to the user while holding the channel lock. An easy way to avoid this is
|
|
||||||
to not deliver signals while processing a state change, but rather defer them until the channel lock is released. Most new signaling modules
|
|
||||||
accomplish this by setting the span flag FTDM_SPAN_USE_SIGNALS_QUEUE, this flag tells the core to enqueue signals (ie FTDM_SIGEVENT_START)
|
|
||||||
when ftdm_span_send_signal() is called and not deliver them until ftdm_span_trigger_signals() is called, which is done by the signaling module
|
|
||||||
in its signaling thread when no channel lock is being held.
|
|
||||||
|
|
||||||
== State changes while locking ==
|
|
||||||
|
|
||||||
Only 2 types of threads should be performing state changes.
|
|
||||||
|
|
||||||
User threads.
|
|
||||||
The user thread is a random thread that was crated by the API user. We do not know what threading model users of FreeTDM will follow
|
|
||||||
and therefore cannot make assumptions about it. The user should be free to call FreeTDM APIs from any thread, except threads that
|
|
||||||
are under our control, like the signaling threads. Although it may work in most situations, is discouraged for users to try
|
|
||||||
to use FreeTDM APIs from the signaling thread, that is, the thread where the signaling callback provided during configuration
|
|
||||||
is called (the callback where FTDM_SIGEVENT_XXX signals are delivered).
|
|
||||||
|
|
||||||
A user thread may request state changes implicitly through calls to FreeTDM API's. The idea of state changes is internal to freetdm
|
|
||||||
and should not be exposed to users of the API (except for debugging purposes, like the ftdm_channel_get_state, ftdm_channel_get_state_str etc)
|
|
||||||
|
|
||||||
This is an example of the API's that implicitly request a state change.
|
|
||||||
|
|
||||||
ftdm_channel_call_answer()
|
|
||||||
|
|
||||||
Signaling modules should guarantee that upon releasing a lock on a channel, any state changes will be already processed and
|
|
||||||
not deferred to other threads, otherwise that leads to a situation where a state change requested by the signaling module is pending
|
|
||||||
to be serviced by another signaling module thread but a user thread wins the channel lock and attempts to perform a state change which will
|
|
||||||
fail because another state change is pending (and user threads are not meant to process signaling states).
|
|
||||||
|
|
||||||
ONLY one signaling thread per channel should try to perform state changes and processing of the states,
|
|
||||||
otherwise complexity arises and is not worth it!
|
|
||||||
|
|
||||||
At some point before we stablished this policies we could have 3 different threads doing state changes.
|
|
||||||
|
|
||||||
1. A user random thread could implcitly try to change the state in response to a call API.
|
|
||||||
2. The ftmod signaling thread could try to change the state in response to other state changes.
|
|
||||||
3. The lower level signaling stack threads could try to change the state in response to stack events.
|
|
||||||
|
|
||||||
As a result, lower level signaling stack thread could set a state and then let the signaling thread to
|
|
||||||
process it, but when unlocking the channel, the user thread may win the lock over the signaling thread and
|
|
||||||
may try to set a state change of its own and fail (due to the unprocessed state change)!
|
|
||||||
|
|
||||||
The rule is, the signaling module should never unlock a channel with states pending to process this way the user,
|
|
||||||
when acquiring a channel lock (inside ftdm_channel_call_answer for example) it will always find a consistent state
|
|
||||||
for the channel and not in the middle of state processing.
|
|
||||||
|
|
||||||
|
|
|
@ -1,59 +0,0 @@
|
||||||
FreeTDM can both notify and set signaling status changes in the different protocols thru a unified interface. More
|
|
||||||
specific details on the C data types and function prototypes are found in freetdm.h
|
|
||||||
|
|
||||||
The API provides the following functions and data types to do it:
|
|
||||||
|
|
||||||
The signaling status in any channel/span is represented thru ftdm_signaling_status_t
|
|
||||||
|
|
||||||
/* The signaling link is down (no d-chans up in the span/group, MFC-R2 bit pattern unidentified) */
|
|
||||||
FTDM_SIG_STATE_DOWN,
|
|
||||||
/* The signaling link is suspended (MFC-R2 bit pattern blocked, PRI maintenance, ss7 blocked?) */
|
|
||||||
FTDM_SIG_STATE_SUSPENDED,
|
|
||||||
/* The signaling link is ready and calls can be placed (ie: d-chan up, MFC-R2 both rx and tx in IDLE) */
|
|
||||||
FTDM_SIG_STATE_UP,
|
|
||||||
/* Invalid status */
|
|
||||||
FTDM_SIG_STATE_INVALID
|
|
||||||
|
|
||||||
Changes in the signaling status are notified to the user using the standard callback notification function provided
|
|
||||||
during configuration using the sigevent type FTDM_SIGEVENT_SIGSTATUS_CHANGED which is sent when the line status changes.
|
|
||||||
|
|
||||||
On startup the signalling status default is FTDM_SIG_STATE_DOWN, and no notification is provided until the state change,
|
|
||||||
so applications must assume the status is down unless told otherwise.
|
|
||||||
|
|
||||||
When ftdm_span_start is called, the signaling stack takes care of attempting to bring the status to UP
|
|
||||||
but it will ultimately depend on the other side too.
|
|
||||||
|
|
||||||
== Setting the signaling status ==
|
|
||||||
|
|
||||||
Users can set the signaling status on a given channel/span thru FreeTDM the following API functions:
|
|
||||||
|
|
||||||
ftdm_channel_set_sig_status
|
|
||||||
ftdm_span_set_sig_status
|
|
||||||
|
|
||||||
If the user calls ftdm_channel_set_sig_status(chan, FTDM_SIG_STATE_SUSPENDED), the signaling stack will try to set
|
|
||||||
the status of the line to the one requested, if successful, it will result in a SIGEVENT_SIGSTATUS_CHANGED notification
|
|
||||||
being sent with status FTDM_SIG_STATE_SUSPENDED.
|
|
||||||
|
|
||||||
** MFC-R2 Signaling Notes **
|
|
||||||
For MFC-R2, calling ftdm_span_start() results in setting the tx CAS bits to IDLE. However, if the rx bits are in BLOCKED state
|
|
||||||
the signaling status will be reported as SUSPENDED.
|
|
||||||
|
|
||||||
If the user calls ftdm_channel_set_sig_status(chan, SUSPENDED), the tx CAS bits will be set to BLOCKED and, if, the current rx bits
|
|
||||||
are IDLE then a SIGEVENT_SIGSTATUS_CHANGED with state SUSPENDED will be sent. If the rx bits are already in blocked then no further
|
|
||||||
SIGEVENT_SIGSTATUS_CHANGED notification is needed (because it was already sent when the rx bits were initially detected as BLOCKED).
|
|
||||||
|
|
||||||
If the user calls ftdm_channel_set_sig_status(chan, UP), the tx CAS bits will be set to IDLE and, if, the current rx bits
|
|
||||||
are IDLE, then SIGEVENT_SIGSTATUS_CHANGED with state UP will be sent. If the rx bits are BLOCKED, then no notification is
|
|
||||||
sent at all until the rx bits change.
|
|
||||||
|
|
||||||
Bottom line is, for MFC-R2, SIGEVENT_SIGSTATUS_CHANGED UP is only sent to the user when both the rx and tx bits are in IDLE, and
|
|
||||||
SIGEVENT_SIGSTATUS_CHANGED SUSPENDED is only sent to the user when any of the rx or tx bits are in BLOCKED.
|
|
||||||
|
|
||||||
== Getting the signaling status ==
|
|
||||||
Users can get the signaling status on a given channel/span thru FreeTDM the following API functions:
|
|
||||||
|
|
||||||
ftdm_channel_get_sig_status
|
|
||||||
ftdm_span_get_sig_status
|
|
||||||
|
|
||||||
The line status returned should be the same as the last time a SIGEVENT_SIGSTATUS_CHANGED was reported.
|
|
||||||
|
|
|
@ -1,43 +0,0 @@
|
||||||
SS7 Native Bridge
|
|
||||||
|
|
||||||
Native bridge is enabled on 2 conditions:
|
|
||||||
|
|
||||||
* The SIP header FreeTDM-TransUUID is set in the originating leg and matches a freetdm channel
|
|
||||||
* The variable freetdm_native_sigbridge is true and the originating leg is also a freetdm channel
|
|
||||||
|
|
||||||
Some coding rules apply to this feature:
|
|
||||||
|
|
||||||
- Each channel is responsible for clearning its own peer_data and event queue
|
|
||||||
at the end of the call (when moving to DOWN state)
|
|
||||||
|
|
||||||
- Each channel dequeues messages only from its own queue and enqueues messages
|
|
||||||
in the peer's queue, with the only exception being messages received before
|
|
||||||
the bridge is stablished (IAM for sure and possible SAM messages) because
|
|
||||||
if the bridge is not yet stablished the messages must be queued by the channel
|
|
||||||
in its own queue temporarily until the bridge is ready
|
|
||||||
|
|
||||||
- When the bridge is ready it is the responsibility of the incoming channel to
|
|
||||||
move the messages that stored temporarily in its own queue to the bridged peer queue
|
|
||||||
|
|
||||||
- During hangup, each channel is responsible for moving itself to DOWN. The procedure
|
|
||||||
however differs slightly depending on the hangup conditions
|
|
||||||
|
|
||||||
If the user requests hangup (ie, FreeSWITCH) the request will be noted by setting the
|
|
||||||
FTDM_CHANNEL_USER_HANGUP flag but will not be processed yet because call control is
|
|
||||||
driven only by the link messages (so no hangup from ESL or command line allowed)
|
|
||||||
|
|
||||||
When REL message comes, the channel receiving it must move to TERMINATING state and:
|
|
||||||
|
|
||||||
- If the user has not hangup yet (FTDM_CHANNEL_USER_HANGUP flag not set) then
|
|
||||||
notify the user via SIGEVENT_STOP and wait for the user to move to HANGUP
|
|
||||||
state by calling ftdm_channel_call_hangup() before sending RLC
|
|
||||||
|
|
||||||
- If the user did hangup already (FTDM_CHANNEL_USER_HANGUP flag is set) then
|
|
||||||
skip user notification and move to HANGUP state directly where the RLC message
|
|
||||||
will be sent
|
|
||||||
|
|
||||||
- On HANGUP state the RLC is sent and the channel is moved to DOWN, final state
|
|
||||||
The peer channel will forward the REL message and wait for RLC from the network, when
|
|
||||||
RLC is received the channel can move straight to DOWN itself because the peer channel
|
|
||||||
is completing its own shutdown procedure when it received the REL message
|
|
||||||
|
|
|
@ -1,122 +0,0 @@
|
||||||
Using FreeTDM Variables
|
|
||||||
|
|
||||||
1. User application sending variables or raw buffer to FreeTDM
|
|
||||||
==============================================================
|
|
||||||
|
|
||||||
The User can include a ftdm_usrmsg_t before sending an event to freetdm.
|
|
||||||
|
|
||||||
example #1a - Making an outbound call:
|
|
||||||
--------------------------------------
|
|
||||||
|
|
||||||
To make an outbound call:
|
|
||||||
ftdm_usrmsg_t usrmsg;
|
|
||||||
memset(&usrmsg, 0, sizeof(usrmsg));
|
|
||||||
|
|
||||||
/* Attach variable to usrmsg */
|
|
||||||
ftdm_usrmsg_add_var(&usrmsg, "isdn.prog_ind.descr", "inband-info-available");
|
|
||||||
|
|
||||||
ftdm_channel_call_place_ex(ftdmchan, &usrmsg);
|
|
||||||
|
|
||||||
example #1b - Adding a variable:
|
|
||||||
--------------------------------
|
|
||||||
When using ftmod_sangoma_isdn, user want to specify progress indicator inside PROCEED message.
|
|
||||||
|
|
||||||
|
|
||||||
ftdm_usrmsg_t usrmsg;
|
|
||||||
memset(&usrmsg, 0, sizeof(usrmsg));
|
|
||||||
|
|
||||||
/* Attach variable to usrmsg */
|
|
||||||
ftdm_usrmsg_add_var(&usrmsg, "isdn.prog_ind.descr", "inband-info-available");
|
|
||||||
|
|
||||||
/* Request FreeTDM to send a PROCEED msg */
|
|
||||||
ftdm_channel_call_indicate_ex(ftdmchan, FTDM_CHANNEL_INDICATE_PROCEED, &usrmsg);
|
|
||||||
|
|
||||||
|
|
||||||
example #2 - Setting raw data:
|
|
||||||
--------------------------------------------------------
|
|
||||||
|
|
||||||
When using ftmod_sangoma_isdn, user wants to transmit a custom Facility IE, inside a FACILITY message.
|
|
||||||
|
|
||||||
ftdm_usrmsg_t usrmsg;
|
|
||||||
|
|
||||||
uint8_t *my_facility_ie = ftdm_calloc(1, 200); /*memory has to be allocated using ftdm_calloc !! */
|
|
||||||
unsigned my_facility_ie_len = 0;
|
|
||||||
|
|
||||||
memset(&usrmsg, 0, sizeof(usrmsg));
|
|
||||||
|
|
||||||
/* Fill my_facility_ie with custom data here */
|
|
||||||
my_facility_ie[my_facility_ie_len++] = 0x1C; /* Q.931 Facility IE ID */
|
|
||||||
my_facility_ie[my_facility_ie_len++] = 0x03; /* Length of facility IE */
|
|
||||||
my_facility_ie[my_facility_ie_len++] = 0x01;
|
|
||||||
my_facility_ie[my_facility_ie_len++] = 0x02;
|
|
||||||
my_facility_ie[my_facility_ie_len++] = 0x03;
|
|
||||||
|
|
||||||
ftdm_usrmsg_set_raw_data(&usrmsg, my_facility_ie, my_facility_ie_len);
|
|
||||||
|
|
||||||
ftdm_channel_call_indicate_ex(ftdmchan, FTDM_CHANNEL_INDICATE_FACILITY, &usrmsg);
|
|
||||||
|
|
||||||
/* FreeTDM will automatically free my_facility_ie */
|
|
||||||
|
|
||||||
|
|
||||||
2. User application receiving variables and raw buffer from FreeTDM
|
|
||||||
==================================================================
|
|
||||||
|
|
||||||
example #1 - print all variables received from FreeTDM
|
|
||||||
------------------------------------------------------
|
|
||||||
|
|
||||||
/* Inside event call-back function */
|
|
||||||
ftdm_iterator_t *iter = NULL;
|
|
||||||
ftdm_iterator_t *curr = NULL;
|
|
||||||
const char *var_name = NULL;
|
|
||||||
const char *var_value = NULL;
|
|
||||||
|
|
||||||
/* Read all variables attached to this event */
|
|
||||||
iter = ftdm_sigmsg_get_var_iterator(sigmsg, iter);
|
|
||||||
for (curr = iter ; curr; curr = ftdm_iterator_next(curr)) {
|
|
||||||
ftdm_get_current_var(curr, &var_name, &var_value);
|
|
||||||
fprintf("Call Variable: %s=%s\n", var_name, var_value);
|
|
||||||
}
|
|
||||||
ftdm_iterator_free(iter);
|
|
||||||
|
|
||||||
|
|
||||||
example #2 - accessing a specific variable
|
|
||||||
------------------------------------------
|
|
||||||
|
|
||||||
/* Inside event call-back function */
|
|
||||||
char *string = NULL;
|
|
||||||
string = ftdm_sigmsg_get_var(sigmsg, "isdn.prog_ind.descr");
|
|
||||||
if (string && *string) {
|
|
||||||
fprintf("Progress indicator:%s\n", string);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
example #3a - accessing raw data
|
|
||||||
-------------------------------
|
|
||||||
|
|
||||||
/* Inside event call-back function */
|
|
||||||
ftdm_size_t len;
|
|
||||||
uint8_t *mydata;
|
|
||||||
if (ftdm_sigmsg_get_raw_data(sigmsg, (void**)&mydata, &len) == FTDM_SUCCESS) {
|
|
||||||
/* raw data is available, do something with mydata here */
|
|
||||||
}
|
|
||||||
/* Once this function returns, raw data will be free'd inside FreeTDM */
|
|
||||||
|
|
||||||
|
|
||||||
example #3b - accessing raw data
|
|
||||||
-------------------------------
|
|
||||||
|
|
||||||
/* Inside event call-back function */
|
|
||||||
ftdm_size_t len;
|
|
||||||
uint8_t *mydata;
|
|
||||||
if (ftdm_sigmsg_get_raw_data_detached(sigmsg, (void**)&mydata, &len) == FTDM_SUCCESS) {
|
|
||||||
/* raw data is available, do something with mydata here */
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
:
|
|
||||||
:
|
|
||||||
:
|
|
||||||
|
|
||||||
/* User owns raw data and is responsible for free'ing it*/
|
|
||||||
ftdm_safe_free(mydata);
|
|
||||||
|
|
|
@ -1,155 +0,0 @@
|
||||||
|
|
||||||
Microsoft Visual Studio Solution File, Format Version 10.00
|
|
||||||
# Visual Studio 2008
|
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "freetdm", "msvc\freetdm.2008.vcproj", "{93B8812C-3EC4-4F78-8970-FFBFC99E167D}"
|
|
||||||
EndProject
|
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testanalog", "msvc\testanalog\testanalog.2008.vcproj", "{BB833648-BAFF-4BE2-94DB-F8BB043C588C}"
|
|
||||||
ProjectSection(ProjectDependencies) = postProject
|
|
||||||
{93B8812C-3EC4-4F78-8970-FFBFC99E167D} = {93B8812C-3EC4-4F78-8970-FFBFC99E167D}
|
|
||||||
EndProjectSection
|
|
||||||
EndProject
|
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testisdn", "msvc\testisdn\testisdn.2008.vcproj", "{6DA6FD42-641D-4147-92F5-3BC4AAA6589B}"
|
|
||||||
ProjectSection(ProjectDependencies) = postProject
|
|
||||||
{93B8812C-3EC4-4F78-8970-FFBFC99E167D} = {93B8812C-3EC4-4F78-8970-FFBFC99E167D}
|
|
||||||
EndProjectSection
|
|
||||||
EndProject
|
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_freetdm", "mod_freetdm\mod_freetdm.2008.vcproj", "{FE3540C5-3303-46E0-A69E-D92F775687F1}"
|
|
||||||
ProjectSection(ProjectDependencies) = postProject
|
|
||||||
{93B8812C-3EC4-4F78-8970-FFBFC99E167D} = {93B8812C-3EC4-4F78-8970-FFBFC99E167D}
|
|
||||||
EndProjectSection
|
|
||||||
EndProject
|
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ftmod_analog", "src\ftmod\ftmod_analog\ftmod_analog.2008.vcproj", "{37C94798-6E33-4B4F-8EE0-C72A7DC91157}"
|
|
||||||
ProjectSection(ProjectDependencies) = postProject
|
|
||||||
{93B8812C-3EC4-4F78-8970-FFBFC99E167D} = {93B8812C-3EC4-4F78-8970-FFBFC99E167D}
|
|
||||||
EndProjectSection
|
|
||||||
EndProject
|
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ftmod_analog_em", "src\ftmod\ftmod_analog_em\ftmod_analog_em.2008.vcproj", "{B3F49375-2834-4937-9D8C-4AC2EC911010}"
|
|
||||||
ProjectSection(ProjectDependencies) = postProject
|
|
||||||
{93B8812C-3EC4-4F78-8970-FFBFC99E167D} = {93B8812C-3EC4-4F78-8970-FFBFC99E167D}
|
|
||||||
EndProjectSection
|
|
||||||
EndProject
|
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ftmod_isdn", "src\ftmod\ftmod_isdn\ftmod_isdn.2008.vcproj", "{729344A5-D5E9-434D-8EE8-AF8C6C795D15}"
|
|
||||||
ProjectSection(ProjectDependencies) = postProject
|
|
||||||
{93B8812C-3EC4-4F78-8970-FFBFC99E167D} = {93B8812C-3EC4-4F78-8970-FFBFC99E167D}
|
|
||||||
EndProjectSection
|
|
||||||
EndProject
|
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ftmod_pika", "src\ftmod\ftmod_pika\ftmod_pika.2008.vcproj", "{E886B4D5-AB4F-4092-B8F4-3B06E1E462EF}"
|
|
||||||
ProjectSection(ProjectDependencies) = postProject
|
|
||||||
{93B8812C-3EC4-4F78-8970-FFBFC99E167D} = {93B8812C-3EC4-4F78-8970-FFBFC99E167D}
|
|
||||||
EndProjectSection
|
|
||||||
EndProject
|
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ftmod_wanpipe", "src\ftmod\ftmod_wanpipe\ftmod_wanpipe.2008.vcproj", "{1A145EE9-BBD8-45E5-98CD-EB4BE99E1DCD}"
|
|
||||||
ProjectSection(ProjectDependencies) = postProject
|
|
||||||
{93B8812C-3EC4-4F78-8970-FFBFC99E167D} = {93B8812C-3EC4-4F78-8970-FFBFC99E167D}
|
|
||||||
EndProjectSection
|
|
||||||
EndProject
|
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ftmod_sangoma_isdn", "src\ftmod\ftmod_sangoma_isdn\ftmod_sangoma_isdn.2008.vcproj", "{B2AF4EA6-0CD7-4529-9EB5-5AF43DB90395}"
|
|
||||||
ProjectSection(ProjectDependencies) = postProject
|
|
||||||
{93B8812C-3EC4-4F78-8970-FFBFC99E167D} = {93B8812C-3EC4-4F78-8970-FFBFC99E167D}
|
|
||||||
EndProjectSection
|
|
||||||
EndProject
|
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ftmod_r2", "src\ftmod\ftmod_r2\ftmod_r2.2008.vcproj", "{08C3EA27-A51D-47F8-B47D-B189C649CF30}"
|
|
||||||
ProjectSection(ProjectDependencies) = postProject
|
|
||||||
{93B8812C-3EC4-4F78-8970-FFBFC99E167D} = {93B8812C-3EC4-4F78-8970-FFBFC99E167D}
|
|
||||||
EndProjectSection
|
|
||||||
EndProject
|
|
||||||
Global
|
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
|
||||||
Debug|Win32 = Debug|Win32
|
|
||||||
Debug|x64 = Debug|x64
|
|
||||||
Release|Win32 = Release|Win32
|
|
||||||
Release|x64 = Release|x64
|
|
||||||
EndGlobalSection
|
|
||||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
|
||||||
{93B8812C-3EC4-4F78-8970-FFBFC99E167D}.Debug|Win32.ActiveCfg = Debug|Win32
|
|
||||||
{93B8812C-3EC4-4F78-8970-FFBFC99E167D}.Debug|Win32.Build.0 = Debug|Win32
|
|
||||||
{93B8812C-3EC4-4F78-8970-FFBFC99E167D}.Debug|x64.ActiveCfg = Debug|x64
|
|
||||||
{93B8812C-3EC4-4F78-8970-FFBFC99E167D}.Debug|x64.Build.0 = Debug|x64
|
|
||||||
{93B8812C-3EC4-4F78-8970-FFBFC99E167D}.Release|Win32.ActiveCfg = Release|Win32
|
|
||||||
{93B8812C-3EC4-4F78-8970-FFBFC99E167D}.Release|Win32.Build.0 = Release|Win32
|
|
||||||
{93B8812C-3EC4-4F78-8970-FFBFC99E167D}.Release|x64.ActiveCfg = Release|x64
|
|
||||||
{93B8812C-3EC4-4F78-8970-FFBFC99E167D}.Release|x64.Build.0 = Release|x64
|
|
||||||
{BB833648-BAFF-4BE2-94DB-F8BB043C588C}.Debug|Win32.ActiveCfg = Debug|Win32
|
|
||||||
{BB833648-BAFF-4BE2-94DB-F8BB043C588C}.Debug|Win32.Build.0 = Debug|Win32
|
|
||||||
{BB833648-BAFF-4BE2-94DB-F8BB043C588C}.Debug|x64.ActiveCfg = Debug|x64
|
|
||||||
{BB833648-BAFF-4BE2-94DB-F8BB043C588C}.Debug|x64.Build.0 = Debug|x64
|
|
||||||
{BB833648-BAFF-4BE2-94DB-F8BB043C588C}.Release|Win32.ActiveCfg = Release|Win32
|
|
||||||
{BB833648-BAFF-4BE2-94DB-F8BB043C588C}.Release|Win32.Build.0 = Release|Win32
|
|
||||||
{BB833648-BAFF-4BE2-94DB-F8BB043C588C}.Release|x64.ActiveCfg = Release|x64
|
|
||||||
{BB833648-BAFF-4BE2-94DB-F8BB043C588C}.Release|x64.Build.0 = Release|x64
|
|
||||||
{6DA6FD42-641D-4147-92F5-3BC4AAA6589B}.Debug|Win32.ActiveCfg = Debug|Win32
|
|
||||||
{6DA6FD42-641D-4147-92F5-3BC4AAA6589B}.Debug|x64.ActiveCfg = Debug|x64
|
|
||||||
{6DA6FD42-641D-4147-92F5-3BC4AAA6589B}.Release|Win32.ActiveCfg = Release|Win32
|
|
||||||
{6DA6FD42-641D-4147-92F5-3BC4AAA6589B}.Release|x64.ActiveCfg = Release|x64
|
|
||||||
{FE3540C5-3303-46E0-A69E-D92F775687F1}.Debug|Win32.ActiveCfg = Debug|Win32
|
|
||||||
{FE3540C5-3303-46E0-A69E-D92F775687F1}.Debug|Win32.Build.0 = Debug|Win32
|
|
||||||
{FE3540C5-3303-46E0-A69E-D92F775687F1}.Debug|x64.ActiveCfg = Debug|x64
|
|
||||||
{FE3540C5-3303-46E0-A69E-D92F775687F1}.Debug|x64.Build.0 = Debug|x64
|
|
||||||
{FE3540C5-3303-46E0-A69E-D92F775687F1}.Release|Win32.ActiveCfg = Release|Win32
|
|
||||||
{FE3540C5-3303-46E0-A69E-D92F775687F1}.Release|Win32.Build.0 = Release|Win32
|
|
||||||
{FE3540C5-3303-46E0-A69E-D92F775687F1}.Release|x64.ActiveCfg = Release|x64
|
|
||||||
{FE3540C5-3303-46E0-A69E-D92F775687F1}.Release|x64.Build.0 = Release|x64
|
|
||||||
{37C94798-6E33-4B4F-8EE0-C72A7DC91157}.Debug|Win32.ActiveCfg = Debug|Win32
|
|
||||||
{37C94798-6E33-4B4F-8EE0-C72A7DC91157}.Debug|Win32.Build.0 = Debug|Win32
|
|
||||||
{37C94798-6E33-4B4F-8EE0-C72A7DC91157}.Debug|x64.ActiveCfg = Debug|x64
|
|
||||||
{37C94798-6E33-4B4F-8EE0-C72A7DC91157}.Debug|x64.Build.0 = Debug|x64
|
|
||||||
{37C94798-6E33-4B4F-8EE0-C72A7DC91157}.Release|Win32.ActiveCfg = Release|Win32
|
|
||||||
{37C94798-6E33-4B4F-8EE0-C72A7DC91157}.Release|Win32.Build.0 = Release|Win32
|
|
||||||
{37C94798-6E33-4B4F-8EE0-C72A7DC91157}.Release|x64.ActiveCfg = Release|x64
|
|
||||||
{37C94798-6E33-4B4F-8EE0-C72A7DC91157}.Release|x64.Build.0 = Release|x64
|
|
||||||
{B3F49375-2834-4937-9D8C-4AC2EC911010}.Debug|Win32.ActiveCfg = Debug|Win32
|
|
||||||
{B3F49375-2834-4937-9D8C-4AC2EC911010}.Debug|Win32.Build.0 = Debug|Win32
|
|
||||||
{B3F49375-2834-4937-9D8C-4AC2EC911010}.Debug|x64.ActiveCfg = Debug|x64
|
|
||||||
{B3F49375-2834-4937-9D8C-4AC2EC911010}.Debug|x64.Build.0 = Debug|x64
|
|
||||||
{B3F49375-2834-4937-9D8C-4AC2EC911010}.Release|Win32.ActiveCfg = Release|Win32
|
|
||||||
{B3F49375-2834-4937-9D8C-4AC2EC911010}.Release|Win32.Build.0 = Release|Win32
|
|
||||||
{B3F49375-2834-4937-9D8C-4AC2EC911010}.Release|x64.ActiveCfg = Release|x64
|
|
||||||
{B3F49375-2834-4937-9D8C-4AC2EC911010}.Release|x64.Build.0 = Release|x64
|
|
||||||
{729344A5-D5E9-434D-8EE8-AF8C6C795D15}.Debug|Win32.ActiveCfg = Debug|Win32
|
|
||||||
{729344A5-D5E9-434D-8EE8-AF8C6C795D15}.Debug|x64.ActiveCfg = Debug|x64
|
|
||||||
{729344A5-D5E9-434D-8EE8-AF8C6C795D15}.Release|Win32.ActiveCfg = Release|Win32
|
|
||||||
{729344A5-D5E9-434D-8EE8-AF8C6C795D15}.Release|x64.ActiveCfg = Release|x64
|
|
||||||
{E886B4D5-AB4F-4092-B8F4-3B06E1E462EF}.Debug|Win32.ActiveCfg = Debug|Win32
|
|
||||||
{E886B4D5-AB4F-4092-B8F4-3B06E1E462EF}.Debug|x64.ActiveCfg = Debug|x64
|
|
||||||
{E886B4D5-AB4F-4092-B8F4-3B06E1E462EF}.Release|Win32.ActiveCfg = Release|Win32
|
|
||||||
{E886B4D5-AB4F-4092-B8F4-3B06E1E462EF}.Release|x64.ActiveCfg = Release|x64
|
|
||||||
{1A145EE9-BBD8-45E5-98CD-EB4BE99E1DCD}.Debug|Win32.ActiveCfg = Debug|Win32
|
|
||||||
{1A145EE9-BBD8-45E5-98CD-EB4BE99E1DCD}.Debug|Win32.Build.0 = Debug|Win32
|
|
||||||
{1A145EE9-BBD8-45E5-98CD-EB4BE99E1DCD}.Debug|x64.ActiveCfg = Debug|x64
|
|
||||||
{1A145EE9-BBD8-45E5-98CD-EB4BE99E1DCD}.Release|Win32.ActiveCfg = Release|Win32
|
|
||||||
{1A145EE9-BBD8-45E5-98CD-EB4BE99E1DCD}.Release|x64.ActiveCfg = Release|x64
|
|
||||||
{D021EF2A-460D-4827-A0F7-41FDECF46F1B}.Debug|Win32.ActiveCfg = Debug|Win32
|
|
||||||
{D021EF2A-460D-4827-A0F7-41FDECF46F1B}.Debug|x64.ActiveCfg = Debug|x64
|
|
||||||
{D021EF2A-460D-4827-A0F7-41FDECF46F1B}.Debug|x64.Build.0 = Debug|x64
|
|
||||||
{D021EF2A-460D-4827-A0F7-41FDECF46F1B}.Release|Win32.ActiveCfg = Release|Win32
|
|
||||||
{D021EF2A-460D-4827-A0F7-41FDECF46F1B}.Release|Win32.Build.0 = Release|Win32
|
|
||||||
{D021EF2A-460D-4827-A0F7-41FDECF46F1B}.Release|x64.ActiveCfg = Release|x64
|
|
||||||
{D021EF2A-460D-4827-A0F7-41FDECF46F1B}.Release|x64.Build.0 = Release|x64
|
|
||||||
{2B1BAF36-0241-43E7-B865-A8338AD48E2E}.Debug|Win32.ActiveCfg = Debug|Win32
|
|
||||||
{2B1BAF36-0241-43E7-B865-A8338AD48E2E}.Debug|x64.ActiveCfg = Debug|x64
|
|
||||||
{2B1BAF36-0241-43E7-B865-A8338AD48E2E}.Debug|x64.Build.0 = Debug|x64
|
|
||||||
{2B1BAF36-0241-43E7-B865-A8338AD48E2E}.Release|Win32.ActiveCfg = Release|Win32
|
|
||||||
{2B1BAF36-0241-43E7-B865-A8338AD48E2E}.Release|Win32.Build.0 = Release|Win32
|
|
||||||
{2B1BAF36-0241-43E7-B865-A8338AD48E2E}.Release|x64.ActiveCfg = Release|x64
|
|
||||||
{2B1BAF36-0241-43E7-B865-A8338AD48E2E}.Release|x64.Build.0 = Release|x64
|
|
||||||
{0DA69C18-4FA1-4E8C-89CE-12498637C5BE}.Debug|Win32.ActiveCfg = Debug|Win32
|
|
||||||
{0DA69C18-4FA1-4E8C-89CE-12498637C5BE}.Debug|x64.ActiveCfg = Debug|x64
|
|
||||||
{0DA69C18-4FA1-4E8C-89CE-12498637C5BE}.Debug|x64.Build.0 = Debug|x64
|
|
||||||
{0DA69C18-4FA1-4E8C-89CE-12498637C5BE}.Release|Win32.ActiveCfg = Release|Win32
|
|
||||||
{0DA69C18-4FA1-4E8C-89CE-12498637C5BE}.Release|Win32.Build.0 = Release|Win32
|
|
||||||
{0DA69C18-4FA1-4E8C-89CE-12498637C5BE}.Release|x64.ActiveCfg = Release|x64
|
|
||||||
{0DA69C18-4FA1-4E8C-89CE-12498637C5BE}.Release|x64.Build.0 = Release|x64
|
|
||||||
{B2AF4EA6-0CD7-4529-9EB5-5AF43DB90395}.Debug|Win32.ActiveCfg = Debug|Win32
|
|
||||||
{B2AF4EA6-0CD7-4529-9EB5-5AF43DB90395}.Debug|x64.ActiveCfg = Debug|Win32
|
|
||||||
{B2AF4EA6-0CD7-4529-9EB5-5AF43DB90395}.Release|Win32.ActiveCfg = Release|Win32
|
|
||||||
{B2AF4EA6-0CD7-4529-9EB5-5AF43DB90395}.Release|Win32.Build.0 = Release|Win32
|
|
||||||
{B2AF4EA6-0CD7-4529-9EB5-5AF43DB90395}.Release|x64.ActiveCfg = Release|Win32
|
|
||||||
{08C3EA27-A51D-47F8-B47D-B189C649CF30}.Debug|Win32.ActiveCfg = Debug|Win32
|
|
||||||
{08C3EA27-A51D-47F8-B47D-B189C649CF30}.Debug|x64.ActiveCfg = Debug|Win32
|
|
||||||
{08C3EA27-A51D-47F8-B47D-B189C649CF30}.Release|Win32.ActiveCfg = Release|Win32
|
|
||||||
{08C3EA27-A51D-47F8-B47D-B189C649CF30}.Release|x64.ActiveCfg = Release|Win32
|
|
||||||
EndGlobalSection
|
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
|
||||||
HideSolutionNode = FALSE
|
|
||||||
EndGlobalSection
|
|
||||||
EndGlobal
|
|
|
@ -1,127 +0,0 @@
|
||||||
|
|
||||||
Microsoft Visual Studio Solution File, Format Version 11.00
|
|
||||||
# Visual Studio 2010
|
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "freetdm", "msvc\freetdm.2010.vcxproj", "{93B8812C-3EC4-4F78-8970-FFBFC99E167D}"
|
|
||||||
EndProject
|
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testanalog", "msvc\testanalog\testanalog.2010.vcxproj", "{BB833648-BAFF-4BE2-94DB-F8BB043C588C}"
|
|
||||||
EndProject
|
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testisdn", "msvc\testisdn\testisdn.2010.vcxproj", "{6DA6FD42-641D-4147-92F5-3BC4AAA6589B}"
|
|
||||||
EndProject
|
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_freetdm", "mod_freetdm\mod_freetdm.2010.vcxproj", "{FE3540C5-3303-46E0-A69E-D92F775687F1}"
|
|
||||||
EndProject
|
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ftmod_analog", "src\ftmod\ftmod_analog\ftmod_analog.2010.vcxproj", "{37C94798-6E33-4B4F-8EE0-C72A7DC91157}"
|
|
||||||
EndProject
|
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ftmod_analog_em", "src\ftmod\ftmod_analog_em\ftmod_analog_em.2010.vcxproj", "{B3F49375-2834-4937-9D8C-4AC2EC911010}"
|
|
||||||
EndProject
|
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ftmod_isdn", "src\ftmod\ftmod_isdn\ftmod_isdn.2010.vcxproj", "{729344A5-D5E9-434D-8EE8-AF8C6C795D15}"
|
|
||||||
EndProject
|
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ftmod_pika", "src\ftmod\ftmod_pika\ftmod_pika.2010.vcxproj", "{E886B4D5-AB4F-4092-B8F4-3B06E1E462EF}"
|
|
||||||
EndProject
|
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ftmod_wanpipe", "src\ftmod\ftmod_wanpipe\ftmod_wanpipe.2010.vcxproj", "{1A145EE9-BBD8-45E5-98CD-EB4BE99E1DCD}"
|
|
||||||
EndProject
|
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ftmod_sangoma_isdn", "src\ftmod\ftmod_sangoma_isdn\ftmod_sangoma_isdn.2010.vcxproj", "{B2AF4EA6-0CD7-4529-9EB5-5AF43DB90395}"
|
|
||||||
EndProject
|
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ftmod_r2", "src\ftmod\ftmod_r2\ftmod_r2.2010.vcxproj", "{08C3EA27-A51D-47F8-B47D-B189C649CF30}"
|
|
||||||
EndProject
|
|
||||||
Global
|
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
|
||||||
Debug|Win32 = Debug|Win32
|
|
||||||
Debug|x64 = Debug|x64
|
|
||||||
Release|Win32 = Release|Win32
|
|
||||||
Release|x64 = Release|x64
|
|
||||||
EndGlobalSection
|
|
||||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
|
||||||
{93B8812C-3EC4-4F78-8970-FFBFC99E167D}.Debug|Win32.ActiveCfg = Debug|Win32
|
|
||||||
{93B8812C-3EC4-4F78-8970-FFBFC99E167D}.Debug|Win32.Build.0 = Debug|Win32
|
|
||||||
{93B8812C-3EC4-4F78-8970-FFBFC99E167D}.Debug|x64.ActiveCfg = Debug|x64
|
|
||||||
{93B8812C-3EC4-4F78-8970-FFBFC99E167D}.Debug|x64.Build.0 = Debug|x64
|
|
||||||
{93B8812C-3EC4-4F78-8970-FFBFC99E167D}.Release|Win32.ActiveCfg = Release|Win32
|
|
||||||
{93B8812C-3EC4-4F78-8970-FFBFC99E167D}.Release|Win32.Build.0 = Release|Win32
|
|
||||||
{93B8812C-3EC4-4F78-8970-FFBFC99E167D}.Release|x64.ActiveCfg = Release|x64
|
|
||||||
{93B8812C-3EC4-4F78-8970-FFBFC99E167D}.Release|x64.Build.0 = Release|x64
|
|
||||||
{BB833648-BAFF-4BE2-94DB-F8BB043C588C}.Debug|Win32.ActiveCfg = Debug|Win32
|
|
||||||
{BB833648-BAFF-4BE2-94DB-F8BB043C588C}.Debug|Win32.Build.0 = Debug|Win32
|
|
||||||
{BB833648-BAFF-4BE2-94DB-F8BB043C588C}.Debug|x64.ActiveCfg = Debug|x64
|
|
||||||
{BB833648-BAFF-4BE2-94DB-F8BB043C588C}.Debug|x64.Build.0 = Debug|x64
|
|
||||||
{BB833648-BAFF-4BE2-94DB-F8BB043C588C}.Release|Win32.ActiveCfg = Release|Win32
|
|
||||||
{BB833648-BAFF-4BE2-94DB-F8BB043C588C}.Release|Win32.Build.0 = Release|Win32
|
|
||||||
{BB833648-BAFF-4BE2-94DB-F8BB043C588C}.Release|x64.ActiveCfg = Release|x64
|
|
||||||
{BB833648-BAFF-4BE2-94DB-F8BB043C588C}.Release|x64.Build.0 = Release|x64
|
|
||||||
{6DA6FD42-641D-4147-92F5-3BC4AAA6589B}.Debug|Win32.ActiveCfg = Debug|Win32
|
|
||||||
{6DA6FD42-641D-4147-92F5-3BC4AAA6589B}.Debug|x64.ActiveCfg = Debug|x64
|
|
||||||
{6DA6FD42-641D-4147-92F5-3BC4AAA6589B}.Release|Win32.ActiveCfg = Release|Win32
|
|
||||||
{6DA6FD42-641D-4147-92F5-3BC4AAA6589B}.Release|x64.ActiveCfg = Release|x64
|
|
||||||
{FE3540C5-3303-46E0-A69E-D92F775687F1}.Debug|Win32.ActiveCfg = Debug|Win32
|
|
||||||
{FE3540C5-3303-46E0-A69E-D92F775687F1}.Debug|Win32.Build.0 = Debug|Win32
|
|
||||||
{FE3540C5-3303-46E0-A69E-D92F775687F1}.Debug|x64.ActiveCfg = Debug|x64
|
|
||||||
{FE3540C5-3303-46E0-A69E-D92F775687F1}.Debug|x64.Build.0 = Debug|x64
|
|
||||||
{FE3540C5-3303-46E0-A69E-D92F775687F1}.Release|Win32.ActiveCfg = Release|Win32
|
|
||||||
{FE3540C5-3303-46E0-A69E-D92F775687F1}.Release|Win32.Build.0 = Release|Win32
|
|
||||||
{FE3540C5-3303-46E0-A69E-D92F775687F1}.Release|x64.ActiveCfg = Release|x64
|
|
||||||
{FE3540C5-3303-46E0-A69E-D92F775687F1}.Release|x64.Build.0 = Release|x64
|
|
||||||
{37C94798-6E33-4B4F-8EE0-C72A7DC91157}.Debug|Win32.ActiveCfg = Debug|Win32
|
|
||||||
{37C94798-6E33-4B4F-8EE0-C72A7DC91157}.Debug|Win32.Build.0 = Debug|Win32
|
|
||||||
{37C94798-6E33-4B4F-8EE0-C72A7DC91157}.Debug|x64.ActiveCfg = Debug|x64
|
|
||||||
{37C94798-6E33-4B4F-8EE0-C72A7DC91157}.Debug|x64.Build.0 = Debug|x64
|
|
||||||
{37C94798-6E33-4B4F-8EE0-C72A7DC91157}.Release|Win32.ActiveCfg = Release|Win32
|
|
||||||
{37C94798-6E33-4B4F-8EE0-C72A7DC91157}.Release|Win32.Build.0 = Release|Win32
|
|
||||||
{37C94798-6E33-4B4F-8EE0-C72A7DC91157}.Release|x64.ActiveCfg = Release|x64
|
|
||||||
{37C94798-6E33-4B4F-8EE0-C72A7DC91157}.Release|x64.Build.0 = Release|x64
|
|
||||||
{B3F49375-2834-4937-9D8C-4AC2EC911010}.Debug|Win32.ActiveCfg = Debug|Win32
|
|
||||||
{B3F49375-2834-4937-9D8C-4AC2EC911010}.Debug|Win32.Build.0 = Debug|Win32
|
|
||||||
{B3F49375-2834-4937-9D8C-4AC2EC911010}.Debug|x64.ActiveCfg = Debug|x64
|
|
||||||
{B3F49375-2834-4937-9D8C-4AC2EC911010}.Debug|x64.Build.0 = Debug|x64
|
|
||||||
{B3F49375-2834-4937-9D8C-4AC2EC911010}.Release|Win32.ActiveCfg = Release|Win32
|
|
||||||
{B3F49375-2834-4937-9D8C-4AC2EC911010}.Release|Win32.Build.0 = Release|Win32
|
|
||||||
{B3F49375-2834-4937-9D8C-4AC2EC911010}.Release|x64.ActiveCfg = Release|x64
|
|
||||||
{B3F49375-2834-4937-9D8C-4AC2EC911010}.Release|x64.Build.0 = Release|x64
|
|
||||||
{729344A5-D5E9-434D-8EE8-AF8C6C795D15}.Debug|Win32.ActiveCfg = Debug|Win32
|
|
||||||
{729344A5-D5E9-434D-8EE8-AF8C6C795D15}.Debug|x64.ActiveCfg = Debug|x64
|
|
||||||
{729344A5-D5E9-434D-8EE8-AF8C6C795D15}.Release|Win32.ActiveCfg = Release|Win32
|
|
||||||
{729344A5-D5E9-434D-8EE8-AF8C6C795D15}.Release|x64.ActiveCfg = Release|x64
|
|
||||||
{E886B4D5-AB4F-4092-B8F4-3B06E1E462EF}.Debug|Win32.ActiveCfg = Debug|Win32
|
|
||||||
{E886B4D5-AB4F-4092-B8F4-3B06E1E462EF}.Debug|x64.ActiveCfg = Debug|x64
|
|
||||||
{E886B4D5-AB4F-4092-B8F4-3B06E1E462EF}.Release|Win32.ActiveCfg = Release|Win32
|
|
||||||
{E886B4D5-AB4F-4092-B8F4-3B06E1E462EF}.Release|x64.ActiveCfg = Release|x64
|
|
||||||
{1A145EE9-BBD8-45E5-98CD-EB4BE99E1DCD}.Debug|Win32.ActiveCfg = Debug|Win32
|
|
||||||
{1A145EE9-BBD8-45E5-98CD-EB4BE99E1DCD}.Debug|Win32.Build.0 = Debug|Win32
|
|
||||||
{1A145EE9-BBD8-45E5-98CD-EB4BE99E1DCD}.Debug|x64.ActiveCfg = Debug|x64
|
|
||||||
{1A145EE9-BBD8-45E5-98CD-EB4BE99E1DCD}.Release|Win32.ActiveCfg = Release|Win32
|
|
||||||
{1A145EE9-BBD8-45E5-98CD-EB4BE99E1DCD}.Release|x64.ActiveCfg = Release|x64
|
|
||||||
{D021EF2A-460D-4827-A0F7-41FDECF46F1B}.Debug|Win32.ActiveCfg = Debug|Win32
|
|
||||||
{D021EF2A-460D-4827-A0F7-41FDECF46F1B}.Debug|Win32.Build.0 = Debug|Win32
|
|
||||||
{D021EF2A-460D-4827-A0F7-41FDECF46F1B}.Debug|x64.ActiveCfg = Debug|x64
|
|
||||||
{D021EF2A-460D-4827-A0F7-41FDECF46F1B}.Debug|x64.Build.0 = Debug|x64
|
|
||||||
{D021EF2A-460D-4827-A0F7-41FDECF46F1B}.Release|Win32.ActiveCfg = Release|Win32
|
|
||||||
{D021EF2A-460D-4827-A0F7-41FDECF46F1B}.Release|Win32.Build.0 = Release|Win32
|
|
||||||
{D021EF2A-460D-4827-A0F7-41FDECF46F1B}.Release|x64.ActiveCfg = Release|x64
|
|
||||||
{D021EF2A-460D-4827-A0F7-41FDECF46F1B}.Release|x64.Build.0 = Release|x64
|
|
||||||
{2B1BAF36-0241-43E7-B865-A8338AD48E2E}.Debug|Win32.ActiveCfg = Debug|Win32
|
|
||||||
{2B1BAF36-0241-43E7-B865-A8338AD48E2E}.Debug|Win32.Build.0 = Debug|Win32
|
|
||||||
{2B1BAF36-0241-43E7-B865-A8338AD48E2E}.Debug|x64.ActiveCfg = Debug|x64
|
|
||||||
{2B1BAF36-0241-43E7-B865-A8338AD48E2E}.Debug|x64.Build.0 = Debug|x64
|
|
||||||
{2B1BAF36-0241-43E7-B865-A8338AD48E2E}.Release|Win32.ActiveCfg = Release|Win32
|
|
||||||
{2B1BAF36-0241-43E7-B865-A8338AD48E2E}.Release|Win32.Build.0 = Release|Win32
|
|
||||||
{2B1BAF36-0241-43E7-B865-A8338AD48E2E}.Release|x64.ActiveCfg = Release|x64
|
|
||||||
{2B1BAF36-0241-43E7-B865-A8338AD48E2E}.Release|x64.Build.0 = Release|x64
|
|
||||||
{0DA69C18-4FA1-4E8C-89CE-12498637C5BE}.Debug|Win32.ActiveCfg = Debug|Win32
|
|
||||||
{0DA69C18-4FA1-4E8C-89CE-12498637C5BE}.Debug|Win32.Build.0 = Debug|Win32
|
|
||||||
{0DA69C18-4FA1-4E8C-89CE-12498637C5BE}.Debug|x64.ActiveCfg = Debug|x64
|
|
||||||
{0DA69C18-4FA1-4E8C-89CE-12498637C5BE}.Debug|x64.Build.0 = Debug|x64
|
|
||||||
{0DA69C18-4FA1-4E8C-89CE-12498637C5BE}.Release|Win32.ActiveCfg = Release|Win32
|
|
||||||
{0DA69C18-4FA1-4E8C-89CE-12498637C5BE}.Release|Win32.Build.0 = Release|Win32
|
|
||||||
{0DA69C18-4FA1-4E8C-89CE-12498637C5BE}.Release|x64.ActiveCfg = Release|x64
|
|
||||||
{0DA69C18-4FA1-4E8C-89CE-12498637C5BE}.Release|x64.Build.0 = Release|x64
|
|
||||||
{B2AF4EA6-0CD7-4529-9EB5-5AF43DB90395}.Debug|Win32.ActiveCfg = Debug|Win32
|
|
||||||
{B2AF4EA6-0CD7-4529-9EB5-5AF43DB90395}.Debug|x64.ActiveCfg = Debug|x64
|
|
||||||
{B2AF4EA6-0CD7-4529-9EB5-5AF43DB90395}.Release|Win32.ActiveCfg = Release|Win32
|
|
||||||
{B2AF4EA6-0CD7-4529-9EB5-5AF43DB90395}.Release|x64.ActiveCfg = Release|x64
|
|
||||||
{08C3EA27-A51D-47F8-B47D-B189C649CF30}.Debug|Win32.ActiveCfg = Debug|Win32
|
|
||||||
{08C3EA27-A51D-47F8-B47D-B189C649CF30}.Debug|x64.ActiveCfg = Debug|x64
|
|
||||||
{08C3EA27-A51D-47F8-B47D-B189C649CF30}.Release|Win32.ActiveCfg = Release|Win32
|
|
||||||
{08C3EA27-A51D-47F8-B47D-B189C649CF30}.Release|x64.ActiveCfg = Release|x64
|
|
||||||
EndGlobalSection
|
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
|
||||||
HideSolutionNode = FALSE
|
|
||||||
EndGlobalSection
|
|
||||||
EndGlobal
|
|
|
@ -1,127 +0,0 @@
|
||||||
|
|
||||||
Microsoft Visual Studio Solution File, Format Version 11.00
|
|
||||||
# Visual Studio 2012
|
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "freetdm", "msvc\freetdm.2012.vcxproj", "{93B8812C-3EC4-4F78-8970-FFBFC99E167D}"
|
|
||||||
EndProject
|
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testanalog", "msvc\testanalog\testanalog.2012.vcxproj", "{BB833648-BAFF-4BE2-94DB-F8BB043C588C}"
|
|
||||||
EndProject
|
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testisdn", "msvc\testisdn\testisdn.2012.vcxproj", "{6DA6FD42-641D-4147-92F5-3BC4AAA6589B}"
|
|
||||||
EndProject
|
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_freetdm", "mod_freetdm\mod_freetdm.2012.vcxproj", "{FE3540C5-3303-46E0-A69E-D92F775687F1}"
|
|
||||||
EndProject
|
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ftmod_analog", "src\ftmod\ftmod_analog\ftmod_analog.2012.vcxproj", "{37C94798-6E33-4B4F-8EE0-C72A7DC91157}"
|
|
||||||
EndProject
|
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ftmod_analog_em", "src\ftmod\ftmod_analog_em\ftmod_analog_em.2012.vcxproj", "{B3F49375-2834-4937-9D8C-4AC2EC911010}"
|
|
||||||
EndProject
|
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ftmod_isdn", "src\ftmod\ftmod_isdn\ftmod_isdn.2012.vcxproj", "{729344A5-D5E9-434D-8EE8-AF8C6C795D15}"
|
|
||||||
EndProject
|
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ftmod_pika", "src\ftmod\ftmod_pika\ftmod_pika.2012.vcxproj", "{E886B4D5-AB4F-4092-B8F4-3B06E1E462EF}"
|
|
||||||
EndProject
|
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ftmod_wanpipe", "src\ftmod\ftmod_wanpipe\ftmod_wanpipe.2012.vcxproj", "{1A145EE9-BBD8-45E5-98CD-EB4BE99E1DCD}"
|
|
||||||
EndProject
|
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ftmod_sangoma_isdn", "src\ftmod\ftmod_sangoma_isdn\ftmod_sangoma_isdn.2012.vcxproj", "{B2AF4EA6-0CD7-4529-9EB5-5AF43DB90395}"
|
|
||||||
EndProject
|
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ftmod_r2", "src\ftmod\ftmod_r2\ftmod_r2.2012.vcxproj", "{08C3EA27-A51D-47F8-B47D-B189C649CF30}"
|
|
||||||
EndProject
|
|
||||||
Global
|
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
|
||||||
Debug|Win32 = Debug|Win32
|
|
||||||
Debug|x64 = Debug|x64
|
|
||||||
Release|Win32 = Release|Win32
|
|
||||||
Release|x64 = Release|x64
|
|
||||||
EndGlobalSection
|
|
||||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
|
||||||
{93B8812C-3EC4-4F78-8970-FFBFC99E167D}.Debug|Win32.ActiveCfg = Debug|Win32
|
|
||||||
{93B8812C-3EC4-4F78-8970-FFBFC99E167D}.Debug|Win32.Build.0 = Debug|Win32
|
|
||||||
{93B8812C-3EC4-4F78-8970-FFBFC99E167D}.Debug|x64.ActiveCfg = Debug|x64
|
|
||||||
{93B8812C-3EC4-4F78-8970-FFBFC99E167D}.Debug|x64.Build.0 = Debug|x64
|
|
||||||
{93B8812C-3EC4-4F78-8970-FFBFC99E167D}.Release|Win32.ActiveCfg = Release|Win32
|
|
||||||
{93B8812C-3EC4-4F78-8970-FFBFC99E167D}.Release|Win32.Build.0 = Release|Win32
|
|
||||||
{93B8812C-3EC4-4F78-8970-FFBFC99E167D}.Release|x64.ActiveCfg = Release|x64
|
|
||||||
{93B8812C-3EC4-4F78-8970-FFBFC99E167D}.Release|x64.Build.0 = Release|x64
|
|
||||||
{BB833648-BAFF-4BE2-94DB-F8BB043C588C}.Debug|Win32.ActiveCfg = Debug|Win32
|
|
||||||
{BB833648-BAFF-4BE2-94DB-F8BB043C588C}.Debug|Win32.Build.0 = Debug|Win32
|
|
||||||
{BB833648-BAFF-4BE2-94DB-F8BB043C588C}.Debug|x64.ActiveCfg = Debug|x64
|
|
||||||
{BB833648-BAFF-4BE2-94DB-F8BB043C588C}.Debug|x64.Build.0 = Debug|x64
|
|
||||||
{BB833648-BAFF-4BE2-94DB-F8BB043C588C}.Release|Win32.ActiveCfg = Release|Win32
|
|
||||||
{BB833648-BAFF-4BE2-94DB-F8BB043C588C}.Release|Win32.Build.0 = Release|Win32
|
|
||||||
{BB833648-BAFF-4BE2-94DB-F8BB043C588C}.Release|x64.ActiveCfg = Release|x64
|
|
||||||
{BB833648-BAFF-4BE2-94DB-F8BB043C588C}.Release|x64.Build.0 = Release|x64
|
|
||||||
{6DA6FD42-641D-4147-92F5-3BC4AAA6589B}.Debug|Win32.ActiveCfg = Debug|Win32
|
|
||||||
{6DA6FD42-641D-4147-92F5-3BC4AAA6589B}.Debug|x64.ActiveCfg = Debug|x64
|
|
||||||
{6DA6FD42-641D-4147-92F5-3BC4AAA6589B}.Release|Win32.ActiveCfg = Release|Win32
|
|
||||||
{6DA6FD42-641D-4147-92F5-3BC4AAA6589B}.Release|x64.ActiveCfg = Release|x64
|
|
||||||
{FE3540C5-3303-46E0-A69E-D92F775687F1}.Debug|Win32.ActiveCfg = Debug|Win32
|
|
||||||
{FE3540C5-3303-46E0-A69E-D92F775687F1}.Debug|Win32.Build.0 = Debug|Win32
|
|
||||||
{FE3540C5-3303-46E0-A69E-D92F775687F1}.Debug|x64.ActiveCfg = Debug|x64
|
|
||||||
{FE3540C5-3303-46E0-A69E-D92F775687F1}.Debug|x64.Build.0 = Debug|x64
|
|
||||||
{FE3540C5-3303-46E0-A69E-D92F775687F1}.Release|Win32.ActiveCfg = Release|Win32
|
|
||||||
{FE3540C5-3303-46E0-A69E-D92F775687F1}.Release|Win32.Build.0 = Release|Win32
|
|
||||||
{FE3540C5-3303-46E0-A69E-D92F775687F1}.Release|x64.ActiveCfg = Release|x64
|
|
||||||
{FE3540C5-3303-46E0-A69E-D92F775687F1}.Release|x64.Build.0 = Release|x64
|
|
||||||
{37C94798-6E33-4B4F-8EE0-C72A7DC91157}.Debug|Win32.ActiveCfg = Debug|Win32
|
|
||||||
{37C94798-6E33-4B4F-8EE0-C72A7DC91157}.Debug|Win32.Build.0 = Debug|Win32
|
|
||||||
{37C94798-6E33-4B4F-8EE0-C72A7DC91157}.Debug|x64.ActiveCfg = Debug|x64
|
|
||||||
{37C94798-6E33-4B4F-8EE0-C72A7DC91157}.Debug|x64.Build.0 = Debug|x64
|
|
||||||
{37C94798-6E33-4B4F-8EE0-C72A7DC91157}.Release|Win32.ActiveCfg = Release|Win32
|
|
||||||
{37C94798-6E33-4B4F-8EE0-C72A7DC91157}.Release|Win32.Build.0 = Release|Win32
|
|
||||||
{37C94798-6E33-4B4F-8EE0-C72A7DC91157}.Release|x64.ActiveCfg = Release|x64
|
|
||||||
{37C94798-6E33-4B4F-8EE0-C72A7DC91157}.Release|x64.Build.0 = Release|x64
|
|
||||||
{B3F49375-2834-4937-9D8C-4AC2EC911010}.Debug|Win32.ActiveCfg = Debug|Win32
|
|
||||||
{B3F49375-2834-4937-9D8C-4AC2EC911010}.Debug|Win32.Build.0 = Debug|Win32
|
|
||||||
{B3F49375-2834-4937-9D8C-4AC2EC911010}.Debug|x64.ActiveCfg = Debug|x64
|
|
||||||
{B3F49375-2834-4937-9D8C-4AC2EC911010}.Debug|x64.Build.0 = Debug|x64
|
|
||||||
{B3F49375-2834-4937-9D8C-4AC2EC911010}.Release|Win32.ActiveCfg = Release|Win32
|
|
||||||
{B3F49375-2834-4937-9D8C-4AC2EC911010}.Release|Win32.Build.0 = Release|Win32
|
|
||||||
{B3F49375-2834-4937-9D8C-4AC2EC911010}.Release|x64.ActiveCfg = Release|x64
|
|
||||||
{B3F49375-2834-4937-9D8C-4AC2EC911010}.Release|x64.Build.0 = Release|x64
|
|
||||||
{729344A5-D5E9-434D-8EE8-AF8C6C795D15}.Debug|Win32.ActiveCfg = Debug|Win32
|
|
||||||
{729344A5-D5E9-434D-8EE8-AF8C6C795D15}.Debug|x64.ActiveCfg = Debug|x64
|
|
||||||
{729344A5-D5E9-434D-8EE8-AF8C6C795D15}.Release|Win32.ActiveCfg = Release|Win32
|
|
||||||
{729344A5-D5E9-434D-8EE8-AF8C6C795D15}.Release|x64.ActiveCfg = Release|x64
|
|
||||||
{E886B4D5-AB4F-4092-B8F4-3B06E1E462EF}.Debug|Win32.ActiveCfg = Debug|Win32
|
|
||||||
{E886B4D5-AB4F-4092-B8F4-3B06E1E462EF}.Debug|x64.ActiveCfg = Debug|x64
|
|
||||||
{E886B4D5-AB4F-4092-B8F4-3B06E1E462EF}.Release|Win32.ActiveCfg = Release|Win32
|
|
||||||
{E886B4D5-AB4F-4092-B8F4-3B06E1E462EF}.Release|x64.ActiveCfg = Release|x64
|
|
||||||
{1A145EE9-BBD8-45E5-98CD-EB4BE99E1DCD}.Debug|Win32.ActiveCfg = Debug|Win32
|
|
||||||
{1A145EE9-BBD8-45E5-98CD-EB4BE99E1DCD}.Debug|Win32.Build.0 = Debug|Win32
|
|
||||||
{1A145EE9-BBD8-45E5-98CD-EB4BE99E1DCD}.Debug|x64.ActiveCfg = Debug|x64
|
|
||||||
{1A145EE9-BBD8-45E5-98CD-EB4BE99E1DCD}.Release|Win32.ActiveCfg = Release|Win32
|
|
||||||
{1A145EE9-BBD8-45E5-98CD-EB4BE99E1DCD}.Release|x64.ActiveCfg = Release|x64
|
|
||||||
{D021EF2A-460D-4827-A0F7-41FDECF46F1B}.Debug|Win32.ActiveCfg = Debug|Win32
|
|
||||||
{D021EF2A-460D-4827-A0F7-41FDECF46F1B}.Debug|Win32.Build.0 = Debug|Win32
|
|
||||||
{D021EF2A-460D-4827-A0F7-41FDECF46F1B}.Debug|x64.ActiveCfg = Debug|x64
|
|
||||||
{D021EF2A-460D-4827-A0F7-41FDECF46F1B}.Debug|x64.Build.0 = Debug|x64
|
|
||||||
{D021EF2A-460D-4827-A0F7-41FDECF46F1B}.Release|Win32.ActiveCfg = Release|Win32
|
|
||||||
{D021EF2A-460D-4827-A0F7-41FDECF46F1B}.Release|Win32.Build.0 = Release|Win32
|
|
||||||
{D021EF2A-460D-4827-A0F7-41FDECF46F1B}.Release|x64.ActiveCfg = Release|x64
|
|
||||||
{D021EF2A-460D-4827-A0F7-41FDECF46F1B}.Release|x64.Build.0 = Release|x64
|
|
||||||
{2B1BAF36-0241-43E7-B865-A8338AD48E2E}.Debug|Win32.ActiveCfg = Debug|Win32
|
|
||||||
{2B1BAF36-0241-43E7-B865-A8338AD48E2E}.Debug|Win32.Build.0 = Debug|Win32
|
|
||||||
{2B1BAF36-0241-43E7-B865-A8338AD48E2E}.Debug|x64.ActiveCfg = Debug|x64
|
|
||||||
{2B1BAF36-0241-43E7-B865-A8338AD48E2E}.Debug|x64.Build.0 = Debug|x64
|
|
||||||
{2B1BAF36-0241-43E7-B865-A8338AD48E2E}.Release|Win32.ActiveCfg = Release|Win32
|
|
||||||
{2B1BAF36-0241-43E7-B865-A8338AD48E2E}.Release|Win32.Build.0 = Release|Win32
|
|
||||||
{2B1BAF36-0241-43E7-B865-A8338AD48E2E}.Release|x64.ActiveCfg = Release|x64
|
|
||||||
{2B1BAF36-0241-43E7-B865-A8338AD48E2E}.Release|x64.Build.0 = Release|x64
|
|
||||||
{0DA69C18-4FA1-4E8C-89CE-12498637C5BE}.Debug|Win32.ActiveCfg = Debug|Win32
|
|
||||||
{0DA69C18-4FA1-4E8C-89CE-12498637C5BE}.Debug|Win32.Build.0 = Debug|Win32
|
|
||||||
{0DA69C18-4FA1-4E8C-89CE-12498637C5BE}.Debug|x64.ActiveCfg = Debug|x64
|
|
||||||
{0DA69C18-4FA1-4E8C-89CE-12498637C5BE}.Debug|x64.Build.0 = Debug|x64
|
|
||||||
{0DA69C18-4FA1-4E8C-89CE-12498637C5BE}.Release|Win32.ActiveCfg = Release|Win32
|
|
||||||
{0DA69C18-4FA1-4E8C-89CE-12498637C5BE}.Release|Win32.Build.0 = Release|Win32
|
|
||||||
{0DA69C18-4FA1-4E8C-89CE-12498637C5BE}.Release|x64.ActiveCfg = Release|x64
|
|
||||||
{0DA69C18-4FA1-4E8C-89CE-12498637C5BE}.Release|x64.Build.0 = Release|x64
|
|
||||||
{B2AF4EA6-0CD7-4529-9EB5-5AF43DB90395}.Debug|Win32.ActiveCfg = Debug|Win32
|
|
||||||
{B2AF4EA6-0CD7-4529-9EB5-5AF43DB90395}.Debug|x64.ActiveCfg = Debug|x64
|
|
||||||
{B2AF4EA6-0CD7-4529-9EB5-5AF43DB90395}.Release|Win32.ActiveCfg = Release|Win32
|
|
||||||
{B2AF4EA6-0CD7-4529-9EB5-5AF43DB90395}.Release|x64.ActiveCfg = Release|x64
|
|
||||||
{08C3EA27-A51D-47F8-B47D-B189C649CF30}.Debug|Win32.ActiveCfg = Debug|Win32
|
|
||||||
{08C3EA27-A51D-47F8-B47D-B189C649CF30}.Debug|x64.ActiveCfg = Debug|x64
|
|
||||||
{08C3EA27-A51D-47F8-B47D-B189C649CF30}.Release|Win32.ActiveCfg = Release|Win32
|
|
||||||
{08C3EA27-A51D-47F8-B47D-B189C649CF30}.Release|x64.ActiveCfg = Release|x64
|
|
||||||
EndGlobalSection
|
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
|
||||||
HideSolutionNode = FALSE
|
|
||||||
EndGlobalSection
|
|
||||||
EndGlobal
|
|
|
@ -1,18 +0,0 @@
|
||||||
#
|
|
||||||
# FreeTDM pkg-config file
|
|
||||||
#
|
|
||||||
prefix=@prefix@
|
|
||||||
exec_prefix=${prefix}
|
|
||||||
libdir=${exec_prefix}/lib
|
|
||||||
includedir=${prefix}/include
|
|
||||||
modulesdir=@modinstdir@
|
|
||||||
|
|
||||||
Name: FreeTDM
|
|
||||||
Description:
|
|
||||||
Version: @PACKAGE_VERSION@
|
|
||||||
URL: http://www.openzap.org/
|
|
||||||
Requires:
|
|
||||||
Conflicts:
|
|
||||||
Libs: -L${libdir} -lfreetdm
|
|
||||||
Libs.private: -lm
|
|
||||||
Cflags: -I${includedir}
|
|
|
@ -1,144 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
INSTALLPREFIX="/usr/local/freetdm"
|
|
||||||
VERSION=""
|
|
||||||
NODOCS="NO"
|
|
||||||
|
|
||||||
for i in $*
|
|
||||||
do
|
|
||||||
case $i in
|
|
||||||
--version=*)
|
|
||||||
VERSION=`echo $i | sed 's/[-a-zA-Z0-9]*=//'`
|
|
||||||
;;
|
|
||||||
--prefix=*)
|
|
||||||
INSTALLPREFIX=`echo $i | sed 's/[-a-zA-Z0-9]*=//'`
|
|
||||||
;;
|
|
||||||
--nodocs)
|
|
||||||
NODOCS="YES"
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
# unknown option
|
|
||||||
echo "Unknown option $i"
|
|
||||||
exit
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
|
|
||||||
if [ "x$VERSION" = "x" ]
|
|
||||||
then
|
|
||||||
echo "Provide a version number with --version=<version>"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
arch=$(uname -m)
|
|
||||||
|
|
||||||
# defs
|
|
||||||
LIBSNG_ISDN_URL=ftp://ftp.sangoma.com/linux/libsng_isdn
|
|
||||||
LIBSNG_ISDN_NAME=libsng_isdn-7-current
|
|
||||||
LIBSNG_SS7_URL=ftp://ftp.sangoma.com/linux/libsng_ss7
|
|
||||||
LIBSNG_SS7_NAME=libsng_ss7-3-current
|
|
||||||
LIBSNG_ISDN_DIR="$LIBSNG_ISDN_NAME.$arch"
|
|
||||||
LIBSNG_SS7_DIR="$LIBSNG_SS7_NAME.$arch"
|
|
||||||
|
|
||||||
# download and decompress a tarball
|
|
||||||
# $1 = prefix_url, such as ftp://ftp.sangoma.com/foo/bar
|
|
||||||
# $2 = package name, such as libsng_isdn-7.0.0.x86_64
|
|
||||||
function download() {
|
|
||||||
wget $1/$2.tgz
|
|
||||||
if [ $? = 0 ]
|
|
||||||
then
|
|
||||||
tardir=$(tar -tf $2.tgz | head -n1 | sed 's,\/,,g')
|
|
||||||
tar -xvzf $2.tgz || echo "FAILED to decompress $2.tgz"
|
|
||||||
if [ "$tardir" != "$2" ]
|
|
||||||
then
|
|
||||||
mv $tardir $2 || echo "FAILED to move $tardir to $2"
|
|
||||||
fi
|
|
||||||
echo "SUCCESSFULLY downloaded $2"
|
|
||||||
else
|
|
||||||
echo "FAILED to download $1/$2.tgz"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# download and build libsng-ss7
|
|
||||||
fullname="$LIBSNG_ISDN_NAME.$arch"
|
|
||||||
if [ -d $fullname ]
|
|
||||||
then
|
|
||||||
echo "skipping isdn download since $fullname directory already exists ... remove if you want this step to be performed"
|
|
||||||
else
|
|
||||||
download $LIBSNG_ISDN_URL $fullname
|
|
||||||
fi
|
|
||||||
|
|
||||||
cd $LIBSNG_ISDN_DIR
|
|
||||||
make DESTDIR=$INSTALLPREFIX install || echo "Failed to build libsng-isdn"
|
|
||||||
cd ..
|
|
||||||
|
|
||||||
# download and build libsng-ss7
|
|
||||||
fullname="$LIBSNG_SS7_NAME.$arch"
|
|
||||||
if [ -d $fullname ]
|
|
||||||
then
|
|
||||||
echo "skipping ss7 download since $fullname directory already exists ... remove if you want this step to be performed"
|
|
||||||
else
|
|
||||||
download $LIBSNG_SS7_URL $fullname
|
|
||||||
fi
|
|
||||||
|
|
||||||
cd $LIBSNG_SS7_DIR
|
|
||||||
make DESTDIR=$INSTALLPREFIX install || echo "Failed to build libsng-ss7"
|
|
||||||
cd ..
|
|
||||||
|
|
||||||
if [ ! -d $INSTALLPREFIX ]
|
|
||||||
then
|
|
||||||
mkdir -p $INSTALLPREFIX || exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ ! -d $INSTALLPREFIX/bin-releases ]
|
|
||||||
then
|
|
||||||
mkdir -p $INSTALLPREFIX/bin-releases || exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# attempt to compile freetdm
|
|
||||||
echo "Build freetdm and mod_freetdm now..."
|
|
||||||
make all mod_freetdm || exit 1
|
|
||||||
echo "freetdm built OK"
|
|
||||||
|
|
||||||
major=$(echo "$VERSION" | cut -d. -f1)
|
|
||||||
minor=$(echo "$VERSION" | cut -d. -f2)
|
|
||||||
micro=$(echo "$VERSION" | cut -d. -f3)
|
|
||||||
release="freetdm-$VERSION"
|
|
||||||
|
|
||||||
# ABI compatibility check
|
|
||||||
if [ -x /usr/local/bin/ftdm_abi_check.py ]; then
|
|
||||||
/usr/local/bin/ftdm_abi_check.py --release_path=$(pwd) --archive_path=$INSTALLPREFIX/bin-releases --version=$VERSION
|
|
||||||
|
|
||||||
if [ $? -ne 0 ]; then
|
|
||||||
echo "ABI compabitility test failed, not creating release. Either increment the major version number or fix the interface."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
echo -ne "\n\nWARNING: /usr/local/bin/ftdm_abi_check.py not found, skipping ABI compatibility test\n\n"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ $NODOCS = "NO" ]
|
|
||||||
then
|
|
||||||
make dox || exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "Creating $release ($major.$minor.$micro) at $INSTALLPREFIX/$release (directory will be removed if exists already) ... "
|
|
||||||
|
|
||||||
mkdir -p $INSTALLPREFIX/$release $INSTALLPREFIX/bin-releases/$major/$release
|
|
||||||
|
|
||||||
cp -r ./* $INSTALLPREFIX/bin-releases/$major/$release
|
|
||||||
cp -r ./.libs $INSTALLPREFIX/bin-releases/$major/$release
|
|
||||||
|
|
||||||
make clean
|
|
||||||
make mod_freetdm-clean
|
|
||||||
|
|
||||||
cp -r ./* $INSTALLPREFIX/$release
|
|
||||||
|
|
||||||
# copy ABI compatibility reports to release
|
|
||||||
if [ -d compat_reports ]; then
|
|
||||||
mv ./compat_reports $INSTALLPREFIX/$release
|
|
||||||
fi
|
|
||||||
|
|
||||||
rm -rf $INSTALLPREFIX/$release/{$LIBSNG_ISDN_DIR,$LIBSNG_SS7_DIR,*.tgz}
|
|
||||||
rm -rf $INSTALLPREFIX/bin-releases/$major/$release/{$LIBSNG_ISDN_DIR,$LIBSNG_SS7_DIR,*.tgz}
|
|
||||||
|
|
||||||
tar -C $INSTALLPREFIX -czf $INSTALLPREFIX/$release.tar.gz $release/
|
|
|
@ -1,32 +0,0 @@
|
||||||
#
|
|
||||||
# Arnaldo M Pereira <arnaldo@sangoma.com>
|
|
||||||
#
|
|
||||||
CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
|
|
||||||
PROJECT(mod_freetdm)
|
|
||||||
|
|
||||||
IF(NOT DEFINED WIN32)
|
|
||||||
ADD_DEFINITIONS(-g -O2 -ffast-math -Wall -Werror -Wunused-variable -Wwrite-strings -Wstrict-prototypes -Wmissing-prototypes -O0 -g -ggdb -DPACKAGE_NAME=\"freetdm\" -DPACKAGE_TARNAME=\"freetdm\" -DPACKAGE_VERSION=\"pre-alpha\" -DPACKAGE_STRING=\"freetdm\ pre-alpha\" -DPACKAGE_BUGREPORT=\"bugs@freeswitch.org\" -DPACKAGE_URL=\"\" -DPACKAGE=\"libfreetdm\" -DVERSION=\"0.1\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_DLFCN_H=1 -DLT_OBJDIR=\".libs/\" -DHAVE_LIBDL=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBM=1 -DSIZEOF_LONG=8 -DHAVE_NETINET_SCTP_H=1 -DHAVE_NETDB_H=1 -DHAVE_SYS_SELECT_H=1 -DHAVE_GETHOSTBYNAME_R=1) # -DDEBUG=/\*\*/)
|
|
||||||
ENDIF(NOT DEFINED WIN32)
|
|
||||||
|
|
||||||
# includes
|
|
||||||
SET(mod_freetdm_INCLUDES
|
|
||||||
${PROJECT_SOURCE_DIR}/../src/include
|
|
||||||
${PROJECT_SOURCE_DIR}/../src/isdn/include
|
|
||||||
${PROJECT_SOURCE_DIR}/../../libteletone/src
|
|
||||||
${PROJECT_SOURCE_DIR}/../../../src/include
|
|
||||||
)
|
|
||||||
INCLUDE_DIRECTORIES(${mod_freetdm_INCLUDES})
|
|
||||||
|
|
||||||
LINK_DIRECTORIES(${PROJECT_SOURCE_DIR}/..)
|
|
||||||
ADD_LIBRARY(${PROJECT_NAME} SHARED mod_freetdm.c)
|
|
||||||
TARGET_LINK_LIBRARIES(${PROJECT_NAME} freetdm -fPIC -Werror -fvisibility=hidden)
|
|
||||||
|
|
||||||
IF(DEFINED WIN32)
|
|
||||||
SET(EXT lib)
|
|
||||||
ELSE(DEFINED WIN32)
|
|
||||||
SET(EXT so)
|
|
||||||
ENDIF(DEFINED WIN32)
|
|
||||||
|
|
||||||
ADD_CUSTOM_COMMAND(TARGET ${PROJECT_NAME} POST_BUILD
|
|
||||||
COMMAND ${CMAKE_COMMAND} -E rename lib${PROJECT_NAME}.${EXT} ${PROJECT_NAME}.${EXT}
|
|
||||||
)
|
|
|
@ -1,24 +0,0 @@
|
||||||
FT_CFLAGS=@CFLAGS@ @COMP_VENDOR_CFLAGS@ @DEFS@
|
|
||||||
|
|
||||||
BASE=../../..
|
|
||||||
FT_DIR=..
|
|
||||||
VERBOSE=1
|
|
||||||
FTLA=$(FT_DIR)/libfreetdm.la
|
|
||||||
LOCAL_OBJS=tdm.o
|
|
||||||
LOCAL_CFLAGS=-I$(FT_DIR)/src/include -I$(FT_DIR)/src/isdn/include $(FT_CFLAGS)
|
|
||||||
LOCAL_LDFLAGS=-L$(FT_DIR) -lfreetdm
|
|
||||||
include $(BASE)/build/modmake.rules
|
|
||||||
|
|
||||||
local_depend: $(FTLA)
|
|
||||||
|
|
||||||
$(FTLA): $(FT_DIR)/.update
|
|
||||||
cd $(FT_DIR) && $(MAKE)
|
|
||||||
|
|
||||||
local_install:
|
|
||||||
cd $(FT_DIR) && $(MAKE) install
|
|
||||||
[ -f $(DESTDIR)@confdir@/autoload_configs/freetdm.conf.xml ] || cp -f $(FT_DIR)/conf/freetdm.conf.xml $(DESTDIR)@confdir@/autoload_configs
|
|
||||||
|
|
||||||
local_clean:
|
|
||||||
cd $(FT_DIR) && $(MAKE) clean
|
|
||||||
|
|
||||||
|
|
|
@ -1,6 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
rm -rf mod_freetdm.so
|
|
||||||
rm -rf .libs/mod_freetdm.so
|
|
||||||
rm -rf mod_freetdm.o
|
|
||||||
rm -rf .libs/mod_freetdm.o
|
|
||||||
rm -rf mod_freetdm.lo
|
|
|
@ -1,369 +0,0 @@
|
||||||
<?xml version="1.0" encoding="Windows-1252"?>
|
|
||||||
<VisualStudioProject
|
|
||||||
ProjectType="Visual C++"
|
|
||||||
Version="9.00"
|
|
||||||
Name="mod_freetdm"
|
|
||||||
ProjectGUID="{FE3540C5-3303-46E0-A69E-D92F775687F1}"
|
|
||||||
RootNamespace="mod_freetdm"
|
|
||||||
Keyword="Win32Proj"
|
|
||||||
TargetFrameworkVersion="131072"
|
|
||||||
>
|
|
||||||
<Platforms>
|
|
||||||
<Platform
|
|
||||||
Name="Win32"
|
|
||||||
/>
|
|
||||||
<Platform
|
|
||||||
Name="x64"
|
|
||||||
/>
|
|
||||||
</Platforms>
|
|
||||||
<ToolFiles>
|
|
||||||
</ToolFiles>
|
|
||||||
<Configurations>
|
|
||||||
<Configuration
|
|
||||||
Name="Debug|Win32"
|
|
||||||
OutputDirectory="$(ConfigurationName)"
|
|
||||||
IntermediateDirectory="$(ConfigurationName)"
|
|
||||||
ConfigurationType="2"
|
|
||||||
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
|
|
||||||
CharacterSet="2"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
Optimization="0"
|
|
||||||
AdditionalIncludeDirectories="../../../src/include;../src/include;../../curl/include;../src/isdn/include"
|
|
||||||
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;MOD_EXPORTS"
|
|
||||||
MinimalRebuild="true"
|
|
||||||
BasicRuntimeChecks="3"
|
|
||||||
RuntimeLibrary="3"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
WarningLevel="4"
|
|
||||||
WarnAsError="true"
|
|
||||||
Detect64BitPortabilityProblems="false"
|
|
||||||
DebugInformationFormat="3"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
AdditionalDependencies="FreeSwitchCore.lib"
|
|
||||||
OutputFile="$(SolutionDir)$(OutDir)/mod/mod_freetdm.dll"
|
|
||||||
LinkIncremental="2"
|
|
||||||
AdditionalLibraryDirectories=""../../../w32/Library/$(OutDir)""
|
|
||||||
GenerateDebugInformation="true"
|
|
||||||
ProgramDatabaseFile="$(OutDir)/$(TargetName).pdb"
|
|
||||||
SubSystem="2"
|
|
||||||
RandomizedBaseAddress="1"
|
|
||||||
DataExecutionPrevention="0"
|
|
||||||
ImportLibrary="$(OutDir)/mod_freetdm.lib"
|
|
||||||
TargetMachine="1"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCALinkTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManifestTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXDCMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCBscMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCFxCopTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAppVerifierTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
/>
|
|
||||||
</Configuration>
|
|
||||||
<Configuration
|
|
||||||
Name="Release|Win32"
|
|
||||||
OutputDirectory="$(ConfigurationName)"
|
|
||||||
IntermediateDirectory="$(ConfigurationName)"
|
|
||||||
ConfigurationType="2"
|
|
||||||
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
|
|
||||||
CharacterSet="2"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories="../../../src/include;../src/include;../../curl/include;../src/isdn/include"
|
|
||||||
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;MOD_EXPORTS"
|
|
||||||
RuntimeLibrary="2"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
WarningLevel="4"
|
|
||||||
WarnAsError="true"
|
|
||||||
Detect64BitPortabilityProblems="false"
|
|
||||||
DebugInformationFormat="3"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
AdditionalDependencies="FreeSwitchCore.lib"
|
|
||||||
OutputFile="$(SolutionDir)$(OutDir)/mod/mod_freetdm.dll"
|
|
||||||
LinkIncremental="1"
|
|
||||||
AdditionalLibraryDirectories=""../../../w32/Library/$(OutDir)""
|
|
||||||
GenerateDebugInformation="true"
|
|
||||||
ProgramDatabaseFile="$(OutDir)/$(TargetName).pdb"
|
|
||||||
SubSystem="2"
|
|
||||||
OptimizeReferences="2"
|
|
||||||
EnableCOMDATFolding="2"
|
|
||||||
LinkTimeCodeGeneration="1"
|
|
||||||
RandomizedBaseAddress="1"
|
|
||||||
DataExecutionPrevention="0"
|
|
||||||
ImportLibrary="$(OutDir)/mod_freetdm.lib"
|
|
||||||
TargetMachine="1"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCALinkTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManifestTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXDCMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCBscMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCFxCopTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAppVerifierTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
/>
|
|
||||||
</Configuration>
|
|
||||||
<Configuration
|
|
||||||
Name="Debug|x64"
|
|
||||||
OutputDirectory="$(PlatformName)\$(ConfigurationName)"
|
|
||||||
IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
|
|
||||||
ConfigurationType="2"
|
|
||||||
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
|
|
||||||
CharacterSet="2"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"
|
|
||||||
TargetEnvironment="3"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
Optimization="0"
|
|
||||||
AdditionalIncludeDirectories="../../../src/include;../src/include;../../curl/include;../src/isdn/include"
|
|
||||||
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;MOD_EXPORTS"
|
|
||||||
MinimalRebuild="true"
|
|
||||||
BasicRuntimeChecks="3"
|
|
||||||
RuntimeLibrary="3"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
WarningLevel="4"
|
|
||||||
WarnAsError="true"
|
|
||||||
Detect64BitPortabilityProblems="false"
|
|
||||||
DebugInformationFormat="3"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
AdditionalDependencies="FreeSwitchCore.lib"
|
|
||||||
OutputFile="$(SolutionDir)$(OutDir)/mod/mod_freetdm.dll"
|
|
||||||
LinkIncremental="2"
|
|
||||||
AdditionalLibraryDirectories=""../../../w32/Library/$(OutDir)""
|
|
||||||
GenerateDebugInformation="true"
|
|
||||||
ProgramDatabaseFile="$(OutDir)/$(TargetName).pdb"
|
|
||||||
SubSystem="2"
|
|
||||||
RandomizedBaseAddress="1"
|
|
||||||
DataExecutionPrevention="0"
|
|
||||||
ImportLibrary="$(OutDir)/mod_freetdm.lib"
|
|
||||||
TargetMachine="17"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCALinkTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManifestTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXDCMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCBscMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCFxCopTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAppVerifierTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
/>
|
|
||||||
</Configuration>
|
|
||||||
<Configuration
|
|
||||||
Name="Release|x64"
|
|
||||||
OutputDirectory="$(PlatformName)\$(ConfigurationName)"
|
|
||||||
IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
|
|
||||||
ConfigurationType="2"
|
|
||||||
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
|
|
||||||
CharacterSet="2"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"
|
|
||||||
TargetEnvironment="3"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories="../../../src/include;../src/include;../../curl/include;../src/isdn/include"
|
|
||||||
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;MOD_EXPORTS"
|
|
||||||
RuntimeLibrary="2"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
WarningLevel="4"
|
|
||||||
WarnAsError="true"
|
|
||||||
Detect64BitPortabilityProblems="false"
|
|
||||||
DebugInformationFormat="3"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
AdditionalDependencies="FreeSwitchCore.lib"
|
|
||||||
OutputFile="$(SolutionDir)$(OutDir)/mod/mod_freetdm.dll"
|
|
||||||
LinkIncremental="1"
|
|
||||||
AdditionalLibraryDirectories=""../../../w32/Library/$(OutDir)""
|
|
||||||
GenerateDebugInformation="true"
|
|
||||||
ProgramDatabaseFile="$(OutDir)/$(TargetName).pdb"
|
|
||||||
SubSystem="2"
|
|
||||||
OptimizeReferences="2"
|
|
||||||
EnableCOMDATFolding="2"
|
|
||||||
LinkTimeCodeGeneration="1"
|
|
||||||
RandomizedBaseAddress="1"
|
|
||||||
DataExecutionPrevention="0"
|
|
||||||
ImportLibrary="$(OutDir)/mod_freetdm.lib"
|
|
||||||
TargetMachine="17"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCALinkTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManifestTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXDCMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCBscMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCFxCopTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAppVerifierTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
/>
|
|
||||||
</Configuration>
|
|
||||||
</Configurations>
|
|
||||||
<References>
|
|
||||||
</References>
|
|
||||||
<Files>
|
|
||||||
<Filter
|
|
||||||
Name="Source Files"
|
|
||||||
Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
|
|
||||||
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
|
|
||||||
>
|
|
||||||
<File
|
|
||||||
RelativePath=".\mod_freetdm.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
</Filter>
|
|
||||||
</Files>
|
|
||||||
<Globals>
|
|
||||||
</Globals>
|
|
||||||
</VisualStudioProject>
|
|
|
@ -1,14 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<ItemGroup>
|
|
||||||
<Filter Include="Source Files">
|
|
||||||
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
|
|
||||||
<Extensions>cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
|
|
||||||
</Filter>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ClCompile Include="mod_freetdm.c">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
</ItemGroup>
|
|
||||||
</Project>
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,201 +0,0 @@
|
||||||
<?xml version="1.0" encoding="Windows-1252"?>
|
|
||||||
<VisualStudioProject
|
|
||||||
ProjectType="Visual C++"
|
|
||||||
Version="8.00"
|
|
||||||
Name="mod_freetdm"
|
|
||||||
ProjectGUID="{FE3540C5-3303-46E0-A69E-D92F775687F1}"
|
|
||||||
RootNamespace="mod_freetdm"
|
|
||||||
Keyword="Win32Proj"
|
|
||||||
>
|
|
||||||
<Platforms>
|
|
||||||
<Platform
|
|
||||||
Name="Win32"
|
|
||||||
/>
|
|
||||||
</Platforms>
|
|
||||||
<ToolFiles>
|
|
||||||
</ToolFiles>
|
|
||||||
<Configurations>
|
|
||||||
<Configuration
|
|
||||||
Name="Debug|Win32"
|
|
||||||
OutputDirectory="$(ConfigurationName)"
|
|
||||||
IntermediateDirectory="$(ConfigurationName)"
|
|
||||||
ConfigurationType="2"
|
|
||||||
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
|
|
||||||
CharacterSet="2"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
Optimization="0"
|
|
||||||
AdditionalIncludeDirectories="../../../src/include;../src/include;../src/isdn/include"
|
|
||||||
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;MOD_EXPORTS"
|
|
||||||
MinimalRebuild="true"
|
|
||||||
BasicRuntimeChecks="3"
|
|
||||||
RuntimeLibrary="3"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
WarningLevel="4"
|
|
||||||
WarnAsError="true"
|
|
||||||
Detect64BitPortabilityProblems="false"
|
|
||||||
DebugInformationFormat="3"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
AdditionalDependencies="FreeSwitchCore.lib"
|
|
||||||
OutputFile="$(SolutionDir)$(OutDir)/mod/$(InputName).dll"
|
|
||||||
LinkIncremental="2"
|
|
||||||
AdditionalLibraryDirectories=""../../../w32/Library/$(OutDir)""
|
|
||||||
GenerateDebugInformation="true"
|
|
||||||
ProgramDatabaseFile="$(OutDir)$(TargetName).pdb"
|
|
||||||
SubSystem="2"
|
|
||||||
ImportLibrary="$(OutDir)/mod_freetdm.lib"
|
|
||||||
TargetMachine="1"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCALinkTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManifestTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXDCMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCBscMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCFxCopTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAppVerifierTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebDeploymentTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
/>
|
|
||||||
</Configuration>
|
|
||||||
<Configuration
|
|
||||||
Name="Release|Win32"
|
|
||||||
OutputDirectory="$(ConfigurationName)"
|
|
||||||
IntermediateDirectory="$(ConfigurationName)"
|
|
||||||
ConfigurationType="2"
|
|
||||||
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
|
|
||||||
CharacterSet="2"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories="../../../src/include;../src/include;../src/isdn/include"
|
|
||||||
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;MOD_EXPORTS"
|
|
||||||
RuntimeLibrary="2"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
WarningLevel="4"
|
|
||||||
WarnAsError="true"
|
|
||||||
Detect64BitPortabilityProblems="false"
|
|
||||||
DebugInformationFormat="3"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
AdditionalDependencies="FreeSwitchCore.lib"
|
|
||||||
OutputFile="$(SolutionDir)$(OutDir)/mod/$(InputName).dll"
|
|
||||||
LinkIncremental="1"
|
|
||||||
AdditionalLibraryDirectories=""../../../w32/Library/$(OutDir)""
|
|
||||||
GenerateDebugInformation="true"
|
|
||||||
ProgramDatabaseFile="$(OutDir)$(TargetName).pdb"
|
|
||||||
SubSystem="2"
|
|
||||||
OptimizeReferences="2"
|
|
||||||
EnableCOMDATFolding="2"
|
|
||||||
LinkTimeCodeGeneration="1"
|
|
||||||
ImportLibrary="$(OutDir)/mod_freetdm.lib"
|
|
||||||
TargetMachine="1"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCALinkTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManifestTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXDCMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCBscMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCFxCopTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAppVerifierTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebDeploymentTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
/>
|
|
||||||
</Configuration>
|
|
||||||
</Configurations>
|
|
||||||
<References>
|
|
||||||
</References>
|
|
||||||
<Files>
|
|
||||||
<Filter
|
|
||||||
Name="Source Files"
|
|
||||||
Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
|
|
||||||
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
|
|
||||||
>
|
|
||||||
<File
|
|
||||||
RelativePath=".\mod_freetdm.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
</Filter>
|
|
||||||
</Files>
|
|
||||||
<Globals>
|
|
||||||
</Globals>
|
|
||||||
</VisualStudioProject>
|
|
|
@ -1,719 +0,0 @@
|
||||||
/*
|
|
||||||
* FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
|
|
||||||
* Copyright (C) 2005-2011, Anthony Minessale II <anthm@freeswitch.org>
|
|
||||||
*
|
|
||||||
* 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 <anthm@freeswitch.org>
|
|
||||||
* Portions created by the Initial Developer are Copyright (C)
|
|
||||||
* the Initial Developer. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* Contributor(s):
|
|
||||||
*
|
|
||||||
* Mathieu Rene <mrene@avgs.ca>
|
|
||||||
*
|
|
||||||
* tdm.c -- FreeTDM Controllable Channel Module
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <switch.h>
|
|
||||||
#include "freetdm.h"
|
|
||||||
|
|
||||||
void ctdm_init(switch_loadable_module_interface_t *module_interface);
|
|
||||||
|
|
||||||
/* Parameters */
|
|
||||||
|
|
||||||
#define kSPAN_ID "span"
|
|
||||||
#define kCHAN_ID "chan"
|
|
||||||
#define kSPAN_NAME "span_name"
|
|
||||||
#define kPREBUFFER_LEN "prebuffer_len"
|
|
||||||
#define kECHOCANCEL "echo_cancel"
|
|
||||||
|
|
||||||
|
|
||||||
static struct {
|
|
||||||
switch_memory_pool_t *pool;
|
|
||||||
switch_endpoint_interface_t *endpoint_interface;
|
|
||||||
} ctdm;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
int span_id;
|
|
||||||
int chan_id;
|
|
||||||
ftdm_channel_t *ftdm_channel;
|
|
||||||
switch_core_session_t *session;
|
|
||||||
switch_codec_t read_codec, write_codec;
|
|
||||||
switch_frame_t read_frame;
|
|
||||||
int prebuffer_len;
|
|
||||||
|
|
||||||
unsigned char databuf[SWITCH_RECOMMENDED_BUFFER_SIZE];
|
|
||||||
} ctdm_private_t;
|
|
||||||
|
|
||||||
static switch_status_t channel_on_init(switch_core_session_t *session);
|
|
||||||
static switch_status_t channel_on_destroy(switch_core_session_t *session);
|
|
||||||
static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *session, switch_event_t *var_event,
|
|
||||||
switch_caller_profile_t *outbound_profile,
|
|
||||||
switch_core_session_t **new_session,
|
|
||||||
switch_memory_pool_t **pool,
|
|
||||||
switch_originate_flag_t flags, switch_call_cause_t *cancel_cause);
|
|
||||||
static switch_status_t channel_read_frame(switch_core_session_t *session, switch_frame_t **frame, switch_io_flag_t flags, int stream_id);
|
|
||||||
static switch_status_t channel_write_frame(switch_core_session_t *session, switch_frame_t *frame, switch_io_flag_t flags, int stream_id);
|
|
||||||
static switch_status_t channel_receive_message(switch_core_session_t *session, switch_core_session_message_t *msg);
|
|
||||||
static switch_status_t channel_receive_event(switch_core_session_t *session, switch_event_t *event);
|
|
||||||
static switch_status_t channel_send_dtmf(switch_core_session_t *session, const switch_dtmf_t *dtmf);
|
|
||||||
|
|
||||||
|
|
||||||
static ftdm_status_t ctdm_span_prepare(ftdm_span_t *span);
|
|
||||||
|
|
||||||
switch_state_handler_table_t ctdm_state_handlers = {
|
|
||||||
.on_init = channel_on_init,
|
|
||||||
.on_destroy = channel_on_destroy
|
|
||||||
};
|
|
||||||
|
|
||||||
switch_io_routines_t ctdm_io_routines = {
|
|
||||||
.send_dtmf = channel_send_dtmf,
|
|
||||||
.outgoing_channel = channel_outgoing_channel,
|
|
||||||
.read_frame = channel_read_frame,
|
|
||||||
.write_frame = channel_write_frame,
|
|
||||||
.receive_message = channel_receive_message,
|
|
||||||
.receive_event = channel_receive_event
|
|
||||||
};
|
|
||||||
|
|
||||||
static void ctdm_report_alarms(ftdm_channel_t *channel)
|
|
||||||
{
|
|
||||||
switch_event_t *event = NULL;
|
|
||||||
ftdm_alarm_flag_t alarmflag = 0;
|
|
||||||
|
|
||||||
if (switch_event_create(&event, SWITCH_EVENT_TRAP) != SWITCH_STATUS_SUCCESS) {
|
|
||||||
ftdm_log(FTDM_LOG_ERROR, "failed to create alarms events\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ftdm_channel_get_alarms(channel, &alarmflag) != FTDM_SUCCESS) {
|
|
||||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Failed to retrieve alarms %s:%d\n", ftdm_channel_get_span_name(channel), ftdm_channel_get_id(channel));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch_event_add_header(event, SWITCH_STACK_BOTTOM, "span-name", "%s", ftdm_channel_get_span_name(channel));
|
|
||||||
switch_event_add_header(event, SWITCH_STACK_BOTTOM, "span-number", "%d", ftdm_channel_get_span_id(channel));
|
|
||||||
switch_event_add_header(event, SWITCH_STACK_BOTTOM, "chan-number", "%d", ftdm_channel_get_id(channel));
|
|
||||||
|
|
||||||
if (alarmflag) {
|
|
||||||
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "condition", "ftdm-alarm-trap");
|
|
||||||
} else {
|
|
||||||
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "condition", "ftdm-alarm-clear");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (alarmflag & FTDM_ALARM_RED) {
|
|
||||||
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "alarm", "red");
|
|
||||||
}
|
|
||||||
if (alarmflag & FTDM_ALARM_YELLOW) {
|
|
||||||
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "alarm", "yellow");
|
|
||||||
}
|
|
||||||
if (alarmflag & FTDM_ALARM_RAI) {
|
|
||||||
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "alarm", "rai");
|
|
||||||
}
|
|
||||||
if (alarmflag & FTDM_ALARM_BLUE) {
|
|
||||||
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "alarm", "blue");
|
|
||||||
}
|
|
||||||
if (alarmflag & FTDM_ALARM_AIS) {
|
|
||||||
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "alarm", "ais");
|
|
||||||
}
|
|
||||||
if (alarmflag & FTDM_ALARM_GENERAL) {
|
|
||||||
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "alarm", "general");
|
|
||||||
}
|
|
||||||
|
|
||||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Reporting [%s] alarms for %s:%d\n",
|
|
||||||
(alarmflag?"ftdm-alarm-trap":"ftdm-alarm-clear"), ftdm_channel_get_span_name(channel), ftdm_channel_get_id(channel));
|
|
||||||
|
|
||||||
switch_event_fire(&event);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
static ftdm_channel_t *ctdm_get_channel_from_event(switch_event_t *event, ftdm_span_t *span)
|
|
||||||
{
|
|
||||||
uint32_t chan_id = 0;
|
|
||||||
const char *chan_number = NULL;
|
|
||||||
|
|
||||||
chan_number = switch_event_get_header(event, "chan-number");
|
|
||||||
|
|
||||||
if (zstr(chan_number)) {
|
|
||||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "No channel number specified\n");
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
chan_id = atoi(chan_number);
|
|
||||||
if (!chan_id) {
|
|
||||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invalid channel number:%s\n", chan_number);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return ftdm_span_get_channel_ph(span, chan_id);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static void ctdm_event_handler(switch_event_t *event)
|
|
||||||
{
|
|
||||||
ftdm_status_t status = FTDM_FAIL;
|
|
||||||
switch(event->event_id) {
|
|
||||||
case SWITCH_EVENT_TRAP:
|
|
||||||
{
|
|
||||||
ftdm_span_t *span = NULL;
|
|
||||||
ftdm_channel_t *channel = NULL;
|
|
||||||
const char *span_name = NULL;
|
|
||||||
|
|
||||||
const char *cond = switch_event_get_header(event, "condition");
|
|
||||||
const char *command = switch_event_get_header(event, "command");
|
|
||||||
if (zstr(cond)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
span_name = switch_event_get_header(event, "span-name");
|
|
||||||
|
|
||||||
if (ftdm_span_find_by_name(span_name, &span) != FTDM_SUCCESS) {
|
|
||||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Cannot find span [%s]\n", span_name);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!strcmp(cond, "mg-tdm-prepare")) {
|
|
||||||
status = ctdm_span_prepare(span);
|
|
||||||
if (status == FTDM_SUCCESS) {
|
|
||||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "%s:prepared successfully\n", span_name);
|
|
||||||
} else if (status != FTDM_EINVAL) {
|
|
||||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "%s:Failed to prepare span\n", span_name);
|
|
||||||
}
|
|
||||||
} else if (!strcmp(cond, "mg-tdm-check")) {
|
|
||||||
channel = ctdm_get_channel_from_event(event, span);
|
|
||||||
if (!channel) {
|
|
||||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Could not find channel\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Requesting alarm status for %s:%d\n",
|
|
||||||
ftdm_channel_get_span_name(channel), ftdm_channel_get_id(channel));
|
|
||||||
|
|
||||||
ctdm_report_alarms(channel);
|
|
||||||
} else if (!strcmp(cond, "mg-tdm-dtmfremoval")) {
|
|
||||||
uint8_t enable = 0;
|
|
||||||
channel = ctdm_get_channel_from_event(event, span);
|
|
||||||
if (!channel) {
|
|
||||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Could not find channel\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (zstr(command)) {
|
|
||||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "%s:No command specified for mg-tdm-dtmfremoval\n", span_name);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!strcmp(command, "enable")) {
|
|
||||||
enable = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "%s DTMF-removal for %s:%d\n",
|
|
||||||
enable ? "Enabling" : "Disabling", ftdm_channel_get_span_name(channel), ftdm_channel_get_id(channel));
|
|
||||||
|
|
||||||
ftdm_channel_command(channel, enable ? FTDM_COMMAND_ENABLE_DTMF_REMOVAL : FTDM_COMMAND_DISABLE_DTMF_REMOVAL, 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ctdm_init(switch_loadable_module_interface_t *module_interface)
|
|
||||||
{
|
|
||||||
switch_endpoint_interface_t *endpoint_interface;
|
|
||||||
ctdm.pool = module_interface->pool;
|
|
||||||
endpoint_interface = switch_loadable_module_create_interface(module_interface, SWITCH_ENDPOINT_INTERFACE);
|
|
||||||
endpoint_interface->interface_name = "tdm";
|
|
||||||
endpoint_interface->io_routines = &ctdm_io_routines;
|
|
||||||
endpoint_interface->state_handler = &ctdm_state_handlers;
|
|
||||||
ctdm.endpoint_interface = endpoint_interface;
|
|
||||||
|
|
||||||
switch_event_bind("mod_freetdm", SWITCH_EVENT_TRAP, SWITCH_EVENT_SUBCLASS_ANY, ctdm_event_handler, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
static FIO_SIGNAL_CB_FUNCTION(on_signal_cb)
|
|
||||||
{
|
|
||||||
uint32_t chanid, spanid;
|
|
||||||
switch_event_t *event = NULL;
|
|
||||||
ftdm_alarm_flag_t alarmbits = FTDM_ALARM_NONE;
|
|
||||||
|
|
||||||
chanid = ftdm_channel_get_id(sigmsg->channel);
|
|
||||||
spanid = ftdm_channel_get_span_id(sigmsg->channel);
|
|
||||||
|
|
||||||
switch(sigmsg->event_id) {
|
|
||||||
case FTDM_SIGEVENT_ALARM_CLEAR:
|
|
||||||
case FTDM_SIGEVENT_ALARM_TRAP:
|
|
||||||
{
|
|
||||||
if (ftdm_channel_get_alarms(sigmsg->channel, &alarmbits) != FTDM_SUCCESS) {
|
|
||||||
ftdm_log(FTDM_LOG_ERROR, "failed to retrieve alarms\n");
|
|
||||||
return FTDM_FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (switch_event_create(&event, SWITCH_EVENT_TRAP) != SWITCH_STATUS_SUCCESS) {
|
|
||||||
ftdm_log(FTDM_LOG_ERROR, "failed to create alarms events\n");
|
|
||||||
return FTDM_FAIL;
|
|
||||||
}
|
|
||||||
if (sigmsg->event_id == FTDM_SIGEVENT_ALARM_CLEAR) {
|
|
||||||
ftdm_log(FTDM_LOG_NOTICE, "Alarm cleared on channel %d:%d\n", spanid, chanid);
|
|
||||||
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "condition", "ftdm-alarm-clear");
|
|
||||||
} else {
|
|
||||||
ftdm_log(FTDM_LOG_NOTICE, "Alarm raised on channel %d:%d\n", spanid, chanid);
|
|
||||||
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "condition", "ftdm-alarm-trap");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Unhandled event %d\n", sigmsg->event_id);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (event) {
|
|
||||||
switch_event_add_header(event, SWITCH_STACK_BOTTOM, "span-name", "%s", ftdm_channel_get_span_name(sigmsg->channel));
|
|
||||||
switch_event_add_header(event, SWITCH_STACK_BOTTOM, "span-number", "%d", ftdm_channel_get_span_id(sigmsg->channel));
|
|
||||||
switch_event_add_header(event, SWITCH_STACK_BOTTOM, "chan-number", "%d", ftdm_channel_get_id(sigmsg->channel));
|
|
||||||
|
|
||||||
if (alarmbits & FTDM_ALARM_RED) {
|
|
||||||
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "alarm", "red");
|
|
||||||
}
|
|
||||||
if (alarmbits & FTDM_ALARM_YELLOW) {
|
|
||||||
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "alarm", "yellow");
|
|
||||||
}
|
|
||||||
if (alarmbits & FTDM_ALARM_RAI) {
|
|
||||||
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "alarm", "rai");
|
|
||||||
}
|
|
||||||
if (alarmbits & FTDM_ALARM_BLUE) {
|
|
||||||
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "alarm", "blue");
|
|
||||||
}
|
|
||||||
if (alarmbits & FTDM_ALARM_AIS) {
|
|
||||||
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "alarm", "ais");
|
|
||||||
}
|
|
||||||
if (alarmbits & FTDM_ALARM_GENERAL) {
|
|
||||||
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "alarm", "general");
|
|
||||||
}
|
|
||||||
|
|
||||||
switch_event_fire(&event);
|
|
||||||
}
|
|
||||||
return FTDM_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
static ftdm_status_t ctdm_span_prepare(ftdm_span_t *span)
|
|
||||||
{
|
|
||||||
if (ftdm_span_register_signal_cb(span, on_signal_cb) != FTDM_SUCCESS) {
|
|
||||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Couldn't register signal CB\n");
|
|
||||||
return FTDM_FAIL;
|
|
||||||
}
|
|
||||||
return ftdm_span_start(span);
|
|
||||||
}
|
|
||||||
|
|
||||||
static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *session, switch_event_t *var_event,
|
|
||||||
switch_caller_profile_t *outbound_profile,
|
|
||||||
switch_core_session_t **new_session,
|
|
||||||
switch_memory_pool_t **pool,
|
|
||||||
switch_originate_flag_t flags, switch_call_cause_t *cancel_cause)
|
|
||||||
{
|
|
||||||
const char *szchanid = switch_event_get_header(var_event, kCHAN_ID),
|
|
||||||
*span_name = switch_event_get_header(var_event, kSPAN_NAME),
|
|
||||||
*szprebuffer_len = switch_event_get_header(var_event, kPREBUFFER_LEN);
|
|
||||||
int chan_id;
|
|
||||||
int span_id;
|
|
||||||
switch_caller_profile_t *caller_profile;
|
|
||||||
ftdm_span_t *span;
|
|
||||||
ftdm_channel_t *chan;
|
|
||||||
switch_channel_t *channel;
|
|
||||||
char name[128];
|
|
||||||
const char *dname;
|
|
||||||
ftdm_codec_t codec;
|
|
||||||
uint32_t interval;
|
|
||||||
ctdm_private_t *tech_pvt = NULL;
|
|
||||||
|
|
||||||
if (zstr(szchanid) || zstr(span_name)) {
|
|
||||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Both ["kSPAN_ID"] and ["kCHAN_ID"] have to be set.\n");
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
chan_id = atoi(szchanid);
|
|
||||||
|
|
||||||
if (ftdm_span_find_by_name(span_name, &span) == FTDM_SUCCESS) {
|
|
||||||
span_id = ftdm_span_get_id(span);
|
|
||||||
} else {
|
|
||||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Cannot find span [%s]\n", span_name);
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!(*new_session = switch_core_session_request(ctdm.endpoint_interface, SWITCH_CALL_DIRECTION_OUTBOUND, 0, pool))) {
|
|
||||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Couldn't request session.\n");
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
channel = switch_core_session_get_channel(*new_session);
|
|
||||||
|
|
||||||
if (ftdm_channel_open_ph(span_id, chan_id, &chan) != FTDM_SUCCESS) {
|
|
||||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Couldn't open span or channel.\n");
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch_channel_set_flag(channel, CF_AUDIO);
|
|
||||||
|
|
||||||
span = ftdm_channel_get_span(chan);
|
|
||||||
|
|
||||||
tech_pvt = switch_core_session_alloc(*new_session, sizeof *tech_pvt);
|
|
||||||
tech_pvt->chan_id = chan_id;
|
|
||||||
tech_pvt->span_id = span_id;
|
|
||||||
tech_pvt->ftdm_channel = chan;
|
|
||||||
tech_pvt->session = *new_session;
|
|
||||||
tech_pvt->read_frame.buflen = sizeof(tech_pvt->databuf);
|
|
||||||
tech_pvt->read_frame.data = tech_pvt->databuf;
|
|
||||||
tech_pvt->prebuffer_len = zstr(szprebuffer_len) ? 0 : atoi(szprebuffer_len);
|
|
||||||
switch_core_session_set_private(*new_session, tech_pvt);
|
|
||||||
|
|
||||||
|
|
||||||
caller_profile = switch_caller_profile_clone(*new_session, outbound_profile);
|
|
||||||
switch_channel_set_caller_profile(channel, caller_profile);
|
|
||||||
|
|
||||||
snprintf(name, sizeof(name), "tdm/%d:%d", span_id, chan_id);
|
|
||||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Connect outbound channel %s\n", name);
|
|
||||||
switch_channel_set_name(channel, name);
|
|
||||||
|
|
||||||
switch_channel_set_state(channel, CS_INIT);
|
|
||||||
|
|
||||||
if (FTDM_SUCCESS != ftdm_channel_command(chan, FTDM_COMMAND_GET_CODEC, &codec)) {
|
|
||||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Failed to retrieve channel codec.\n");
|
|
||||||
return SWITCH_CAUSE_NETWORK_OUT_OF_ORDER;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (FTDM_SUCCESS != ftdm_channel_command(chan, FTDM_COMMAND_GET_INTERVAL, &interval)) {
|
|
||||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Failed to retrieve channel interval.\n");
|
|
||||||
return SWITCH_CAUSE_NETWORK_OUT_OF_ORDER;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (FTDM_SUCCESS != ftdm_channel_command(chan, FTDM_COMMAND_SET_PRE_BUFFER_SIZE, &tech_pvt->prebuffer_len)) {
|
|
||||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Failed to set channel pre buffer size.\n");
|
|
||||||
return SWITCH_CAUSE_NETWORK_OUT_OF_ORDER;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (FTDM_SUCCESS != ftdm_channel_command(tech_pvt->ftdm_channel, FTDM_COMMAND_ENABLE_ECHOCANCEL, NULL)) {
|
|
||||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Failed to set enable echo cancellation.\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
switch(codec) {
|
|
||||||
case FTDM_CODEC_ULAW:
|
|
||||||
{
|
|
||||||
dname = "PCMU";
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case FTDM_CODEC_ALAW:
|
|
||||||
{
|
|
||||||
dname = "PCMA";
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case FTDM_CODEC_SLIN:
|
|
||||||
{
|
|
||||||
dname = "L16";
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
{
|
|
||||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invalid codec value retrieved from channel, codec value: %d\n", codec);
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if (switch_core_codec_init(&tech_pvt->read_codec,
|
|
||||||
dname,
|
|
||||||
NULL,
|
|
||||||
NULL,
|
|
||||||
8000,
|
|
||||||
interval,
|
|
||||||
1,
|
|
||||||
SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE,
|
|
||||||
NULL, switch_core_session_get_pool(tech_pvt->session)) != SWITCH_STATUS_SUCCESS) {
|
|
||||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Can't load codec?\n");
|
|
||||||
goto fail;
|
|
||||||
} else {
|
|
||||||
if (switch_core_codec_init(&tech_pvt->write_codec,
|
|
||||||
dname,
|
|
||||||
NULL,
|
|
||||||
NULL,
|
|
||||||
8000,
|
|
||||||
interval,
|
|
||||||
1,
|
|
||||||
SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE,
|
|
||||||
NULL, switch_core_session_get_pool(tech_pvt->session)) != SWITCH_STATUS_SUCCESS) {
|
|
||||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Can't load codec?\n");
|
|
||||||
switch_core_codec_destroy(&tech_pvt->read_codec);
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (switch_core_session_set_read_codec(*new_session, &tech_pvt->read_codec) != SWITCH_STATUS_SUCCESS) {
|
|
||||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Can't set read codec?\n");
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (switch_core_session_set_write_codec(*new_session, &tech_pvt->write_codec) != SWITCH_STATUS_SUCCESS) {
|
|
||||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Can't set write codec?\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (switch_core_session_thread_launch(*new_session) != SWITCH_STATUS_SUCCESS) {
|
|
||||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Couldn't start session thread.\n");
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch_channel_mark_answered(channel);
|
|
||||||
|
|
||||||
return SWITCH_CAUSE_SUCCESS;
|
|
||||||
|
|
||||||
fail:
|
|
||||||
|
|
||||||
if (tech_pvt) {
|
|
||||||
if (tech_pvt->ftdm_channel) {
|
|
||||||
ftdm_channel_close(&tech_pvt->ftdm_channel);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tech_pvt->read_codec.implementation) {
|
|
||||||
switch_core_codec_destroy(&tech_pvt->read_codec);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tech_pvt->write_codec.implementation) {
|
|
||||||
switch_core_codec_destroy(&tech_pvt->write_codec);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (*new_session) {
|
|
||||||
switch_core_session_destroy(new_session);
|
|
||||||
}
|
|
||||||
return SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER;
|
|
||||||
}
|
|
||||||
|
|
||||||
static switch_status_t channel_on_init(switch_core_session_t *session)
|
|
||||||
{
|
|
||||||
switch_channel_t *channel = switch_core_session_get_channel(session);
|
|
||||||
|
|
||||||
switch_channel_set_state(channel, CS_CONSUME_MEDIA);
|
|
||||||
return SWITCH_STATUS_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
static switch_status_t channel_on_destroy(switch_core_session_t *session)
|
|
||||||
{
|
|
||||||
ctdm_private_t *tech_pvt = switch_core_session_get_private(session);
|
|
||||||
|
|
||||||
if ((tech_pvt = switch_core_session_get_private(session))) {
|
|
||||||
|
|
||||||
if (FTDM_SUCCESS != ftdm_channel_command(tech_pvt->ftdm_channel, FTDM_COMMAND_ENABLE_ECHOCANCEL, NULL)) {
|
|
||||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Failed to enable echo cancellation.\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tech_pvt->read_codec.implementation) {
|
|
||||||
switch_core_codec_destroy(&tech_pvt->read_codec);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tech_pvt->write_codec.implementation) {
|
|
||||||
switch_core_codec_destroy(&tech_pvt->write_codec);
|
|
||||||
}
|
|
||||||
|
|
||||||
switch_core_session_unset_read_codec(session);
|
|
||||||
switch_core_session_unset_write_codec(session);
|
|
||||||
|
|
||||||
ftdm_channel_close(&tech_pvt->ftdm_channel);
|
|
||||||
}
|
|
||||||
|
|
||||||
return SWITCH_STATUS_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static switch_status_t channel_read_frame(switch_core_session_t *session, switch_frame_t **frame, switch_io_flag_t flags, int stream_id)
|
|
||||||
{
|
|
||||||
ftdm_wait_flag_t wflags = FTDM_READ;
|
|
||||||
ftdm_status_t status;
|
|
||||||
ctdm_private_t *tech_pvt;
|
|
||||||
const char *name;
|
|
||||||
switch_channel_t *channel;
|
|
||||||
int chunk;
|
|
||||||
uint32_t span_id, chan_id;
|
|
||||||
ftdm_size_t len;
|
|
||||||
char dtmf[128] = "";
|
|
||||||
|
|
||||||
channel = switch_core_session_get_channel(session);
|
|
||||||
assert(channel != NULL);
|
|
||||||
|
|
||||||
tech_pvt = switch_core_session_get_private(session);
|
|
||||||
assert(tech_pvt != NULL);
|
|
||||||
|
|
||||||
name = switch_channel_get_name(channel);
|
|
||||||
|
|
||||||
top:
|
|
||||||
wflags = FTDM_READ;
|
|
||||||
chunk = ftdm_channel_get_io_interval(tech_pvt->ftdm_channel) * 2;
|
|
||||||
status = ftdm_channel_wait(tech_pvt->ftdm_channel, &wflags, chunk);
|
|
||||||
|
|
||||||
|
|
||||||
span_id = ftdm_channel_get_span_id(tech_pvt->ftdm_channel);
|
|
||||||
chan_id = ftdm_channel_get_id(tech_pvt->ftdm_channel);
|
|
||||||
|
|
||||||
if (status == FTDM_FAIL) {
|
|
||||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Failed to read from channel %s device %d:%d!\n", name, span_id, chan_id);
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (status == FTDM_TIMEOUT) {
|
|
||||||
goto top;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!(wflags & FTDM_READ)) {
|
|
||||||
goto top;
|
|
||||||
}
|
|
||||||
|
|
||||||
len = tech_pvt->read_frame.buflen;
|
|
||||||
if (ftdm_channel_read(tech_pvt->ftdm_channel, tech_pvt->read_frame.data, &len) != FTDM_SUCCESS) {
|
|
||||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Failed to read from channel %s device %d:%d!\n", name, span_id, chan_id);
|
|
||||||
}
|
|
||||||
|
|
||||||
*frame = &tech_pvt->read_frame;
|
|
||||||
tech_pvt->read_frame.datalen = (uint32_t)len;
|
|
||||||
tech_pvt->read_frame.samples = tech_pvt->read_frame.datalen;
|
|
||||||
tech_pvt->read_frame.codec = &tech_pvt->read_codec;
|
|
||||||
|
|
||||||
if (ftdm_channel_get_codec(tech_pvt->ftdm_channel) == FTDM_CODEC_SLIN) {
|
|
||||||
tech_pvt->read_frame.samples /= 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
while (ftdm_channel_dequeue_dtmf(tech_pvt->ftdm_channel, dtmf, sizeof(dtmf))) {
|
|
||||||
switch_dtmf_t _dtmf = { 0, switch_core_default_dtmf_duration(0) };
|
|
||||||
char *p;
|
|
||||||
for (p = dtmf; p && *p; p++) {
|
|
||||||
if (is_dtmf(*p)) {
|
|
||||||
_dtmf.digit = *p;
|
|
||||||
ftdm_log(FTDM_LOG_DEBUG, "Queuing DTMF [%c] in channel %s device %d:%d\n", *p, name, span_id, chan_id);
|
|
||||||
switch_channel_queue_dtmf(channel, &_dtmf);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return SWITCH_STATUS_SUCCESS;
|
|
||||||
|
|
||||||
fail:
|
|
||||||
return SWITCH_STATUS_GENERR;
|
|
||||||
}
|
|
||||||
|
|
||||||
static switch_status_t channel_write_frame(switch_core_session_t *session, switch_frame_t *frame, switch_io_flag_t flags, int stream_id)
|
|
||||||
{
|
|
||||||
ftdm_wait_flag_t wflags = FTDM_WRITE;
|
|
||||||
ctdm_private_t *tech_pvt;
|
|
||||||
const char *name;
|
|
||||||
switch_channel_t *channel;
|
|
||||||
uint32_t span_id, chan_id;
|
|
||||||
ftdm_size_t len;
|
|
||||||
unsigned char data[SWITCH_RECOMMENDED_BUFFER_SIZE] = {0};
|
|
||||||
|
|
||||||
channel = switch_core_session_get_channel(session);
|
|
||||||
assert(channel != NULL);
|
|
||||||
|
|
||||||
tech_pvt = switch_core_session_get_private(session);
|
|
||||||
assert(tech_pvt != NULL);
|
|
||||||
|
|
||||||
span_id = ftdm_channel_get_span_id(tech_pvt->ftdm_channel);
|
|
||||||
chan_id = ftdm_channel_get_id(tech_pvt->ftdm_channel);
|
|
||||||
|
|
||||||
name = switch_channel_get_name(channel);
|
|
||||||
|
|
||||||
if (switch_test_flag(frame, SFF_CNG)) {
|
|
||||||
frame->data = data;
|
|
||||||
frame->buflen = sizeof(data);
|
|
||||||
if ((frame->datalen = tech_pvt->write_codec.implementation->encoded_bytes_per_packet) > frame->buflen) {
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
memset(data, 255, frame->datalen);
|
|
||||||
}
|
|
||||||
|
|
||||||
wflags = FTDM_WRITE;
|
|
||||||
ftdm_channel_wait(tech_pvt->ftdm_channel, &wflags, ftdm_channel_get_io_interval(tech_pvt->ftdm_channel) * 10);
|
|
||||||
|
|
||||||
if (!(wflags & FTDM_WRITE)) {
|
|
||||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Dropping frame! (write not ready) in channel %s device %d:%d!\n", name, span_id, chan_id);
|
|
||||||
return SWITCH_STATUS_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
len = frame->datalen;
|
|
||||||
if (ftdm_channel_write(tech_pvt->ftdm_channel, frame->data, frame->buflen, &len) != FTDM_SUCCESS) {
|
|
||||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Failed to write to channel %s device %d:%d!\n", name, span_id, chan_id);
|
|
||||||
}
|
|
||||||
|
|
||||||
return SWITCH_STATUS_SUCCESS;
|
|
||||||
|
|
||||||
fail:
|
|
||||||
return SWITCH_STATUS_GENERR;
|
|
||||||
}
|
|
||||||
|
|
||||||
static switch_status_t channel_send_dtmf(switch_core_session_t *session, const switch_dtmf_t *dtmf)
|
|
||||||
{
|
|
||||||
ctdm_private_t *tech_pvt = NULL;
|
|
||||||
char tmp[2] = "";
|
|
||||||
|
|
||||||
tech_pvt = switch_core_session_get_private(session);
|
|
||||||
assert(tech_pvt != NULL);
|
|
||||||
|
|
||||||
tmp[0] = dtmf->digit;
|
|
||||||
ftdm_channel_command(tech_pvt->ftdm_channel, FTDM_COMMAND_SEND_DTMF, tmp);
|
|
||||||
|
|
||||||
return SWITCH_STATUS_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
static switch_status_t channel_receive_message(switch_core_session_t *session, switch_core_session_message_t *msg)
|
|
||||||
{
|
|
||||||
return SWITCH_STATUS_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
static switch_status_t channel_receive_event(switch_core_session_t *session, switch_event_t *event)
|
|
||||||
{
|
|
||||||
const char *command = switch_event_get_header(event, "command");
|
|
||||||
ctdm_private_t *tech_pvt = switch_core_session_get_private(session);
|
|
||||||
|
|
||||||
if (!zstr(command)) {
|
|
||||||
|
|
||||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "FreeTDM received %s command \n",command);
|
|
||||||
|
|
||||||
if (!strcasecmp(command, kPREBUFFER_LEN)) {
|
|
||||||
const char *szval = switch_event_get_header(event, kPREBUFFER_LEN);
|
|
||||||
int val = !zstr(szval) ? atoi(szval) : 0;
|
|
||||||
|
|
||||||
if (tech_pvt->prebuffer_len == val) {
|
|
||||||
tech_pvt->prebuffer_len = val;
|
|
||||||
if (FTDM_SUCCESS != ftdm_channel_command(tech_pvt->ftdm_channel, FTDM_COMMAND_SET_PRE_BUFFER_SIZE, &tech_pvt->prebuffer_len)) {
|
|
||||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Failed to set channel pre buffer size.\n");
|
|
||||||
return SWITCH_STATUS_GENERR;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (!strcasecmp(command, kECHOCANCEL)) {
|
|
||||||
const char *szval = switch_event_get_header(event, kECHOCANCEL);
|
|
||||||
int enabled = !!switch_true(szval);
|
|
||||||
|
|
||||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "FreeTDM sending echo cancel [%s] command \n",enabled ? "enable" : "disable");
|
|
||||||
|
|
||||||
if (FTDM_SUCCESS != ftdm_channel_command(tech_pvt->ftdm_channel, enabled ? FTDM_COMMAND_ENABLE_ECHOCANCEL : FTDM_COMMAND_DISABLE_ECHOCANCEL, NULL)) {
|
|
||||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Failed to %s echo cancellation.\n", enabled ? "enable" : "disable");
|
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
|
||||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "FreeTDM received unknown command [%s] \n",command);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return SWITCH_STATUS_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,499 +0,0 @@
|
||||||
<?xml version="1.0" encoding="Windows-1252"?>
|
|
||||||
<VisualStudioProject
|
|
||||||
ProjectType="Visual C++"
|
|
||||||
Version="9.00"
|
|
||||||
Name="freetdm"
|
|
||||||
ProjectGUID="{93B8812C-3EC4-4F78-8970-FFBFC99E167D}"
|
|
||||||
RootNamespace="freetdm"
|
|
||||||
Keyword="Win32Proj"
|
|
||||||
TargetFrameworkVersion="131072"
|
|
||||||
>
|
|
||||||
<Platforms>
|
|
||||||
<Platform
|
|
||||||
Name="Win32"
|
|
||||||
/>
|
|
||||||
<Platform
|
|
||||||
Name="x64"
|
|
||||||
/>
|
|
||||||
</Platforms>
|
|
||||||
<ToolFiles>
|
|
||||||
</ToolFiles>
|
|
||||||
<Configurations>
|
|
||||||
<Configuration
|
|
||||||
Name="Debug|Win32"
|
|
||||||
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
|
|
||||||
IntermediateDirectory="$(ConfigurationName)"
|
|
||||||
ConfigurationType="2"
|
|
||||||
CharacterSet="2"
|
|
||||||
BuildLogFile="$(IntDir)\BuildLog-freetdm.htm"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
Optimization="0"
|
|
||||||
AdditionalIncludeDirectories="../src/include;../src/include/private;../src/isdn/include"
|
|
||||||
PreprocessorDefinitions="WIN32;_DEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;FREETDM_EXPORTS;TELETONE_EXPORTS;_WIN32_WINNT=0x0501"
|
|
||||||
MinimalRebuild="true"
|
|
||||||
BasicRuntimeChecks="3"
|
|
||||||
RuntimeLibrary="3"
|
|
||||||
DisableLanguageExtensions="false"
|
|
||||||
RuntimeTypeInfo="false"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
WarningLevel="4"
|
|
||||||
WarnAsError="true"
|
|
||||||
Detect64BitPortabilityProblems="false"
|
|
||||||
DebugInformationFormat="3"
|
|
||||||
CompileAs="1"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
GenerateDebugInformation="true"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCALinkTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManifestTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXDCMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCBscMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCFxCopTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAppVerifierTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
/>
|
|
||||||
</Configuration>
|
|
||||||
<Configuration
|
|
||||||
Name="Debug|x64"
|
|
||||||
OutputDirectory="$(SolutionDir)$(PlatformName)\$(ConfigurationName)"
|
|
||||||
IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
|
|
||||||
ConfigurationType="2"
|
|
||||||
CharacterSet="2"
|
|
||||||
BuildLogFile="$(IntDir)\BuildLog-freetdm.htm"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"
|
|
||||||
TargetEnvironment="3"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
Optimization="0"
|
|
||||||
AdditionalIncludeDirectories="../src/include;../src/include/private;../src/isdn/include"
|
|
||||||
PreprocessorDefinitions="WIN32;_DEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;FREETDM_EXPORTS;TELETONE_EXPORTS;_WIN32_WINNT=0x0501"
|
|
||||||
MinimalRebuild="true"
|
|
||||||
BasicRuntimeChecks="3"
|
|
||||||
RuntimeLibrary="3"
|
|
||||||
DisableLanguageExtensions="false"
|
|
||||||
RuntimeTypeInfo="false"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
WarningLevel="4"
|
|
||||||
WarnAsError="true"
|
|
||||||
Detect64BitPortabilityProblems="false"
|
|
||||||
DebugInformationFormat="3"
|
|
||||||
CompileAs="1"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
GenerateDebugInformation="true"
|
|
||||||
TargetMachine="17"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCALinkTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManifestTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXDCMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCBscMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCFxCopTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAppVerifierTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
/>
|
|
||||||
</Configuration>
|
|
||||||
<Configuration
|
|
||||||
Name="Release|Win32"
|
|
||||||
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
|
|
||||||
IntermediateDirectory="$(ConfigurationName)"
|
|
||||||
ConfigurationType="2"
|
|
||||||
CharacterSet="2"
|
|
||||||
WholeProgramOptimization="1"
|
|
||||||
BuildLogFile="$(IntDir)\BuildLog-freetdm.htm"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories="../src/include;../src/include/private;../src/isdn/include"
|
|
||||||
PreprocessorDefinitions="WIN32;NDEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;FREETDM_EXPORTS;TELETONE_EXPORTS;_WIN32_WINNT=0x0501"
|
|
||||||
RuntimeLibrary="2"
|
|
||||||
DisableLanguageExtensions="false"
|
|
||||||
RuntimeTypeInfo="false"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
WarningLevel="4"
|
|
||||||
WarnAsError="true"
|
|
||||||
Detect64BitPortabilityProblems="false"
|
|
||||||
DebugInformationFormat="3"
|
|
||||||
CompileAs="1"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCALinkTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManifestTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXDCMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCBscMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCFxCopTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAppVerifierTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
/>
|
|
||||||
</Configuration>
|
|
||||||
<Configuration
|
|
||||||
Name="Release|x64"
|
|
||||||
OutputDirectory="$(SolutionDir)$(PlatformName)\$(ConfigurationName)"
|
|
||||||
IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
|
|
||||||
ConfigurationType="2"
|
|
||||||
CharacterSet="2"
|
|
||||||
WholeProgramOptimization="1"
|
|
||||||
BuildLogFile="$(IntDir)\BuildLog-freetdm.htm"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"
|
|
||||||
TargetEnvironment="3"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories="../src/include;../src/include/private;../src/isdn/include"
|
|
||||||
PreprocessorDefinitions="WIN32;NDEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;FREETDM_EXPORTS;TELETONE_EXPORTS;_WIN32_WINNT=0x0501"
|
|
||||||
RuntimeLibrary="2"
|
|
||||||
DisableLanguageExtensions="false"
|
|
||||||
RuntimeTypeInfo="false"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
WarningLevel="4"
|
|
||||||
WarnAsError="true"
|
|
||||||
Detect64BitPortabilityProblems="false"
|
|
||||||
DebugInformationFormat="3"
|
|
||||||
CompileAs="1"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
TargetMachine="17"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCALinkTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManifestTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXDCMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCBscMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCFxCopTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAppVerifierTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
/>
|
|
||||||
</Configuration>
|
|
||||||
</Configurations>
|
|
||||||
<References>
|
|
||||||
</References>
|
|
||||||
<Files>
|
|
||||||
<Filter
|
|
||||||
Name="Header Files"
|
|
||||||
Filter="h;hpp;hxx;hm;inl;inc;xsd"
|
|
||||||
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
|
|
||||||
>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\include\freetdm.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\include\private\fsk.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\include\private\ftdm_buffer.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\include\private\ftdm_call_utils.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\include\private\ftdm_config.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\include\private\ftdm_core.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\include\ftdm_declare.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\include\private\ftdm_dso.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\include\ftdm_os.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\include\private\ftdm_sched.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\include\private\ftdm_state.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\include\ftdm_threadmutex.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\include\private\ftdm_types.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\include\private\g711.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\include\private\hashtable.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\include\private\hashtable_itr.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\include\private\hashtable_private.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\include\private\libteletone.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\include\private\libteletone_detect.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\include\private\libteletone_generate.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\include\private\uart.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
</Filter>
|
|
||||||
<Filter
|
|
||||||
Name="Source Files"
|
|
||||||
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
|
|
||||||
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
|
|
||||||
>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\fsk.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\ftdm_buffer.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\ftdm_call_utils.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\ftdm_variables.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\ftdm_callerid.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\ftdm_config.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\ftdm_cpu_monitor.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\ftdm_dso.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\ftdm_io.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\ftdm_queue.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\ftdm_sched.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\ftdm_state.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\ftdm_threadmutex.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\g711.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\hashtable.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\hashtable_itr.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\libteletone_detect.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\libteletone_generate.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\uart.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
</Filter>
|
|
||||||
</Files>
|
|
||||||
<Globals>
|
|
||||||
</Globals>
|
|
||||||
</VisualStudioProject>
|
|
|
@ -1,137 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<ItemGroup>
|
|
||||||
<Filter Include="Header Files">
|
|
||||||
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
|
|
||||||
<Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
|
|
||||||
</Filter>
|
|
||||||
<Filter Include="Source Files">
|
|
||||||
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
|
|
||||||
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
|
|
||||||
</Filter>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ClInclude Include="..\src\include\freetdm.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="..\src\include\private\fsk.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="..\src\include\private\ftdm_buffer.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="..\src\include\private\ftdm_call_utils.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="..\src\include\private\ftdm_config.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="..\src\include\private\ftdm_core.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="..\src\include\ftdm_declare.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="..\src\include\private\ftdm_dso.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="..\src\include\ftdm_os.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="..\src\include\private\ftdm_sched.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="..\src\include\ftdm_threadmutex.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="..\src\include\private\ftdm_types.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="..\src\include\private\g711.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="..\src\include\private\hashtable.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="..\src\include\private\hashtable_itr.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="..\src\include\private\hashtable_private.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="..\src\include\private\libteletone.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="..\src\include\private\libteletone_detect.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="..\src\include\private\libteletone_generate.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="..\src\include\private\uart.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="..\src\include\private\ftdm_state.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ClCompile Include="..\src\fsk.c">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="..\src\ftdm_buffer.c">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="..\src\ftdm_call_utils.c">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="..\src\ftdm_variables.c">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="..\src\ftdm_callerid.c">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="..\src\ftdm_config.c">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="..\src\ftdm_cpu_monitor.c">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="..\src\ftdm_dso.c">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="..\src\ftdm_io.c">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="..\src\ftdm_queue.c">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="..\src\ftdm_sched.c">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="..\src\ftdm_threadmutex.c">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="..\src\g711.c">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="..\src\hashtable.c">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="..\src\hashtable_itr.c">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="..\src\libteletone_detect.c">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="..\src\libteletone_generate.c">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="..\src\uart.c">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="..\src\ftdm_state.c">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
</ItemGroup>
|
|
||||||
</Project>
|
|
|
@ -1,301 +0,0 @@
|
||||||
<?xml version="1.0" encoding="Windows-1252"?>
|
|
||||||
<VisualStudioProject
|
|
||||||
ProjectType="Visual C++"
|
|
||||||
Version="8.00"
|
|
||||||
Name="freetdm"
|
|
||||||
ProjectGUID="{93B8812C-3EC4-4F78-8970-FFBFC99E167D}"
|
|
||||||
RootNamespace="freetdm"
|
|
||||||
Keyword="Win32Proj"
|
|
||||||
>
|
|
||||||
<Platforms>
|
|
||||||
<Platform
|
|
||||||
Name="Win32"
|
|
||||||
/>
|
|
||||||
</Platforms>
|
|
||||||
<ToolFiles>
|
|
||||||
</ToolFiles>
|
|
||||||
<Configurations>
|
|
||||||
<Configuration
|
|
||||||
Name="Debug|Win32"
|
|
||||||
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
|
|
||||||
IntermediateDirectory="$(ConfigurationName)"
|
|
||||||
ConfigurationType="2"
|
|
||||||
CharacterSet="2"
|
|
||||||
BuildLogFile="$(IntDir)\BuildLog-freetdm.htm"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
Optimization="0"
|
|
||||||
AdditionalIncludeDirectories="../src/include;../src/isdn/include"
|
|
||||||
PreprocessorDefinitions="WIN32;_DEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;FREETDM_EXPORTS;TELETONE_EXPORTS"
|
|
||||||
MinimalRebuild="true"
|
|
||||||
BasicRuntimeChecks="3"
|
|
||||||
RuntimeLibrary="3"
|
|
||||||
DisableLanguageExtensions="false"
|
|
||||||
RuntimeTypeInfo="false"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
WarningLevel="4"
|
|
||||||
WarnAsError="true"
|
|
||||||
Detect64BitPortabilityProblems="true"
|
|
||||||
DebugInformationFormat="3"
|
|
||||||
CompileAs="1"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCALinkTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManifestTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXDCMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCBscMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCFxCopTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAppVerifierTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebDeploymentTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
/>
|
|
||||||
</Configuration>
|
|
||||||
<Configuration
|
|
||||||
Name="Release|Win32"
|
|
||||||
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
|
|
||||||
IntermediateDirectory="$(ConfigurationName)"
|
|
||||||
ConfigurationType="2"
|
|
||||||
CharacterSet="2"
|
|
||||||
WholeProgramOptimization="1"
|
|
||||||
BuildLogFile="$(IntDir)\BuildLog-freetdm.htm"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories="../src/include;../src/isdn/include"
|
|
||||||
PreprocessorDefinitions="WIN32;NDEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;FREETDM_EXPORTS;TELETONE_EXPORTS"
|
|
||||||
RuntimeLibrary="2"
|
|
||||||
DisableLanguageExtensions="false"
|
|
||||||
RuntimeTypeInfo="false"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
WarningLevel="4"
|
|
||||||
WarnAsError="true"
|
|
||||||
Detect64BitPortabilityProblems="true"
|
|
||||||
DebugInformationFormat="3"
|
|
||||||
CompileAs="1"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCALinkTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManifestTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXDCMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCBscMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCFxCopTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAppVerifierTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebDeploymentTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
/>
|
|
||||||
</Configuration>
|
|
||||||
</Configurations>
|
|
||||||
<References>
|
|
||||||
</References>
|
|
||||||
<Files>
|
|
||||||
<Filter
|
|
||||||
Name="Source Files"
|
|
||||||
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
|
|
||||||
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
|
|
||||||
>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\fsk.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\g711.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\hashtable.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\hashtable_itr.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\libteletone_detect.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\libteletone_generate.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\uart.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\ftdm_buffer.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\ftdm_callerid.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\ftdm_config.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\ftdm_dso.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\ftdm_io.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\ftdm_threadmutex.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
</Filter>
|
|
||||||
<Filter
|
|
||||||
Name="Header Files"
|
|
||||||
Filter="h;hpp;hxx;hm;inl;inc;xsd"
|
|
||||||
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
|
|
||||||
>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\include\fsk.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\include\g711.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\include\hashtable.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\include\hashtable_itr.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\include\hashtable_private.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\include\libteletone.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\include\libteletone_detect.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\include\libteletone_generate.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\include\freetdm.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\include\uart.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\include\ftdm_buffer.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\include\ftdm_config.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\include\ftdm_dso.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\include\ftdm_threadmutex.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\src\include\ftdm_types.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
</Filter>
|
|
||||||
</Files>
|
|
||||||
<Globals>
|
|
||||||
</Globals>
|
|
||||||
</VisualStudioProject>
|
|
|
@ -1,193 +0,0 @@
|
||||||
<?xml version="1.0" encoding="Windows-1252"?>
|
|
||||||
<VisualStudioProject
|
|
||||||
ProjectType="Visual C++"
|
|
||||||
Version="8.00"
|
|
||||||
Name="testanalog"
|
|
||||||
ProjectGUID="{BB833648-BAFF-4BE2-94DB-F8BB043C588C}"
|
|
||||||
RootNamespace="testanalog"
|
|
||||||
Keyword="Win32Proj"
|
|
||||||
>
|
|
||||||
<Platforms>
|
|
||||||
<Platform
|
|
||||||
Name="Win32"
|
|
||||||
/>
|
|
||||||
</Platforms>
|
|
||||||
<ToolFiles>
|
|
||||||
</ToolFiles>
|
|
||||||
<Configurations>
|
|
||||||
<Configuration
|
|
||||||
Name="Debug|Win32"
|
|
||||||
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
|
|
||||||
IntermediateDirectory="$(ConfigurationName)"
|
|
||||||
ConfigurationType="1"
|
|
||||||
CharacterSet="1"
|
|
||||||
BuildLogFile="$(IntDir)\BuildLog-testanalog.htm"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
Optimization="0"
|
|
||||||
AdditionalIncludeDirectories="../../src/include;../../src/isdn/include"
|
|
||||||
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
|
|
||||||
MinimalRebuild="true"
|
|
||||||
BasicRuntimeChecks="3"
|
|
||||||
RuntimeLibrary="3"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
WarningLevel="4"
|
|
||||||
WarnAsError="true"
|
|
||||||
Detect64BitPortabilityProblems="true"
|
|
||||||
DebugInformationFormat="4"
|
|
||||||
DisableSpecificWarnings="4100"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
LinkIncremental="2"
|
|
||||||
GenerateDebugInformation="true"
|
|
||||||
SubSystem="1"
|
|
||||||
TargetMachine="1"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCALinkTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManifestTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXDCMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCBscMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCFxCopTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAppVerifierTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebDeploymentTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
/>
|
|
||||||
</Configuration>
|
|
||||||
<Configuration
|
|
||||||
Name="Release|Win32"
|
|
||||||
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
|
|
||||||
IntermediateDirectory="$(ConfigurationName)"
|
|
||||||
ConfigurationType="1"
|
|
||||||
CharacterSet="1"
|
|
||||||
WholeProgramOptimization="1"
|
|
||||||
BuildLogFile="$(IntDir)\BuildLog-testanalog.htm"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories="../../src/include;../../src/isdn/include"
|
|
||||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
|
|
||||||
RuntimeLibrary="2"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
WarningLevel="4"
|
|
||||||
WarnAsError="true"
|
|
||||||
Detect64BitPortabilityProblems="true"
|
|
||||||
DebugInformationFormat="3"
|
|
||||||
DisableSpecificWarnings="4100"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
LinkIncremental="1"
|
|
||||||
GenerateDebugInformation="true"
|
|
||||||
SubSystem="1"
|
|
||||||
OptimizeReferences="2"
|
|
||||||
EnableCOMDATFolding="2"
|
|
||||||
TargetMachine="1"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCALinkTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManifestTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXDCMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCBscMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCFxCopTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAppVerifierTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebDeploymentTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
/>
|
|
||||||
</Configuration>
|
|
||||||
</Configurations>
|
|
||||||
<References>
|
|
||||||
</References>
|
|
||||||
<Files>
|
|
||||||
<Filter
|
|
||||||
Name="Source Files"
|
|
||||||
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
|
|
||||||
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
|
|
||||||
>
|
|
||||||
<File
|
|
||||||
RelativePath="..\..\src\testanalog.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
</Filter>
|
|
||||||
</Files>
|
|
||||||
<Globals>
|
|
||||||
</Globals>
|
|
||||||
</VisualStudioProject>
|
|
|
@ -1,349 +0,0 @@
|
||||||
<?xml version="1.0" encoding="Windows-1252"?>
|
|
||||||
<VisualStudioProject
|
|
||||||
ProjectType="Visual C++"
|
|
||||||
Version="9.00"
|
|
||||||
Name="testanalog"
|
|
||||||
ProjectGUID="{BB833648-BAFF-4BE2-94DB-F8BB043C588C}"
|
|
||||||
RootNamespace="testanalog"
|
|
||||||
Keyword="Win32Proj"
|
|
||||||
TargetFrameworkVersion="131072"
|
|
||||||
>
|
|
||||||
<Platforms>
|
|
||||||
<Platform
|
|
||||||
Name="Win32"
|
|
||||||
/>
|
|
||||||
<Platform
|
|
||||||
Name="x64"
|
|
||||||
/>
|
|
||||||
</Platforms>
|
|
||||||
<ToolFiles>
|
|
||||||
</ToolFiles>
|
|
||||||
<Configurations>
|
|
||||||
<Configuration
|
|
||||||
Name="Debug|Win32"
|
|
||||||
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
|
|
||||||
IntermediateDirectory="$(ConfigurationName)"
|
|
||||||
ConfigurationType="1"
|
|
||||||
CharacterSet="1"
|
|
||||||
BuildLogFile="$(IntDir)\BuildLog-testanalog.htm"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
Optimization="0"
|
|
||||||
AdditionalIncludeDirectories="../../src/include;../../src/isdn/include"
|
|
||||||
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
|
|
||||||
MinimalRebuild="true"
|
|
||||||
BasicRuntimeChecks="3"
|
|
||||||
RuntimeLibrary="3"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
WarningLevel="4"
|
|
||||||
WarnAsError="true"
|
|
||||||
DebugInformationFormat="4"
|
|
||||||
DisableSpecificWarnings="4100"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
LinkIncremental="2"
|
|
||||||
GenerateDebugInformation="true"
|
|
||||||
SubSystem="1"
|
|
||||||
RandomizedBaseAddress="1"
|
|
||||||
DataExecutionPrevention="0"
|
|
||||||
TargetMachine="1"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCALinkTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManifestTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXDCMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCBscMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCFxCopTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAppVerifierTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
/>
|
|
||||||
</Configuration>
|
|
||||||
<Configuration
|
|
||||||
Name="Release|Win32"
|
|
||||||
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
|
|
||||||
IntermediateDirectory="$(ConfigurationName)"
|
|
||||||
ConfigurationType="1"
|
|
||||||
CharacterSet="1"
|
|
||||||
WholeProgramOptimization="1"
|
|
||||||
BuildLogFile="$(IntDir)\BuildLog-testanalog.htm"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories="../../src/include;../../src/isdn/include"
|
|
||||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
|
|
||||||
RuntimeLibrary="2"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
WarningLevel="4"
|
|
||||||
WarnAsError="true"
|
|
||||||
DebugInformationFormat="3"
|
|
||||||
DisableSpecificWarnings="4100"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
LinkIncremental="1"
|
|
||||||
GenerateDebugInformation="true"
|
|
||||||
SubSystem="1"
|
|
||||||
OptimizeReferences="2"
|
|
||||||
EnableCOMDATFolding="2"
|
|
||||||
RandomizedBaseAddress="1"
|
|
||||||
DataExecutionPrevention="0"
|
|
||||||
TargetMachine="1"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCALinkTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManifestTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXDCMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCBscMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCFxCopTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAppVerifierTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
/>
|
|
||||||
</Configuration>
|
|
||||||
<Configuration
|
|
||||||
Name="Debug|x64"
|
|
||||||
OutputDirectory="$(SolutionDir)$(PlatformName)\$(ConfigurationName)"
|
|
||||||
IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
|
|
||||||
ConfigurationType="1"
|
|
||||||
CharacterSet="1"
|
|
||||||
BuildLogFile="$(IntDir)\BuildLog-testanalog.htm"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"
|
|
||||||
TargetEnvironment="3"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
Optimization="0"
|
|
||||||
AdditionalIncludeDirectories="../../src/include;../../src/isdn/include"
|
|
||||||
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
|
|
||||||
MinimalRebuild="true"
|
|
||||||
BasicRuntimeChecks="3"
|
|
||||||
RuntimeLibrary="3"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
WarningLevel="4"
|
|
||||||
WarnAsError="true"
|
|
||||||
DebugInformationFormat="3"
|
|
||||||
DisableSpecificWarnings="4100"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
LinkIncremental="2"
|
|
||||||
GenerateDebugInformation="true"
|
|
||||||
SubSystem="1"
|
|
||||||
RandomizedBaseAddress="1"
|
|
||||||
DataExecutionPrevention="0"
|
|
||||||
TargetMachine="17"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCALinkTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManifestTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXDCMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCBscMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCFxCopTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAppVerifierTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
/>
|
|
||||||
</Configuration>
|
|
||||||
<Configuration
|
|
||||||
Name="Release|x64"
|
|
||||||
OutputDirectory="$(SolutionDir)$(PlatformName)\$(ConfigurationName)"
|
|
||||||
IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
|
|
||||||
ConfigurationType="1"
|
|
||||||
CharacterSet="1"
|
|
||||||
WholeProgramOptimization="1"
|
|
||||||
BuildLogFile="$(IntDir)\BuildLog-testanalog.htm"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"
|
|
||||||
TargetEnvironment="3"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories="../../src/include;../../src/isdn/include"
|
|
||||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
|
|
||||||
RuntimeLibrary="2"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
WarningLevel="4"
|
|
||||||
WarnAsError="true"
|
|
||||||
DebugInformationFormat="3"
|
|
||||||
DisableSpecificWarnings="4100"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
LinkIncremental="1"
|
|
||||||
GenerateDebugInformation="true"
|
|
||||||
SubSystem="1"
|
|
||||||
OptimizeReferences="2"
|
|
||||||
EnableCOMDATFolding="2"
|
|
||||||
RandomizedBaseAddress="1"
|
|
||||||
DataExecutionPrevention="0"
|
|
||||||
TargetMachine="17"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCALinkTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManifestTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXDCMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCBscMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCFxCopTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAppVerifierTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
/>
|
|
||||||
</Configuration>
|
|
||||||
</Configurations>
|
|
||||||
<References>
|
|
||||||
</References>
|
|
||||||
<Files>
|
|
||||||
<Filter
|
|
||||||
Name="Source Files"
|
|
||||||
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
|
|
||||||
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
|
|
||||||
>
|
|
||||||
<File
|
|
||||||
RelativePath="..\..\src\testanalog.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
</Filter>
|
|
||||||
</Files>
|
|
||||||
<Globals>
|
|
||||||
</Globals>
|
|
||||||
</VisualStudioProject>
|
|
|
@ -1,14 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<ItemGroup>
|
|
||||||
<Filter Include="Source Files">
|
|
||||||
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
|
|
||||||
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
|
|
||||||
</Filter>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ClCompile Include="..\..\src\testanalog.c">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
</ItemGroup>
|
|
||||||
</Project>
|
|
|
@ -1,354 +0,0 @@
|
||||||
<?xml version="1.0" encoding="Windows-1252"?>
|
|
||||||
<VisualStudioProject
|
|
||||||
ProjectType="Visual C++"
|
|
||||||
Version="9.00"
|
|
||||||
Name="testboost"
|
|
||||||
ProjectGUID="{2B1BAF36-0241-43E7-B865-A8338AD48E2E}"
|
|
||||||
RootNamespace="testboost"
|
|
||||||
Keyword="Win32Proj"
|
|
||||||
TargetFrameworkVersion="131072"
|
|
||||||
>
|
|
||||||
<Platforms>
|
|
||||||
<Platform
|
|
||||||
Name="Win32"
|
|
||||||
/>
|
|
||||||
<Platform
|
|
||||||
Name="x64"
|
|
||||||
/>
|
|
||||||
</Platforms>
|
|
||||||
<ToolFiles>
|
|
||||||
</ToolFiles>
|
|
||||||
<Configurations>
|
|
||||||
<Configuration
|
|
||||||
Name="Debug|Win32"
|
|
||||||
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
|
|
||||||
IntermediateDirectory="testboost\$(ConfigurationName)"
|
|
||||||
ConfigurationType="1"
|
|
||||||
CharacterSet="1"
|
|
||||||
BuildLogFile="$(IntDir)\BuildLog-testboost.htm"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
Optimization="0"
|
|
||||||
AdditionalIncludeDirectories="../../src/include"
|
|
||||||
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
|
|
||||||
MinimalRebuild="true"
|
|
||||||
BasicRuntimeChecks="3"
|
|
||||||
RuntimeLibrary="3"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
WarningLevel="4"
|
|
||||||
WarnAsError="true"
|
|
||||||
DebugInformationFormat="4"
|
|
||||||
DisableSpecificWarnings="4100"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
AdditionalDependencies="..\..\debug\freetdm.lib"
|
|
||||||
LinkIncremental="2"
|
|
||||||
GenerateDebugInformation="true"
|
|
||||||
SubSystem="1"
|
|
||||||
RandomizedBaseAddress="1"
|
|
||||||
DataExecutionPrevention="0"
|
|
||||||
TargetMachine="1"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCALinkTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManifestTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXDCMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCBscMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCFxCopTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAppVerifierTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
/>
|
|
||||||
</Configuration>
|
|
||||||
<Configuration
|
|
||||||
Name="Debug|x64"
|
|
||||||
OutputDirectory="$(SolutionDir)$(PlatformName)\$(ConfigurationName)"
|
|
||||||
IntermediateDirectory="$(PlatformName)\testboost\$(ConfigurationName)"
|
|
||||||
ConfigurationType="1"
|
|
||||||
CharacterSet="1"
|
|
||||||
BuildLogFile="$(IntDir)\BuildLog-testboost.htm"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"
|
|
||||||
TargetEnvironment="3"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
Optimization="0"
|
|
||||||
AdditionalIncludeDirectories="../../src/include"
|
|
||||||
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
|
|
||||||
MinimalRebuild="true"
|
|
||||||
BasicRuntimeChecks="3"
|
|
||||||
RuntimeLibrary="3"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
WarningLevel="4"
|
|
||||||
WarnAsError="true"
|
|
||||||
DebugInformationFormat="3"
|
|
||||||
DisableSpecificWarnings="4100"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
AdditionalDependencies="freetdm.lib"
|
|
||||||
LinkIncremental="2"
|
|
||||||
AdditionalLibraryDirectories=""$(OutDir)";"C:\Program Files\Sangoma\api\lib\x64""
|
|
||||||
GenerateDebugInformation="true"
|
|
||||||
SubSystem="1"
|
|
||||||
RandomizedBaseAddress="1"
|
|
||||||
DataExecutionPrevention="0"
|
|
||||||
TargetMachine="17"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCALinkTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManifestTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXDCMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCBscMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCFxCopTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAppVerifierTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
/>
|
|
||||||
</Configuration>
|
|
||||||
<Configuration
|
|
||||||
Name="Release|Win32"
|
|
||||||
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
|
|
||||||
IntermediateDirectory="testboost\$(ConfigurationName)"
|
|
||||||
ConfigurationType="1"
|
|
||||||
CharacterSet="1"
|
|
||||||
WholeProgramOptimization="1"
|
|
||||||
BuildLogFile="$(IntDir)\BuildLog-testboost.htm"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories="../../src/include"
|
|
||||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
|
|
||||||
RuntimeLibrary="2"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
WarningLevel="4"
|
|
||||||
WarnAsError="true"
|
|
||||||
DebugInformationFormat="3"
|
|
||||||
DisableSpecificWarnings="4100"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
LinkIncremental="1"
|
|
||||||
GenerateDebugInformation="true"
|
|
||||||
SubSystem="1"
|
|
||||||
OptimizeReferences="2"
|
|
||||||
EnableCOMDATFolding="2"
|
|
||||||
RandomizedBaseAddress="1"
|
|
||||||
DataExecutionPrevention="0"
|
|
||||||
TargetMachine="1"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCALinkTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManifestTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXDCMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCBscMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCFxCopTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAppVerifierTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
/>
|
|
||||||
</Configuration>
|
|
||||||
<Configuration
|
|
||||||
Name="Release|x64"
|
|
||||||
OutputDirectory="$(SolutionDir)$(PlatformName)\$(ConfigurationName)"
|
|
||||||
IntermediateDirectory="$(PlatformName)\testboost\$(ConfigurationName)"
|
|
||||||
ConfigurationType="1"
|
|
||||||
CharacterSet="1"
|
|
||||||
WholeProgramOptimization="1"
|
|
||||||
BuildLogFile="$(IntDir)\BuildLog-testboost.htm"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"
|
|
||||||
TargetEnvironment="3"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories="../../src/include"
|
|
||||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
|
|
||||||
RuntimeLibrary="2"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
WarningLevel="4"
|
|
||||||
WarnAsError="true"
|
|
||||||
DebugInformationFormat="3"
|
|
||||||
DisableSpecificWarnings="4100"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
AdditionalDependencies="freetdm.lib"
|
|
||||||
LinkIncremental="1"
|
|
||||||
AdditionalLibraryDirectories=""$(OutDir)";"C:\Program Files\Sangoma\api\lib\x64""
|
|
||||||
GenerateDebugInformation="true"
|
|
||||||
SubSystem="1"
|
|
||||||
OptimizeReferences="2"
|
|
||||||
EnableCOMDATFolding="2"
|
|
||||||
RandomizedBaseAddress="1"
|
|
||||||
DataExecutionPrevention="0"
|
|
||||||
TargetMachine="17"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCALinkTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManifestTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXDCMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCBscMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCFxCopTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAppVerifierTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
/>
|
|
||||||
</Configuration>
|
|
||||||
</Configurations>
|
|
||||||
<References>
|
|
||||||
</References>
|
|
||||||
<Files>
|
|
||||||
<Filter
|
|
||||||
Name="Source Files"
|
|
||||||
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
|
|
||||||
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
|
|
||||||
>
|
|
||||||
<File
|
|
||||||
RelativePath="..\..\src\testboost.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
</Filter>
|
|
||||||
</Files>
|
|
||||||
<Globals>
|
|
||||||
</Globals>
|
|
||||||
</VisualStudioProject>
|
|
|
@ -1,14 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<ItemGroup>
|
|
||||||
<Filter Include="Source Files">
|
|
||||||
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
|
|
||||||
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
|
|
||||||
</Filter>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ClCompile Include="..\..\src\testboost.c">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
</ItemGroup>
|
|
||||||
</Project>
|
|
|
@ -1,354 +0,0 @@
|
||||||
<?xml version="1.0" encoding="Windows-1252"?>
|
|
||||||
<VisualStudioProject
|
|
||||||
ProjectType="Visual C++"
|
|
||||||
Version="9.00"
|
|
||||||
Name="testsangomaboost"
|
|
||||||
ProjectGUID="{0DA69C18-4FA1-4E8C-89CE-12498637C5BE}"
|
|
||||||
RootNamespace="testsangomaboost"
|
|
||||||
Keyword="Win32Proj"
|
|
||||||
TargetFrameworkVersion="131072"
|
|
||||||
>
|
|
||||||
<Platforms>
|
|
||||||
<Platform
|
|
||||||
Name="Win32"
|
|
||||||
/>
|
|
||||||
<Platform
|
|
||||||
Name="x64"
|
|
||||||
/>
|
|
||||||
</Platforms>
|
|
||||||
<ToolFiles>
|
|
||||||
</ToolFiles>
|
|
||||||
<Configurations>
|
|
||||||
<Configuration
|
|
||||||
Name="Debug|Win32"
|
|
||||||
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
|
|
||||||
IntermediateDirectory="$(ConfigurationName)"
|
|
||||||
ConfigurationType="1"
|
|
||||||
CharacterSet="1"
|
|
||||||
BuildLogFile="$(IntDir)\BuildLog-testsangomaboost.htm"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
Optimization="0"
|
|
||||||
AdditionalIncludeDirectories="../../src/include"
|
|
||||||
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
|
|
||||||
MinimalRebuild="true"
|
|
||||||
BasicRuntimeChecks="3"
|
|
||||||
RuntimeLibrary="3"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
WarningLevel="4"
|
|
||||||
WarnAsError="true"
|
|
||||||
DebugInformationFormat="4"
|
|
||||||
DisableSpecificWarnings="4100"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
AdditionalDependencies="..\..\debug\freetdm.lib"
|
|
||||||
LinkIncremental="2"
|
|
||||||
GenerateDebugInformation="true"
|
|
||||||
SubSystem="1"
|
|
||||||
RandomizedBaseAddress="1"
|
|
||||||
DataExecutionPrevention="0"
|
|
||||||
TargetMachine="1"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCALinkTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManifestTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXDCMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCBscMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCFxCopTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAppVerifierTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
/>
|
|
||||||
</Configuration>
|
|
||||||
<Configuration
|
|
||||||
Name="Debug|x64"
|
|
||||||
OutputDirectory="$(SolutionDir)$(PlatformName)\$(ConfigurationName)"
|
|
||||||
IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
|
|
||||||
ConfigurationType="1"
|
|
||||||
CharacterSet="1"
|
|
||||||
BuildLogFile="$(IntDir)\BuildLog-testsangomaboost.htm"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"
|
|
||||||
TargetEnvironment="3"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
Optimization="0"
|
|
||||||
AdditionalIncludeDirectories="../../src/include"
|
|
||||||
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
|
|
||||||
MinimalRebuild="true"
|
|
||||||
BasicRuntimeChecks="3"
|
|
||||||
RuntimeLibrary="3"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
WarningLevel="4"
|
|
||||||
WarnAsError="false"
|
|
||||||
DebugInformationFormat="3"
|
|
||||||
DisableSpecificWarnings="4100"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
AdditionalDependencies="freetdm.lib"
|
|
||||||
LinkIncremental="2"
|
|
||||||
AdditionalLibraryDirectories=""$(OutDir)";"C:\Program Files\Sangoma\api\lib\x64""
|
|
||||||
GenerateDebugInformation="true"
|
|
||||||
SubSystem="1"
|
|
||||||
RandomizedBaseAddress="1"
|
|
||||||
DataExecutionPrevention="0"
|
|
||||||
TargetMachine="17"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCALinkTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManifestTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXDCMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCBscMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCFxCopTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAppVerifierTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
/>
|
|
||||||
</Configuration>
|
|
||||||
<Configuration
|
|
||||||
Name="Release|Win32"
|
|
||||||
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
|
|
||||||
IntermediateDirectory="$(ConfigurationName)"
|
|
||||||
ConfigurationType="1"
|
|
||||||
CharacterSet="1"
|
|
||||||
WholeProgramOptimization="1"
|
|
||||||
BuildLogFile="$(IntDir)\BuildLog-testsangomaboost.htm"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories="../../src/include"
|
|
||||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
|
|
||||||
RuntimeLibrary="2"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
WarningLevel="4"
|
|
||||||
WarnAsError="true"
|
|
||||||
DebugInformationFormat="3"
|
|
||||||
DisableSpecificWarnings="4100"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
LinkIncremental="1"
|
|
||||||
GenerateDebugInformation="true"
|
|
||||||
SubSystem="1"
|
|
||||||
OptimizeReferences="2"
|
|
||||||
EnableCOMDATFolding="2"
|
|
||||||
RandomizedBaseAddress="1"
|
|
||||||
DataExecutionPrevention="0"
|
|
||||||
TargetMachine="1"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCALinkTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManifestTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXDCMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCBscMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCFxCopTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAppVerifierTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
/>
|
|
||||||
</Configuration>
|
|
||||||
<Configuration
|
|
||||||
Name="Release|x64"
|
|
||||||
OutputDirectory="$(SolutionDir)$(PlatformName)\$(ConfigurationName)"
|
|
||||||
IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
|
|
||||||
ConfigurationType="1"
|
|
||||||
CharacterSet="1"
|
|
||||||
WholeProgramOptimization="1"
|
|
||||||
BuildLogFile="$(IntDir)\BuildLog-testsangomaboost.htm"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"
|
|
||||||
TargetEnvironment="3"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories="../../src/include"
|
|
||||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
|
|
||||||
RuntimeLibrary="2"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
WarningLevel="4"
|
|
||||||
WarnAsError="false"
|
|
||||||
DebugInformationFormat="3"
|
|
||||||
DisableSpecificWarnings="4100"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
AdditionalDependencies="freetdm.lib"
|
|
||||||
LinkIncremental="1"
|
|
||||||
AdditionalLibraryDirectories=""$(OutDir)";"C:\Program Files\Sangoma\api\lib\x64""
|
|
||||||
GenerateDebugInformation="true"
|
|
||||||
SubSystem="1"
|
|
||||||
OptimizeReferences="2"
|
|
||||||
EnableCOMDATFolding="2"
|
|
||||||
RandomizedBaseAddress="1"
|
|
||||||
DataExecutionPrevention="0"
|
|
||||||
TargetMachine="17"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCALinkTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManifestTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXDCMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCBscMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCFxCopTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAppVerifierTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
/>
|
|
||||||
</Configuration>
|
|
||||||
</Configurations>
|
|
||||||
<References>
|
|
||||||
</References>
|
|
||||||
<Files>
|
|
||||||
<Filter
|
|
||||||
Name="Source Files"
|
|
||||||
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
|
|
||||||
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
|
|
||||||
>
|
|
||||||
<File
|
|
||||||
RelativePath="..\..\src\testsangomaboost.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
</Filter>
|
|
||||||
</Files>
|
|
||||||
<Globals>
|
|
||||||
</Globals>
|
|
||||||
</VisualStudioProject>
|
|
|
@ -1,14 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<ItemGroup>
|
|
||||||
<Filter Include="Source Files">
|
|
||||||
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
|
|
||||||
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
|
|
||||||
</Filter>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ClCompile Include="..\..\src\testsangomaboost.c">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
</ItemGroup>
|
|
||||||
</Project>
|
|
|
@ -1,193 +0,0 @@
|
||||||
<?xml version="1.0" encoding="Windows-1252"?>
|
|
||||||
<VisualStudioProject
|
|
||||||
ProjectType="Visual C++"
|
|
||||||
Version="8.00"
|
|
||||||
Name="testisdn"
|
|
||||||
ProjectGUID="{6DA6FD42-641D-4147-92F5-3BC4AAA6589B}"
|
|
||||||
RootNamespace="testisdn"
|
|
||||||
Keyword="Win32Proj"
|
|
||||||
>
|
|
||||||
<Platforms>
|
|
||||||
<Platform
|
|
||||||
Name="Win32"
|
|
||||||
/>
|
|
||||||
</Platforms>
|
|
||||||
<ToolFiles>
|
|
||||||
</ToolFiles>
|
|
||||||
<Configurations>
|
|
||||||
<Configuration
|
|
||||||
Name="Debug|Win32"
|
|
||||||
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
|
|
||||||
IntermediateDirectory="$(ConfigurationName)"
|
|
||||||
ConfigurationType="1"
|
|
||||||
CharacterSet="1"
|
|
||||||
BuildLogFile="$(IntDir)\BuildLog-testisdn.htm"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
Optimization="0"
|
|
||||||
AdditionalIncludeDirectories="../../src/include;../../src/isdn/include"
|
|
||||||
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
|
|
||||||
MinimalRebuild="true"
|
|
||||||
BasicRuntimeChecks="3"
|
|
||||||
RuntimeLibrary="3"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
WarningLevel="4"
|
|
||||||
WarnAsError="true"
|
|
||||||
Detect64BitPortabilityProblems="true"
|
|
||||||
DebugInformationFormat="4"
|
|
||||||
DisableSpecificWarnings="4100"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
LinkIncremental="2"
|
|
||||||
GenerateDebugInformation="true"
|
|
||||||
SubSystem="1"
|
|
||||||
TargetMachine="1"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCALinkTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManifestTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXDCMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCBscMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCFxCopTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAppVerifierTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebDeploymentTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
/>
|
|
||||||
</Configuration>
|
|
||||||
<Configuration
|
|
||||||
Name="Release|Win32"
|
|
||||||
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
|
|
||||||
IntermediateDirectory="$(ConfigurationName)"
|
|
||||||
ConfigurationType="1"
|
|
||||||
CharacterSet="1"
|
|
||||||
WholeProgramOptimization="1"
|
|
||||||
BuildLogFile="$(IntDir)\BuildLog-testisdn.htm"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories="../../src/include;../../src/isdn/include"
|
|
||||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
|
|
||||||
RuntimeLibrary="2"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
WarningLevel="4"
|
|
||||||
WarnAsError="true"
|
|
||||||
Detect64BitPortabilityProblems="true"
|
|
||||||
DebugInformationFormat="3"
|
|
||||||
DisableSpecificWarnings="4100"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
LinkIncremental="1"
|
|
||||||
GenerateDebugInformation="true"
|
|
||||||
SubSystem="1"
|
|
||||||
OptimizeReferences="2"
|
|
||||||
EnableCOMDATFolding="2"
|
|
||||||
TargetMachine="1"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCALinkTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManifestTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXDCMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCBscMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCFxCopTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAppVerifierTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebDeploymentTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
/>
|
|
||||||
</Configuration>
|
|
||||||
</Configurations>
|
|
||||||
<References>
|
|
||||||
</References>
|
|
||||||
<Files>
|
|
||||||
<Filter
|
|
||||||
Name="Source Files"
|
|
||||||
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
|
|
||||||
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
|
|
||||||
>
|
|
||||||
<File
|
|
||||||
RelativePath="..\..\src\testisdn.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
</Filter>
|
|
||||||
</Files>
|
|
||||||
<Globals>
|
|
||||||
</Globals>
|
|
||||||
</VisualStudioProject>
|
|
|
@ -1,349 +0,0 @@
|
||||||
<?xml version="1.0" encoding="Windows-1252"?>
|
|
||||||
<VisualStudioProject
|
|
||||||
ProjectType="Visual C++"
|
|
||||||
Version="9.00"
|
|
||||||
Name="testisdn"
|
|
||||||
ProjectGUID="{6DA6FD42-641D-4147-92F5-3BC4AAA6589B}"
|
|
||||||
RootNamespace="testisdn"
|
|
||||||
Keyword="Win32Proj"
|
|
||||||
TargetFrameworkVersion="131072"
|
|
||||||
>
|
|
||||||
<Platforms>
|
|
||||||
<Platform
|
|
||||||
Name="Win32"
|
|
||||||
/>
|
|
||||||
<Platform
|
|
||||||
Name="x64"
|
|
||||||
/>
|
|
||||||
</Platforms>
|
|
||||||
<ToolFiles>
|
|
||||||
</ToolFiles>
|
|
||||||
<Configurations>
|
|
||||||
<Configuration
|
|
||||||
Name="Debug|Win32"
|
|
||||||
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
|
|
||||||
IntermediateDirectory="$(ConfigurationName)"
|
|
||||||
ConfigurationType="1"
|
|
||||||
CharacterSet="1"
|
|
||||||
BuildLogFile="$(IntDir)\BuildLog-testisdn.htm"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
Optimization="0"
|
|
||||||
AdditionalIncludeDirectories="../../src/include;../../src/isdn/include"
|
|
||||||
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
|
|
||||||
MinimalRebuild="true"
|
|
||||||
BasicRuntimeChecks="3"
|
|
||||||
RuntimeLibrary="3"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
WarningLevel="4"
|
|
||||||
WarnAsError="true"
|
|
||||||
DebugInformationFormat="4"
|
|
||||||
DisableSpecificWarnings="4100"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
LinkIncremental="2"
|
|
||||||
GenerateDebugInformation="true"
|
|
||||||
SubSystem="1"
|
|
||||||
RandomizedBaseAddress="1"
|
|
||||||
DataExecutionPrevention="0"
|
|
||||||
TargetMachine="1"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCALinkTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManifestTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXDCMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCBscMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCFxCopTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAppVerifierTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
/>
|
|
||||||
</Configuration>
|
|
||||||
<Configuration
|
|
||||||
Name="Release|Win32"
|
|
||||||
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
|
|
||||||
IntermediateDirectory="$(ConfigurationName)"
|
|
||||||
ConfigurationType="1"
|
|
||||||
CharacterSet="1"
|
|
||||||
WholeProgramOptimization="1"
|
|
||||||
BuildLogFile="$(IntDir)\BuildLog-testisdn.htm"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories="../../src/include;../../src/isdn/include"
|
|
||||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
|
|
||||||
RuntimeLibrary="2"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
WarningLevel="4"
|
|
||||||
WarnAsError="true"
|
|
||||||
DebugInformationFormat="3"
|
|
||||||
DisableSpecificWarnings="4100"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
LinkIncremental="1"
|
|
||||||
GenerateDebugInformation="true"
|
|
||||||
SubSystem="1"
|
|
||||||
OptimizeReferences="2"
|
|
||||||
EnableCOMDATFolding="2"
|
|
||||||
RandomizedBaseAddress="1"
|
|
||||||
DataExecutionPrevention="0"
|
|
||||||
TargetMachine="1"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCALinkTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManifestTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXDCMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCBscMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCFxCopTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAppVerifierTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
/>
|
|
||||||
</Configuration>
|
|
||||||
<Configuration
|
|
||||||
Name="Debug|x64"
|
|
||||||
OutputDirectory="$(SolutionDir)$(PlatformName)\$(ConfigurationName)"
|
|
||||||
IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
|
|
||||||
ConfigurationType="1"
|
|
||||||
CharacterSet="1"
|
|
||||||
BuildLogFile="$(IntDir)\BuildLog-testisdn.htm"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"
|
|
||||||
TargetEnvironment="3"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
Optimization="0"
|
|
||||||
AdditionalIncludeDirectories="../../src/include;../../src/isdn/include"
|
|
||||||
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
|
|
||||||
MinimalRebuild="true"
|
|
||||||
BasicRuntimeChecks="3"
|
|
||||||
RuntimeLibrary="3"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
WarningLevel="4"
|
|
||||||
WarnAsError="true"
|
|
||||||
DebugInformationFormat="3"
|
|
||||||
DisableSpecificWarnings="4100"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
LinkIncremental="2"
|
|
||||||
GenerateDebugInformation="true"
|
|
||||||
SubSystem="1"
|
|
||||||
RandomizedBaseAddress="1"
|
|
||||||
DataExecutionPrevention="0"
|
|
||||||
TargetMachine="17"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCALinkTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManifestTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXDCMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCBscMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCFxCopTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAppVerifierTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
/>
|
|
||||||
</Configuration>
|
|
||||||
<Configuration
|
|
||||||
Name="Release|x64"
|
|
||||||
OutputDirectory="$(SolutionDir)$(PlatformName)\$(ConfigurationName)"
|
|
||||||
IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
|
|
||||||
ConfigurationType="1"
|
|
||||||
CharacterSet="1"
|
|
||||||
WholeProgramOptimization="1"
|
|
||||||
BuildLogFile="$(IntDir)\BuildLog-testisdn.htm"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"
|
|
||||||
TargetEnvironment="3"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories="../../src/include;../../src/isdn/include"
|
|
||||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
|
|
||||||
RuntimeLibrary="2"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
WarningLevel="4"
|
|
||||||
WarnAsError="true"
|
|
||||||
DebugInformationFormat="3"
|
|
||||||
DisableSpecificWarnings="4100"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
LinkIncremental="1"
|
|
||||||
GenerateDebugInformation="true"
|
|
||||||
SubSystem="1"
|
|
||||||
OptimizeReferences="2"
|
|
||||||
EnableCOMDATFolding="2"
|
|
||||||
RandomizedBaseAddress="1"
|
|
||||||
DataExecutionPrevention="0"
|
|
||||||
TargetMachine="17"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCALinkTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManifestTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXDCMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCBscMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCFxCopTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAppVerifierTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
/>
|
|
||||||
</Configuration>
|
|
||||||
</Configurations>
|
|
||||||
<References>
|
|
||||||
</References>
|
|
||||||
<Files>
|
|
||||||
<Filter
|
|
||||||
Name="Source Files"
|
|
||||||
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
|
|
||||||
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
|
|
||||||
>
|
|
||||||
<File
|
|
||||||
RelativePath="..\..\src\testisdn.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
</Filter>
|
|
||||||
</Files>
|
|
||||||
<Globals>
|
|
||||||
</Globals>
|
|
||||||
</VisualStudioProject>
|
|
|
@ -1,14 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<ItemGroup>
|
|
||||||
<Filter Include="Source Files">
|
|
||||||
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
|
|
||||||
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
|
|
||||||
</Filter>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ClCompile Include="..\..\src\testisdn.c">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
</ItemGroup>
|
|
||||||
</Project>
|
|
|
@ -1,7 +0,0 @@
|
||||||
#
|
|
||||||
# Arnaldo M Pereira <arnaldo@sangoma.com>
|
|
||||||
#
|
|
||||||
CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
|
|
||||||
PROJECT(sample)
|
|
||||||
|
|
||||||
#ADD_SUBDIRECTORY(sched) FIXME: this code doesnt compile
|
|
|
@ -1,12 +0,0 @@
|
||||||
#
|
|
||||||
# Arnaldo M Pereira <arnaldo@sangoma.com>
|
|
||||||
#
|
|
||||||
CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
|
|
||||||
PROJECT(dso)
|
|
||||||
|
|
||||||
IF(NOT DEFINED WIN32)
|
|
||||||
INCLUDE_DIRECTORIES(/usr/local/freeswitch/include)
|
|
||||||
ADD_DEFINITIONS(-Wall)
|
|
||||||
ADD_EXECUTABLE(ftdmload ftdmload.c)
|
|
||||||
TARGET_LINK_LIBRARIES(ftdmload freetdm)
|
|
||||||
ENDIF(NOT DEFINED WIN32)
|
|
|
@ -1,14 +0,0 @@
|
||||||
CC=gcc
|
|
||||||
CFLAGS=-Wall -I/usr/local/freeswitch/include
|
|
||||||
LDFLAGS=-L/usr/local/freeswitch/lib -lfreetdm
|
|
||||||
|
|
||||||
ftdmload: ftdmload.o
|
|
||||||
|
|
||||||
clean:
|
|
||||||
rm -rf ftdmload.o
|
|
||||||
rm -rf ftdmload
|
|
||||||
|
|
||||||
export:
|
|
||||||
export LD_LIBRARY_PATH=/usr/local/freeswitch/lib
|
|
||||||
|
|
||||||
|
|
|
@ -1,168 +0,0 @@
|
||||||
#define _GNU_SOURCE
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <freetdm.h>
|
|
||||||
#include <ftdm_dso.h>
|
|
||||||
#include <dlfcn.h>
|
|
||||||
#include <execinfo.h>
|
|
||||||
|
|
||||||
#define ARRLEN(obj) (sizeof(obj)/sizeof(obj[0]))
|
|
||||||
|
|
||||||
struct dso_entry {
|
|
||||||
char name[25];
|
|
||||||
ftdm_dso_lib_t lib;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct dso_entry loaded[10];
|
|
||||||
|
|
||||||
static void *(*real_dlopen)(const char *filename, int flag) = NULL;
|
|
||||||
static int (*real_dlclose)(void *handle) = NULL;
|
|
||||||
|
|
||||||
static void print_stack()
|
|
||||||
{
|
|
||||||
void *stacktrace[100];
|
|
||||||
char **symbols;
|
|
||||||
int size;
|
|
||||||
int i;
|
|
||||||
size = backtrace(stacktrace, ARRLEN(stacktrace));
|
|
||||||
symbols = backtrace_symbols(stacktrace, size);
|
|
||||||
if (!symbols) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
for (i = 0; i < size; i++) {
|
|
||||||
ftdm_log(FTDM_LOG_DEBUG, "%s\n", symbols[i]);
|
|
||||||
}
|
|
||||||
free(symbols);
|
|
||||||
}
|
|
||||||
|
|
||||||
void *dlopen(const char *filename, int flag)
|
|
||||||
{
|
|
||||||
char *msg = NULL;
|
|
||||||
void *handle = NULL;
|
|
||||||
print_stack();
|
|
||||||
if (real_dlopen == NULL) {
|
|
||||||
dlerror();
|
|
||||||
real_dlopen = dlsym(RTLD_NEXT, "dlopen");
|
|
||||||
if ((msg = dlerror()) != NULL) {
|
|
||||||
fprintf(stderr, "dlsym failed: %s\n", msg);
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
fprintf(stderr, "Real dlopen at addr %p\n", real_dlopen);
|
|
||||||
}
|
|
||||||
handle = real_dlopen(filename, flag);
|
|
||||||
if (!handle) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
ftdm_log(FTDM_LOG_NOTICE, "Loaded %s with handle %p\n", filename, handle);
|
|
||||||
return handle;
|
|
||||||
}
|
|
||||||
|
|
||||||
int dlclose(void *handle)
|
|
||||||
{
|
|
||||||
char *msg = NULL;
|
|
||||||
print_stack();
|
|
||||||
if (real_dlclose == NULL) {
|
|
||||||
dlerror();
|
|
||||||
real_dlclose = dlsym(RTLD_NEXT, "dlclose");
|
|
||||||
if ((msg = dlerror()) != NULL) {
|
|
||||||
fprintf(stderr, "dlsym failed: %s\n", msg);
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
fprintf(stderr, "Real dlclose at addr %p\n", real_dlclose);
|
|
||||||
}
|
|
||||||
ftdm_log(FTDM_LOG_NOTICE, "Unloading %p\n", handle);
|
|
||||||
return real_dlclose(handle);
|
|
||||||
}
|
|
||||||
|
|
||||||
int load(char *name)
|
|
||||||
{
|
|
||||||
char path[255];
|
|
||||||
char *err;
|
|
||||||
struct dso_entry *entry = NULL;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for (i = 0; i < ARRLEN(loaded); i++) {
|
|
||||||
if (!loaded[i].lib) {
|
|
||||||
entry = &loaded[i];
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!entry) {
|
|
||||||
ftdm_log(FTDM_LOG_CRIT, "Cannot load more libraries\n");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
ftdm_build_dso_path(name, path, sizeof(path));
|
|
||||||
ftdm_log(FTDM_LOG_DEBUG, "Loading %s!\n", path);
|
|
||||||
entry->lib = ftdm_dso_open(path, &err);
|
|
||||||
if (!entry->lib) {
|
|
||||||
ftdm_log(FTDM_LOG_CRIT, "Cannot load library '%s': %s\n", path, err);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
strncpy(entry->name, name, sizeof(entry->name)-1);
|
|
||||||
entry->name[sizeof(entry->name)-1] = 0;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int unload(char *name)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
struct dso_entry *entry = NULL;
|
|
||||||
ftdm_log(FTDM_LOG_DEBUG, "Unloading %s!\n", name);
|
|
||||||
for (i = 0; i < ARRLEN(loaded); i++) {
|
|
||||||
if (loaded[i].lib && !strcasecmp(loaded[i].name, name)) {
|
|
||||||
entry = &loaded[i];
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!entry) {
|
|
||||||
ftdm_log(FTDM_LOG_CRIT, "Library %s not found\n", name);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
ftdm_dso_destroy(&entry->lib);
|
|
||||||
entry->lib = NULL;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
|
||||||
{
|
|
||||||
char cmdline[255];
|
|
||||||
char name[255];
|
|
||||||
|
|
||||||
ftdm_global_set_default_logger(FTDM_LOG_LEVEL_DEBUG);
|
|
||||||
|
|
||||||
if (ftdm_global_init() != FTDM_SUCCESS) {
|
|
||||||
fprintf(stderr, "Error loading FreeTDM\n");
|
|
||||||
exit(-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
memset(loaded, 0, sizeof(loaded));
|
|
||||||
|
|
||||||
printf("CLI> ");
|
|
||||||
while (fgets(cmdline, sizeof(cmdline), stdin)) {
|
|
||||||
if (sscanf(cmdline, "load=%s\n", name) == 1) {
|
|
||||||
load(name);
|
|
||||||
} else if (sscanf(cmdline, "unload=%s\n", name) == 1) {
|
|
||||||
unload(name);
|
|
||||||
} else if (!strncasecmp(cmdline, "exit", sizeof("exit")-1)) {
|
|
||||||
printf("Quitting ...\n");
|
|
||||||
sleep(1);
|
|
||||||
break;
|
|
||||||
} else {
|
|
||||||
fprintf(stderr, "load=<name> | unload=<name> | exit\n");
|
|
||||||
}
|
|
||||||
printf("\nCLI> ");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
ftdm_global_destroy();
|
|
||||||
|
|
||||||
printf("Done, press any key to die!\n");
|
|
||||||
|
|
||||||
getchar();
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,12 +0,0 @@
|
||||||
#
|
|
||||||
# Arnaldo M Pereira <arnaldo@sangoma.com>
|
|
||||||
#
|
|
||||||
CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
|
|
||||||
PROJECT(sched)
|
|
||||||
|
|
||||||
IF(NOT DEFINED WIN32)
|
|
||||||
INCLUDE_DIRECTORIES(/usr/local/freeswitch/include)
|
|
||||||
ADD_DEFINITIONS(-Wall)
|
|
||||||
ADD_EXECUTABLE(ftdmsched ftdmsched.c)
|
|
||||||
TARGET_LINK_LIBRARIES(ftdmsched freetdm)
|
|
||||||
ENDIF(NOT DEFINED WIN32)
|
|
|
@ -1,110 +0,0 @@
|
||||||
#define _GNU_SOURCE
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <signal.h>
|
|
||||||
#include "../../src/include/private/ftdm_core.h"
|
|
||||||
|
|
||||||
static int running = 1;
|
|
||||||
|
|
||||||
typedef struct custom_data {
|
|
||||||
ftdm_timer_t *heartbeat_timer;
|
|
||||||
int beat;
|
|
||||||
int counter;
|
|
||||||
ftdm_sched_callback_t callback;
|
|
||||||
ftdm_sched_t *sched;
|
|
||||||
} custom_data_t;
|
|
||||||
|
|
||||||
void trap(int signal)
|
|
||||||
{
|
|
||||||
running = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void handle_heartbeat(void *usrdata)
|
|
||||||
{
|
|
||||||
ftdm_status_t status;
|
|
||||||
custom_data_t *data = usrdata;
|
|
||||||
|
|
||||||
printf("beep (elapsed %dms count= %d)\n", data->beat, data->counter);
|
|
||||||
if (data->beat > 1000) {
|
|
||||||
data->beat -= 1000;
|
|
||||||
} else if (data->beat <= 1000 && data->beat > 200) {
|
|
||||||
data->beat -= 100;
|
|
||||||
} else if (data->beat <= 200 && data->beat > 100) {
|
|
||||||
if (!data->counter--) {
|
|
||||||
data->counter = 5;
|
|
||||||
data->beat -= 100;
|
|
||||||
}
|
|
||||||
} else if (data->beat <= 100 && data->beat > 10) {
|
|
||||||
if (!data->counter--) {
|
|
||||||
data->counter = 10;
|
|
||||||
data->beat -= 10;
|
|
||||||
if (data->beat == 10) {
|
|
||||||
data->counter = 200;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (!data->counter--) {
|
|
||||||
data->counter = 5;
|
|
||||||
data->beat--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!data->beat) {
|
|
||||||
printf("beeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeep you're dead!\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
data->heartbeat_timer = NULL;
|
|
||||||
status = ftdm_sched_timer(data->sched, "heartbeat", data->beat, data->callback, data, &data->heartbeat_timer);
|
|
||||||
if (status != FTDM_SUCCESS) {
|
|
||||||
fprintf(stderr, "Error creating heartbeat timer\n");
|
|
||||||
running = 0;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
|
||||||
{
|
|
||||||
ftdm_status_t status;
|
|
||||||
custom_data_t data;
|
|
||||||
|
|
||||||
ftdm_sched_t *sched;
|
|
||||||
signal(SIGINT, trap);
|
|
||||||
|
|
||||||
ftdm_global_set_default_logger(FTDM_LOG_LEVEL_DEBUG);
|
|
||||||
|
|
||||||
if (ftdm_global_init() != FTDM_SUCCESS) {
|
|
||||||
fprintf(stderr, "Error loading FreeTDM\n");
|
|
||||||
exit(-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
status = ftdm_sched_create(&sched, "testsched");
|
|
||||||
if (status != FTDM_SUCCESS) {
|
|
||||||
fprintf(stderr, "Error creating sched\n");
|
|
||||||
exit(-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
data.sched = sched;
|
|
||||||
data.counter = 10;
|
|
||||||
data.beat = 5000;
|
|
||||||
data.callback = handle_heartbeat;
|
|
||||||
status = ftdm_sched_timer(sched, "heartbeat", data.beat, data.callback, &data, &data.heartbeat_timer);
|
|
||||||
if (status != FTDM_SUCCESS) {
|
|
||||||
fprintf(stderr, "Error creating heartbeat timer\n");
|
|
||||||
exit(-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
ftdm_sched_free_run(sched);
|
|
||||||
|
|
||||||
while (running) {
|
|
||||||
ftdm_sleep(10);
|
|
||||||
}
|
|
||||||
|
|
||||||
ftdm_global_destroy();
|
|
||||||
|
|
||||||
printf("Done, press any key to die!\n");
|
|
||||||
|
|
||||||
getchar();
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,54 +0,0 @@
|
||||||
//#include "freetdm.h"
|
|
||||||
#include "libteletone_detect.h"
|
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
|
||||||
{
|
|
||||||
int fd, b;
|
|
||||||
short sln[512] = {0};
|
|
||||||
teletone_dtmf_detect_state_t dtmf_detect = {0};
|
|
||||||
teletone_hit_type_t hit;
|
|
||||||
|
|
||||||
if (argc < 2) {
|
|
||||||
fprintf(stderr, "Arg Error!\n");
|
|
||||||
exit(-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
teletone_dtmf_detect_init (&dtmf_detect, 8000);
|
|
||||||
|
|
||||||
if ((fd = open(argv[1], O_RDONLY)) < 0) {
|
|
||||||
fprintf(stderr, "File Error! [%s]\n", strerror(errno));
|
|
||||||
exit(-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
while((b = read(fd, sln, 320)) > 0) {
|
|
||||||
char digit_char;
|
|
||||||
unsigned int dur;
|
|
||||||
|
|
||||||
teletone_dtmf_detect(&dtmf_detect, sln, b / 2);
|
|
||||||
if ((hit = teletone_dtmf_get(&dtmf_detect, &digit_char, &dur))) {
|
|
||||||
const char *hs = NULL;
|
|
||||||
|
|
||||||
|
|
||||||
switch(hit) {
|
|
||||||
case TT_HIT_BEGIN:
|
|
||||||
hs = "begin";
|
|
||||||
break;
|
|
||||||
|
|
||||||
case TT_HIT_MIDDLE:
|
|
||||||
hs = "middle";
|
|
||||||
break;
|
|
||||||
|
|
||||||
case TT_HIT_END:
|
|
||||||
hs = "end";
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
printf("%s digit: %c\n", hs, digit_char);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
close(fd);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,32 +0,0 @@
|
||||||
//#include "freetdm.h"
|
|
||||||
#include "libteletone_detect.h"
|
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
|
||||||
{
|
|
||||||
teletone_multi_tone_t mt = {0};
|
|
||||||
teletone_tone_map_t map = {{0}};
|
|
||||||
|
|
||||||
int fd, b;
|
|
||||||
short sln[512] = {0};
|
|
||||||
|
|
||||||
if (argc < 2) {
|
|
||||||
fprintf(stderr, "Arg Error!\n");
|
|
||||||
exit(-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
map.freqs[0] = atof("350");
|
|
||||||
map.freqs[1] = atof("440");
|
|
||||||
teletone_multi_tone_init(&mt, &map);
|
|
||||||
|
|
||||||
if ((fd = open(argv[1], O_RDONLY)) < 0) {
|
|
||||||
fprintf(stderr, "File Error! [%s]\n", strerror(errno));
|
|
||||||
exit(-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
while((b = read(fd, sln, 320)) > 0) {
|
|
||||||
printf("TEST %d %d\n", b, teletone_multi_tone_detect(&mt, sln, b / 2));
|
|
||||||
}
|
|
||||||
close(fd);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,351 +0,0 @@
|
||||||
|
|
||||||
/*
|
|
||||||
* bell202.c
|
|
||||||
*
|
|
||||||
* Copyright (c) 2005 Robert Krten. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
*
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND
|
|
||||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE
|
|
||||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
||||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
||||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
||||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
||||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
||||||
* SUCH DAMAGE.
|
|
||||||
*
|
|
||||||
* This module contains a Bell-202 1200-baud FSK decoder, suitable for
|
|
||||||
* use in a library. The general style of the library calls is modeled
|
|
||||||
* after the POSIX pthread_*() functions.
|
|
||||||
*
|
|
||||||
* 2005 03 20 R. Krten created
|
|
||||||
*/
|
|
||||||
#include <private/ftdm_core.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include <math.h>
|
|
||||||
|
|
||||||
#include "fsk.h"
|
|
||||||
#include "uart.h"
|
|
||||||
|
|
||||||
#ifndef M_PI
|
|
||||||
#define M_PI 3.14159265358979323846
|
|
||||||
#endif
|
|
||||||
|
|
||||||
fsk_modem_definition_t fsk_modem_definitions[] =
|
|
||||||
{
|
|
||||||
{ /* FSK_V23_FORWARD_MODE1 */ 1700, 1300, 600 },
|
|
||||||
{ /* FSK_V23_FORWARD_MODE2 */ 2100, 1300, 1200 },
|
|
||||||
{ /* FSK_V23_BACKWARD */ 450, 390, 75 },
|
|
||||||
{ /* FSK_BELL202 */ 2200, 1200, 1200 },
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
|
||||||
* dsp_fsk_attr_init
|
|
||||||
*
|
|
||||||
* Initializes the attributes structure; this must be done before the
|
|
||||||
* attributes structure is used.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void dsp_fsk_attr_init (dsp_fsk_attr_t *attr)
|
|
||||||
{
|
|
||||||
memset(attr, 0, sizeof(*attr));
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* dsp_fsk_attr_get_bithandler
|
|
||||||
* dsp_fsk_attr_set_bithandler
|
|
||||||
* dsp_fsk_attr_get_bytehandler
|
|
||||||
* dsp_fsk_attr_set_bytehandler
|
|
||||||
* dsp_fsk_attr_getsamplerate
|
|
||||||
* dsp_fsk_attr_setsamplerate
|
|
||||||
*
|
|
||||||
* These functions get and set their respective elements from the
|
|
||||||
* attributes structure. If an error code is returned, it is just
|
|
||||||
* zero == ok, -1 == fail.
|
|
||||||
*/
|
|
||||||
|
|
||||||
bithandler_func_t dsp_fsk_attr_get_bithandler(dsp_fsk_attr_t *attr, void **bithandler_arg)
|
|
||||||
{
|
|
||||||
*bithandler_arg = attr->bithandler_arg;
|
|
||||||
return attr->bithandler;
|
|
||||||
}
|
|
||||||
|
|
||||||
void dsp_fsk_attr_set_bithandler(dsp_fsk_attr_t *attr, bithandler_func_t bithandler, void *bithandler_arg)
|
|
||||||
{
|
|
||||||
attr->bithandler = bithandler;
|
|
||||||
attr->bithandler_arg = bithandler_arg;
|
|
||||||
}
|
|
||||||
|
|
||||||
bytehandler_func_t dsp_fsk_attr_get_bytehandler(dsp_fsk_attr_t *attr, void **bytehandler_arg)
|
|
||||||
{
|
|
||||||
*bytehandler_arg = attr->bytehandler_arg;
|
|
||||||
return attr->bytehandler;
|
|
||||||
}
|
|
||||||
|
|
||||||
void dsp_fsk_attr_set_bytehandler(dsp_fsk_attr_t *attr, bytehandler_func_t bytehandler, void *bytehandler_arg)
|
|
||||||
{
|
|
||||||
attr->bytehandler = bytehandler;
|
|
||||||
attr->bytehandler_arg = bytehandler_arg;
|
|
||||||
}
|
|
||||||
|
|
||||||
int dsp_fsk_attr_get_samplerate (dsp_fsk_attr_t *attr)
|
|
||||||
{
|
|
||||||
return attr->sample_rate;
|
|
||||||
}
|
|
||||||
|
|
||||||
int dsp_fsk_attr_set_samplerate (dsp_fsk_attr_t *attr, int samplerate)
|
|
||||||
{
|
|
||||||
if (samplerate <= 0) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
attr->sample_rate = samplerate;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* dsp_fsk_create
|
|
||||||
*
|
|
||||||
* Creates a handle for subsequent use. The handle is created to contain
|
|
||||||
* a context data structure for use by the sample handler function. The
|
|
||||||
* function expects an initialized attributes structure, and returns the
|
|
||||||
* handle or a NULL if there were errors.
|
|
||||||
*
|
|
||||||
* Once created, the handle can be used until it is destroyed.
|
|
||||||
*/
|
|
||||||
|
|
||||||
dsp_fsk_handle_t *dsp_fsk_create(dsp_fsk_attr_t *attr)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
double phi_mark, phi_space;
|
|
||||||
dsp_fsk_handle_t *handle;
|
|
||||||
|
|
||||||
handle = ftdm_malloc(sizeof(*handle));
|
|
||||||
if (!handle) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
memset(handle, 0, sizeof(*handle));
|
|
||||||
|
|
||||||
/* fill the attributes member */
|
|
||||||
memcpy(&handle->attr, attr, sizeof(*attr));
|
|
||||||
|
|
||||||
/* see if we can do downsampling. We only really need 6 samples to "match" */
|
|
||||||
if (attr->sample_rate / fsk_modem_definitions[FSK_BELL202].freq_mark > 6) {
|
|
||||||
handle->downsampling_count = attr->sample_rate / fsk_modem_definitions[FSK_BELL202].freq_mark / 6;
|
|
||||||
} else {
|
|
||||||
handle->downsampling_count = 1;
|
|
||||||
}
|
|
||||||
handle->current_downsample = 1;
|
|
||||||
|
|
||||||
/* calculate the correlate size (number of samples required for slowest wave) */
|
|
||||||
handle->corrsize = attr->sample_rate / handle->downsampling_count / fsk_modem_definitions[FSK_BELL202].freq_mark;
|
|
||||||
|
|
||||||
/* allocate the correlation sin/cos arrays and initialize */
|
|
||||||
for (i = 0; i < 4; i++) {
|
|
||||||
handle->correlates[i] = ftdm_malloc(sizeof(double) * handle->corrsize);
|
|
||||||
if (handle->correlates[i] == NULL) {
|
|
||||||
/* some failed, back out memory allocations */
|
|
||||||
dsp_fsk_destroy(&handle);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* now initialize them */
|
|
||||||
phi_mark = 2. * M_PI / ((double) attr->sample_rate / (double) handle->downsampling_count / (double) fsk_modem_definitions[FSK_BELL202].freq_mark);
|
|
||||||
phi_space = 2. * M_PI / ((double) attr->sample_rate / (double) handle->downsampling_count / (double) fsk_modem_definitions[FSK_BELL202].freq_space);
|
|
||||||
|
|
||||||
for (i = 0; i < handle->corrsize; i++) {
|
|
||||||
handle->correlates[0][i] = sin(phi_mark * (double) i);
|
|
||||||
handle->correlates[1][i] = cos(phi_mark * (double) i);
|
|
||||||
handle->correlates[2][i] = sin(phi_space * (double) i);
|
|
||||||
handle->correlates[3][i] = cos(phi_space * (double) i);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* initialize the ring buffer */
|
|
||||||
handle->buffer = ftdm_malloc(sizeof(double) * handle->corrsize);
|
|
||||||
if (!handle->buffer) { /* failed; back out memory allocations */
|
|
||||||
dsp_fsk_destroy(&handle);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
memset(handle->buffer, 0, sizeof(double) * handle->corrsize);
|
|
||||||
handle->ringstart = 0;
|
|
||||||
|
|
||||||
/* initalize intra-cell position */
|
|
||||||
handle->cellpos = 0;
|
|
||||||
handle->celladj = fsk_modem_definitions[FSK_BELL202].baud_rate / (double) attr->sample_rate * (double) handle->downsampling_count;
|
|
||||||
|
|
||||||
/* if they have provided a byte handler, add a UART to the processing chain */
|
|
||||||
if (handle->attr.bytehandler) {
|
|
||||||
dsp_uart_attr_t uart_attr;
|
|
||||||
dsp_uart_handle_t *uart_handle;
|
|
||||||
|
|
||||||
dsp_uart_attr_init(&uart_attr);
|
|
||||||
dsp_uart_attr_set_bytehandler(&uart_attr, handle->attr.bytehandler, handle->attr.bytehandler_arg);
|
|
||||||
uart_handle = dsp_uart_create(&uart_attr);
|
|
||||||
if (uart_handle == NULL) {
|
|
||||||
dsp_fsk_destroy(&handle);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
handle->attr.bithandler = dsp_uart_bit_handler;
|
|
||||||
handle->attr.bithandler_arg = uart_handle;
|
|
||||||
}
|
|
||||||
|
|
||||||
return handle;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* dsp_fsk_destroy
|
|
||||||
*
|
|
||||||
* Destroys a handle, releasing any associated memory. Sets handle pointer to NULL
|
|
||||||
* so A destroyed handle can not be used for anything after the destroy.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void dsp_fsk_destroy(dsp_fsk_handle_t **handle)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
/* if empty handle, just return */
|
|
||||||
if (*handle == NULL) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < 4; i++) {
|
|
||||||
if ((*handle)->correlates[i] != NULL) {
|
|
||||||
ftdm_safe_free((*handle)->correlates[i]);
|
|
||||||
(*handle)->correlates[i] = NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((*handle)->buffer != NULL) {
|
|
||||||
ftdm_safe_free((*handle)->buffer);
|
|
||||||
(*handle)->buffer = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((*handle)->attr.bytehandler) {
|
|
||||||
dsp_uart_handle_t** dhandle = (void *)(&(*handle)->attr.bithandler_arg);
|
|
||||||
dsp_uart_destroy(dhandle);
|
|
||||||
}
|
|
||||||
|
|
||||||
ftdm_safe_free(*handle);
|
|
||||||
*handle = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* dsp_fsk_sample
|
|
||||||
*
|
|
||||||
* This is the main processing entry point. The function accepts a normalized
|
|
||||||
* sample (i.e., one whose range is between -1 and +1). The function performs
|
|
||||||
* the Bell-202 FSK modem decode processing, and, if it detects a valid bit,
|
|
||||||
* will call the bithandler associated with the attributes structure.
|
|
||||||
*
|
|
||||||
* For the Bell-202 standard, a logical zero (space) is 2200 Hz, and a logical
|
|
||||||
* one (mark) is 1200 Hz.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void
|
|
||||||
dsp_fsk_sample (dsp_fsk_handle_t *handle, double normalized_sample)
|
|
||||||
{
|
|
||||||
double val;
|
|
||||||
double factors[4];
|
|
||||||
int i, j;
|
|
||||||
|
|
||||||
/* if we can avoid processing samples, do so */
|
|
||||||
if (handle->downsampling_count != 1) {
|
|
||||||
if (handle->current_downsample < handle->downsampling_count) {
|
|
||||||
handle->current_downsample++;
|
|
||||||
return; /* throw this sample out */
|
|
||||||
}
|
|
||||||
handle->current_downsample = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* store sample in buffer */
|
|
||||||
handle->buffer[handle->ringstart++] = normalized_sample;
|
|
||||||
if (handle->ringstart >= handle->corrsize) {
|
|
||||||
handle->ringstart = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* do the correlation calculation */
|
|
||||||
factors[0] = factors[1] = factors[2] = factors[3] = 0; /* clear out intermediate sums */
|
|
||||||
j = handle->ringstart;
|
|
||||||
for (i = 0; i < handle->corrsize; i++) {
|
|
||||||
if (j >= handle->corrsize) {
|
|
||||||
j = 0;
|
|
||||||
}
|
|
||||||
val = handle->buffer[j];
|
|
||||||
factors[0] += handle->correlates[0][i] * val;
|
|
||||||
factors[1] += handle->correlates[1][i] * val;
|
|
||||||
factors[2] += handle->correlates[2][i] * val;
|
|
||||||
factors[3] += handle->correlates[3][i] * val;
|
|
||||||
j++;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* store the bit (bit value is comparison of the two sets of correlate factors) */
|
|
||||||
handle->previous_bit = handle->current_bit;
|
|
||||||
handle->current_bit = (factors[0] * factors[0] + factors[1] * factors[1] > factors[2] * factors[2] + factors[3] * factors[3]);
|
|
||||||
|
|
||||||
/* if there's a transition, we can synchronize the cell position */
|
|
||||||
if (handle->previous_bit != handle->current_bit) {
|
|
||||||
handle->cellpos = 0.5; /* adjust cell position to be in the middle of the cell */
|
|
||||||
}
|
|
||||||
handle->cellpos += handle->celladj; /* walk the cell along */
|
|
||||||
|
|
||||||
if (handle->cellpos > 1.0) {
|
|
||||||
handle->cellpos -= 1.0;
|
|
||||||
|
|
||||||
switch (handle->state) {
|
|
||||||
case FSK_STATE_DATA:
|
|
||||||
{
|
|
||||||
|
|
||||||
(*handle->attr.bithandler) (handle->attr.bithandler_arg, handle->current_bit);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case FSK_STATE_CHANSEIZE:
|
|
||||||
{
|
|
||||||
|
|
||||||
if (handle->last_bit != handle->current_bit) {
|
|
||||||
handle->conscutive_state_bits++;
|
|
||||||
} else {
|
|
||||||
handle->conscutive_state_bits = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (handle->conscutive_state_bits > 15) {
|
|
||||||
handle->state = FSK_STATE_CARRIERSIG;
|
|
||||||
handle->conscutive_state_bits = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case FSK_STATE_CARRIERSIG:
|
|
||||||
{
|
|
||||||
if (handle->current_bit) {
|
|
||||||
handle->conscutive_state_bits++;
|
|
||||||
} else {
|
|
||||||
handle->conscutive_state_bits = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (handle->conscutive_state_bits > 15) {
|
|
||||||
handle->state = FSK_STATE_DATA;
|
|
||||||
handle->conscutive_state_bits = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
handle->last_bit = handle->current_bit;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,78 +0,0 @@
|
||||||
/*
|
|
||||||
*
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#ifndef _DEFAULT_SOURCE
|
|
||||||
#define _DEFAULT_SOURCE
|
|
||||||
#endif
|
|
||||||
#define _BSD_SOURCE
|
|
||||||
#include "private/ftdm_core.h"
|
|
||||||
|
|
||||||
#if defined(HAVE_EXECINFO_H) && !defined(__FreeBSD__)
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <execinfo.h>
|
|
||||||
#include <syscall.h>
|
|
||||||
|
|
||||||
#define FTDM_BACKTRACE_MAX 50
|
|
||||||
|
|
||||||
FT_DECLARE(ftdm_status_t) ftdm_backtrace_walk(void (* callback)(const int tid, const void *addr, const char *symbol, void *priv), void *priv)
|
|
||||||
{
|
|
||||||
void *stacktrace[FTDM_BACKTRACE_MAX];
|
|
||||||
char **symbols = NULL;
|
|
||||||
size_t size = 0;
|
|
||||||
pid_t tid = 0;
|
|
||||||
int si = 0;
|
|
||||||
|
|
||||||
if (!callback) {
|
|
||||||
return FTDM_EINVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
tid = syscall(SYS_gettid);
|
|
||||||
|
|
||||||
size = backtrace(stacktrace, ftdm_array_len(stacktrace));
|
|
||||||
symbols = backtrace_symbols(stacktrace, size);
|
|
||||||
|
|
||||||
for (si = 0; si < size; si++) {
|
|
||||||
callback(tid, stacktrace[si], symbols[si], priv);
|
|
||||||
}
|
|
||||||
|
|
||||||
free(symbols);
|
|
||||||
return FTDM_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
#else /* !HAVE_EXECINFO_H */
|
|
||||||
|
|
||||||
FT_DECLARE(ftdm_status_t) ftdm_backtrace_walk(void (* callback)(const int tid, const void *addr, const char *symbol, void *priv), void *priv)
|
|
||||||
{
|
|
||||||
ftdm_log(FTDM_LOG_DEBUG, "Stack traces are not available on this platform!\n");
|
|
||||||
return FTDM_NOTIMPL;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
static void span_backtrace(const int tid, const void *addr, const char *symbol, void *priv)
|
|
||||||
{
|
|
||||||
ftdm_span_t *span = priv;
|
|
||||||
ftdm_log(FTDM_LOG_DEBUG, "[%d][tid:%d] %p -> %s\n",
|
|
||||||
ftdm_span_get_id(span), tid, addr, symbol);
|
|
||||||
}
|
|
||||||
|
|
||||||
FT_DECLARE(ftdm_status_t) ftdm_backtrace_span(ftdm_span_t *span)
|
|
||||||
{
|
|
||||||
return ftdm_backtrace_walk(&span_backtrace, span);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static void chan_backtrace(const int tid, const void *addr, const char *symbol, void *priv)
|
|
||||||
{
|
|
||||||
ftdm_channel_t *chan = priv;
|
|
||||||
ftdm_log(FTDM_LOG_DEBUG, "[%d:%d][tid:%d] %p -> %s\n",
|
|
||||||
ftdm_channel_get_span_id(chan), ftdm_channel_get_id(chan), tid, addr, symbol);
|
|
||||||
}
|
|
||||||
|
|
||||||
FT_DECLARE(ftdm_status_t) ftdm_backtrace_chan(ftdm_channel_t *chan)
|
|
||||||
{
|
|
||||||
return ftdm_backtrace_walk(&chan_backtrace, chan);
|
|
||||||
}
|
|
|
@ -1,308 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2007-2014, Anthony Minessale II
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
*
|
|
||||||
* * Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
*
|
|
||||||
* * Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* * Neither the name of the original author; nor the names of any contributors
|
|
||||||
* may be used to endorse or promote products derived from this software
|
|
||||||
* without specific prior written permission.
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
|
||||||
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
|
||||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
||||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
|
||||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
||||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
||||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
||||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "private/ftdm_core.h"
|
|
||||||
#include "ftdm_buffer.h"
|
|
||||||
|
|
||||||
static unsigned buffer_id = 0;
|
|
||||||
|
|
||||||
struct ftdm_buffer {
|
|
||||||
unsigned char *data;
|
|
||||||
unsigned char *head;
|
|
||||||
ftdm_size_t used;
|
|
||||||
ftdm_size_t actually_used;
|
|
||||||
ftdm_size_t datalen;
|
|
||||||
ftdm_size_t max_len;
|
|
||||||
ftdm_size_t blocksize;
|
|
||||||
unsigned id;
|
|
||||||
int loops;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
FT_DECLARE(ftdm_status_t) ftdm_buffer_create(ftdm_buffer_t **buffer, ftdm_size_t blocksize, ftdm_size_t start_len, ftdm_size_t max_len)
|
|
||||||
{
|
|
||||||
ftdm_buffer_t *new_buffer;
|
|
||||||
|
|
||||||
new_buffer = ftdm_malloc(sizeof(*new_buffer));
|
|
||||||
if (new_buffer) {
|
|
||||||
memset(new_buffer, 0, sizeof(*new_buffer));
|
|
||||||
|
|
||||||
if (!start_len) {
|
|
||||||
start_len = 250;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!blocksize) {
|
|
||||||
blocksize = start_len;
|
|
||||||
}
|
|
||||||
|
|
||||||
new_buffer->data = ftdm_malloc(start_len);
|
|
||||||
if (!new_buffer->data) {
|
|
||||||
ftdm_safe_free(new_buffer);
|
|
||||||
return FTDM_MEMERR;
|
|
||||||
}
|
|
||||||
memset(new_buffer->data, 0, start_len);
|
|
||||||
|
|
||||||
new_buffer->max_len = max_len;
|
|
||||||
new_buffer->datalen = start_len;
|
|
||||||
new_buffer->id = buffer_id++;
|
|
||||||
new_buffer->blocksize = blocksize;
|
|
||||||
new_buffer->head = new_buffer->data;
|
|
||||||
|
|
||||||
*buffer = new_buffer;
|
|
||||||
return FTDM_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
return FTDM_MEMERR;
|
|
||||||
}
|
|
||||||
|
|
||||||
FT_DECLARE(ftdm_size_t) ftdm_buffer_len(ftdm_buffer_t *buffer)
|
|
||||||
{
|
|
||||||
|
|
||||||
assert(buffer != NULL);
|
|
||||||
|
|
||||||
return buffer->datalen;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
FT_DECLARE(ftdm_size_t) ftdm_buffer_freespace(ftdm_buffer_t *buffer)
|
|
||||||
{
|
|
||||||
assert(buffer != NULL);
|
|
||||||
|
|
||||||
|
|
||||||
if (buffer->max_len) {
|
|
||||||
return (ftdm_size_t) (buffer->max_len - buffer->used);
|
|
||||||
}
|
|
||||||
return 1000000;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
FT_DECLARE(ftdm_size_t) ftdm_buffer_inuse(ftdm_buffer_t *buffer)
|
|
||||||
{
|
|
||||||
assert(buffer != NULL);
|
|
||||||
|
|
||||||
return buffer->used;
|
|
||||||
}
|
|
||||||
|
|
||||||
FT_DECLARE(ftdm_size_t) ftdm_buffer_seek(ftdm_buffer_t *buffer, ftdm_size_t datalen)
|
|
||||||
{
|
|
||||||
ftdm_size_t reading = 0;
|
|
||||||
|
|
||||||
assert(buffer != NULL);
|
|
||||||
|
|
||||||
if (buffer->used < 1) {
|
|
||||||
buffer->used = 0;
|
|
||||||
return 0;
|
|
||||||
} else if (buffer->used >= datalen) {
|
|
||||||
reading = datalen;
|
|
||||||
} else {
|
|
||||||
reading = buffer->used;
|
|
||||||
}
|
|
||||||
|
|
||||||
buffer->used = buffer->actually_used - reading;
|
|
||||||
buffer->head = buffer->data + reading;
|
|
||||||
|
|
||||||
return reading;
|
|
||||||
}
|
|
||||||
|
|
||||||
FT_DECLARE(ftdm_size_t) ftdm_buffer_toss(ftdm_buffer_t *buffer, ftdm_size_t datalen)
|
|
||||||
{
|
|
||||||
ftdm_size_t reading = 0;
|
|
||||||
|
|
||||||
assert(buffer != NULL);
|
|
||||||
|
|
||||||
if (buffer->used < 1) {
|
|
||||||
buffer->used = 0;
|
|
||||||
return 0;
|
|
||||||
} else if (buffer->used >= datalen) {
|
|
||||||
reading = datalen;
|
|
||||||
} else {
|
|
||||||
reading = buffer->used;
|
|
||||||
}
|
|
||||||
|
|
||||||
buffer->used -= reading;
|
|
||||||
buffer->head += reading;
|
|
||||||
|
|
||||||
return buffer->used;
|
|
||||||
}
|
|
||||||
|
|
||||||
FT_DECLARE(void) ftdm_buffer_set_loops(ftdm_buffer_t *buffer, int loops)
|
|
||||||
{
|
|
||||||
buffer->loops = loops;
|
|
||||||
}
|
|
||||||
|
|
||||||
FT_DECLARE(ftdm_size_t) ftdm_buffer_read_loop(ftdm_buffer_t *buffer, void *data, ftdm_size_t datalen)
|
|
||||||
{
|
|
||||||
ftdm_size_t len;
|
|
||||||
if ((len = ftdm_buffer_read(buffer, data, datalen)) < datalen) {
|
|
||||||
if (buffer->loops == 0) {
|
|
||||||
return len;
|
|
||||||
}
|
|
||||||
buffer->head = buffer->data;
|
|
||||||
buffer->used = buffer->actually_used;
|
|
||||||
len = ftdm_buffer_read(buffer, (char*)data + len, datalen - len);
|
|
||||||
buffer->loops--;
|
|
||||||
}
|
|
||||||
return len;
|
|
||||||
}
|
|
||||||
|
|
||||||
FT_DECLARE(ftdm_size_t) ftdm_buffer_read(ftdm_buffer_t *buffer, void *data, ftdm_size_t datalen)
|
|
||||||
{
|
|
||||||
ftdm_size_t reading = 0;
|
|
||||||
|
|
||||||
assert(buffer != NULL);
|
|
||||||
assert(data != NULL);
|
|
||||||
|
|
||||||
|
|
||||||
if (buffer->used < 1) {
|
|
||||||
buffer->used = 0;
|
|
||||||
return 0;
|
|
||||||
} else if (buffer->used >= datalen) {
|
|
||||||
reading = datalen;
|
|
||||||
} else {
|
|
||||||
reading = buffer->used;
|
|
||||||
}
|
|
||||||
|
|
||||||
memcpy(data, buffer->head, reading);
|
|
||||||
buffer->used -= reading;
|
|
||||||
buffer->head += reading;
|
|
||||||
|
|
||||||
/* if (buffer->id == 4) printf("%u o %d = %d\n", buffer->id, (unsigned)reading, (unsigned)buffer->used); */
|
|
||||||
return reading;
|
|
||||||
}
|
|
||||||
|
|
||||||
FT_DECLARE(ftdm_size_t) ftdm_buffer_write(ftdm_buffer_t *buffer, const void *data, ftdm_size_t datalen)
|
|
||||||
{
|
|
||||||
ftdm_size_t freespace, actual_freespace;
|
|
||||||
|
|
||||||
assert(buffer != NULL);
|
|
||||||
assert(data != NULL);
|
|
||||||
assert(buffer->data != NULL);
|
|
||||||
|
|
||||||
if (!datalen) {
|
|
||||||
return buffer->used;
|
|
||||||
}
|
|
||||||
|
|
||||||
actual_freespace = buffer->datalen - buffer->actually_used;
|
|
||||||
if (actual_freespace < datalen && (!buffer->max_len || (buffer->used + datalen <= buffer->max_len))) {
|
|
||||||
memmove(buffer->data, buffer->head, buffer->used);
|
|
||||||
buffer->head = buffer->data;
|
|
||||||
buffer->actually_used = buffer->used;
|
|
||||||
}
|
|
||||||
|
|
||||||
freespace = buffer->datalen - buffer->used;
|
|
||||||
|
|
||||||
/*
|
|
||||||
if (buffer->data != buffer->head) {
|
|
||||||
memmove(buffer->data, buffer->head, buffer->used);
|
|
||||||
buffer->head = buffer->data;
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (freespace < datalen) {
|
|
||||||
ftdm_size_t new_size, new_block_size;
|
|
||||||
void *data;
|
|
||||||
|
|
||||||
new_size = buffer->datalen + datalen;
|
|
||||||
new_block_size = buffer->datalen + buffer->blocksize;
|
|
||||||
|
|
||||||
if (new_block_size > new_size) {
|
|
||||||
new_size = new_block_size;
|
|
||||||
}
|
|
||||||
buffer->head = buffer->data;
|
|
||||||
data = realloc(buffer->data, new_size);
|
|
||||||
if (!data) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
buffer->data = data;
|
|
||||||
buffer->head = buffer->data;
|
|
||||||
buffer->datalen = new_size;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
freespace = buffer->datalen - buffer->used;
|
|
||||||
|
|
||||||
if (freespace < datalen) {
|
|
||||||
return 0;
|
|
||||||
} else {
|
|
||||||
memcpy(buffer->head + buffer->used, data, datalen);
|
|
||||||
buffer->used += datalen;
|
|
||||||
buffer->actually_used += datalen;
|
|
||||||
}
|
|
||||||
/* if (buffer->id == 4) printf("%u i %d = %d\n", buffer->id, (unsigned)datalen, (unsigned)buffer->used); */
|
|
||||||
|
|
||||||
return buffer->used;
|
|
||||||
}
|
|
||||||
|
|
||||||
FT_DECLARE(void) ftdm_buffer_zero(ftdm_buffer_t *buffer)
|
|
||||||
{
|
|
||||||
assert(buffer != NULL);
|
|
||||||
assert(buffer->data != NULL);
|
|
||||||
|
|
||||||
buffer->used = 0;
|
|
||||||
buffer->actually_used = 0;
|
|
||||||
buffer->head = buffer->data;
|
|
||||||
}
|
|
||||||
|
|
||||||
FT_DECLARE(ftdm_size_t) ftdm_buffer_zwrite(ftdm_buffer_t *buffer, const void *data, ftdm_size_t datalen)
|
|
||||||
{
|
|
||||||
ftdm_size_t w;
|
|
||||||
|
|
||||||
if (!(w = ftdm_buffer_write(buffer, data, datalen))) {
|
|
||||||
ftdm_buffer_zero(buffer);
|
|
||||||
return ftdm_buffer_write(buffer, data, datalen);
|
|
||||||
}
|
|
||||||
|
|
||||||
return w;
|
|
||||||
}
|
|
||||||
|
|
||||||
FT_DECLARE(void) ftdm_buffer_destroy(ftdm_buffer_t **buffer)
|
|
||||||
{
|
|
||||||
if (*buffer) {
|
|
||||||
ftdm_safe_free((*buffer)->data);
|
|
||||||
ftdm_safe_free(*buffer);
|
|
||||||
}
|
|
||||||
|
|
||||||
*buffer = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 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 noet:
|
|
||||||
*/
|
|
|
@ -1,237 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2010, Sangoma Technologies
|
|
||||||
* David Yat Sin <dyatsin@sangoma.com>
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
*
|
|
||||||
* * Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
*
|
|
||||||
* * Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* * Neither the name of the original author; nor the names of any contributors
|
|
||||||
* may be used to endorse or promote products derived from this software
|
|
||||||
* without specific prior written permission.
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
|
||||||
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
|
||||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
||||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
|
||||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
||||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
||||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
||||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*
|
|
||||||
* Contributors:
|
|
||||||
*
|
|
||||||
* Moises Silva <moy@sangoma.com>
|
|
||||||
* Ricardo Barroetaveña <rbarroetavena@anura.com.ar>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "private/ftdm_core.h"
|
|
||||||
#include <ctype.h>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
FT_DECLARE(char *) ftdm_url_encode(const char *url, char *buf, ftdm_size_t len)
|
|
||||||
{
|
|
||||||
/* This implementation of url_encode is slightly different compared to the
|
|
||||||
* Freeswitch one. This is because this implementation accepts the full
|
|
||||||
* range of values (0x00 - 0xFF) compared to the Freeswitch implementation
|
|
||||||
* that does not accept 0x00 */
|
|
||||||
|
|
||||||
const char *p;
|
|
||||||
size_t x = 0,y = 0;
|
|
||||||
const char urlunsafe[] = "\r\n \"#%&+:;<=>?@[\\]^`{|}";
|
|
||||||
const char hex[] = "0123456789ABCDEF";
|
|
||||||
|
|
||||||
if (!buf) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!url) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
len--;
|
|
||||||
|
|
||||||
for (p = url; y <= len; p++) {
|
|
||||||
if (*p < ' ' || *p > '~' || strchr(urlunsafe, *p)) {
|
|
||||||
buf[x++] = '%';
|
|
||||||
buf[x++] = hex[(*p >> 4) & 0x0f];
|
|
||||||
buf[x++] = hex[*p & 0x0f];
|
|
||||||
} else {
|
|
||||||
buf[x++] = *p;
|
|
||||||
}
|
|
||||||
y++;
|
|
||||||
}
|
|
||||||
buf[x] = '\0';
|
|
||||||
return buf;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
FT_DECLARE(char *) ftdm_url_decode(char *s, ftdm_size_t *len)
|
|
||||||
{
|
|
||||||
/* This implementation of url_decode is slightly different compared to the
|
|
||||||
* Freeswitch one. This is because this implementation accepts the full
|
|
||||||
* range of values (0x00 - 0xFF) compared to the Freeswitch implementation
|
|
||||||
* that does not accept 0x00 */
|
|
||||||
|
|
||||||
char *o;
|
|
||||||
unsigned int tmp;
|
|
||||||
ftdm_size_t mylen = 0;
|
|
||||||
|
|
||||||
if (ftdm_strlen_zero(s)) {
|
|
||||||
return s;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (o = s; *s; s++, o++) {
|
|
||||||
if (*s == '%' && strlen(s) > 2 && sscanf(s + 1, "%2x", &tmp) == 1) {
|
|
||||||
*o = (char) tmp;
|
|
||||||
s += 2;
|
|
||||||
} else {
|
|
||||||
*o = *s;
|
|
||||||
}
|
|
||||||
mylen++;
|
|
||||||
}
|
|
||||||
*o = '\0';
|
|
||||||
*len = mylen;
|
|
||||||
return s;
|
|
||||||
}
|
|
||||||
|
|
||||||
FT_DECLARE(ftdm_status_t) ftdm_set_npi(const char *string, uint8_t *target)
|
|
||||||
{
|
|
||||||
uint8_t val;
|
|
||||||
ftdm_status_t status = FTDM_SUCCESS;
|
|
||||||
|
|
||||||
val = ftdm_str2ftdm_npi(string);
|
|
||||||
if (val == FTDM_NPI_INVALID) {
|
|
||||||
ftdm_log(FTDM_LOG_WARNING, "Invalid NPI string (%s)\n", string);
|
|
||||||
status = FTDM_FAIL;
|
|
||||||
val = FTDM_NPI_UNKNOWN;
|
|
||||||
}
|
|
||||||
*target = val;
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
|
|
||||||
FT_DECLARE(ftdm_status_t) ftdm_set_ton(const char *string, uint8_t *target)
|
|
||||||
{
|
|
||||||
uint8_t val;
|
|
||||||
ftdm_status_t status = FTDM_SUCCESS;
|
|
||||||
|
|
||||||
val = ftdm_str2ftdm_ton(string);
|
|
||||||
if (val == FTDM_TON_INVALID) {
|
|
||||||
ftdm_log(FTDM_LOG_WARNING, "Invalid TON string (%s)\n", string);
|
|
||||||
status = FTDM_FAIL;
|
|
||||||
val = FTDM_TON_UNKNOWN;
|
|
||||||
}
|
|
||||||
*target = val;
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
|
|
||||||
FT_DECLARE(ftdm_status_t) ftdm_set_bearer_capability(const char *string, uint8_t *target)
|
|
||||||
{
|
|
||||||
uint8_t val;
|
|
||||||
ftdm_status_t status = FTDM_SUCCESS;
|
|
||||||
|
|
||||||
val = ftdm_str2ftdm_bearer_cap(string);
|
|
||||||
if (val == FTDM_NPI_INVALID) {
|
|
||||||
ftdm_log(FTDM_LOG_WARNING, "Invalid Bearer-Capability string (%s)\n", string);
|
|
||||||
status = FTDM_FAIL;
|
|
||||||
val = FTDM_BEARER_CAP_SPEECH;
|
|
||||||
}
|
|
||||||
|
|
||||||
*target = val;
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
|
|
||||||
FT_DECLARE(ftdm_status_t) ftdm_set_bearer_layer1(const char *string, uint8_t *target)
|
|
||||||
{
|
|
||||||
uint8_t val;
|
|
||||||
ftdm_status_t status = FTDM_SUCCESS;
|
|
||||||
|
|
||||||
val = ftdm_str2ftdm_usr_layer1_prot(string);
|
|
||||||
if (val == FTDM_USER_LAYER1_PROT_INVALID) {
|
|
||||||
ftdm_log(FTDM_LOG_WARNING, "Invalid Bearer Layer 1 Protocol string (%s)\n", string);
|
|
||||||
status = FTDM_FAIL;
|
|
||||||
val = FTDM_USER_LAYER1_PROT_ULAW;
|
|
||||||
}
|
|
||||||
|
|
||||||
*target = val;
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
|
|
||||||
FT_DECLARE(ftdm_status_t) ftdm_set_screening_ind(const char *string, uint8_t *target)
|
|
||||||
{
|
|
||||||
uint8_t val;
|
|
||||||
ftdm_status_t status = FTDM_SUCCESS;
|
|
||||||
|
|
||||||
val = ftdm_str2ftdm_screening(string);
|
|
||||||
if (val == FTDM_SCREENING_INVALID) {
|
|
||||||
ftdm_log(FTDM_LOG_WARNING, "Invalid screening indicator string (%s)\n", string);
|
|
||||||
status = FTDM_FAIL;
|
|
||||||
val = FTDM_SCREENING_NOT_SCREENED;
|
|
||||||
}
|
|
||||||
|
|
||||||
*target = val;
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
|
|
||||||
FT_DECLARE(ftdm_status_t) ftdm_set_presentation_ind(const char *string, uint8_t *target)
|
|
||||||
{
|
|
||||||
uint8_t val;
|
|
||||||
ftdm_status_t status = FTDM_SUCCESS;
|
|
||||||
|
|
||||||
val = ftdm_str2ftdm_presentation(string);
|
|
||||||
if (val == FTDM_PRES_INVALID) {
|
|
||||||
ftdm_log(FTDM_LOG_WARNING, "Invalid presentation string (%s)\n", string);
|
|
||||||
status = FTDM_FAIL;
|
|
||||||
val = FTDM_PRES_ALLOWED;
|
|
||||||
}
|
|
||||||
|
|
||||||
*target = val;
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
|
|
||||||
FT_DECLARE(ftdm_status_t) ftdm_is_number(const char *number)
|
|
||||||
{
|
|
||||||
if (!number) {
|
|
||||||
return FTDM_FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
for ( ; *number; number++) {
|
|
||||||
if (!isdigit(*number)) {
|
|
||||||
return FTDM_FAIL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return FTDM_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
FT_DECLARE(ftdm_status_t) ftdm_set_calling_party_category(const char *string, uint8_t *target)
|
|
||||||
{
|
|
||||||
uint8_t val;
|
|
||||||
ftdm_status_t status = FTDM_SUCCESS;
|
|
||||||
|
|
||||||
val = ftdm_str2ftdm_calling_party_category(string);
|
|
||||||
if (val == FTDM_CPC_INVALID) {
|
|
||||||
ftdm_log(FTDM_LOG_WARNING, "Invalid category string (%s)\n", string);
|
|
||||||
val = FTDM_CPC_ORDINARY;
|
|
||||||
status = FTDM_FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
*target = val;
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,307 +0,0 @@
|
||||||
#include "private/ftdm_core.h"
|
|
||||||
#include "fsk.h"
|
|
||||||
#include "uart.h"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static void fsk_byte_handler (void *x, int data)
|
|
||||||
{
|
|
||||||
ftdm_fsk_data_state_t *state = (ftdm_fsk_data_state_t *) x;
|
|
||||||
uint8_t byte = (uint8_t)data;
|
|
||||||
|
|
||||||
top:
|
|
||||||
|
|
||||||
if (state->init == 3) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (state->dlen) {
|
|
||||||
goto add_byte;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (state->bpos == 1) {
|
|
||||||
state->blen = byte;
|
|
||||||
|
|
||||||
if ((uint32_t)(state->dlen = state->bpos + byte + 2) > state->bufsize) {
|
|
||||||
state->dlen = state->bufsize;
|
|
||||||
}
|
|
||||||
goto top;
|
|
||||||
}
|
|
||||||
|
|
||||||
add_byte:
|
|
||||||
|
|
||||||
if (state->bpos <= state->dlen) {
|
|
||||||
state->buf[state->bpos++] = byte;
|
|
||||||
} else {
|
|
||||||
state->init = 3;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
FT_DECLARE(ftdm_status_t) ftdm_fsk_data_init(ftdm_fsk_data_state_t *state, uint8_t *data, uint32_t datalen)
|
|
||||||
{
|
|
||||||
memset(state, 0, sizeof(*state));
|
|
||||||
state->buf = data;
|
|
||||||
state->bufsize = datalen;
|
|
||||||
state->bpos = 2;
|
|
||||||
|
|
||||||
return FTDM_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
FT_DECLARE(ftdm_status_t) ftdm_fsk_data_add_sdmf(ftdm_fsk_data_state_t *state, const char *date, char *number)
|
|
||||||
{
|
|
||||||
size_t dlen = strlen(date);
|
|
||||||
size_t nlen = strlen(number);
|
|
||||||
|
|
||||||
state->buf[0] = FTDM_CID_TYPE_SDMF;
|
|
||||||
memcpy(&state->buf[state->bpos], date, dlen);
|
|
||||||
state->bpos += dlen;
|
|
||||||
memcpy(&state->buf[state->bpos], number, nlen);
|
|
||||||
state->bpos += nlen;
|
|
||||||
|
|
||||||
return FTDM_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
FT_DECLARE(ftdm_status_t) ftdm_fsk_data_add_mdmf(ftdm_fsk_data_state_t *state, ftdm_mdmf_type_t type, const uint8_t *data, uint32_t datalen)
|
|
||||||
{
|
|
||||||
state->buf[0] = FTDM_CID_TYPE_MDMF;
|
|
||||||
state->buf[state->bpos++] = type;
|
|
||||||
state->buf[state->bpos++] = (uint8_t)datalen;
|
|
||||||
memcpy(&state->buf[state->bpos], data, datalen);
|
|
||||||
state->bpos += datalen;
|
|
||||||
return FTDM_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
FT_DECLARE(ftdm_status_t) ftdm_fsk_data_add_checksum(ftdm_fsk_data_state_t *state)
|
|
||||||
{
|
|
||||||
uint32_t i;
|
|
||||||
uint8_t check = 0;
|
|
||||||
|
|
||||||
state->buf[1] = (uint8_t)(state->bpos - 2);
|
|
||||||
|
|
||||||
for (i = 0; i < state->bpos; i++) {
|
|
||||||
check = check + state->buf[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
state->checksum = state->buf[state->bpos] = (uint8_t)(256 - check);
|
|
||||||
state->bpos++;
|
|
||||||
|
|
||||||
state->dlen = state->bpos;
|
|
||||||
state->blen = state->buf[1];
|
|
||||||
|
|
||||||
return FTDM_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
FT_DECLARE(ftdm_status_t) ftdm_fsk_data_parse(ftdm_fsk_data_state_t *state, ftdm_size_t *type, char **data, ftdm_size_t *len)
|
|
||||||
{
|
|
||||||
|
|
||||||
ftdm_size_t i;
|
|
||||||
int sum = 0;
|
|
||||||
|
|
||||||
top:
|
|
||||||
|
|
||||||
if (state->checksum != 0 || state->ppos >= state->dlen - 1) {
|
|
||||||
return FTDM_FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!state->ppos) {
|
|
||||||
for(i = 0; i < state->bpos; i++) {
|
|
||||||
sum += state->buf[i];
|
|
||||||
}
|
|
||||||
state->checksum = sum % 256;
|
|
||||||
state->ppos = 2;
|
|
||||||
|
|
||||||
if (state->buf[0] != FTDM_CID_TYPE_MDMF && state->buf[0] != FTDM_CID_TYPE_SDMF) {
|
|
||||||
state->checksum = -1;
|
|
||||||
}
|
|
||||||
goto top;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (state->buf[0] == FTDM_CID_TYPE_SDMF) {
|
|
||||||
/* convert sdmf to mdmf so we don't need 2 parsers */
|
|
||||||
if (state->ppos == 2) {
|
|
||||||
*type = MDMF_DATETIME;
|
|
||||||
*len = 8;
|
|
||||||
} else {
|
|
||||||
if (state->buf[state->ppos] == 'P' || state->buf[state->ppos] == 'O') {
|
|
||||||
*type = MDMF_NO_NUM;
|
|
||||||
*len = 1;
|
|
||||||
} else {
|
|
||||||
*type = MDMF_PHONE_NUM;
|
|
||||||
*len = state->blen - 8;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*data = (char *)&state->buf[state->ppos];
|
|
||||||
state->ppos += *len;
|
|
||||||
return FTDM_SUCCESS;
|
|
||||||
} else if (state->buf[0] == FTDM_CID_TYPE_MDMF) {
|
|
||||||
*type = state->buf[state->ppos++];
|
|
||||||
*len = state->buf[state->ppos++];
|
|
||||||
*data = (char *)&state->buf[state->ppos];
|
|
||||||
state->ppos += *len;
|
|
||||||
return FTDM_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
return FTDM_FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
FT_DECLARE(ftdm_status_t) ftdm_fsk_demod_feed(ftdm_fsk_data_state_t *state, int16_t *data, ftdm_size_t samples)
|
|
||||||
{
|
|
||||||
uint32_t x;
|
|
||||||
int16_t *sp = data;
|
|
||||||
|
|
||||||
if (state->init == 3) {
|
|
||||||
return FTDM_FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (x = 0; x < samples; x++) {
|
|
||||||
dsp_fsk_sample (state->fsk1200_handle, (double) *sp++ / 32767.0);
|
|
||||||
if (state->dlen && state->bpos >= state->dlen) {
|
|
||||||
state->init = 3;
|
|
||||||
return FTDM_FAIL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return FTDM_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
FT_DECLARE(ftdm_status_t) ftdm_fsk_demod_destroy(ftdm_fsk_data_state_t *state)
|
|
||||||
{
|
|
||||||
dsp_fsk_destroy(&state->fsk1200_handle);
|
|
||||||
memset(state, 0, sizeof(*state));
|
|
||||||
return FTDM_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
FT_DECLARE(int) ftdm_fsk_demod_init(ftdm_fsk_data_state_t *state, int rate, uint8_t *buf, ftdm_size_t bufsize)
|
|
||||||
{
|
|
||||||
|
|
||||||
dsp_fsk_attr_t fsk1200_attr;
|
|
||||||
|
|
||||||
if (state->fsk1200_handle) {
|
|
||||||
dsp_fsk_destroy(&state->fsk1200_handle);
|
|
||||||
}
|
|
||||||
|
|
||||||
memset(state, 0, sizeof(*state));
|
|
||||||
memset(buf, 0, bufsize);
|
|
||||||
state->buf = buf;
|
|
||||||
state->bufsize = bufsize;
|
|
||||||
|
|
||||||
dsp_fsk_attr_init (&fsk1200_attr);
|
|
||||||
dsp_fsk_attr_set_samplerate (&fsk1200_attr, rate);
|
|
||||||
dsp_fsk_attr_set_bytehandler (&fsk1200_attr, fsk_byte_handler, state);
|
|
||||||
state->fsk1200_handle = dsp_fsk_create (&fsk1200_attr);
|
|
||||||
|
|
||||||
if (state->fsk1200_handle == NULL) {
|
|
||||||
return FTDM_FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return FTDM_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
FT_DECLARE(ftdm_size_t) ftdm_fsk_modulator_generate_bit(ftdm_fsk_modulator_t *fsk_trans, int8_t bit, int16_t *buf, ftdm_size_t buflen)
|
|
||||||
{
|
|
||||||
ftdm_size_t i;
|
|
||||||
|
|
||||||
for(i = 0 ; i < buflen; i++) {
|
|
||||||
fsk_trans->bit_accum += fsk_trans->bit_factor;
|
|
||||||
if (fsk_trans->bit_accum >= FTDM_FSK_MOD_FACTOR) {
|
|
||||||
fsk_trans->bit_accum -= (FTDM_FSK_MOD_FACTOR + fsk_trans->bit_factor);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
buf[i] = teletone_dds_state_modulate_sample(&fsk_trans->dds, bit);
|
|
||||||
}
|
|
||||||
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
FT_DECLARE(int32_t) ftdm_fsk_modulator_generate_carrier_bits(ftdm_fsk_modulator_t *fsk_trans, uint32_t bits)
|
|
||||||
{
|
|
||||||
uint32_t i = 0;
|
|
||||||
ftdm_size_t r = 0;
|
|
||||||
int8_t bit = 1;
|
|
||||||
|
|
||||||
for (i = 0; i < bits; i++) {
|
|
||||||
if ((r = ftdm_fsk_modulator_generate_bit(fsk_trans, bit, fsk_trans->sample_buffer, sizeof(fsk_trans->sample_buffer) / 2))) {
|
|
||||||
if (fsk_trans->write_sample_callback(fsk_trans->sample_buffer, r, fsk_trans->user_data) != FTDM_SUCCESS) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
FT_DECLARE(void) ftdm_fsk_modulator_generate_chan_sieze(ftdm_fsk_modulator_t *fsk_trans)
|
|
||||||
{
|
|
||||||
uint32_t i = 0;
|
|
||||||
ftdm_size_t r = 0;
|
|
||||||
int8_t bit = 0;
|
|
||||||
|
|
||||||
for (i = 0; i < fsk_trans->chan_sieze_bits; i++) {
|
|
||||||
if ((r = ftdm_fsk_modulator_generate_bit(fsk_trans, bit, fsk_trans->sample_buffer, sizeof(fsk_trans->sample_buffer) / 2))) {
|
|
||||||
if (fsk_trans->write_sample_callback(fsk_trans->sample_buffer, r, fsk_trans->user_data) != FTDM_SUCCESS) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
bit = !bit;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
FT_DECLARE(void) ftdm_fsk_modulator_send_data(ftdm_fsk_modulator_t *fsk_trans)
|
|
||||||
{
|
|
||||||
ftdm_size_t r = 0;
|
|
||||||
int8_t bit = 0;
|
|
||||||
|
|
||||||
while((bit = ftdm_bitstream_get_bit(&fsk_trans->bs)) > -1) {
|
|
||||||
if ((r = ftdm_fsk_modulator_generate_bit(fsk_trans, bit, fsk_trans->sample_buffer, sizeof(fsk_trans->sample_buffer) / 2))) {
|
|
||||||
if (fsk_trans->write_sample_callback(fsk_trans->sample_buffer, r, fsk_trans->user_data) != FTDM_SUCCESS) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
FT_DECLARE(ftdm_status_t) ftdm_fsk_modulator_init(ftdm_fsk_modulator_t *fsk_trans,
|
|
||||||
fsk_modem_types_t modem_type,
|
|
||||||
uint32_t sample_rate,
|
|
||||||
ftdm_fsk_data_state_t *fsk_data,
|
|
||||||
float db_level,
|
|
||||||
uint32_t carrier_bits_start,
|
|
||||||
uint32_t carrier_bits_stop,
|
|
||||||
uint32_t chan_sieze_bits,
|
|
||||||
ftdm_fsk_write_sample_t write_sample_callback,
|
|
||||||
void *user_data)
|
|
||||||
{
|
|
||||||
memset(fsk_trans, 0, sizeof(*fsk_trans));
|
|
||||||
fsk_trans->modem_type = modem_type;
|
|
||||||
teletone_dds_state_set_tone(&fsk_trans->dds, fsk_modem_definitions[fsk_trans->modem_type].freq_space, sample_rate, 0);
|
|
||||||
teletone_dds_state_set_tone(&fsk_trans->dds, fsk_modem_definitions[fsk_trans->modem_type].freq_mark, sample_rate, 1);
|
|
||||||
fsk_trans->bit_factor = (uint32_t)((fsk_modem_definitions[fsk_trans->modem_type].baud_rate * FTDM_FSK_MOD_FACTOR) / (float)sample_rate);
|
|
||||||
fsk_trans->samples_per_bit = (uint32_t) (sample_rate / fsk_modem_definitions[fsk_trans->modem_type].baud_rate);
|
|
||||||
fsk_trans->est_bytes = (int32_t)(((fsk_data->dlen * 10) + carrier_bits_start + carrier_bits_stop + chan_sieze_bits) * ((fsk_trans->samples_per_bit + 1) * 2));
|
|
||||||
fsk_trans->bit_accum = 0;
|
|
||||||
fsk_trans->fsk_data = fsk_data;
|
|
||||||
teletone_dds_state_set_tx_level(&fsk_trans->dds, db_level);
|
|
||||||
ftdm_bitstream_init(&fsk_trans->bs, fsk_trans->fsk_data->buf, (uint32_t)fsk_trans->fsk_data->dlen, FTDM_ENDIAN_BIG, 1);
|
|
||||||
fsk_trans->carrier_bits_start = carrier_bits_start;
|
|
||||||
fsk_trans->carrier_bits_stop = carrier_bits_stop;
|
|
||||||
fsk_trans->chan_sieze_bits = chan_sieze_bits;
|
|
||||||
fsk_trans->write_sample_callback = write_sample_callback;
|
|
||||||
fsk_trans->user_data = user_data;
|
|
||||||
return FTDM_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,383 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2007-2014, Anthony Minessale II
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
*
|
|
||||||
* * Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
*
|
|
||||||
* * Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* * Neither the name of the original author; nor the names of any contributors
|
|
||||||
* may be used to endorse or promote products derived from this software
|
|
||||||
* without specific prior written permission.
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
|
||||||
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
|
||||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
||||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
|
||||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
||||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
||||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
||||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*
|
|
||||||
* Contributors:
|
|
||||||
*
|
|
||||||
* Moises Silva <moy@sangoma.com>
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "private/ftdm_core.h"
|
|
||||||
|
|
||||||
#ifndef FTDM_MOD_DIR
|
|
||||||
#define FTDM_MOD_DIR "."
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define FTDM_MAX_CONF_DIR 512
|
|
||||||
|
|
||||||
static char g_ftdm_config_dir[FTDM_MAX_CONF_DIR] = FTDM_CONFIG_DIR;
|
|
||||||
static char g_ftdm_mod_dir[FTDM_MAX_CONF_DIR] = FTDM_MOD_DIR;
|
|
||||||
|
|
||||||
FT_DECLARE(void) ftdm_global_set_mod_directory(const char *path)
|
|
||||||
{
|
|
||||||
snprintf(g_ftdm_mod_dir, sizeof(g_ftdm_mod_dir), "%s", path);
|
|
||||||
ftdm_log(FTDM_LOG_DEBUG, "New mod directory: %s\n", g_ftdm_mod_dir);
|
|
||||||
}
|
|
||||||
|
|
||||||
FT_DECLARE(void) ftdm_global_set_config_directory(const char *path)
|
|
||||||
{
|
|
||||||
snprintf(g_ftdm_config_dir, sizeof(g_ftdm_config_dir), "%s", path);
|
|
||||||
ftdm_log(FTDM_LOG_DEBUG, "New config directory: %s\n", g_ftdm_config_dir);
|
|
||||||
}
|
|
||||||
|
|
||||||
int ftdm_config_open_file(ftdm_config_t *cfg, const char *file_path)
|
|
||||||
{
|
|
||||||
FILE *f;
|
|
||||||
const char *path = NULL;
|
|
||||||
char path_buf[1024];
|
|
||||||
|
|
||||||
if (file_path[0] == '/') {
|
|
||||||
path = file_path;
|
|
||||||
} else {
|
|
||||||
snprintf(path_buf, sizeof(path_buf), "%s%s%s", g_ftdm_config_dir, FTDM_PATH_SEPARATOR, file_path);
|
|
||||||
path = path_buf;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!path) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
memset(cfg, 0, sizeof(*cfg));
|
|
||||||
cfg->lockto = -1;
|
|
||||||
ftdm_log(FTDM_LOG_DEBUG, "Configuration file is %s\n", path);
|
|
||||||
f = fopen(path, "r");
|
|
||||||
|
|
||||||
if (!f) {
|
|
||||||
if (file_path[0] != '/') {
|
|
||||||
int last = -1;
|
|
||||||
char *var, *val;
|
|
||||||
|
|
||||||
snprintf(path_buf, sizeof(path_buf), "%s%sfreetdm.conf", g_ftdm_config_dir, FTDM_PATH_SEPARATOR);
|
|
||||||
path = path_buf;
|
|
||||||
|
|
||||||
if ((f = fopen(path, "r")) == 0) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
cfg->file = f;
|
|
||||||
ftdm_set_string(cfg->path, path);
|
|
||||||
|
|
||||||
while (ftdm_config_next_pair(cfg, &var, &val)) {
|
|
||||||
if ((cfg->sectno != last) && !strcmp(cfg->section, file_path)) {
|
|
||||||
cfg->lockto = cfg->sectno;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ftdm_config_close_file(cfg);
|
|
||||||
memset(cfg, 0, sizeof(*cfg));
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
} else {
|
|
||||||
cfg->file = f;
|
|
||||||
ftdm_set_string(cfg->path, path);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ftdm_config_close_file(ftdm_config_t *cfg)
|
|
||||||
{
|
|
||||||
|
|
||||||
if (cfg->file) {
|
|
||||||
fclose(cfg->file);
|
|
||||||
}
|
|
||||||
|
|
||||||
memset(cfg, 0, sizeof(*cfg));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int ftdm_config_next_pair(ftdm_config_t *cfg, char **var, char **val)
|
|
||||||
{
|
|
||||||
int ret = 0;
|
|
||||||
char *p, *end;
|
|
||||||
|
|
||||||
*var = *val = NULL;
|
|
||||||
|
|
||||||
if (!cfg->path) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (;;) {
|
|
||||||
cfg->lineno++;
|
|
||||||
|
|
||||||
if (!fgets(cfg->buf, sizeof(cfg->buf), cfg->file)) {
|
|
||||||
ret = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
*var = cfg->buf;
|
|
||||||
|
|
||||||
if (**var == '[' && (end = strchr(*var, ']')) != 0) {
|
|
||||||
*end = '\0';
|
|
||||||
(*var)++;
|
|
||||||
if (**var == '+') {
|
|
||||||
(*var)++;
|
|
||||||
ftdm_copy_string(cfg->section, *var, sizeof(cfg->section));
|
|
||||||
cfg->sectno++;
|
|
||||||
|
|
||||||
if (cfg->lockto > -1 && cfg->sectno != cfg->lockto) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
cfg->catno = 0;
|
|
||||||
cfg->lineno = 0;
|
|
||||||
*var = (char *) "";
|
|
||||||
*val = (char *) "";
|
|
||||||
return 1;
|
|
||||||
} else {
|
|
||||||
ftdm_copy_string(cfg->category, *var, sizeof(cfg->category));
|
|
||||||
cfg->catno++;
|
|
||||||
}
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if (**var == '#' || **var == ';' || **var == '\n' || **var == '\r') {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!strncmp(*var, "__END__", 7)) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if ((end = strchr(*var, ';')) && *(end+1) == *end) {
|
|
||||||
*end = '\0';
|
|
||||||
end--;
|
|
||||||
} else if ((end = strchr(*var, '\n')) != 0) {
|
|
||||||
if (*(end - 1) == '\r') {
|
|
||||||
end--;
|
|
||||||
}
|
|
||||||
*end = '\0';
|
|
||||||
}
|
|
||||||
|
|
||||||
p = *var;
|
|
||||||
while ((*p == ' ' || *p == '\t') && p != end) {
|
|
||||||
*p = '\0';
|
|
||||||
p++;
|
|
||||||
}
|
|
||||||
*var = p;
|
|
||||||
|
|
||||||
|
|
||||||
if ((*val = strchr(*var, '=')) == 0) {
|
|
||||||
ret = -1;
|
|
||||||
/* log_printf(0, server.log, "Invalid syntax on %s: line %d\n", cfg->path, cfg->lineno); */
|
|
||||||
continue;
|
|
||||||
} else {
|
|
||||||
p = *val - 1;
|
|
||||||
*(*val) = '\0';
|
|
||||||
(*val)++;
|
|
||||||
if (*(*val) == '>') {
|
|
||||||
*(*val) = '\0';
|
|
||||||
(*val)++;
|
|
||||||
}
|
|
||||||
|
|
||||||
while ((*p == ' ' || *p == '\t') && p != *var) {
|
|
||||||
*p = '\0';
|
|
||||||
p--;
|
|
||||||
}
|
|
||||||
|
|
||||||
p = *val;
|
|
||||||
while ((*p == ' ' || *p == '\t') && p != end) {
|
|
||||||
*p = '\0';
|
|
||||||
p++;
|
|
||||||
}
|
|
||||||
*val = p;
|
|
||||||
ret = 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
FT_DECLARE (int) ftdm_config_get_cas_bits(char *strvalue, unsigned char *outbits)
|
|
||||||
{
|
|
||||||
char cas_bits[5];
|
|
||||||
unsigned char bit = 0x8;
|
|
||||||
int x = 0;
|
|
||||||
char *double_colon = strchr(strvalue, ':');
|
|
||||||
if (!double_colon) {
|
|
||||||
ftdm_log(FTDM_LOG_ERROR, "No CAS bits specified: %s, :xxxx definition expected, where x is 1 or 0\n", strvalue);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
double_colon++;
|
|
||||||
*outbits = 0;
|
|
||||||
cas_bits[4] = 0;
|
|
||||||
if (sscanf(double_colon, "%c%c%c%c", &cas_bits[0], &cas_bits[1], &cas_bits[2], &cas_bits[3]) != 4) {
|
|
||||||
ftdm_log(FTDM_LOG_ERROR, "Invalid CAS bits specified: '%s', :xxxx definition expected, where x is 1 or 0\n", double_colon);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
ftdm_log(FTDM_LOG_DEBUG, "CAS bits specification found: %s\n", cas_bits);
|
|
||||||
for (; cas_bits[x]; x++) {
|
|
||||||
if ('1' == cas_bits[x]) {
|
|
||||||
*outbits |= bit;
|
|
||||||
} else if ('0' != cas_bits[x]) {
|
|
||||||
ftdm_log(FTDM_LOG_ERROR, "Invalid CAS pattern specified: %s, just 0 or 1 allowed for each bit\n",
|
|
||||||
strvalue);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
bit >>= 1;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define PARAMETERS_CHUNK_SIZE 20
|
|
||||||
FT_DECLARE(ftdm_status_t) ftdm_conf_node_create(const char *name, ftdm_conf_node_t **node, ftdm_conf_node_t *parent)
|
|
||||||
{
|
|
||||||
ftdm_conf_node_t *newnode;
|
|
||||||
ftdm_conf_node_t *sibling = NULL;
|
|
||||||
|
|
||||||
ftdm_assert_return(name != NULL, FTDM_FAIL, "null node name");
|
|
||||||
|
|
||||||
newnode = ftdm_calloc(1, sizeof(**node));
|
|
||||||
if (!newnode) {
|
|
||||||
return FTDM_MEMERR;
|
|
||||||
}
|
|
||||||
|
|
||||||
strncpy(newnode->name, name, sizeof(newnode->name)-1);
|
|
||||||
newnode->name[sizeof(newnode->name)-1] = 0;
|
|
||||||
|
|
||||||
newnode->parameters = ftdm_calloc(PARAMETERS_CHUNK_SIZE, sizeof(*newnode->parameters));
|
|
||||||
if (!newnode->parameters) {
|
|
||||||
ftdm_safe_free(newnode);
|
|
||||||
return FTDM_MEMERR;
|
|
||||||
}
|
|
||||||
newnode->t_parameters = PARAMETERS_CHUNK_SIZE;
|
|
||||||
|
|
||||||
if (parent) {
|
|
||||||
/* store who my parent is */
|
|
||||||
newnode->parent = parent;
|
|
||||||
|
|
||||||
/* arrange them in FIFO order (newnode should be last) */
|
|
||||||
if (!parent->child) {
|
|
||||||
/* we're the first node being added */
|
|
||||||
parent->child = newnode;
|
|
||||||
} else {
|
|
||||||
if (!parent->last) {
|
|
||||||
/* we're the second node being added */
|
|
||||||
parent->last = newnode;
|
|
||||||
parent->child->next = newnode;
|
|
||||||
newnode->prev = parent->child;
|
|
||||||
} else {
|
|
||||||
/* we're the third or Nth node to be added */
|
|
||||||
sibling = parent->last;
|
|
||||||
sibling->next = newnode;
|
|
||||||
parent->last = newnode;
|
|
||||||
newnode->prev = sibling;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
*node = newnode;
|
|
||||||
|
|
||||||
return FTDM_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
FT_DECLARE(ftdm_status_t) ftdm_conf_node_add_param(ftdm_conf_node_t *node, const char *param, const char *val)
|
|
||||||
{
|
|
||||||
void *newparameters;
|
|
||||||
|
|
||||||
ftdm_assert_return(param != NULL, FTDM_FAIL, "param is null");
|
|
||||||
ftdm_assert_return(val != NULL, FTDM_FAIL, "val is null");
|
|
||||||
|
|
||||||
if (node->n_parameters == node->t_parameters) {
|
|
||||||
newparameters = ftdm_realloc(node->parameters, (node->t_parameters + PARAMETERS_CHUNK_SIZE) * sizeof(*node->parameters));
|
|
||||||
if (!newparameters) {
|
|
||||||
return FTDM_MEMERR;
|
|
||||||
}
|
|
||||||
node->parameters = newparameters;
|
|
||||||
node->t_parameters = node->n_parameters + PARAMETERS_CHUNK_SIZE;
|
|
||||||
}
|
|
||||||
node->parameters[node->n_parameters].var = param;
|
|
||||||
node->parameters[node->n_parameters].val = val;
|
|
||||||
node->n_parameters++;
|
|
||||||
return FTDM_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
FT_DECLARE(ftdm_status_t) ftdm_conf_node_destroy(ftdm_conf_node_t *node)
|
|
||||||
{
|
|
||||||
ftdm_conf_node_t *curr = NULL;
|
|
||||||
ftdm_conf_node_t *child = node->child;
|
|
||||||
while (child) {
|
|
||||||
curr = child;
|
|
||||||
child = curr->next;
|
|
||||||
ftdm_conf_node_destroy(curr);
|
|
||||||
}
|
|
||||||
ftdm_free(node->parameters);
|
|
||||||
ftdm_free(node);
|
|
||||||
return FTDM_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
FT_DECLARE(char *) ftdm_build_dso_path(const char *name, char *path, ftdm_size_t len)
|
|
||||||
{
|
|
||||||
#ifdef WIN32
|
|
||||||
const char *ext = ".dll";
|
|
||||||
//const char *EXT = ".DLL";
|
|
||||||
#elif defined (MACOSX) || defined (DARWIN)
|
|
||||||
const char *ext = ".dylib";
|
|
||||||
//const char *EXT = ".DYLIB";
|
|
||||||
#else
|
|
||||||
const char *ext = ".so";
|
|
||||||
//const char *EXT = ".SO";
|
|
||||||
#endif
|
|
||||||
if (*name == *FTDM_PATH_SEPARATOR) {
|
|
||||||
snprintf(path, len, "%s%s", name, ext);
|
|
||||||
} else {
|
|
||||||
snprintf(path, len, "%s%s%s%s", g_ftdm_mod_dir, FTDM_PATH_SEPARATOR, name, ext);
|
|
||||||
}
|
|
||||||
return path;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 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 noet:
|
|
||||||
*/
|
|
|
@ -1,307 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2010, Sangoma Technologies
|
|
||||||
* Moises Silva <moy@sangoma.com>
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
*
|
|
||||||
* * Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
*
|
|
||||||
* * Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* * Neither the name of the original author; nor the names of any contributors
|
|
||||||
* may be used to endorse or promote products derived from this software
|
|
||||||
* without specific prior written permission.
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
|
||||||
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
|
||||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
||||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
|
||||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
||||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
||||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
||||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*
|
|
||||||
* Contributors:
|
|
||||||
* David Yat Sin <dyatsin@sangoma.com>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef WIN32
|
|
||||||
# if (_WIN32_WINNT < 0x0501)
|
|
||||||
# error "Need to target at least Windows XP/Server 2003 because GetSystemTimes is needed"
|
|
||||||
# endif
|
|
||||||
# include <windows.h>
|
|
||||||
#else /* LINUX */
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "private/ftdm_core.h"
|
|
||||||
#include "ftdm_cpu_monitor.h"
|
|
||||||
struct ftdm_cpu_monitor_stats
|
|
||||||
{
|
|
||||||
/* bool, just used to retrieve the values for the first time and not calculate the percentage of idle time */
|
|
||||||
int valid_last_times;
|
|
||||||
|
|
||||||
/* last calculated percentage of idle time */
|
|
||||||
double last_percentage_of_idle_time;
|
|
||||||
|
|
||||||
#ifdef __linux__
|
|
||||||
/* the cpu feature gets disabled on errors */
|
|
||||||
int disabled;
|
|
||||||
|
|
||||||
/* all of these are the Linux jiffies last retrieved count */
|
|
||||||
unsigned long long last_user_time;
|
|
||||||
unsigned long long last_system_time;
|
|
||||||
unsigned long long last_idle_time;
|
|
||||||
|
|
||||||
unsigned long long last_nice_time;
|
|
||||||
unsigned long long last_irq_time;
|
|
||||||
unsigned long long last_soft_irq_time;
|
|
||||||
unsigned long long last_io_wait_time;
|
|
||||||
unsigned long long last_steal_time;
|
|
||||||
|
|
||||||
/* /proc/stat file descriptor used to retrieve the counters */
|
|
||||||
int procfd;
|
|
||||||
int initd;
|
|
||||||
#elif defined (WIN32) || defined (WIN64)
|
|
||||||
__int64 i64LastUserTime;
|
|
||||||
__int64 i64LastKernelTime;
|
|
||||||
__int64 i64LastIdleTime;
|
|
||||||
#else
|
|
||||||
/* Unsupported */
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
|
|
||||||
#ifdef __linux__
|
|
||||||
static ftdm_status_t ftdm_cpu_read_stats(struct ftdm_cpu_monitor_stats *p,
|
|
||||||
unsigned long long *user,
|
|
||||||
unsigned long long *nice,
|
|
||||||
unsigned long long *system,
|
|
||||||
unsigned long long *idle,
|
|
||||||
unsigned long long *iowait,
|
|
||||||
unsigned long long *irq,
|
|
||||||
unsigned long long *softirq,
|
|
||||||
unsigned long long *steal)
|
|
||||||
{
|
|
||||||
// the output of proc should not change that often from one kernel to other
|
|
||||||
// see fs/proc/proc_misc.c or fs/proc/stat.c in the Linux kernel for more details
|
|
||||||
// also man 5 proc is useful.
|
|
||||||
#define CPU_ELEMENTS_1 7 // change this if you change the format string
|
|
||||||
#define CPU_INFO_FORMAT_1 "cpu %llu %llu %llu %llu %llu %llu %llu"
|
|
||||||
|
|
||||||
#define CPU_ELEMENTS_2 8 // change this if you change the format string
|
|
||||||
#define CPU_INFO_FORMAT_2 "cpu %llu %llu %llu %llu %llu %llu %llu %llu"
|
|
||||||
|
|
||||||
#define CPU_ELEMENTS_3 9 // change this if you change the format string
|
|
||||||
#define CPU_INFO_FORMAT_3 "cpu %llu %llu %llu %llu %llu %llu %llu %llu %llu"
|
|
||||||
|
|
||||||
static const char procfile[] = "/proc/stat";
|
|
||||||
int rc = 0;
|
|
||||||
int myerrno = 0;
|
|
||||||
int elements = 0;
|
|
||||||
const char *cpustr = NULL;
|
|
||||||
char statbuff[1024];
|
|
||||||
unsigned long long guest = 0;
|
|
||||||
|
|
||||||
if (!p->initd) {
|
|
||||||
p->procfd = open(procfile, O_RDONLY, 0);
|
|
||||||
if(p->procfd == -1) {
|
|
||||||
ftdm_log(FTDM_LOG_ERROR, "Failed to open CPU statistics file %s: %s\n", procfile, strerror(myerrno));
|
|
||||||
return FTDM_FAIL;
|
|
||||||
}
|
|
||||||
p->initd = 1;
|
|
||||||
} else {
|
|
||||||
lseek(p->procfd, 0L, SEEK_SET);
|
|
||||||
}
|
|
||||||
|
|
||||||
rc = read(p->procfd, statbuff, sizeof(statbuff) - 1);
|
|
||||||
if (rc <= 0) {
|
|
||||||
myerrno = errno;
|
|
||||||
ftdm_log(FTDM_LOG_ERROR, "Failed to read CPU statistics file %s: %s\n", procfile, strerror(myerrno));
|
|
||||||
return FTDM_FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
cpustr = strstr(statbuff, "cpu ");
|
|
||||||
if (!cpustr) {
|
|
||||||
ftdm_log(FTDM_LOG_ERROR, "wrong format for Linux proc cpu statistics: missing cpu string\n");
|
|
||||||
return FTDM_FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* test each of the known formats starting from the bigger one */
|
|
||||||
elements = sscanf(cpustr, CPU_INFO_FORMAT_3, user, nice, system, idle, iowait, irq, softirq, steal, &guest);
|
|
||||||
if (elements == CPU_ELEMENTS_3) {
|
|
||||||
user += guest; /* guest operating system's run in user space */
|
|
||||||
return FTDM_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
elements = sscanf(cpustr, CPU_INFO_FORMAT_2, user, nice, system, idle, iowait, irq, softirq, steal);
|
|
||||||
if (elements == CPU_ELEMENTS_2) {
|
|
||||||
return FTDM_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
elements = sscanf(cpustr, CPU_INFO_FORMAT_1, user, nice, system, idle, iowait, irq, softirq);
|
|
||||||
if (elements == CPU_ELEMENTS_1) {
|
|
||||||
*steal = 0;
|
|
||||||
return FTDM_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
ftdm_log(FTDM_LOG_ERROR, "Unexpected format for Linux proc cpu statistics:%s\n", cpustr);
|
|
||||||
return FTDM_FAIL;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __linux__
|
|
||||||
FT_DECLARE(ftdm_status_t) ftdm_cpu_get_system_idle_time (struct ftdm_cpu_monitor_stats *p, double *idle_percentage)
|
|
||||||
{
|
|
||||||
unsigned long long user, nice, system, idle, iowait, irq, softirq, steal;
|
|
||||||
unsigned long long usertime, kerneltime, idletime, totaltime, halftime;
|
|
||||||
|
|
||||||
*idle_percentage = 100.0;
|
|
||||||
if (p->disabled) {
|
|
||||||
return FTDM_FAIL;
|
|
||||||
}
|
|
||||||
if (ftdm_cpu_read_stats(p, &user, &nice, &system, &idle, &iowait, &irq, &softirq, &steal)) {
|
|
||||||
ftdm_log(FTDM_LOG_ERROR, "Failed to retrieve Linux CPU statistics - disabling cpu monitor\n");
|
|
||||||
p->disabled = 1;
|
|
||||||
return FTDM_FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!p->valid_last_times) {
|
|
||||||
// we dont strictly need to save all of them but I feel code is more clear if we do
|
|
||||||
p->valid_last_times = 1;
|
|
||||||
p->last_user_time = user;
|
|
||||||
p->last_nice_time = nice;
|
|
||||||
p->last_system_time = system;
|
|
||||||
p->last_irq_time = irq;
|
|
||||||
p->last_soft_irq_time = softirq;
|
|
||||||
p->last_io_wait_time = iowait;
|
|
||||||
p->last_steal_time = steal;
|
|
||||||
p->last_idle_time = idle;
|
|
||||||
p->last_percentage_of_idle_time = 100.0;
|
|
||||||
*idle_percentage = p->last_percentage_of_idle_time;
|
|
||||||
return FTDM_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
usertime = (user - p->last_user_time) + (nice - p->last_nice_time);
|
|
||||||
kerneltime = (system - p->last_system_time) + (irq - p->last_irq_time) + (softirq - p->last_soft_irq_time);
|
|
||||||
kerneltime += (iowait - p->last_io_wait_time);
|
|
||||||
kerneltime += (steal - p->last_steal_time);
|
|
||||||
idletime = (idle - p->last_idle_time);
|
|
||||||
|
|
||||||
totaltime = usertime + kerneltime + idletime;
|
|
||||||
|
|
||||||
if (totaltime <= 0) {
|
|
||||||
// this may happen if not enough time has elapsed and the jiffies counters are the same than the last time we checked
|
|
||||||
// jiffies depend on timer interrupts which depend on the number of HZ compile time setting of the kernel
|
|
||||||
// typical configs set HZ to 100 (that means, 100 jiffies updates per second, that is one each 10ms)
|
|
||||||
// avoid an arithmetic exception and return the same values
|
|
||||||
*idle_percentage = p->last_percentage_of_idle_time;
|
|
||||||
return FTDM_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
halftime = totaltime / 2UL;
|
|
||||||
|
|
||||||
p->last_percentage_of_idle_time = ((100 * idletime + halftime) / totaltime);
|
|
||||||
*idle_percentage = p->last_percentage_of_idle_time;
|
|
||||||
|
|
||||||
p->last_user_time = user;
|
|
||||||
p->last_nice_time = nice;
|
|
||||||
p->last_system_time = system;
|
|
||||||
p->last_irq_time = irq;
|
|
||||||
p->last_soft_irq_time = softirq;
|
|
||||||
p->last_io_wait_time = iowait;
|
|
||||||
p->last_steal_time = steal;
|
|
||||||
p->last_idle_time = idle;
|
|
||||||
|
|
||||||
return FTDM_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
#elif defined (__WINDOWS__)
|
|
||||||
FT_DECLARE(ftdm_status_t) ftdm_cpu_get_system_idle_time(struct ftdm_cpu_monitor_stats *p, double *idle_percentage)
|
|
||||||
{
|
|
||||||
FILETIME idleTime;
|
|
||||||
FILETIME kernelTime;
|
|
||||||
FILETIME userTime;
|
|
||||||
int64_t i64UserTime;
|
|
||||||
int64_t i64KernelTime;
|
|
||||||
int64_t i64IdleTime;
|
|
||||||
|
|
||||||
if (!GetSystemTimes(&idleTime, &kernelTime, &userTime)) {
|
|
||||||
return FTDM_FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
i64UserTime = (int64_t)userTime.dwLowDateTime | ((int64_t)userTime.dwHighDateTime << 32);
|
|
||||||
|
|
||||||
i64KernelTime = (int64_t)kernelTime.dwLowDateTime | ((int64_t)kernelTime.dwHighDateTime << 32);
|
|
||||||
|
|
||||||
i64IdleTime = (int64_t)idleTime.dwLowDateTime | ((int64_t)idleTime.dwHighDateTime << 32);
|
|
||||||
|
|
||||||
if (p->valid_last_times) {
|
|
||||||
int64_t i64User = i64UserTime - p->i64LastUserTime;
|
|
||||||
int64_t i64Kernel = i64KernelTime - p->i64LastKernelTime;
|
|
||||||
int64_t i64Idle = i64IdleTime - p->i64LastIdleTime;
|
|
||||||
int64_t i64System = i64User + i64Kernel;
|
|
||||||
*idle_percentage = 100.0 * i64Idle / i64System;
|
|
||||||
} else {
|
|
||||||
*idle_percentage = 100.0;
|
|
||||||
p->valid_last_times = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Remember current value for the next call */
|
|
||||||
p->i64LastUserTime = i64UserTime;
|
|
||||||
p->i64LastKernelTime = i64KernelTime;
|
|
||||||
p->i64LastIdleTime = i64IdleTime;
|
|
||||||
|
|
||||||
/* Success */
|
|
||||||
return FTDM_SUCCESS;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
/* Unsupported */
|
|
||||||
FT_DECLARE(ftdm_status_t) ftdm_cpu_get_system_idle_time(struct ftdm_cpu_monitor_stats *p, double *idle_percentage)
|
|
||||||
{
|
|
||||||
*idle_percentage = 100.0;
|
|
||||||
return FTDM_FAIL;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
FT_DECLARE(struct ftdm_cpu_monitor_stats*) ftdm_new_cpu_monitor(void)
|
|
||||||
{
|
|
||||||
return calloc(1, sizeof(struct ftdm_cpu_monitor_stats));
|
|
||||||
}
|
|
||||||
|
|
||||||
FT_DECLARE(void) ftdm_delete_cpu_monitor(struct ftdm_cpu_monitor_stats *p)
|
|
||||||
{
|
|
||||||
#ifdef __linux__
|
|
||||||
close(p->procfd);
|
|
||||||
#endif
|
|
||||||
free(p);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* 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 noet:
|
|
||||||
*/
|
|
|
@ -1,126 +0,0 @@
|
||||||
/*
|
|
||||||
* Cross Platform dso/dll load abstraction
|
|
||||||
* Copyright(C) 2008 Michael Jerris
|
|
||||||
*
|
|
||||||
* You may opt to use, copy, modify, merge, publish, distribute and/or sell
|
|
||||||
* copies of the Software, and permit persons to whom the Software is
|
|
||||||
* furnished to do so.
|
|
||||||
*
|
|
||||||
* This work is provided under this license on an "as is" basis, without warranty of any kind,
|
|
||||||
* either expressed or implied, including, without limitation, warranties that the covered code
|
|
||||||
* is free of defects, merchantable, fit for a particular purpose or non-infringing. The entire
|
|
||||||
* risk as to the quality and performance of the covered code is with you. Should any covered
|
|
||||||
* code prove defective in any respect, you (not the initial developer or any other contributor)
|
|
||||||
* assume the cost of any necessary servicing, repair or correction. This disclaimer of warranty
|
|
||||||
* constitutes an essential part of this license. No use of any covered code is authorized hereunder
|
|
||||||
* except under this disclaimer.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "private/ftdm_core.h"
|
|
||||||
#include "ftdm_dso.h"
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#ifdef WIN32
|
|
||||||
#include <windows.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
|
|
||||||
FT_DECLARE(ftdm_status_t) ftdm_dso_destroy(ftdm_dso_lib_t *lib) {
|
|
||||||
if (lib && *lib) {
|
|
||||||
FreeLibrary(*lib);
|
|
||||||
*lib = NULL;
|
|
||||||
}
|
|
||||||
return FTDM_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
FT_DECLARE(ftdm_dso_lib_t) ftdm_dso_open(const char *path, char **err) {
|
|
||||||
HINSTANCE lib;
|
|
||||||
|
|
||||||
lib = LoadLibraryEx(path, NULL, 0);
|
|
||||||
|
|
||||||
if (!lib) {
|
|
||||||
LoadLibraryEx(path, NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!lib) {
|
|
||||||
DWORD error = GetLastError();
|
|
||||||
char tmp[80];
|
|
||||||
sprintf(tmp, "dll open error [%ul]\n", error);
|
|
||||||
*err = ftdm_strdup(tmp);
|
|
||||||
}
|
|
||||||
|
|
||||||
return lib;
|
|
||||||
}
|
|
||||||
|
|
||||||
FT_DECLARE(void*) ftdm_dso_func_sym(ftdm_dso_lib_t lib, const char *sym, char **err) {
|
|
||||||
FARPROC func = GetProcAddress(lib, sym);
|
|
||||||
if (!func) {
|
|
||||||
DWORD error = GetLastError();
|
|
||||||
char tmp[80];
|
|
||||||
sprintf(tmp, "dll sym error [%ul]\n", error);
|
|
||||||
*err = ftdm_strdup(tmp);
|
|
||||||
}
|
|
||||||
return (void *)(intptr_t)func; // this should really be addr - ftdm_dso_func_data
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/*
|
|
||||||
** {========================================================================
|
|
||||||
** This is an implementation of loadlib based on the dlfcn interface.
|
|
||||||
** The dlfcn interface is available in Linux, SunOS, Solaris, IRIX, FreeBSD,
|
|
||||||
** NetBSD, AIX 4.2, HPUX 11, and probably most other Unix flavors, at least
|
|
||||||
** as an emulation layer on top of native functions.
|
|
||||||
** =========================================================================
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#include <dlfcn.h>
|
|
||||||
|
|
||||||
FT_DECLARE(ftdm_status_t) ftdm_dso_destroy(ftdm_dso_lib_t *lib) {
|
|
||||||
int rc;
|
|
||||||
if (lib && *lib) {
|
|
||||||
rc = dlclose(*lib);
|
|
||||||
if (rc) {
|
|
||||||
ftdm_log(FTDM_LOG_ERROR, "Failed to close lib %p: %s\n", *lib, dlerror());
|
|
||||||
return FTDM_FAIL;
|
|
||||||
}
|
|
||||||
ftdm_log(FTDM_LOG_DEBUG, "lib %p was closed with success\n", *lib);
|
|
||||||
*lib = NULL;
|
|
||||||
return FTDM_SUCCESS;
|
|
||||||
}
|
|
||||||
ftdm_log(FTDM_LOG_ERROR, "Invalid pointer provided to ftdm_dso_destroy\n");
|
|
||||||
return FTDM_FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
FT_DECLARE(ftdm_dso_lib_t) ftdm_dso_open(const char *path, char **err) {
|
|
||||||
void *lib = dlopen(path, RTLD_NOW | RTLD_LOCAL);
|
|
||||||
if (lib == NULL) {
|
|
||||||
*err = ftdm_strdup(dlerror());
|
|
||||||
}
|
|
||||||
return lib;
|
|
||||||
}
|
|
||||||
|
|
||||||
FT_DECLARE(void *) ftdm_dso_func_sym(ftdm_dso_lib_t lib, const char *sym, char **err) {
|
|
||||||
void *func = dlsym(lib, sym);
|
|
||||||
if (!func) {
|
|
||||||
*err = ftdm_strdup(dlerror());
|
|
||||||
}
|
|
||||||
return func;
|
|
||||||
}
|
|
||||||
#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 noet:
|
|
||||||
*/
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,234 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2009, Sangoma Technologies
|
|
||||||
* Moises Silva <moy@sangoma.com>
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
*
|
|
||||||
* * Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
*
|
|
||||||
* * Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* * Neither the name of the original author; nor the names of any contributors
|
|
||||||
* may be used to endorse or promote products derived from this software
|
|
||||||
* without specific prior written permission.
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
|
||||||
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
|
||||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
||||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
|
||||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
||||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
||||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
||||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "private/ftdm_core.h"
|
|
||||||
|
|
||||||
static ftdm_status_t ftdm_std_queue_create(ftdm_queue_t **outqueue, ftdm_size_t capacity);
|
|
||||||
static ftdm_status_t ftdm_std_queue_enqueue(ftdm_queue_t *queue, void *obj);
|
|
||||||
static void *ftdm_std_queue_dequeue(ftdm_queue_t *queue);
|
|
||||||
static ftdm_status_t ftdm_std_queue_wait(ftdm_queue_t *queue, int ms);
|
|
||||||
static ftdm_status_t ftdm_std_queue_get_interrupt(ftdm_queue_t *queue, ftdm_interrupt_t **interrupt);
|
|
||||||
static ftdm_status_t ftdm_std_queue_destroy(ftdm_queue_t **inqueue);
|
|
||||||
|
|
||||||
struct ftdm_queue {
|
|
||||||
ftdm_mutex_t *mutex;
|
|
||||||
ftdm_interrupt_t *interrupt;
|
|
||||||
ftdm_size_t capacity;
|
|
||||||
ftdm_size_t size;
|
|
||||||
unsigned rindex;
|
|
||||||
unsigned windex;
|
|
||||||
void **elements;
|
|
||||||
};
|
|
||||||
|
|
||||||
FT_DECLARE_DATA ftdm_queue_handler_t g_ftdm_queue_handler =
|
|
||||||
{
|
|
||||||
/*.create = */ ftdm_std_queue_create,
|
|
||||||
/*.enqueue = */ ftdm_std_queue_enqueue,
|
|
||||||
/*.dequeue = */ ftdm_std_queue_dequeue,
|
|
||||||
/*.wait = */ ftdm_std_queue_wait,
|
|
||||||
/*.get_interrupt = */ ftdm_std_queue_get_interrupt,
|
|
||||||
/*.destroy = */ ftdm_std_queue_destroy
|
|
||||||
};
|
|
||||||
|
|
||||||
FT_DECLARE(ftdm_status_t) ftdm_global_set_queue_handler(ftdm_queue_handler_t *handler)
|
|
||||||
{
|
|
||||||
if (!handler ||
|
|
||||||
!handler->create ||
|
|
||||||
!handler->enqueue ||
|
|
||||||
!handler->dequeue ||
|
|
||||||
!handler->wait ||
|
|
||||||
!handler->get_interrupt ||
|
|
||||||
!handler->destroy) {
|
|
||||||
return FTDM_FAIL;
|
|
||||||
}
|
|
||||||
memcpy(&g_ftdm_queue_handler, handler, sizeof(*handler));
|
|
||||||
return FTDM_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
static ftdm_status_t ftdm_std_queue_create(ftdm_queue_t **outqueue, ftdm_size_t capacity)
|
|
||||||
{
|
|
||||||
ftdm_queue_t *queue = NULL;
|
|
||||||
ftdm_assert_return(outqueue, FTDM_FAIL, "Queue double pointer is null\n");
|
|
||||||
ftdm_assert_return(capacity > 0, FTDM_FAIL, "Queue capacity is not bigger than 0\n");
|
|
||||||
|
|
||||||
*outqueue = NULL;
|
|
||||||
queue = ftdm_calloc(1, sizeof(*queue));
|
|
||||||
if (!queue) {
|
|
||||||
return FTDM_FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
queue->elements = ftdm_calloc(1, (sizeof(void*)*capacity));
|
|
||||||
if (!queue->elements) {
|
|
||||||
goto failed;
|
|
||||||
}
|
|
||||||
queue->capacity = capacity;
|
|
||||||
|
|
||||||
if (ftdm_mutex_create(&queue->mutex) != FTDM_SUCCESS) {
|
|
||||||
goto failed;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ftdm_interrupt_create(&queue->interrupt, FTDM_INVALID_SOCKET, FTDM_NO_FLAGS) != FTDM_SUCCESS) {
|
|
||||||
goto failed;
|
|
||||||
}
|
|
||||||
|
|
||||||
*outqueue = queue;
|
|
||||||
return FTDM_SUCCESS;
|
|
||||||
|
|
||||||
failed:
|
|
||||||
if (queue) {
|
|
||||||
if (queue->interrupt) {
|
|
||||||
ftdm_interrupt_destroy(&queue->interrupt);
|
|
||||||
}
|
|
||||||
if (queue->mutex) {
|
|
||||||
ftdm_mutex_destroy(&queue->mutex);
|
|
||||||
}
|
|
||||||
ftdm_safe_free(queue->elements);
|
|
||||||
ftdm_safe_free(queue);
|
|
||||||
}
|
|
||||||
return FTDM_FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static ftdm_status_t ftdm_std_queue_enqueue(ftdm_queue_t *queue, void *obj)
|
|
||||||
{
|
|
||||||
ftdm_status_t status = FTDM_FAIL;
|
|
||||||
|
|
||||||
ftdm_assert_return(queue != NULL, FTDM_FAIL, "Queue is null!");
|
|
||||||
|
|
||||||
ftdm_mutex_lock(queue->mutex);
|
|
||||||
|
|
||||||
if (queue->windex == queue->capacity) {
|
|
||||||
/* try to see if we can wrap around */
|
|
||||||
queue->windex = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (queue->size != 0 && queue->windex == queue->rindex) {
|
|
||||||
ftdm_log(FTDM_LOG_ERROR, "Failed to enqueue obj %p in queue %p, no more room! windex == rindex == %d!\n", obj, queue, queue->windex);
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
|
|
||||||
queue->elements[queue->windex++] = obj;
|
|
||||||
queue->size++;
|
|
||||||
status = FTDM_SUCCESS;
|
|
||||||
|
|
||||||
/* wake up queue reader */
|
|
||||||
ftdm_interrupt_signal(queue->interrupt);
|
|
||||||
|
|
||||||
done:
|
|
||||||
|
|
||||||
ftdm_mutex_unlock(queue->mutex);
|
|
||||||
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void *ftdm_std_queue_dequeue(ftdm_queue_t *queue)
|
|
||||||
{
|
|
||||||
void *obj = NULL;
|
|
||||||
|
|
||||||
ftdm_assert_return(queue != NULL, NULL, "Queue is null!");
|
|
||||||
|
|
||||||
ftdm_mutex_lock(queue->mutex);
|
|
||||||
|
|
||||||
if (queue->size == 0) {
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
|
|
||||||
obj = queue->elements[queue->rindex];
|
|
||||||
queue->elements[queue->rindex++] = NULL;
|
|
||||||
queue->size--;
|
|
||||||
if (queue->rindex == queue->capacity) {
|
|
||||||
queue->rindex = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
done:
|
|
||||||
|
|
||||||
ftdm_mutex_unlock(queue->mutex);
|
|
||||||
|
|
||||||
return obj;
|
|
||||||
}
|
|
||||||
|
|
||||||
static ftdm_status_t ftdm_std_queue_wait(ftdm_queue_t *queue, int ms)
|
|
||||||
{
|
|
||||||
ftdm_status_t ret;
|
|
||||||
ftdm_assert_return(queue != NULL, FTDM_FAIL, "Queue is null!");
|
|
||||||
|
|
||||||
ftdm_mutex_lock(queue->mutex);
|
|
||||||
|
|
||||||
/* if there is elements in the queue, no need to wait */
|
|
||||||
if (queue->size != 0) {
|
|
||||||
ftdm_mutex_unlock(queue->mutex);
|
|
||||||
return FTDM_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* no elements on the queue, wait for someone to write an element */
|
|
||||||
ret = ftdm_interrupt_wait(queue->interrupt, ms);
|
|
||||||
|
|
||||||
/* got an element or timeout, bail out */
|
|
||||||
ftdm_mutex_unlock(queue->mutex);
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static ftdm_status_t ftdm_std_queue_get_interrupt(ftdm_queue_t *queue, ftdm_interrupt_t **interrupt)
|
|
||||||
{
|
|
||||||
ftdm_assert_return(queue != NULL, FTDM_FAIL, "Queue is null!\n");
|
|
||||||
ftdm_assert_return(interrupt != NULL, FTDM_FAIL, "Queue is null!\n");
|
|
||||||
*interrupt = queue->interrupt;
|
|
||||||
return FTDM_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
static ftdm_status_t ftdm_std_queue_destroy(ftdm_queue_t **inqueue)
|
|
||||||
{
|
|
||||||
ftdm_queue_t *queue = NULL;
|
|
||||||
ftdm_assert_return(inqueue != NULL, FTDM_FAIL, "Queue is null!\n");
|
|
||||||
ftdm_assert_return(*inqueue != NULL, FTDM_FAIL, "Queue is null!\n");
|
|
||||||
|
|
||||||
queue = *inqueue;
|
|
||||||
ftdm_interrupt_destroy(&queue->interrupt);
|
|
||||||
ftdm_mutex_destroy(&queue->mutex);
|
|
||||||
ftdm_safe_free(queue->elements);
|
|
||||||
ftdm_safe_free(queue);
|
|
||||||
*inqueue = NULL;
|
|
||||||
return FTDM_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 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 noet:
|
|
||||||
*/
|
|
|
@ -1,576 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2010, Sangoma Technologies
|
|
||||||
* Moises Silva <moy@sangoma.com>
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
*
|
|
||||||
* * Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
*
|
|
||||||
* * Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* * Neither the name of the original author; nor the names of any contributors
|
|
||||||
* may be used to endorse or promote products derived from this software
|
|
||||||
* without specific prior written permission.
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
|
||||||
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
|
||||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
||||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
|
||||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
||||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
||||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
||||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "private/ftdm_core.h"
|
|
||||||
|
|
||||||
#ifdef __WINDOWS__
|
|
||||||
struct ftdm_timezone {
|
|
||||||
int tz_minuteswest; /* minutes W of Greenwich */
|
|
||||||
int tz_dsttime; /* type of dst correction */
|
|
||||||
};
|
|
||||||
int gettimeofday(struct timeval *tv, struct ftdm_timezone *tz)
|
|
||||||
{
|
|
||||||
FILETIME ft;
|
|
||||||
unsigned __int64 tmpres = 0;
|
|
||||||
static int tzflag;
|
|
||||||
if (NULL != tv) {
|
|
||||||
GetSystemTimeAsFileTime(&ft);
|
|
||||||
tmpres |= ft.dwHighDateTime;
|
|
||||||
tmpres <<= 32;
|
|
||||||
tmpres |= ft.dwLowDateTime;
|
|
||||||
|
|
||||||
/*converting file time to unix epoch */
|
|
||||||
tmpres /= 10; /*convert into microseconds */
|
|
||||||
tmpres -= DELTA_EPOCH_IN_MICROSECS;
|
|
||||||
tv->tv_sec = (long) (tmpres / 1000000UL);
|
|
||||||
tv->tv_usec = (long) (tmpres % 1000000UL);
|
|
||||||
}
|
|
||||||
if (NULL != tz) {
|
|
||||||
if (!tzflag) {
|
|
||||||
_tzset();
|
|
||||||
tzflag++;
|
|
||||||
}
|
|
||||||
tz->tz_minuteswest = _timezone / 60;
|
|
||||||
tz->tz_dsttime = _daylight;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#endif /* __WINDOWS__ */
|
|
||||||
|
|
||||||
typedef struct ftdm_timer ftdm_timer_t;
|
|
||||||
|
|
||||||
static struct {
|
|
||||||
ftdm_sched_t *freeruns;
|
|
||||||
ftdm_mutex_t *mutex;
|
|
||||||
ftdm_bool_t running;
|
|
||||||
} sched_globals;
|
|
||||||
|
|
||||||
struct ftdm_sched {
|
|
||||||
char name[80];
|
|
||||||
ftdm_timer_id_t currid;
|
|
||||||
ftdm_mutex_t *mutex;
|
|
||||||
ftdm_timer_t *timers;
|
|
||||||
int freerun;
|
|
||||||
ftdm_sched_t *next;
|
|
||||||
ftdm_sched_t *prev;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct ftdm_timer {
|
|
||||||
char name[80];
|
|
||||||
ftdm_timer_id_t id;
|
|
||||||
struct timeval time;
|
|
||||||
void *usrdata;
|
|
||||||
ftdm_sched_callback_t callback;
|
|
||||||
ftdm_timer_t *next;
|
|
||||||
ftdm_timer_t *prev;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* FIXME: use ftdm_interrupt_t to wait for new schedules to monitor */
|
|
||||||
#define SCHED_MAX_SLEEP 100
|
|
||||||
static void *run_main_schedule(ftdm_thread_t *thread, void *data)
|
|
||||||
{
|
|
||||||
int32_t timeto;
|
|
||||||
int32_t sleepms;
|
|
||||||
ftdm_status_t status;
|
|
||||||
ftdm_sched_t *current = NULL;
|
|
||||||
|
|
||||||
ftdm_unused_arg(data);
|
|
||||||
ftdm_unused_arg(thread);
|
|
||||||
|
|
||||||
while (ftdm_running()) {
|
|
||||||
|
|
||||||
sleepms = SCHED_MAX_SLEEP;
|
|
||||||
|
|
||||||
ftdm_mutex_lock(sched_globals.mutex);
|
|
||||||
|
|
||||||
if (!sched_globals.freeruns) {
|
|
||||||
|
|
||||||
/* there are no free runs, wait a bit and check again (FIXME: use ftdm_interrupt_t for this) */
|
|
||||||
ftdm_mutex_unlock(sched_globals.mutex);
|
|
||||||
|
|
||||||
if (ftdm_running()) {
|
|
||||||
ftdm_sleep(sleepms);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (current = sched_globals.freeruns; current; current = current->next) {
|
|
||||||
if (!ftdm_running()) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* first run the schedule */
|
|
||||||
ftdm_sched_run(current);
|
|
||||||
|
|
||||||
/* now find out how much time to sleep until running them again */
|
|
||||||
status = ftdm_sched_get_time_to_next_timer(current, &timeto);
|
|
||||||
if (status != FTDM_SUCCESS) {
|
|
||||||
ftdm_log(FTDM_LOG_WARNING, "Failed to get time to next timer for schedule %s, skipping\n", current->name);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* if timeto == -1 we don't want to sleep forever, so keep the last sleepms */
|
|
||||||
if (timeto != -1 && sleepms > timeto) {
|
|
||||||
sleepms = timeto;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ftdm_mutex_unlock(sched_globals.mutex);
|
|
||||||
|
|
||||||
if (ftdm_running()) {
|
|
||||||
ftdm_sleep(sleepms);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ftdm_log(FTDM_LOG_NOTICE, "Main scheduling thread going out ...\n");
|
|
||||||
sched_globals.running = 0;
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
FT_DECLARE(ftdm_status_t) ftdm_sched_global_init()
|
|
||||||
{
|
|
||||||
ftdm_log(FTDM_LOG_DEBUG, "Initializing scheduling API\n");
|
|
||||||
memset(&sched_globals, 0, sizeof(sched_globals));
|
|
||||||
if (ftdm_mutex_create(&sched_globals.mutex) == FTDM_SUCCESS) {
|
|
||||||
return FTDM_SUCCESS;
|
|
||||||
}
|
|
||||||
return FTDM_FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
FT_DECLARE(ftdm_status_t) ftdm_sched_global_destroy()
|
|
||||||
{
|
|
||||||
ftdm_mutex_destroy(&sched_globals.mutex);
|
|
||||||
memset(&sched_globals, 0, sizeof(sched_globals));
|
|
||||||
return FTDM_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
FT_DECLARE(ftdm_status_t) ftdm_sched_free_run(ftdm_sched_t *sched)
|
|
||||||
{
|
|
||||||
ftdm_status_t status = FTDM_FAIL;
|
|
||||||
ftdm_assert_return(sched != NULL, FTDM_EINVAL, "invalid pointer\n");
|
|
||||||
|
|
||||||
ftdm_mutex_lock(sched->mutex);
|
|
||||||
|
|
||||||
ftdm_mutex_lock(sched_globals.mutex);
|
|
||||||
|
|
||||||
if (sched->freerun) {
|
|
||||||
ftdm_log(FTDM_LOG_ERROR, "Schedule %s is already running in free run\n", sched->name);
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
sched->freerun = 1;
|
|
||||||
|
|
||||||
if (sched_globals.running == FTDM_FALSE) {
|
|
||||||
ftdm_log(FTDM_LOG_NOTICE, "Launching main schedule thread\n");
|
|
||||||
status = ftdm_thread_create_detached(run_main_schedule, NULL);
|
|
||||||
if (status != FTDM_SUCCESS) {
|
|
||||||
ftdm_log(FTDM_LOG_CRIT, "Failed to launch main schedule thread\n");
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
sched_globals.running = FTDM_TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
ftdm_log(FTDM_LOG_DEBUG, "Running schedule %s in the main schedule thread\n", sched->name);
|
|
||||||
status = FTDM_SUCCESS;
|
|
||||||
|
|
||||||
/* Add the schedule to the global list of free runs */
|
|
||||||
if (!sched_globals.freeruns) {
|
|
||||||
sched_globals.freeruns = sched;
|
|
||||||
} else {
|
|
||||||
sched->next = sched_globals.freeruns;
|
|
||||||
sched_globals.freeruns->prev = sched;
|
|
||||||
sched_globals.freeruns = sched;
|
|
||||||
}
|
|
||||||
|
|
||||||
done:
|
|
||||||
ftdm_mutex_unlock(sched_globals.mutex);
|
|
||||||
|
|
||||||
ftdm_mutex_unlock(sched->mutex);
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
|
|
||||||
FT_DECLARE(ftdm_bool_t) ftdm_free_sched_running(void)
|
|
||||||
{
|
|
||||||
return sched_globals.running;
|
|
||||||
}
|
|
||||||
|
|
||||||
FT_DECLARE(ftdm_bool_t) ftdm_free_sched_stop(void)
|
|
||||||
{
|
|
||||||
/* currently we really dont stop the thread here, we rely on freetdm being shutdown and ftdm_running() to be false
|
|
||||||
* so the scheduling thread dies and we just wait for it here */
|
|
||||||
uint32_t sanity = 100;
|
|
||||||
while (ftdm_free_sched_running() && --sanity) {
|
|
||||||
ftdm_log(FTDM_LOG_DEBUG, "Waiting for main schedule thread to finish\n");
|
|
||||||
ftdm_sleep(100);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!sanity) {
|
|
||||||
ftdm_log(FTDM_LOG_CRIT, "schedule thread did not stop running, we may crash on shutdown\n");
|
|
||||||
return FTDM_FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
return FTDM_TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
FT_DECLARE(ftdm_status_t) ftdm_sched_create(ftdm_sched_t **sched, const char *name)
|
|
||||||
{
|
|
||||||
ftdm_sched_t *newsched = NULL;
|
|
||||||
|
|
||||||
ftdm_assert_return(sched != NULL, FTDM_EINVAL, "invalid pointer\n");
|
|
||||||
ftdm_assert_return(name != NULL, FTDM_EINVAL, "invalid sched name\n");
|
|
||||||
|
|
||||||
*sched = NULL;
|
|
||||||
|
|
||||||
newsched = ftdm_calloc(1, sizeof(*newsched));
|
|
||||||
if (!newsched) {
|
|
||||||
return FTDM_MEMERR;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ftdm_mutex_create(&newsched->mutex) != FTDM_SUCCESS) {
|
|
||||||
goto failed;
|
|
||||||
}
|
|
||||||
|
|
||||||
ftdm_set_string(newsched->name, name);
|
|
||||||
newsched->currid = 1;
|
|
||||||
|
|
||||||
*sched = newsched;
|
|
||||||
ftdm_log(FTDM_LOG_DEBUG, "Created schedule %s\n", name);
|
|
||||||
return FTDM_SUCCESS;
|
|
||||||
|
|
||||||
failed:
|
|
||||||
ftdm_log(FTDM_LOG_CRIT, "Failed to create schedule\n");
|
|
||||||
|
|
||||||
if (newsched) {
|
|
||||||
if (newsched->mutex) {
|
|
||||||
ftdm_mutex_destroy(&newsched->mutex);
|
|
||||||
}
|
|
||||||
ftdm_safe_free(newsched);
|
|
||||||
}
|
|
||||||
return FTDM_FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
FT_DECLARE(ftdm_status_t) ftdm_sched_run(ftdm_sched_t *sched)
|
|
||||||
{
|
|
||||||
ftdm_status_t status = FTDM_FAIL;
|
|
||||||
ftdm_timer_t *runtimer;
|
|
||||||
ftdm_timer_t *timer;
|
|
||||||
ftdm_sched_callback_t callback;
|
|
||||||
int ms = 0;
|
|
||||||
int rc = -1;
|
|
||||||
void *data;
|
|
||||||
struct timeval now;
|
|
||||||
|
|
||||||
ftdm_assert_return(sched != NULL, FTDM_EINVAL, "sched is null!\n");
|
|
||||||
|
|
||||||
tryagain:
|
|
||||||
|
|
||||||
ftdm_mutex_lock(sched->mutex);
|
|
||||||
|
|
||||||
rc = gettimeofday(&now, NULL);
|
|
||||||
if (rc == -1) {
|
|
||||||
ftdm_log(FTDM_LOG_ERROR, "Failed to retrieve time of day\n");
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
|
|
||||||
timer = sched->timers;
|
|
||||||
while (timer) {
|
|
||||||
runtimer = timer;
|
|
||||||
timer = runtimer->next;
|
|
||||||
|
|
||||||
ms = ((runtimer->time.tv_sec - now.tv_sec) * 1000) +
|
|
||||||
((runtimer->time.tv_usec - now.tv_usec) / 1000);
|
|
||||||
|
|
||||||
if (ms <= 0) {
|
|
||||||
|
|
||||||
if (runtimer == sched->timers) {
|
|
||||||
sched->timers = runtimer->next;
|
|
||||||
if (sched->timers) {
|
|
||||||
sched->timers->prev = NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
callback = runtimer->callback;
|
|
||||||
data = runtimer->usrdata;
|
|
||||||
if (runtimer->next) {
|
|
||||||
runtimer->next->prev = runtimer->prev;
|
|
||||||
}
|
|
||||||
if (runtimer->prev) {
|
|
||||||
runtimer->prev->next = runtimer->next;
|
|
||||||
}
|
|
||||||
|
|
||||||
runtimer->id = 0;
|
|
||||||
ftdm_safe_free(runtimer);
|
|
||||||
|
|
||||||
/* avoid deadlocks by releasing the sched lock before triggering callbacks */
|
|
||||||
ftdm_mutex_unlock(sched->mutex);
|
|
||||||
|
|
||||||
callback(data);
|
|
||||||
/* after calling a callback we must start the scanning again since the
|
|
||||||
* callback or some other thread may have added or cancelled timers to
|
|
||||||
* the linked list */
|
|
||||||
goto tryagain;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
status = FTDM_SUCCESS;
|
|
||||||
done:
|
|
||||||
ftdm_mutex_unlock(sched->mutex);
|
|
||||||
ftdm_unused_arg(sched);
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
|
|
||||||
FT_DECLARE(ftdm_status_t) ftdm_sched_timer(ftdm_sched_t *sched, const char *name,
|
|
||||||
int ms, ftdm_sched_callback_t callback, void *data, ftdm_timer_id_t *timerid)
|
|
||||||
{
|
|
||||||
ftdm_status_t status = FTDM_FAIL;
|
|
||||||
struct timeval now;
|
|
||||||
int rc = 0;
|
|
||||||
ftdm_timer_t *newtimer;
|
|
||||||
|
|
||||||
ftdm_assert_return(sched != NULL, FTDM_EINVAL, "sched is null!\n");
|
|
||||||
ftdm_assert_return(name != NULL, FTDM_EINVAL, "timer name is null!\n");
|
|
||||||
ftdm_assert_return(callback != NULL, FTDM_EINVAL, "sched callback is null!\n");
|
|
||||||
ftdm_assert_return(ms > 0, FTDM_EINVAL, "milliseconds must be bigger than 0!\n");
|
|
||||||
|
|
||||||
if (timerid) {
|
|
||||||
*timerid = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
rc = gettimeofday(&now, NULL);
|
|
||||||
if (rc == -1) {
|
|
||||||
ftdm_log(FTDM_LOG_ERROR, "Failed to retrieve time of day\n");
|
|
||||||
return FTDM_FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
ftdm_mutex_lock(sched->mutex);
|
|
||||||
|
|
||||||
newtimer = ftdm_calloc(1, sizeof(*newtimer));
|
|
||||||
if (!newtimer) {
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
newtimer->id = sched->currid;
|
|
||||||
sched->currid++;
|
|
||||||
if (!sched->currid) {
|
|
||||||
ftdm_log(FTDM_LOG_NOTICE, "Timer id wrap around for sched %s\n", sched->name);
|
|
||||||
/* we do not want currid to be zero since is an invalid id
|
|
||||||
* TODO: check that currid does not exists already in the context, it'd be insane
|
|
||||||
* though, having a timer to live all that time */
|
|
||||||
sched->currid++;
|
|
||||||
}
|
|
||||||
|
|
||||||
ftdm_set_string(newtimer->name, name);
|
|
||||||
newtimer->callback = callback;
|
|
||||||
newtimer->usrdata = data;
|
|
||||||
|
|
||||||
newtimer->time.tv_sec = now.tv_sec + (ms / 1000);
|
|
||||||
newtimer->time.tv_usec = now.tv_usec + (ms % 1000) * 1000;
|
|
||||||
if (newtimer->time.tv_usec >= FTDM_MICROSECONDS_PER_SECOND) {
|
|
||||||
newtimer->time.tv_sec += 1;
|
|
||||||
newtimer->time.tv_usec -= FTDM_MICROSECONDS_PER_SECOND;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!sched->timers) {
|
|
||||||
sched->timers = newtimer;
|
|
||||||
} else {
|
|
||||||
newtimer->next = sched->timers;
|
|
||||||
sched->timers->prev = newtimer;
|
|
||||||
sched->timers = newtimer;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (timerid) {
|
|
||||||
*timerid = newtimer->id;
|
|
||||||
}
|
|
||||||
|
|
||||||
status = FTDM_SUCCESS;
|
|
||||||
done:
|
|
||||||
ftdm_mutex_unlock(sched->mutex);
|
|
||||||
ftdm_unused_arg(sched);
|
|
||||||
ftdm_unused_arg(name);
|
|
||||||
ftdm_unused_arg(ms);
|
|
||||||
ftdm_unused_arg(callback);
|
|
||||||
ftdm_unused_arg(data);
|
|
||||||
ftdm_unused_arg(timerid);
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
|
|
||||||
FT_DECLARE(ftdm_status_t) ftdm_sched_get_time_to_next_timer(const ftdm_sched_t *sched, int32_t *timeto)
|
|
||||||
{
|
|
||||||
ftdm_status_t status = FTDM_FAIL;
|
|
||||||
int res = -1;
|
|
||||||
int ms = 0;
|
|
||||||
struct timeval currtime;
|
|
||||||
ftdm_timer_t *current = NULL;
|
|
||||||
ftdm_timer_t *winner = NULL;
|
|
||||||
|
|
||||||
/* forever by default */
|
|
||||||
*timeto = -1;
|
|
||||||
|
|
||||||
ftdm_mutex_lock(sched->mutex);
|
|
||||||
|
|
||||||
res = gettimeofday(&currtime, NULL);
|
|
||||||
if (-1 == res) {
|
|
||||||
ftdm_log(FTDM_LOG_ERROR, "Failed to get next event time\n");
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
status = FTDM_SUCCESS;
|
|
||||||
current = sched->timers;
|
|
||||||
while (current) {
|
|
||||||
/* if no winner, set this as winner */
|
|
||||||
if (!winner) {
|
|
||||||
winner = current;
|
|
||||||
}
|
|
||||||
current = current->next;
|
|
||||||
/* if no more timers, return the winner */
|
|
||||||
if (!current) {
|
|
||||||
ms = (((winner->time.tv_sec - currtime.tv_sec) * 1000) +
|
|
||||||
((winner->time.tv_usec - currtime.tv_usec) / 1000));
|
|
||||||
|
|
||||||
/* if the timer is expired already, return 0 to attend immediately */
|
|
||||||
if (ms < 0) {
|
|
||||||
*timeto = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
*timeto = ms;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* if the winner timer is after the current timer, then we have a new winner */
|
|
||||||
if (winner->time.tv_sec > current->time.tv_sec
|
|
||||||
|| (winner->time.tv_sec == current->time.tv_sec &&
|
|
||||||
winner->time.tv_usec > current->time.tv_usec)) {
|
|
||||||
winner = current;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
done:
|
|
||||||
ftdm_mutex_unlock(sched->mutex);
|
|
||||||
ftdm_unused_arg(timeto);
|
|
||||||
ftdm_unused_arg(sched);
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
|
|
||||||
FT_DECLARE(ftdm_status_t) ftdm_sched_cancel_timer(ftdm_sched_t *sched, ftdm_timer_id_t timerid)
|
|
||||||
{
|
|
||||||
ftdm_status_t status = FTDM_FAIL;
|
|
||||||
ftdm_timer_t *timer;
|
|
||||||
|
|
||||||
ftdm_assert_return(sched != NULL, FTDM_EINVAL, "sched is null!\n");
|
|
||||||
|
|
||||||
if (!timerid) {
|
|
||||||
return FTDM_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
ftdm_mutex_lock(sched->mutex);
|
|
||||||
|
|
||||||
/* look for the timer and destroy it */
|
|
||||||
for (timer = sched->timers; timer; timer = timer->next) {
|
|
||||||
if (timer->id == timerid) {
|
|
||||||
if (timer == sched->timers) {
|
|
||||||
/* it's the head timer, put a new head */
|
|
||||||
sched->timers = timer->next;
|
|
||||||
}
|
|
||||||
if (timer->prev) {
|
|
||||||
timer->prev->next = timer->next;
|
|
||||||
}
|
|
||||||
if (timer->next) {
|
|
||||||
timer->next->prev = timer->prev;
|
|
||||||
}
|
|
||||||
ftdm_safe_free(timer);
|
|
||||||
status = FTDM_SUCCESS;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ftdm_mutex_unlock(sched->mutex);
|
|
||||||
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
|
|
||||||
FT_DECLARE(ftdm_status_t) ftdm_sched_destroy(ftdm_sched_t **insched)
|
|
||||||
{
|
|
||||||
ftdm_sched_t *sched = NULL;
|
|
||||||
ftdm_timer_t *timer;
|
|
||||||
ftdm_timer_t *deltimer;
|
|
||||||
ftdm_assert_return(insched != NULL, FTDM_EINVAL, "sched is null!\n");
|
|
||||||
ftdm_assert_return(*insched != NULL, FTDM_EINVAL, "sched is null!\n");
|
|
||||||
|
|
||||||
sched = *insched;
|
|
||||||
|
|
||||||
/* since destroying a sched may affect the global list, we gotta check */
|
|
||||||
ftdm_mutex_lock(sched_globals.mutex);
|
|
||||||
|
|
||||||
/* if we're head, replace head with our next (whatever our next is, even null will do) */
|
|
||||||
if (sched == sched_globals.freeruns) {
|
|
||||||
sched_globals.freeruns = sched->next;
|
|
||||||
}
|
|
||||||
/* if we have a previous member (then we were not head) set our previous next to our next */
|
|
||||||
if (sched->prev) {
|
|
||||||
sched->prev->next = sched->next;
|
|
||||||
}
|
|
||||||
/* if we have a next then set their prev to our prev (if we were head prev will be null and sched->next is already the new head) */
|
|
||||||
if (sched->next) {
|
|
||||||
sched->next->prev = sched->prev;
|
|
||||||
}
|
|
||||||
|
|
||||||
ftdm_mutex_unlock(sched_globals.mutex);
|
|
||||||
|
|
||||||
/* now grab the sched mutex */
|
|
||||||
ftdm_mutex_lock(sched->mutex);
|
|
||||||
|
|
||||||
timer = sched->timers;
|
|
||||||
while (timer) {
|
|
||||||
deltimer = timer;
|
|
||||||
timer = timer->next;
|
|
||||||
ftdm_safe_free(deltimer);
|
|
||||||
}
|
|
||||||
|
|
||||||
ftdm_log(FTDM_LOG_DEBUG, "Destroying schedule %s\n", sched->name);
|
|
||||||
|
|
||||||
ftdm_mutex_unlock(sched->mutex);
|
|
||||||
|
|
||||||
ftdm_mutex_destroy(&sched->mutex);
|
|
||||||
|
|
||||||
ftdm_safe_free(sched);
|
|
||||||
|
|
||||||
*insched = NULL;
|
|
||||||
return FTDM_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 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 noet:
|
|
||||||
*/
|
|
|
@ -1,575 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2010, Sangoma Technologies
|
|
||||||
* Moises Silva <moy@sangoma.com>
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
*
|
|
||||||
* * Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
*
|
|
||||||
* * Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* * Neither the name of the original author; nor the names of any contributors
|
|
||||||
* may be used to endorse or promote products derived from this software
|
|
||||||
* without specific prior written permission.
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
|
||||||
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
|
||||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
||||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
|
||||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
||||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
||||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
||||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "private/ftdm_core.h"
|
|
||||||
|
|
||||||
FTDM_ENUM_NAMES(CHANNEL_STATE_NAMES, CHANNEL_STATE_STRINGS)
|
|
||||||
FTDM_STR2ENUM(ftdm_str2ftdm_channel_state, ftdm_channel_state2str, ftdm_channel_state_t, CHANNEL_STATE_NAMES, FTDM_CHANNEL_STATE_INVALID)
|
|
||||||
|
|
||||||
FTDM_ENUM_NAMES(CHANNEL_STATE_STATUS_NAMES, CHANNEL_STATE_STATUS_STRINGS)
|
|
||||||
FTDM_STR2ENUM(ftdm_str2ftdm_state_status, ftdm_state_status2str, ftdm_state_status_t, CHANNEL_STATE_STATUS_NAMES, FTDM_STATE_STATUS_INVALID)
|
|
||||||
|
|
||||||
static ftdm_status_t ftdm_core_set_state(const char *file, const char *func, int line, ftdm_channel_t *ftdmchan, ftdm_channel_state_t state, int waitrq);
|
|
||||||
|
|
||||||
FT_DECLARE(ftdm_status_t) _ftdm_channel_complete_state(const char *file, const char *func, int line, ftdm_channel_t *fchan)
|
|
||||||
{
|
|
||||||
uint8_t hindex = 0;
|
|
||||||
ftdm_time_t diff = 0;
|
|
||||||
ftdm_channel_state_t state = fchan->state;
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
/* I could not perform this sanity check without more disruptive changes. Ideally we should check here if the signaling module completing the state
|
|
||||||
executed a state processor (called ftdm_channel_advance_states() which call fchan->span->state_processor(fchan)) for the state. That is just a
|
|
||||||
sanity check, as in the past we had at least one bug where the signaling module set the state and then accidentally changed the state to a new one
|
|
||||||
without calling ftdm_channel_advance_states(), meaning the state processor for the first state was not executed and that lead to unexpected behavior.
|
|
||||||
|
|
||||||
If we want to be able to perform this kind of sanity check it would be nice to add a new state status (FTDM_STATE_STATUS_PROCESSING), the function
|
|
||||||
ftdm_channel_advance_states() would set the state_status to PROCESSING and then the check below for STATUS_NEW would be valid. Currently is not
|
|
||||||
valid because the signaling module may be completing the state at the end of the state_processor callback and therefore the state will still be
|
|
||||||
in STATUS_NEW, and is perfectly valid ... */
|
|
||||||
|
|
||||||
if (fchan->state_status == FTDM_STATE_STATUS_NEW) {
|
|
||||||
ftdm_log_chan_ex(fchan, file, func, line, FTDM_LOG_LEVEL_CRIT,
|
|
||||||
"Asking to complete state change from %s to %s in %llums, but the state is still unprocessed (this might be a bug!)\n",
|
|
||||||
ftdm_channel_state2str(fchan->last_state), ftdm_channel_state2str(state), diff);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (fchan->state_status == FTDM_STATE_STATUS_COMPLETED) {
|
|
||||||
ftdm_assert_return(!ftdm_test_flag(fchan, FTDM_CHANNEL_STATE_CHANGE), FTDM_FAIL, "State change flag set but state is already completed\n");
|
|
||||||
return FTDM_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
ftdm_usrmsg_free(&fchan->usrmsg);
|
|
||||||
|
|
||||||
ftdm_clear_flag(fchan, FTDM_CHANNEL_STATE_CHANGE);
|
|
||||||
|
|
||||||
if (state == FTDM_CHANNEL_STATE_PROGRESS) {
|
|
||||||
ftdm_set_flag(fchan, FTDM_CHANNEL_PROGRESS);
|
|
||||||
} else if (state == FTDM_CHANNEL_STATE_PROGRESS_MEDIA) {
|
|
||||||
ftdm_set_flag(fchan, FTDM_CHANNEL_PROGRESS);
|
|
||||||
ftdm_test_and_set_media(fchan);
|
|
||||||
} else if (state == FTDM_CHANNEL_STATE_UP) {
|
|
||||||
ftdm_set_flag(fchan, FTDM_CHANNEL_PROGRESS);
|
|
||||||
ftdm_set_flag(fchan, FTDM_CHANNEL_ANSWERED);
|
|
||||||
ftdm_test_and_set_media(fchan);
|
|
||||||
} else if (state == FTDM_CHANNEL_STATE_DIALING) {
|
|
||||||
ftdm_sigmsg_t msg;
|
|
||||||
memset(&msg, 0, sizeof(msg));
|
|
||||||
msg.channel = fchan;
|
|
||||||
msg.event_id = FTDM_SIGEVENT_DIALING;
|
|
||||||
ftdm_span_send_signal(fchan->span, &msg);
|
|
||||||
} else if (state == FTDM_CHANNEL_STATE_HANGUP) {
|
|
||||||
ftdm_set_echocancel_call_end(fchan);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* MAINTENANCE WARNING
|
|
||||||
* we're assuming an indication performed
|
|
||||||
* via state change will involve a single state change */
|
|
||||||
ftdm_ack_indication(fchan, fchan->indication, FTDM_SUCCESS);
|
|
||||||
|
|
||||||
hindex = (fchan->hindex == 0) ? (ftdm_array_len(fchan->history) - 1) : (fchan->hindex - 1);
|
|
||||||
|
|
||||||
ftdm_assert(!fchan->history[hindex].end_time, "End time should be zero!\n");
|
|
||||||
|
|
||||||
fchan->history[hindex].end_time = ftdm_current_time_in_ms();
|
|
||||||
fchan->last_state_change_time = ftdm_current_time_in_ms();
|
|
||||||
|
|
||||||
fchan->state_status = FTDM_STATE_STATUS_COMPLETED;
|
|
||||||
|
|
||||||
diff = fchan->history[hindex].end_time - fchan->history[hindex].time;
|
|
||||||
|
|
||||||
ftdm_log_chan_ex(fchan, file, func, line, FTDM_LOG_LEVEL_DEBUG, "Completed state change from %s to %s in %"FTDM_TIME_FMT" ms\n",
|
|
||||||
ftdm_channel_state2str(fchan->last_state), ftdm_channel_state2str(state), diff);
|
|
||||||
|
|
||||||
|
|
||||||
if (ftdm_test_flag(fchan, FTDM_CHANNEL_BLOCKING)) {
|
|
||||||
ftdm_clear_flag(fchan, FTDM_CHANNEL_BLOCKING);
|
|
||||||
ftdm_interrupt_signal(fchan->state_completed_interrupt);
|
|
||||||
}
|
|
||||||
|
|
||||||
return FTDM_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
FT_DECLARE(ftdm_status_t) _ftdm_set_state(const char *file, const char *func, int line,
|
|
||||||
ftdm_channel_t *fchan, ftdm_channel_state_t state)
|
|
||||||
{
|
|
||||||
if (fchan->state_status != FTDM_STATE_STATUS_COMPLETED) {
|
|
||||||
/* the current state is not completed, setting a new state from a signaling module
|
|
||||||
when the current state is not completed is equivalent to implicitly acknowledging
|
|
||||||
the current state */
|
|
||||||
_ftdm_channel_complete_state(file, func, line, fchan);
|
|
||||||
}
|
|
||||||
return ftdm_core_set_state(file, func, line, fchan, state, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int ftdm_parse_state_map(ftdm_channel_t *ftdmchan, ftdm_channel_state_t state, ftdm_state_map_t *state_map)
|
|
||||||
{
|
|
||||||
int x = 0, ok = 0;
|
|
||||||
ftdm_state_direction_t direction = ftdm_test_flag(ftdmchan, FTDM_CHANNEL_OUTBOUND) ? ZSD_OUTBOUND : ZSD_INBOUND;
|
|
||||||
|
|
||||||
for(x = 0; x < FTDM_MAP_NODE_SIZE; x++) {
|
|
||||||
int i = 0, proceed = 0;
|
|
||||||
if (!state_map->nodes[x].type) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (state_map->nodes[x].direction != direction) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (state_map->nodes[x].check_states[0] == FTDM_CHANNEL_STATE_ANY) {
|
|
||||||
proceed = 1;
|
|
||||||
} else {
|
|
||||||
for(i = 0; i < FTDM_MAP_MAX; i++) {
|
|
||||||
if (state_map->nodes[x].check_states[i] == ftdmchan->state) {
|
|
||||||
proceed = 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!proceed) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
for(i = 0; i < FTDM_MAP_MAX; i++) {
|
|
||||||
ok = (state_map->nodes[x].type == ZSM_ACCEPTABLE);
|
|
||||||
if (state_map->nodes[x].states[i] == FTDM_CHANNEL_STATE_END) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (state_map->nodes[x].states[i] == state) {
|
|
||||||
ok = !ok;
|
|
||||||
goto end;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
end:
|
|
||||||
|
|
||||||
return ok;
|
|
||||||
}
|
|
||||||
|
|
||||||
FT_DECLARE(ftdm_status_t) ftdm_channel_cancel_state(const char *file, const char *func, int line, ftdm_channel_t *fchan)
|
|
||||||
{
|
|
||||||
ftdm_time_t diff;
|
|
||||||
ftdm_channel_state_t state;
|
|
||||||
ftdm_channel_state_t last_state;
|
|
||||||
uint8_t hindex = 0;
|
|
||||||
|
|
||||||
if (!ftdm_test_flag(fchan, FTDM_CHANNEL_STATE_CHANGE)) {
|
|
||||||
ftdm_log_chan(fchan, FTDM_LOG_WARNING, "Cannot cancel state change from %s to %s, it was already processed\n",
|
|
||||||
ftdm_channel_state2str(fchan->last_state), ftdm_channel_state2str(fchan->state));
|
|
||||||
return FTDM_FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (fchan->state_status != FTDM_STATE_STATUS_NEW) {
|
|
||||||
ftdm_log_chan(fchan, FTDM_LOG_WARNING, "Failed to cancel state change from %s to %s, state is not new anymore\n",
|
|
||||||
ftdm_channel_state2str(fchan->last_state), ftdm_channel_state2str(fchan->state));
|
|
||||||
return FTDM_FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* compute the last history index */
|
|
||||||
hindex = (fchan->hindex == 0) ? (ftdm_array_len(fchan->history) - 1) : (fchan->hindex - 1);
|
|
||||||
diff = fchan->history[hindex].end_time - fchan->history[hindex].time;
|
|
||||||
|
|
||||||
/* go back in time and revert the state to the previous state */
|
|
||||||
state = fchan->state;
|
|
||||||
last_state = fchan->last_state;
|
|
||||||
|
|
||||||
fchan->state = fchan->last_state;
|
|
||||||
fchan->state_status = FTDM_STATE_STATUS_COMPLETED;
|
|
||||||
fchan->last_state = fchan->history[hindex].last_state;
|
|
||||||
fchan->hindex = hindex;
|
|
||||||
|
|
||||||
/* clear the state change flag */
|
|
||||||
ftdm_clear_flag(fchan, FTDM_CHANNEL_STATE_CHANGE);
|
|
||||||
|
|
||||||
/* ack any pending indications as cancelled */
|
|
||||||
ftdm_ack_indication(fchan, fchan->indication, FTDM_ECANCELED);
|
|
||||||
|
|
||||||
/* wake up anyone sleeping waiting for the state change to complete, it won't ever be completed */
|
|
||||||
if (ftdm_test_flag(fchan, FTDM_CHANNEL_BLOCKING)) {
|
|
||||||
ftdm_clear_flag(fchan, FTDM_CHANNEL_BLOCKING);
|
|
||||||
ftdm_interrupt_signal(fchan->state_completed_interrupt);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* NOTE
|
|
||||||
* we could potentially also take out the channel from the pendingchans queue, but I believe is easier just leave it,
|
|
||||||
* the only side effect will be a call to ftdm_channel_advance_states() for a channel that has nothing to advance */
|
|
||||||
ftdm_log_chan_ex(fchan, file, func, line, FTDM_LOG_LEVEL_DEBUG, "Cancelled state change from %s to %s in %"FTDM_TIME_FMT" ms\n",
|
|
||||||
ftdm_channel_state2str(last_state), ftdm_channel_state2str(state), diff);
|
|
||||||
|
|
||||||
return FTDM_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
FT_DECLARE(ftdm_status_t) ftdm_channel_set_state(const char *file, const char *func, int line, ftdm_channel_t *ftdmchan, ftdm_channel_state_t state, int waitrq, ftdm_usrmsg_t *usrmsg)
|
|
||||||
{
|
|
||||||
ftdm_channel_save_usrmsg(ftdmchan, usrmsg);
|
|
||||||
|
|
||||||
if (ftdm_core_set_state(file, func, line, ftdmchan, state, waitrq) != FTDM_SUCCESS) {
|
|
||||||
ftdm_usrmsg_free(&ftdmchan->usrmsg);
|
|
||||||
}
|
|
||||||
return FTDM_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* this function MUST be called with the channel lock held. If waitrq == 1, the channel will be unlocked/locked (never call it with waitrq == 1 with an lock recursivity > 1) */
|
|
||||||
#define DEFAULT_WAIT_TIME 1000
|
|
||||||
static ftdm_status_t ftdm_core_set_state(const char *file, const char *func, int line, ftdm_channel_t *ftdmchan, ftdm_channel_state_t state, int waitrq)
|
|
||||||
{
|
|
||||||
ftdm_status_t status;
|
|
||||||
int ok = 1;
|
|
||||||
int waitms = DEFAULT_WAIT_TIME;
|
|
||||||
|
|
||||||
if (!ftdm_test_flag(ftdmchan, FTDM_CHANNEL_READY)) {
|
|
||||||
ftdm_log_chan_ex(ftdmchan, file, func, line, FTDM_LOG_LEVEL_ERROR, "Ignored state change request from %s to %s, the channel is not ready\n",
|
|
||||||
ftdm_channel_state2str(ftdmchan->state), ftdm_channel_state2str(state));
|
|
||||||
return FTDM_FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ftdmchan->state_status != FTDM_STATE_STATUS_COMPLETED) {
|
|
||||||
ftdm_log_chan_ex(ftdmchan, file, func, line, FTDM_LOG_LEVEL_ERROR,
|
|
||||||
"Ignored state change request from %s to %s, the previous state change has not been processed yet (status = %s)\n",
|
|
||||||
ftdm_channel_state2str(ftdmchan->state), ftdm_channel_state2str(state),
|
|
||||||
ftdm_state_status2str(ftdmchan->state_status));
|
|
||||||
return FTDM_FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ftdmchan->state == state) {
|
|
||||||
ftdm_log_chan_ex(ftdmchan, file, func, line, FTDM_LOG_LEVEL_WARNING, "Why bother changing state from %s to %s\n", ftdm_channel_state2str(ftdmchan->state), ftdm_channel_state2str(state));
|
|
||||||
return FTDM_FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!ftdmchan->state_completed_interrupt) {
|
|
||||||
status = ftdm_interrupt_create(&ftdmchan->state_completed_interrupt, FTDM_INVALID_SOCKET, FTDM_NO_FLAGS);
|
|
||||||
if (status != FTDM_SUCCESS) {
|
|
||||||
ftdm_log_chan_ex(ftdmchan, file, func, line, FTDM_LOG_LEVEL_CRIT,
|
|
||||||
"Failed to create state change interrupt when moving from %s to %s\n", ftdm_channel_state2str(ftdmchan->state), ftdm_channel_state2str(state));
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_NATIVE_SIGBRIDGE)) {
|
|
||||||
goto perform_state_change;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ftdmchan->span->state_map) {
|
|
||||||
ok = ftdm_parse_state_map(ftdmchan, state, ftdmchan->span->state_map);
|
|
||||||
goto end;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* basic core state validation (by-passed if the signaling module provides a state_map) */
|
|
||||||
switch(ftdmchan->state) {
|
|
||||||
case FTDM_CHANNEL_STATE_HANGUP:
|
|
||||||
case FTDM_CHANNEL_STATE_TERMINATING:
|
|
||||||
{
|
|
||||||
ok = 0;
|
|
||||||
switch(state) {
|
|
||||||
case FTDM_CHANNEL_STATE_DOWN:
|
|
||||||
case FTDM_CHANNEL_STATE_BUSY:
|
|
||||||
case FTDM_CHANNEL_STATE_RESTART:
|
|
||||||
ok = 1;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case FTDM_CHANNEL_STATE_UP:
|
|
||||||
{
|
|
||||||
ok = 1;
|
|
||||||
switch(state) {
|
|
||||||
case FTDM_CHANNEL_STATE_PROGRESS:
|
|
||||||
case FTDM_CHANNEL_STATE_PROGRESS_MEDIA:
|
|
||||||
case FTDM_CHANNEL_STATE_RING:
|
|
||||||
ok = 0;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case FTDM_CHANNEL_STATE_DOWN:
|
|
||||||
{
|
|
||||||
ok = 0;
|
|
||||||
|
|
||||||
switch(state) {
|
|
||||||
case FTDM_CHANNEL_STATE_DIALTONE:
|
|
||||||
case FTDM_CHANNEL_STATE_COLLECT:
|
|
||||||
case FTDM_CHANNEL_STATE_DIALING:
|
|
||||||
case FTDM_CHANNEL_STATE_RING:
|
|
||||||
case FTDM_CHANNEL_STATE_PROGRESS_MEDIA:
|
|
||||||
case FTDM_CHANNEL_STATE_PROGRESS:
|
|
||||||
case FTDM_CHANNEL_STATE_IDLE:
|
|
||||||
case FTDM_CHANNEL_STATE_GET_CALLERID:
|
|
||||||
case FTDM_CHANNEL_STATE_GENRING:
|
|
||||||
ok = 1;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case FTDM_CHANNEL_STATE_BUSY:
|
|
||||||
{
|
|
||||||
switch(state) {
|
|
||||||
case FTDM_CHANNEL_STATE_UP:
|
|
||||||
ok = 0;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case FTDM_CHANNEL_STATE_RING:
|
|
||||||
{
|
|
||||||
switch(state) {
|
|
||||||
case FTDM_CHANNEL_STATE_UP:
|
|
||||||
ok = 1;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
end:
|
|
||||||
|
|
||||||
if (!ok) {
|
|
||||||
ftdm_log_chan_ex(ftdmchan, file, func, line, FTDM_LOG_LEVEL_WARNING, "VETO state change from %s to %s\n", ftdm_channel_state2str(ftdmchan->state), ftdm_channel_state2str(state));
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
|
|
||||||
perform_state_change:
|
|
||||||
|
|
||||||
ftdm_log_chan_ex(ftdmchan, file, func, line, FTDM_LOG_LEVEL_DEBUG, "Changed state from %s to %s\n", ftdm_channel_state2str(ftdmchan->state), ftdm_channel_state2str(state));
|
|
||||||
ftdmchan->last_state = ftdmchan->state;
|
|
||||||
ftdmchan->state = state;
|
|
||||||
ftdmchan->state_status = FTDM_STATE_STATUS_NEW;
|
|
||||||
ftdmchan->history[ftdmchan->hindex].file = file;
|
|
||||||
ftdmchan->history[ftdmchan->hindex].func = func;
|
|
||||||
ftdmchan->history[ftdmchan->hindex].line = line;
|
|
||||||
ftdmchan->history[ftdmchan->hindex].state = ftdmchan->state;
|
|
||||||
ftdmchan->history[ftdmchan->hindex].last_state = ftdmchan->last_state;
|
|
||||||
ftdmchan->history[ftdmchan->hindex].time = ftdm_current_time_in_ms();
|
|
||||||
ftdmchan->history[ftdmchan->hindex].end_time = 0;
|
|
||||||
ftdmchan->hindex++;
|
|
||||||
if (ftdmchan->hindex == ftdm_array_len(ftdmchan->history)) {
|
|
||||||
ftdmchan->hindex = 0;
|
|
||||||
}
|
|
||||||
ftdm_set_flag(ftdmchan, FTDM_CHANNEL_STATE_CHANGE);
|
|
||||||
|
|
||||||
if (ftdmchan->span->pendingchans) {
|
|
||||||
ftdm_queue_enqueue(ftdmchan->span->pendingchans, ftdmchan);
|
|
||||||
} else {
|
|
||||||
/* there is a potential deadlock here, if a signaling module is processing
|
|
||||||
* state changes while the ftdm_span_stop() function is called, the signaling
|
|
||||||
* thread will block until it can acquire the span lock, but the thread calling
|
|
||||||
* ftdm_span_stop() which holds the span lock is waiting on the signaling thread
|
|
||||||
* to finish ... The only reason to acquire the span lock is this flag, new
|
|
||||||
* signaling modules should use the pendingchans queue instead of this flag,
|
|
||||||
* as of today a few modules need still to be updated before we can get rid of
|
|
||||||
* this flag (ie, ftmod_libpri, ftmod_isdn, ftmod_analog) */
|
|
||||||
ftdm_set_flag_locked(ftdmchan->span, FTDM_SPAN_STATE_CHANGE);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_NONBLOCK)) {
|
|
||||||
/* the channel should not block waiting for state processing */
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!waitrq) {
|
|
||||||
/* no waiting was requested */
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* let's wait for the state change to be completed by the signaling stack */
|
|
||||||
ftdm_set_flag(ftdmchan, FTDM_CHANNEL_BLOCKING);
|
|
||||||
|
|
||||||
ftdm_mutex_unlock(ftdmchan->mutex);
|
|
||||||
|
|
||||||
status = ftdm_interrupt_wait(ftdmchan->state_completed_interrupt, waitms);
|
|
||||||
|
|
||||||
ftdm_mutex_lock(ftdmchan->mutex);
|
|
||||||
|
|
||||||
if (status != FTDM_SUCCESS) {
|
|
||||||
ftdm_clear_flag(ftdmchan, FTDM_CHANNEL_BLOCKING);
|
|
||||||
ftdm_log_chan_ex(ftdmchan, file, func, line,
|
|
||||||
FTDM_LOG_LEVEL_WARNING, "state change from %s to %s was most likely not completed after aprox %dms\n",
|
|
||||||
ftdm_channel_state2str(ftdmchan->last_state), ftdm_channel_state2str(state), DEFAULT_WAIT_TIME);
|
|
||||||
ok = 0;
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
done:
|
|
||||||
return ok ? FTDM_SUCCESS : FTDM_FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
FT_DECLARE(int) ftdm_channel_get_state(const ftdm_channel_t *ftdmchan)
|
|
||||||
{
|
|
||||||
int state;
|
|
||||||
ftdm_channel_lock(ftdmchan);
|
|
||||||
state = ftdmchan->state;
|
|
||||||
ftdm_channel_unlock(ftdmchan);
|
|
||||||
return state;
|
|
||||||
}
|
|
||||||
|
|
||||||
FT_DECLARE(const char *) ftdm_channel_get_state_str(const ftdm_channel_t *ftdmchan)
|
|
||||||
{
|
|
||||||
const char *state;
|
|
||||||
ftdm_channel_lock(ftdmchan);
|
|
||||||
state = ftdm_channel_state2str(ftdmchan->state);
|
|
||||||
ftdm_channel_unlock(ftdmchan);
|
|
||||||
return state;
|
|
||||||
}
|
|
||||||
|
|
||||||
FT_DECLARE(int) ftdm_channel_get_last_state(const ftdm_channel_t *ftdmchan)
|
|
||||||
{
|
|
||||||
int last_state;
|
|
||||||
ftdm_channel_lock(ftdmchan);
|
|
||||||
last_state = ftdmchan->last_state;
|
|
||||||
ftdm_channel_unlock(ftdmchan);
|
|
||||||
return last_state;
|
|
||||||
}
|
|
||||||
|
|
||||||
FT_DECLARE(const char *) ftdm_channel_get_last_state_str(const ftdm_channel_t *ftdmchan)
|
|
||||||
{
|
|
||||||
const char *state;
|
|
||||||
ftdm_channel_lock(ftdmchan);
|
|
||||||
state = ftdm_channel_state2str(ftdmchan->last_state);
|
|
||||||
ftdm_channel_unlock(ftdmchan);
|
|
||||||
return state;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void write_history_entry(const ftdm_channel_t *fchan, ftdm_stream_handle_t *stream, int i, ftdm_time_t *prevtime)
|
|
||||||
{
|
|
||||||
char func[255];
|
|
||||||
char line[255];
|
|
||||||
char states[255];
|
|
||||||
const char *filename = NULL;
|
|
||||||
snprintf(states, sizeof(states), "%-5.15s => %-5.15s", ftdm_channel_state2str(fchan->history[i].last_state), ftdm_channel_state2str(fchan->history[i].state));
|
|
||||||
snprintf(func, sizeof(func), "[%s]", fchan->history[i].func);
|
|
||||||
filename = strrchr(fchan->history[i].file, *FTDM_PATH_SEPARATOR);
|
|
||||||
if (!filename) {
|
|
||||||
filename = fchan->history[i].file;
|
|
||||||
} else {
|
|
||||||
filename++;
|
|
||||||
}
|
|
||||||
if (!(*prevtime)) {
|
|
||||||
*prevtime = fchan->history[i].time;
|
|
||||||
}
|
|
||||||
snprintf(line, sizeof(func), "[%s:%d]", filename, fchan->history[i].line);
|
|
||||||
stream->write_function(stream, "%-30.30s %-30.30s %-30.30s %lums\n", states, func, line, (fchan->history[i].time - *prevtime));
|
|
||||||
*prevtime = fchan->history[i].time;
|
|
||||||
}
|
|
||||||
|
|
||||||
FT_DECLARE(char *) ftdm_channel_get_history_str(const ftdm_channel_t *fchan)
|
|
||||||
{
|
|
||||||
uint8_t i = 0;
|
|
||||||
ftdm_time_t currtime = 0;
|
|
||||||
ftdm_time_t prevtime = 0;
|
|
||||||
|
|
||||||
ftdm_stream_handle_t stream = { 0 };
|
|
||||||
FTDM_STANDARD_STREAM(stream);
|
|
||||||
if (!fchan->history[0].file) {
|
|
||||||
stream.write_function(&stream, "-- No state history --\n");
|
|
||||||
return stream.data;
|
|
||||||
}
|
|
||||||
|
|
||||||
stream.write_function(&stream, "%-30.30s %-30.30s %-30.30s %s",
|
|
||||||
"-- States --", "-- Function --", "-- Location --", "-- Time Offset --\n");
|
|
||||||
|
|
||||||
for (i = fchan->hindex; i < ftdm_array_len(fchan->history); i++) {
|
|
||||||
if (!fchan->history[i].file) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
write_history_entry(fchan, &stream, i, &prevtime);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < fchan->hindex; i++) {
|
|
||||||
write_history_entry(fchan, &stream, i, &prevtime);
|
|
||||||
}
|
|
||||||
|
|
||||||
currtime = ftdm_current_time_in_ms();
|
|
||||||
|
|
||||||
stream.write_function(&stream, "\nTime since last state change: %lums\n", (currtime - prevtime));
|
|
||||||
|
|
||||||
return stream.data;
|
|
||||||
}
|
|
||||||
|
|
||||||
FT_DECLARE(ftdm_status_t) ftdm_channel_advance_states(ftdm_channel_t *fchan)
|
|
||||||
{
|
|
||||||
ftdm_channel_state_t state;
|
|
||||||
|
|
||||||
ftdm_assert_return(fchan->span->state_processor, FTDM_FAIL, "Cannot process states without a state processor!\n");
|
|
||||||
|
|
||||||
while (fchan->state_status == FTDM_STATE_STATUS_NEW) {
|
|
||||||
state = fchan->state;
|
|
||||||
ftdm_log_chan(fchan, FTDM_LOG_DEBUG, "Executing state processor for %s\n", ftdm_channel_state2str(fchan->state));
|
|
||||||
fchan->span->state_processor(fchan);
|
|
||||||
if (state == fchan->state && fchan->state_status == FTDM_STATE_STATUS_NEW) {
|
|
||||||
/* if the state did not change and is still NEW, the state status must go to PROCESSED
|
|
||||||
* otherwise we don't touch it since is a new state and the old state was
|
|
||||||
* already completed implicitly by the state_processor() function via some internal
|
|
||||||
* call to ftdm_set_state() */
|
|
||||||
fchan->state_status = FTDM_STATE_STATUS_PROCESSED;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return FTDM_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
FT_DECLARE(int) ftdm_check_state_all(ftdm_span_t *span, ftdm_channel_state_t state)
|
|
||||||
{
|
|
||||||
uint32_t j;
|
|
||||||
for(j = 1; j <= span->chan_count; j++) {
|
|
||||||
if (span->channels[j]->state != state || ftdm_test_flag(span->channels[j], FTDM_CHANNEL_STATE_CHANGE)) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 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 noet:
|
|
||||||
*/
|
|
|
@ -1,635 +0,0 @@
|
||||||
/*
|
|
||||||
* Cross Platform Thread/Mutex abstraction
|
|
||||||
* Copyright(C) 2007 Michael Jerris
|
|
||||||
*
|
|
||||||
* You may opt to use, copy, modify, merge, publish, distribute and/or sell
|
|
||||||
* copies of the Software, and permit persons to whom the Software is
|
|
||||||
* furnished to do so.
|
|
||||||
*
|
|
||||||
* This work is provided under this license on an "as is" basis, without warranty of any kind,
|
|
||||||
* either expressed or implied, including, without limitation, warranties that the covered code
|
|
||||||
* is free of defects, merchantable, fit for a particular purpose or non-infringing. The entire
|
|
||||||
* risk as to the quality and performance of the covered code is with you. Should any covered
|
|
||||||
* code prove defective in any respect, you (not the initial developer or any other contributor)
|
|
||||||
* assume the cost of any necessary servicing, repair or correction. This disclaimer of warranty
|
|
||||||
* constitutes an essential part of this license. No use of any covered code is authorized hereunder
|
|
||||||
* except under this disclaimer.
|
|
||||||
*
|
|
||||||
* Contributors:
|
|
||||||
*
|
|
||||||
* Moises Silva <moy@sangoma.com>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef WIN32
|
|
||||||
# if (_WIN32_WINNT < 0x0400)
|
|
||||||
# error "Need to target at least Windows 95/WINNT 4.0 because TryEnterCriticalSection is needed"
|
|
||||||
# endif
|
|
||||||
# include <windows.h>
|
|
||||||
#endif
|
|
||||||
/*#define FTDM_DEBUG_MUTEX 0*/
|
|
||||||
|
|
||||||
#include "private/ftdm_core.h"
|
|
||||||
#include "ftdm_threadmutex.h"
|
|
||||||
|
|
||||||
#ifdef WIN32
|
|
||||||
#include <process.h>
|
|
||||||
|
|
||||||
#define FTDM_THREAD_CALLING_CONVENTION __stdcall
|
|
||||||
|
|
||||||
struct ftdm_mutex {
|
|
||||||
CRITICAL_SECTION mutex;
|
|
||||||
};
|
|
||||||
|
|
||||||
#else
|
|
||||||
#include <pthread.h>
|
|
||||||
#include <poll.h>
|
|
||||||
|
|
||||||
#define FTDM_THREAD_CALLING_CONVENTION
|
|
||||||
|
|
||||||
#ifdef FTDM_DEBUG_MUTEX
|
|
||||||
#define FTDM_MUTEX_MAX_REENTRANCY 30
|
|
||||||
typedef struct ftdm_lock_entry {
|
|
||||||
const char *file;
|
|
||||||
const char *func;
|
|
||||||
uint32_t line;
|
|
||||||
} ftdm_lock_entry_t;
|
|
||||||
|
|
||||||
typedef struct ftdm_lock_history {
|
|
||||||
ftdm_lock_entry_t locked;
|
|
||||||
ftdm_lock_entry_t unlocked;
|
|
||||||
} ftdm_lock_history_t;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
struct ftdm_mutex {
|
|
||||||
pthread_mutex_t mutex;
|
|
||||||
#ifdef FTDM_DEBUG_MUTEX
|
|
||||||
ftdm_lock_history_t lock_history[FTDM_MUTEX_MAX_REENTRANCY];
|
|
||||||
uint8_t reentrancy;
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
struct ftdm_interrupt {
|
|
||||||
ftdm_socket_t device;
|
|
||||||
ftdm_wait_flag_t device_input_flags;
|
|
||||||
ftdm_wait_flag_t device_output_flags;
|
|
||||||
#ifdef WIN32
|
|
||||||
/* for generic interruption */
|
|
||||||
HANDLE event;
|
|
||||||
#else
|
|
||||||
/* In theory we could be using thread conditions for generic interruption,
|
|
||||||
* however, Linux does not have a primitive like Windows WaitForMultipleObjects
|
|
||||||
* to wait for both thread condition and file descriptors, therefore we decided
|
|
||||||
* to use a dummy pipe for generic interruption/condition logic
|
|
||||||
* */
|
|
||||||
int readfd;
|
|
||||||
int writefd;
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
|
|
||||||
struct ftdm_thread {
|
|
||||||
#ifdef WIN32
|
|
||||||
void *handle;
|
|
||||||
#else
|
|
||||||
pthread_t handle;
|
|
||||||
#endif
|
|
||||||
void *private_data;
|
|
||||||
ftdm_thread_function_t function;
|
|
||||||
ftdm_size_t stack_size;
|
|
||||||
#ifndef WIN32
|
|
||||||
pthread_attr_t attribute;
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
|
|
||||||
ftdm_size_t thread_default_stacksize = 0;
|
|
||||||
|
|
||||||
FT_DECLARE(void) ftdm_thread_override_default_stacksize(ftdm_size_t size)
|
|
||||||
{
|
|
||||||
thread_default_stacksize = size;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void * FTDM_THREAD_CALLING_CONVENTION thread_launch(void *args)
|
|
||||||
{
|
|
||||||
void *exit_val;
|
|
||||||
ftdm_thread_t *thread = (ftdm_thread_t *)args;
|
|
||||||
exit_val = thread->function(thread, thread->private_data);
|
|
||||||
#ifndef WIN32
|
|
||||||
pthread_attr_destroy(&thread->attribute);
|
|
||||||
#endif
|
|
||||||
ftdm_safe_free(thread);
|
|
||||||
|
|
||||||
return exit_val;
|
|
||||||
}
|
|
||||||
|
|
||||||
FT_DECLARE(ftdm_status_t) ftdm_thread_create_detached(ftdm_thread_function_t func, void *data)
|
|
||||||
{
|
|
||||||
return ftdm_thread_create_detached_ex(func, data, thread_default_stacksize);
|
|
||||||
}
|
|
||||||
|
|
||||||
FT_DECLARE(ftdm_status_t) ftdm_thread_create_detached_ex(ftdm_thread_function_t func, void *data, ftdm_size_t stack_size)
|
|
||||||
{
|
|
||||||
ftdm_thread_t *thread = NULL;
|
|
||||||
ftdm_status_t status = FTDM_FAIL;
|
|
||||||
|
|
||||||
if (!func || !(thread = (ftdm_thread_t *)ftdm_calloc(1, sizeof(ftdm_thread_t)))) {
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
|
|
||||||
thread->private_data = data;
|
|
||||||
thread->function = func;
|
|
||||||
thread->stack_size = stack_size;
|
|
||||||
|
|
||||||
#if defined(WIN32)
|
|
||||||
thread->handle = (void *)_beginthreadex(NULL, (unsigned)thread->stack_size, (unsigned int (__stdcall *)(void *))thread_launch, thread, 0, NULL);
|
|
||||||
if (!thread->handle) {
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
CloseHandle(thread->handle);
|
|
||||||
|
|
||||||
status = FTDM_SUCCESS;
|
|
||||||
goto done;
|
|
||||||
#else
|
|
||||||
|
|
||||||
if (pthread_attr_init(&thread->attribute) != 0) goto fail;
|
|
||||||
|
|
||||||
if (pthread_attr_setdetachstate(&thread->attribute, PTHREAD_CREATE_DETACHED) != 0) goto failpthread;
|
|
||||||
|
|
||||||
if (thread->stack_size && pthread_attr_setstacksize(&thread->attribute, thread->stack_size) != 0) goto failpthread;
|
|
||||||
|
|
||||||
if (pthread_create(&thread->handle, &thread->attribute, thread_launch, thread) != 0) goto failpthread;
|
|
||||||
|
|
||||||
status = FTDM_SUCCESS;
|
|
||||||
goto done;
|
|
||||||
failpthread:
|
|
||||||
pthread_attr_destroy(&thread->attribute);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
fail:
|
|
||||||
if (thread) {
|
|
||||||
ftdm_safe_free(thread);
|
|
||||||
}
|
|
||||||
done:
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
FT_DECLARE(ftdm_status_t) ftdm_mutex_create(ftdm_mutex_t **mutex)
|
|
||||||
{
|
|
||||||
ftdm_status_t status = FTDM_FAIL;
|
|
||||||
#ifndef WIN32
|
|
||||||
pthread_mutexattr_t attr;
|
|
||||||
#endif
|
|
||||||
ftdm_mutex_t *check = NULL;
|
|
||||||
|
|
||||||
check = (ftdm_mutex_t *)ftdm_calloc(1, sizeof(**mutex));
|
|
||||||
if (!check)
|
|
||||||
goto done;
|
|
||||||
#ifdef WIN32
|
|
||||||
InitializeCriticalSection(&check->mutex);
|
|
||||||
#else
|
|
||||||
if (pthread_mutexattr_init(&attr))
|
|
||||||
goto done;
|
|
||||||
|
|
||||||
if (pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE))
|
|
||||||
goto fail;
|
|
||||||
|
|
||||||
if (pthread_mutex_init(&check->mutex, &attr))
|
|
||||||
goto fail;
|
|
||||||
|
|
||||||
goto success;
|
|
||||||
|
|
||||||
fail:
|
|
||||||
pthread_mutexattr_destroy(&attr);
|
|
||||||
goto done;
|
|
||||||
|
|
||||||
success:
|
|
||||||
#endif
|
|
||||||
*mutex = check;
|
|
||||||
status = FTDM_SUCCESS;
|
|
||||||
|
|
||||||
done:
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
|
|
||||||
FT_DECLARE(ftdm_status_t) ftdm_mutex_destroy(ftdm_mutex_t **mutex)
|
|
||||||
{
|
|
||||||
ftdm_mutex_t *mp = *mutex;
|
|
||||||
*mutex = NULL;
|
|
||||||
if (!mp) {
|
|
||||||
return FTDM_FAIL;
|
|
||||||
}
|
|
||||||
#ifdef WIN32
|
|
||||||
DeleteCriticalSection(&mp->mutex);
|
|
||||||
#else
|
|
||||||
if (pthread_mutex_destroy(&mp->mutex))
|
|
||||||
return FTDM_FAIL;
|
|
||||||
#endif
|
|
||||||
ftdm_safe_free(mp);
|
|
||||||
return FTDM_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define ADD_LOCK_HISTORY(mutex, file, line, func) \
|
|
||||||
{ \
|
|
||||||
if ((mutex)->reentrancy < FTDM_MUTEX_MAX_REENTRANCY) { \
|
|
||||||
(mutex)->lock_history[mutex->reentrancy].locked.file = (file); \
|
|
||||||
(mutex)->lock_history[mutex->reentrancy].locked.func = (func); \
|
|
||||||
(mutex)->lock_history[mutex->reentrancy].locked.line = (line); \
|
|
||||||
(mutex)->lock_history[mutex->reentrancy].unlocked.file = NULL; \
|
|
||||||
(mutex)->lock_history[mutex->reentrancy].unlocked.func = NULL; \
|
|
||||||
(mutex)->lock_history[mutex->reentrancy].unlocked.line = 0; \
|
|
||||||
(mutex)->reentrancy++; \
|
|
||||||
if ((mutex)->reentrancy == FTDM_MUTEX_MAX_REENTRANCY) { \
|
|
||||||
ftdm_log((file), (func), (line), FTDM_LOG_LEVEL_ERROR, "Max reentrancy reached for mutex %p\n", (mutex)); \
|
|
||||||
} \
|
|
||||||
} \
|
|
||||||
}
|
|
||||||
|
|
||||||
FT_DECLARE(ftdm_status_t) _ftdm_mutex_lock(const char *file, int line, const char *func, ftdm_mutex_t *mutex)
|
|
||||||
{
|
|
||||||
#ifdef WIN32
|
|
||||||
ftdm_unused_arg(file);
|
|
||||||
ftdm_unused_arg(line);
|
|
||||||
ftdm_unused_arg(func);
|
|
||||||
|
|
||||||
EnterCriticalSection(&mutex->mutex);
|
|
||||||
#else
|
|
||||||
int err;
|
|
||||||
if ((err = pthread_mutex_lock(&mutex->mutex))) {
|
|
||||||
ftdm_log(file, func, line, FTDM_LOG_LEVEL_ERROR, "Failed to lock mutex %d:%s\n", err, strerror(err));
|
|
||||||
return FTDM_FAIL;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#ifdef FTDM_DEBUG_MUTEX
|
|
||||||
ADD_LOCK_HISTORY(mutex, file, line, func);
|
|
||||||
#endif
|
|
||||||
return FTDM_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
FT_DECLARE(ftdm_status_t) _ftdm_mutex_trylock(const char *file, int line, const char *func, ftdm_mutex_t *mutex)
|
|
||||||
{
|
|
||||||
ftdm_unused_arg(file);
|
|
||||||
ftdm_unused_arg(line);
|
|
||||||
ftdm_unused_arg(func);
|
|
||||||
#ifdef WIN32
|
|
||||||
if (!TryEnterCriticalSection(&mutex->mutex))
|
|
||||||
return FTDM_FAIL;
|
|
||||||
#else
|
|
||||||
if (pthread_mutex_trylock(&mutex->mutex))
|
|
||||||
return FTDM_FAIL;
|
|
||||||
#endif
|
|
||||||
#ifdef FTDM_DEBUG_MUTEX
|
|
||||||
ADD_LOCK_HISTORY(mutex, file, line, func);
|
|
||||||
#endif
|
|
||||||
return FTDM_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
FT_DECLARE(ftdm_status_t) _ftdm_mutex_unlock(const char *file, int line, const char *func, ftdm_mutex_t *mutex)
|
|
||||||
{
|
|
||||||
#ifdef FTDM_DEBUG_MUTEX
|
|
||||||
int i = 0;
|
|
||||||
if (mutex->reentrancy == 0) {
|
|
||||||
ftdm_log(file, func, line, FTDM_LOG_LEVEL_ERROR, "Cannot unlock something that is not locked!\n");
|
|
||||||
return FTDM_FAIL;
|
|
||||||
}
|
|
||||||
i = mutex->reentrancy - 1;
|
|
||||||
/* I think this is a fair assumption when debugging */
|
|
||||||
if (func != mutex->lock_history[i].locked.func) {
|
|
||||||
ftdm_log(file, func, line, FTDM_LOG_LEVEL_WARNING, "Mutex %p was suspiciously locked at %s->%s:%d but unlocked at %s->%s:%d!\n",
|
|
||||||
mutex, mutex->lock_history[i].locked.func, mutex->lock_history[i].locked.file, mutex->lock_history[i].locked.line,
|
|
||||||
func, file, line);
|
|
||||||
}
|
|
||||||
mutex->lock_history[i].unlocked.file = file;
|
|
||||||
mutex->lock_history[i].unlocked.line = line;
|
|
||||||
mutex->lock_history[i].unlocked.func = func;
|
|
||||||
mutex->reentrancy--;
|
|
||||||
#endif
|
|
||||||
#ifdef WIN32
|
|
||||||
ftdm_unused_arg(file);
|
|
||||||
ftdm_unused_arg(line);
|
|
||||||
ftdm_unused_arg(func);
|
|
||||||
|
|
||||||
LeaveCriticalSection(&mutex->mutex);
|
|
||||||
#else
|
|
||||||
if (pthread_mutex_unlock(&mutex->mutex)) {
|
|
||||||
ftdm_log(file, func, line, FTDM_LOG_LEVEL_ERROR, "Failed to unlock mutex: %s\n", strerror(errno));
|
|
||||||
#ifdef FTDM_DEBUG_MUTEX
|
|
||||||
mutex->reentrancy++;
|
|
||||||
#endif
|
|
||||||
return FTDM_FAIL;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
return FTDM_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
FT_DECLARE(ftdm_status_t) ftdm_interrupt_create(ftdm_interrupt_t **ininterrupt, ftdm_socket_t device, ftdm_wait_flag_t device_flags)
|
|
||||||
{
|
|
||||||
ftdm_status_t status = FTDM_SUCCESS;
|
|
||||||
ftdm_interrupt_t *interrupt = NULL;
|
|
||||||
#ifndef WIN32
|
|
||||||
int fds[2];
|
|
||||||
#endif
|
|
||||||
|
|
||||||
ftdm_assert_return(ininterrupt != NULL, FTDM_FAIL, "interrupt double pointer is null!\n");
|
|
||||||
|
|
||||||
interrupt = ftdm_calloc(1, sizeof(*interrupt));
|
|
||||||
if (!interrupt) {
|
|
||||||
ftdm_log(FTDM_LOG_ERROR, "Failed to allocate interrupt memory\n");
|
|
||||||
return FTDM_ENOMEM;
|
|
||||||
}
|
|
||||||
|
|
||||||
interrupt->device = device;
|
|
||||||
interrupt->device_input_flags = device_flags;
|
|
||||||
#ifdef WIN32
|
|
||||||
interrupt->event = CreateEvent(NULL, FALSE, FALSE, NULL);
|
|
||||||
if (!interrupt->event) {
|
|
||||||
ftdm_log(FTDM_LOG_ERROR, "Failed to allocate interrupt event\n");
|
|
||||||
status = FTDM_ENOMEM;
|
|
||||||
goto failed;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
if (pipe(fds)) {
|
|
||||||
ftdm_log(FTDM_LOG_ERROR, "Failed to allocate interrupt pipe: %s\n", strerror(errno));
|
|
||||||
status = FTDM_FAIL;
|
|
||||||
goto failed;
|
|
||||||
}
|
|
||||||
interrupt->readfd = fds[0];
|
|
||||||
interrupt->writefd = fds[1];
|
|
||||||
#endif
|
|
||||||
|
|
||||||
*ininterrupt = interrupt;
|
|
||||||
return FTDM_SUCCESS;
|
|
||||||
|
|
||||||
failed:
|
|
||||||
if (interrupt) {
|
|
||||||
#ifndef WIN32
|
|
||||||
if (interrupt->readfd) {
|
|
||||||
close(interrupt->readfd);
|
|
||||||
close(interrupt->writefd);
|
|
||||||
interrupt->readfd = -1;
|
|
||||||
interrupt->writefd = -1;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
ftdm_safe_free(interrupt);
|
|
||||||
}
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define ONE_BILLION 1000000000
|
|
||||||
|
|
||||||
FT_DECLARE(ftdm_status_t) ftdm_interrupt_wait(ftdm_interrupt_t *interrupt, int ms)
|
|
||||||
{
|
|
||||||
int num = 1;
|
|
||||||
#ifdef WIN32
|
|
||||||
DWORD res = 0;
|
|
||||||
HANDLE ints[2];
|
|
||||||
#else
|
|
||||||
int res = 0;
|
|
||||||
struct pollfd ints[2];
|
|
||||||
char pipebuf[255];
|
|
||||||
#endif
|
|
||||||
|
|
||||||
ftdm_assert_return(interrupt != NULL, FTDM_FAIL, "Interrupt is null!\n");
|
|
||||||
|
|
||||||
interrupt->device_output_flags = FTDM_NO_FLAGS;
|
|
||||||
/* start implementation */
|
|
||||||
#ifdef WIN32
|
|
||||||
ints[0] = interrupt->event;
|
|
||||||
if (interrupt->device != FTDM_INVALID_SOCKET) {
|
|
||||||
num++;
|
|
||||||
ints[1] = interrupt->device;
|
|
||||||
ftdm_log(FTDM_LOG_CRIT, "implement me! (Windows support for device_output_flags member!)\n");
|
|
||||||
}
|
|
||||||
res = WaitForMultipleObjects(num, ints, FALSE, ms >= 0 ? ms : INFINITE);
|
|
||||||
switch (res) {
|
|
||||||
case WAIT_TIMEOUT:
|
|
||||||
return FTDM_TIMEOUT;
|
|
||||||
case WAIT_FAILED:
|
|
||||||
case WAIT_ABANDONED: /* is it right to fail with abandoned? */
|
|
||||||
return FTDM_FAIL;
|
|
||||||
default:
|
|
||||||
if (res >= (sizeof(ints)/sizeof(ints[0]))) {
|
|
||||||
ftdm_log(FTDM_LOG_ERROR, "Error waiting for freetdm interrupt event (WaitForSingleObject returned %d)\n", res);
|
|
||||||
return FTDM_FAIL;
|
|
||||||
}
|
|
||||||
return FTDM_SUCCESS;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
pollagain:
|
|
||||||
ints[0].fd = interrupt->readfd;
|
|
||||||
ints[0].events = POLLIN;
|
|
||||||
ints[0].revents = 0;
|
|
||||||
|
|
||||||
if (interrupt->device != FTDM_INVALID_SOCKET) {
|
|
||||||
num++;
|
|
||||||
ints[1].fd = interrupt->device;
|
|
||||||
ints[1].events = interrupt->device_input_flags;
|
|
||||||
ints[1].revents = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
res = poll(ints, num, ms);
|
|
||||||
|
|
||||||
if (res == -1) {
|
|
||||||
if (errno == EINTR) {
|
|
||||||
goto pollagain;
|
|
||||||
}
|
|
||||||
ftdm_log(FTDM_LOG_CRIT, "interrupt poll failed (%s)\n", strerror(errno));
|
|
||||||
return FTDM_FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (res == 0) {
|
|
||||||
return FTDM_TIMEOUT;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ints[0].revents & POLLIN) {
|
|
||||||
res = read(ints[0].fd, pipebuf, sizeof(pipebuf));
|
|
||||||
if (res == -1) {
|
|
||||||
ftdm_log(FTDM_LOG_CRIT, "reading interrupt descriptor failed (%s)\n", strerror(errno));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (interrupt->device != FTDM_INVALID_SOCKET) {
|
|
||||||
if (ints[1].revents & POLLIN) {
|
|
||||||
interrupt->device_output_flags |= FTDM_READ;
|
|
||||||
}
|
|
||||||
if (ints[1].revents & POLLOUT) {
|
|
||||||
interrupt->device_output_flags |= FTDM_WRITE;
|
|
||||||
}
|
|
||||||
if (ints[1].revents & POLLPRI) {
|
|
||||||
interrupt->device_output_flags |= FTDM_EVENTS;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return FTDM_SUCCESS;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
FT_DECLARE(ftdm_status_t) ftdm_interrupt_signal(ftdm_interrupt_t *interrupt)
|
|
||||||
{
|
|
||||||
ftdm_assert_return(interrupt != NULL, FTDM_FAIL, "Interrupt is null!\n");
|
|
||||||
#ifdef WIN32
|
|
||||||
if (!SetEvent(interrupt->event)) {
|
|
||||||
ftdm_log(FTDM_LOG_ERROR, "Failed to signal interrupt\n");
|
|
||||||
return FTDM_FAIL;
|
|
||||||
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
int err;
|
|
||||||
struct pollfd testpoll;
|
|
||||||
testpoll.revents = 0;
|
|
||||||
testpoll.events = POLLIN;
|
|
||||||
testpoll.fd = interrupt->readfd;
|
|
||||||
err = poll(&testpoll, 1, 0);
|
|
||||||
if (err == 0 && !(testpoll.revents & POLLIN)) {
|
|
||||||
/* we just try to notify if there is nothing on the read fd already,
|
|
||||||
* otherwise users that never call interrupt wait eventually will
|
|
||||||
* eventually have the pipe buffer filled */
|
|
||||||
if ((err = write(interrupt->writefd, "w", 1)) != 1) {
|
|
||||||
ftdm_log(FTDM_LOG_ERROR, "Failed to signal interrupt: %s\n", strerror(errno));
|
|
||||||
return FTDM_FAIL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
return FTDM_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
FT_DECLARE(ftdm_status_t) ftdm_interrupt_destroy(ftdm_interrupt_t **ininterrupt)
|
|
||||||
{
|
|
||||||
ftdm_interrupt_t *interrupt = NULL;
|
|
||||||
ftdm_assert_return(ininterrupt != NULL, FTDM_FAIL, "Interrupt null when destroying!\n");
|
|
||||||
interrupt = *ininterrupt;
|
|
||||||
#ifdef WIN32
|
|
||||||
CloseHandle(interrupt->event);
|
|
||||||
#else
|
|
||||||
close(interrupt->readfd);
|
|
||||||
close(interrupt->writefd);
|
|
||||||
|
|
||||||
interrupt->readfd = -1;
|
|
||||||
interrupt->writefd = -1;
|
|
||||||
#endif
|
|
||||||
ftdm_safe_free(interrupt);
|
|
||||||
*ininterrupt = NULL;
|
|
||||||
return FTDM_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
FT_DECLARE(ftdm_status_t) ftdm_interrupt_multiple_wait(ftdm_interrupt_t *interrupts[], ftdm_size_t size, int ms)
|
|
||||||
{
|
|
||||||
int numdevices = 0;
|
|
||||||
unsigned i = 0;
|
|
||||||
|
|
||||||
#if defined(__WINDOWS__)
|
|
||||||
DWORD res = 0;
|
|
||||||
HANDLE ints[20];
|
|
||||||
if (size > (ftdm_array_len(ints)/2)) {
|
|
||||||
/* improve if needed: dynamically allocate the list of interrupts *only* when exceeding the default size */
|
|
||||||
ftdm_log(FTDM_LOG_CRIT, "Unsupported size of interrupts: %d, implement me!\n", size);
|
|
||||||
return FTDM_FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < size; i++) {
|
|
||||||
ints[i] = interrupts[i]->event;
|
|
||||||
interrupts[i]->device_output_flags = FTDM_NO_FLAGS;
|
|
||||||
if (interrupts[i]->device != FTDM_INVALID_SOCKET) {
|
|
||||||
/* WARNING: if the device is ready for data we must implement for Windows the device_output_flags member */
|
|
||||||
ints[size+numdevices] = interrupts[i]->device;
|
|
||||||
numdevices++;
|
|
||||||
ftdm_log(FTDM_LOG_CRIT, "implement me! (Windows support for device_data_ready member!)\n", size);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
res = WaitForMultipleObjects((DWORD)size+numdevices, ints, FALSE, ms >= 0 ? ms : INFINITE);
|
|
||||||
|
|
||||||
switch (res) {
|
|
||||||
case WAIT_TIMEOUT:
|
|
||||||
return FTDM_TIMEOUT;
|
|
||||||
case WAIT_FAILED:
|
|
||||||
case WAIT_ABANDONED: /* is it right to fail with abandoned? */
|
|
||||||
return FTDM_FAIL;
|
|
||||||
default:
|
|
||||||
if (res >= (size+numdevices)) {
|
|
||||||
ftdm_log(FTDM_LOG_ERROR, "Error waiting for freetdm interrupt event (WaitForSingleObject returned %d)\n", res);
|
|
||||||
return FTDM_FAIL;
|
|
||||||
}
|
|
||||||
/* fall-through to FTDM_SUCCESS at the end of the function */
|
|
||||||
}
|
|
||||||
#elif defined(__linux__) || defined(__FreeBSD__)
|
|
||||||
int res = 0;
|
|
||||||
char pipebuf[255];
|
|
||||||
struct pollfd ints[size*2];
|
|
||||||
|
|
||||||
memset(&ints, 0, sizeof(ints));
|
|
||||||
pollagain:
|
|
||||||
for (i = 0; i < size; i++) {
|
|
||||||
ints[i].events = POLLIN;
|
|
||||||
ints[i].revents = 0;
|
|
||||||
ints[i].fd = interrupts[i]->readfd;
|
|
||||||
interrupts[i]->device_output_flags = FTDM_NO_FLAGS;
|
|
||||||
if (interrupts[i]->device != FTDM_INVALID_SOCKET) {
|
|
||||||
ints[size+numdevices].events = interrupts[i]->device_input_flags;
|
|
||||||
ints[size+numdevices].revents = 0;
|
|
||||||
ints[size+numdevices].fd = interrupts[i]->device;
|
|
||||||
numdevices++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
res = poll(ints, size + numdevices, ms);
|
|
||||||
if (res == -1) {
|
|
||||||
if (errno == EINTR) {
|
|
||||||
goto pollagain;
|
|
||||||
}
|
|
||||||
ftdm_log(FTDM_LOG_CRIT, "interrupt poll failed (%s)\n", strerror(errno));
|
|
||||||
return FTDM_FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (res == 0) {
|
|
||||||
return FTDM_TIMEOUT;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* check for events in the pipes and in the devices, but service only the pipes */
|
|
||||||
numdevices = 0;
|
|
||||||
for (i = 0; i < size; i++) {
|
|
||||||
if (ints[i].revents & POLLIN) {
|
|
||||||
res = read(ints[i].fd, pipebuf, sizeof(pipebuf));
|
|
||||||
if (res == -1) {
|
|
||||||
ftdm_log(FTDM_LOG_CRIT, "reading interrupt descriptor failed (%s)\n", strerror(errno));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (interrupts[i]->device != FTDM_INVALID_SOCKET) {
|
|
||||||
if (ints[size+numdevices].revents & POLLIN) {
|
|
||||||
interrupts[i]->device_output_flags |= FTDM_READ;
|
|
||||||
}
|
|
||||||
if (ints[size+numdevices].revents & POLLOUT) {
|
|
||||||
interrupts[i]->device_output_flags |= FTDM_WRITE;
|
|
||||||
}
|
|
||||||
if (ints[size+numdevices].revents & POLLPRI) {
|
|
||||||
interrupts[i]->device_output_flags |= FTDM_EVENTS;
|
|
||||||
}
|
|
||||||
numdevices++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
/* for MacOS compilation, unused vars */
|
|
||||||
numdevices = i;
|
|
||||||
#endif
|
|
||||||
return FTDM_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
FT_DECLARE(ftdm_wait_flag_t) ftdm_interrupt_device_ready(ftdm_interrupt_t *interrupt)
|
|
||||||
{
|
|
||||||
#if defined(__WINDOWS__)
|
|
||||||
/* device output flags are not currently filled for Windows upon returning from a wait function */
|
|
||||||
ftdm_log(FTDM_LOG_CRIT, "IMPLEMENT ME!\n");
|
|
||||||
#endif
|
|
||||||
return interrupt->device_output_flags;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 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 noet:
|
|
||||||
*/
|
|
|
@ -1,151 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2010, Sangoma Technologies
|
|
||||||
* David Yat Sin <dyatsin@sangoma.com>
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
*
|
|
||||||
* * Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
*
|
|
||||||
* * Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* * Neither the name of the original author; nor the names of any contributors
|
|
||||||
* may be used to endorse or promote products derived from this software
|
|
||||||
* without specific prior written permission.
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
|
||||||
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
|
||||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
||||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
|
||||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
||||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
||||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
||||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*
|
|
||||||
* Contributors:
|
|
||||||
*
|
|
||||||
* Moises Silva <moy@sangoma.com>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "private/ftdm_core.h"
|
|
||||||
|
|
||||||
FT_DECLARE(ftdm_status_t) ftdm_sigmsg_add_var(ftdm_sigmsg_t *sigmsg, const char *var_name, const char *value)
|
|
||||||
{
|
|
||||||
char *t_name = 0, *t_val = 0;
|
|
||||||
|
|
||||||
if (!sigmsg || !var_name || !value) {
|
|
||||||
return FTDM_FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!sigmsg->variables) {
|
|
||||||
/* initialize on first use */
|
|
||||||
sigmsg->variables = create_hashtable(16, ftdm_hash_hashfromstring, ftdm_hash_equalkeys);
|
|
||||||
ftdm_assert_return(sigmsg->variables, FTDM_FAIL, "Failed to create hash table\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
t_name = ftdm_strdup(var_name);
|
|
||||||
t_val = ftdm_strdup(value);
|
|
||||||
hashtable_insert(sigmsg->variables, t_name, t_val, HASHTABLE_FLAG_FREE_KEY | HASHTABLE_FLAG_FREE_VALUE);
|
|
||||||
return FTDM_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
FT_DECLARE(ftdm_status_t) ftdm_sigmsg_remove_var(ftdm_sigmsg_t *sigmsg, const char *var_name)
|
|
||||||
{
|
|
||||||
if (sigmsg && sigmsg->variables) {
|
|
||||||
hashtable_remove(sigmsg->variables, (void *)var_name);
|
|
||||||
}
|
|
||||||
return FTDM_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
FT_DECLARE(const char *) ftdm_sigmsg_get_var(ftdm_sigmsg_t *sigmsg, const char *var_name)
|
|
||||||
{
|
|
||||||
const char *var = NULL;
|
|
||||||
|
|
||||||
if (!sigmsg || !sigmsg->variables || !var_name) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
var = (const char *)hashtable_search(((struct hashtable*)sigmsg->variables), (void *)var_name);
|
|
||||||
return var;
|
|
||||||
}
|
|
||||||
|
|
||||||
FT_DECLARE(ftdm_iterator_t *) ftdm_sigmsg_get_var_iterator(const ftdm_sigmsg_t *sigmsg, ftdm_iterator_t *iter)
|
|
||||||
{
|
|
||||||
ftdm_hash_iterator_t *hashiter = NULL;
|
|
||||||
if (!sigmsg) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
hashiter = sigmsg->variables == NULL ? NULL : hashtable_first(sigmsg->variables);
|
|
||||||
|
|
||||||
if (hashiter == NULL) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!(iter = ftdm_get_iterator(FTDM_ITERATOR_VARS, iter))) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
iter->pvt.hashiter = hashiter;
|
|
||||||
return iter;
|
|
||||||
}
|
|
||||||
|
|
||||||
FT_DECLARE(ftdm_status_t) ftdm_get_current_var(ftdm_iterator_t *iter, const char **var_name, const char **var_val)
|
|
||||||
{
|
|
||||||
const void *key = NULL;
|
|
||||||
void *val = NULL;
|
|
||||||
|
|
||||||
*var_name = NULL;
|
|
||||||
*var_val = NULL;
|
|
||||||
|
|
||||||
ftdm_assert_return(iter && (iter->type == FTDM_ITERATOR_VARS) && iter->pvt.hashiter, FTDM_FAIL, "Cannot get variable from invalid iterator!\n");
|
|
||||||
|
|
||||||
hashtable_this(iter->pvt.hashiter, &key, NULL, &val);
|
|
||||||
|
|
||||||
*var_name = key;
|
|
||||||
*var_val = val;
|
|
||||||
|
|
||||||
return FTDM_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
FT_DECLARE(ftdm_status_t) ftdm_usrmsg_add_var(ftdm_usrmsg_t *usrmsg, const char *var_name, const char *value)
|
|
||||||
{
|
|
||||||
char *t_name = 0, *t_val = 0;
|
|
||||||
|
|
||||||
if (!usrmsg || !var_name || !value) {
|
|
||||||
return FTDM_FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!usrmsg->variables) {
|
|
||||||
/* initialize on first use */
|
|
||||||
usrmsg->variables = create_hashtable(16, ftdm_hash_hashfromstring, ftdm_hash_equalkeys);
|
|
||||||
ftdm_assert_return(usrmsg->variables, FTDM_FAIL, "Failed to create hash table\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
t_name = ftdm_strdup(var_name);
|
|
||||||
t_val = ftdm_strdup(value);
|
|
||||||
hashtable_insert(usrmsg->variables, t_name, t_val, HASHTABLE_FLAG_FREE_KEY | HASHTABLE_FLAG_FREE_VALUE);
|
|
||||||
return FTDM_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
FT_DECLARE(const char *) ftdm_usrmsg_get_var(ftdm_usrmsg_t *usrmsg, const char *var_name)
|
|
||||||
{
|
|
||||||
const char *var = NULL;
|
|
||||||
|
|
||||||
if (!usrmsg || !usrmsg->variables || !var_name) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
var = (const char *)hashtable_search(((struct hashtable*)usrmsg->variables), (void *)var_name);
|
|
||||||
return var;
|
|
||||||
}
|
|
|
@ -1,75 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2007-2014, Anthony Minessale II
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
*
|
|
||||||
* * Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
*
|
|
||||||
* * Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* * Neither the name of the original author; nor the names of any contributors
|
|
||||||
* may be used to endorse or promote products derived from this software
|
|
||||||
* without specific prior written permission.
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
|
||||||
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
|
||||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
||||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
|
||||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
||||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
||||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
||||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef FTDM_ANALOG_H
|
|
||||||
#define FTDM_ANALOG_H
|
|
||||||
#include "freetdm.h"
|
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
FTDM_ANALOG_RUNNING = (1 << 0),
|
|
||||||
FTDM_ANALOG_CALLERID = (1 << 1),
|
|
||||||
FTDM_ANALOG_ANSWER_POLARITY_REVERSE = (1 << 2),
|
|
||||||
FTDM_ANALOG_HANGUP_POLARITY_REVERSE = (1 << 3),
|
|
||||||
FTDM_ANALOG_POLARITY_CALLERID = (1 << 4)
|
|
||||||
} ftdm_analog_flag_t;
|
|
||||||
|
|
||||||
#define FTDM_MAX_HOTLINE_STR 32
|
|
||||||
#define MAX_DTMF 256
|
|
||||||
|
|
||||||
struct ftdm_analog_data {
|
|
||||||
uint32_t flags;
|
|
||||||
uint32_t max_dialstr;
|
|
||||||
uint32_t wait_dialtone_timeout;
|
|
||||||
uint32_t polarity_delay;
|
|
||||||
uint32_t digit_timeout;
|
|
||||||
char hotline[FTDM_MAX_HOTLINE_STR];
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Analog flags to be set in the sflags (signaling flags) channel memeber */
|
|
||||||
#define AF_POLARITY_REVERSE (1 << 0)
|
|
||||||
|
|
||||||
static void *ftdm_analog_run(ftdm_thread_t *me, void *obj);
|
|
||||||
typedef struct ftdm_analog_data ftdm_analog_data_t;
|
|
||||||
|
|
||||||
#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 noet:
|
|
||||||
*/
|
|
|
@ -1,353 +0,0 @@
|
||||||
<?xml version="1.0" encoding="Windows-1252"?>
|
|
||||||
<VisualStudioProject
|
|
||||||
ProjectType="Visual C++"
|
|
||||||
Version="9.00"
|
|
||||||
Name="ftmod_analog"
|
|
||||||
ProjectGUID="{37C94798-6E33-4B4F-8EE0-C72A7DC91157}"
|
|
||||||
RootNamespace="ftmod_analog"
|
|
||||||
Keyword="Win32Proj"
|
|
||||||
TargetFrameworkVersion="196613"
|
|
||||||
>
|
|
||||||
<Platforms>
|
|
||||||
<Platform
|
|
||||||
Name="Win32"
|
|
||||||
/>
|
|
||||||
<Platform
|
|
||||||
Name="x64"
|
|
||||||
/>
|
|
||||||
</Platforms>
|
|
||||||
<ToolFiles>
|
|
||||||
</ToolFiles>
|
|
||||||
<Configurations>
|
|
||||||
<Configuration
|
|
||||||
Name="Debug|Win32"
|
|
||||||
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
|
|
||||||
IntermediateDirectory="$(ConfigurationName)"
|
|
||||||
ConfigurationType="2"
|
|
||||||
CharacterSet="1"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
Optimization="0"
|
|
||||||
AdditionalIncludeDirectories="..\..\include;..\..\isdn\include"
|
|
||||||
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;FTMOD_ANALOG_EXPORTS"
|
|
||||||
MinimalRebuild="true"
|
|
||||||
BasicRuntimeChecks="3"
|
|
||||||
RuntimeLibrary="3"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
WarningLevel="4"
|
|
||||||
WarnAsError="true"
|
|
||||||
DebugInformationFormat="4"
|
|
||||||
DisableSpecificWarnings="4100"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
LinkIncremental="2"
|
|
||||||
GenerateDebugInformation="true"
|
|
||||||
SubSystem="2"
|
|
||||||
TargetMachine="1"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCALinkTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManifestTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXDCMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCBscMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCFxCopTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAppVerifierTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
/>
|
|
||||||
</Configuration>
|
|
||||||
<Configuration
|
|
||||||
Name="Debug|x64"
|
|
||||||
OutputDirectory="$(SolutionDir)$(PlatformName)\$(ConfigurationName)"
|
|
||||||
IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
|
|
||||||
ConfigurationType="2"
|
|
||||||
CharacterSet="1"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"
|
|
||||||
TargetEnvironment="3"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
Optimization="0"
|
|
||||||
AdditionalIncludeDirectories="..\..\include;..\..\isdn\include"
|
|
||||||
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;FTMOD_ANALOG_EXPORTS"
|
|
||||||
MinimalRebuild="true"
|
|
||||||
BasicRuntimeChecks="3"
|
|
||||||
RuntimeLibrary="3"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
WarningLevel="4"
|
|
||||||
WarnAsError="false"
|
|
||||||
DebugInformationFormat="3"
|
|
||||||
DisableSpecificWarnings="4100"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
LinkIncremental="2"
|
|
||||||
GenerateDebugInformation="true"
|
|
||||||
SubSystem="2"
|
|
||||||
TargetMachine="17"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCALinkTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManifestTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXDCMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCBscMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCFxCopTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAppVerifierTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
/>
|
|
||||||
</Configuration>
|
|
||||||
<Configuration
|
|
||||||
Name="Release|Win32"
|
|
||||||
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
|
|
||||||
IntermediateDirectory="$(ConfigurationName)"
|
|
||||||
ConfigurationType="2"
|
|
||||||
CharacterSet="1"
|
|
||||||
WholeProgramOptimization="1"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
Optimization="2"
|
|
||||||
EnableIntrinsicFunctions="true"
|
|
||||||
AdditionalIncludeDirectories="..\..\include;..\..\isdn\include"
|
|
||||||
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;FTMOD_ANALOG_EXPORTS"
|
|
||||||
RuntimeLibrary="2"
|
|
||||||
EnableFunctionLevelLinking="true"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
WarningLevel="4"
|
|
||||||
WarnAsError="true"
|
|
||||||
DebugInformationFormat="3"
|
|
||||||
DisableSpecificWarnings="4100"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
LinkIncremental="1"
|
|
||||||
GenerateDebugInformation="true"
|
|
||||||
SubSystem="2"
|
|
||||||
OptimizeReferences="2"
|
|
||||||
EnableCOMDATFolding="2"
|
|
||||||
TargetMachine="1"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCALinkTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManifestTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXDCMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCBscMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCFxCopTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAppVerifierTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
/>
|
|
||||||
</Configuration>
|
|
||||||
<Configuration
|
|
||||||
Name="Release|x64"
|
|
||||||
OutputDirectory="$(SolutionDir)$(PlatformName)\$(ConfigurationName)"
|
|
||||||
IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
|
|
||||||
ConfigurationType="2"
|
|
||||||
CharacterSet="1"
|
|
||||||
WholeProgramOptimization="1"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"
|
|
||||||
TargetEnvironment="3"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
Optimization="2"
|
|
||||||
EnableIntrinsicFunctions="true"
|
|
||||||
AdditionalIncludeDirectories="..\..\include;..\..\isdn\include"
|
|
||||||
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;FTMOD_ANALOG_EXPORTS"
|
|
||||||
RuntimeLibrary="2"
|
|
||||||
EnableFunctionLevelLinking="true"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
WarningLevel="4"
|
|
||||||
WarnAsError="false"
|
|
||||||
DebugInformationFormat="3"
|
|
||||||
DisableSpecificWarnings="4100"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
LinkIncremental="1"
|
|
||||||
GenerateDebugInformation="true"
|
|
||||||
SubSystem="2"
|
|
||||||
OptimizeReferences="2"
|
|
||||||
EnableCOMDATFolding="2"
|
|
||||||
TargetMachine="17"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCALinkTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManifestTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXDCMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCBscMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCFxCopTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAppVerifierTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
/>
|
|
||||||
</Configuration>
|
|
||||||
</Configurations>
|
|
||||||
<References>
|
|
||||||
</References>
|
|
||||||
<Files>
|
|
||||||
<Filter
|
|
||||||
Name="Source Files"
|
|
||||||
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
|
|
||||||
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
|
|
||||||
>
|
|
||||||
<File
|
|
||||||
RelativePath="ftmod_analog.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
</Filter>
|
|
||||||
<Filter
|
|
||||||
Name="Header Files"
|
|
||||||
Filter="h;hpp;hxx;hm;inl;inc;xsd"
|
|
||||||
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
|
|
||||||
>
|
|
||||||
<File
|
|
||||||
RelativePath="ftdm_analog.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
</Filter>
|
|
||||||
</Files>
|
|
||||||
<Globals>
|
|
||||||
</Globals>
|
|
||||||
</VisualStudioProject>
|
|
|
@ -1,23 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<ItemGroup>
|
|
||||||
<Filter Include="Source Files">
|
|
||||||
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
|
|
||||||
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
|
|
||||||
</Filter>
|
|
||||||
<Filter Include="Header Files">
|
|
||||||
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
|
|
||||||
<Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
|
|
||||||
</Filter>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ClCompile Include="ftmod_analog.c">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ClInclude Include="ftdm_analog.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
</ItemGroup>
|
|
||||||
</Project>
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,77 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2008-2012, Anthony Minessale II
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
*
|
|
||||||
* * Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
*
|
|
||||||
* * Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* * Neither the name of the original author; nor the names of any contributors
|
|
||||||
* may be used to endorse or promote products derived from this software
|
|
||||||
* without specific prior written permission.
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
|
||||||
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
|
||||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
||||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
|
||||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
||||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
||||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
||||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*
|
|
||||||
* Contributor(s):
|
|
||||||
*
|
|
||||||
* John Wehle (john@feith.com)
|
|
||||||
* Moises Silva (moy@sangoma.com)
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef FTDM_ANALOG_EM_H
|
|
||||||
#define FTDM_ANALOG_EM_H
|
|
||||||
#include "freetdm.h"
|
|
||||||
|
|
||||||
#define MAX_DIALSTRING 256
|
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
FTDM_ANALOG_EM_RUNNING = (1 << 0),
|
|
||||||
FTDM_ANALOG_EM_LOCAL_WRITE = (1 << 2),
|
|
||||||
FTDM_ANALOG_EM_LOCAL_SUSPEND = (1 << 3),
|
|
||||||
FTDM_ANALOG_EM_REMOTE_SUSPEND = (1 << 4),
|
|
||||||
} ftdm_analog_em_flag_t;
|
|
||||||
|
|
||||||
struct ftdm_analog_data {
|
|
||||||
uint32_t flags;
|
|
||||||
uint32_t max_dialstr;
|
|
||||||
uint32_t digit_timeout;
|
|
||||||
uint32_t dial_timeout;
|
|
||||||
ftdm_bool_t answer_supervision;
|
|
||||||
ftdm_bool_t immediate_ringback;
|
|
||||||
char ringback_file[512];
|
|
||||||
};
|
|
||||||
|
|
||||||
static void *ftdm_analog_em_run(ftdm_thread_t *me, void *obj);
|
|
||||||
typedef struct ftdm_analog_data ftdm_analog_em_data_t;
|
|
||||||
|
|
||||||
#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 noet:
|
|
||||||
*/
|
|
|
@ -1,353 +0,0 @@
|
||||||
<?xml version="1.0" encoding="Windows-1252"?>
|
|
||||||
<VisualStudioProject
|
|
||||||
ProjectType="Visual C++"
|
|
||||||
Version="9.00"
|
|
||||||
Name="ftmod_analog_em"
|
|
||||||
ProjectGUID="{B3F49375-2834-4937-9D8C-4AC2EC911010}"
|
|
||||||
RootNamespace="ftmod_analog_em"
|
|
||||||
Keyword="Win32Proj"
|
|
||||||
TargetFrameworkVersion="196613"
|
|
||||||
>
|
|
||||||
<Platforms>
|
|
||||||
<Platform
|
|
||||||
Name="Win32"
|
|
||||||
/>
|
|
||||||
<Platform
|
|
||||||
Name="x64"
|
|
||||||
/>
|
|
||||||
</Platforms>
|
|
||||||
<ToolFiles>
|
|
||||||
</ToolFiles>
|
|
||||||
<Configurations>
|
|
||||||
<Configuration
|
|
||||||
Name="Debug|Win32"
|
|
||||||
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
|
|
||||||
IntermediateDirectory="$(ConfigurationName)"
|
|
||||||
ConfigurationType="2"
|
|
||||||
CharacterSet="1"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
Optimization="0"
|
|
||||||
AdditionalIncludeDirectories="..\..\include;..\..\isdn\include"
|
|
||||||
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;FTMOD_ANALOG_EM_EXPORTS"
|
|
||||||
MinimalRebuild="true"
|
|
||||||
BasicRuntimeChecks="3"
|
|
||||||
RuntimeLibrary="3"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
WarningLevel="4"
|
|
||||||
WarnAsError="true"
|
|
||||||
DebugInformationFormat="4"
|
|
||||||
DisableSpecificWarnings="4100"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
LinkIncremental="2"
|
|
||||||
GenerateDebugInformation="true"
|
|
||||||
SubSystem="2"
|
|
||||||
TargetMachine="1"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCALinkTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManifestTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXDCMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCBscMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCFxCopTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAppVerifierTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
/>
|
|
||||||
</Configuration>
|
|
||||||
<Configuration
|
|
||||||
Name="Debug|x64"
|
|
||||||
OutputDirectory="$(SolutionDir)$(PlatformName)\$(ConfigurationName)"
|
|
||||||
IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
|
|
||||||
ConfigurationType="2"
|
|
||||||
CharacterSet="1"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"
|
|
||||||
TargetEnvironment="3"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
Optimization="0"
|
|
||||||
AdditionalIncludeDirectories="..\..\include;..\..\isdn\include"
|
|
||||||
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;FTMOD_ANALOG_EM_EXPORTS"
|
|
||||||
MinimalRebuild="true"
|
|
||||||
BasicRuntimeChecks="3"
|
|
||||||
RuntimeLibrary="3"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
WarningLevel="4"
|
|
||||||
WarnAsError="false"
|
|
||||||
DebugInformationFormat="3"
|
|
||||||
DisableSpecificWarnings="4100"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
LinkIncremental="2"
|
|
||||||
GenerateDebugInformation="true"
|
|
||||||
SubSystem="2"
|
|
||||||
TargetMachine="17"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCALinkTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManifestTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXDCMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCBscMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCFxCopTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAppVerifierTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
/>
|
|
||||||
</Configuration>
|
|
||||||
<Configuration
|
|
||||||
Name="Release|Win32"
|
|
||||||
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
|
|
||||||
IntermediateDirectory="$(ConfigurationName)"
|
|
||||||
ConfigurationType="2"
|
|
||||||
CharacterSet="1"
|
|
||||||
WholeProgramOptimization="1"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
Optimization="2"
|
|
||||||
EnableIntrinsicFunctions="true"
|
|
||||||
AdditionalIncludeDirectories="..\..\include;..\..\isdn\include"
|
|
||||||
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;FTMOD_ANALOG_EM_EXPORTS"
|
|
||||||
RuntimeLibrary="2"
|
|
||||||
EnableFunctionLevelLinking="true"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
WarningLevel="4"
|
|
||||||
WarnAsError="true"
|
|
||||||
DebugInformationFormat="3"
|
|
||||||
DisableSpecificWarnings="4100"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
LinkIncremental="1"
|
|
||||||
GenerateDebugInformation="true"
|
|
||||||
SubSystem="2"
|
|
||||||
OptimizeReferences="2"
|
|
||||||
EnableCOMDATFolding="2"
|
|
||||||
TargetMachine="1"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCALinkTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManifestTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXDCMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCBscMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCFxCopTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAppVerifierTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
/>
|
|
||||||
</Configuration>
|
|
||||||
<Configuration
|
|
||||||
Name="Release|x64"
|
|
||||||
OutputDirectory="$(SolutionDir)$(PlatformName)\$(ConfigurationName)"
|
|
||||||
IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
|
|
||||||
ConfigurationType="2"
|
|
||||||
CharacterSet="1"
|
|
||||||
WholeProgramOptimization="1"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"
|
|
||||||
TargetEnvironment="3"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
Optimization="2"
|
|
||||||
EnableIntrinsicFunctions="true"
|
|
||||||
AdditionalIncludeDirectories="..\..\include;..\..\isdn\include"
|
|
||||||
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;FTMOD_ANALOG_EM_EXPORTS"
|
|
||||||
RuntimeLibrary="2"
|
|
||||||
EnableFunctionLevelLinking="true"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
WarningLevel="4"
|
|
||||||
WarnAsError="false"
|
|
||||||
DebugInformationFormat="3"
|
|
||||||
DisableSpecificWarnings="4100"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
LinkIncremental="1"
|
|
||||||
GenerateDebugInformation="true"
|
|
||||||
SubSystem="2"
|
|
||||||
OptimizeReferences="2"
|
|
||||||
EnableCOMDATFolding="2"
|
|
||||||
TargetMachine="17"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCALinkTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManifestTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXDCMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCBscMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCFxCopTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAppVerifierTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
/>
|
|
||||||
</Configuration>
|
|
||||||
</Configurations>
|
|
||||||
<References>
|
|
||||||
</References>
|
|
||||||
<Files>
|
|
||||||
<Filter
|
|
||||||
Name="Source Files"
|
|
||||||
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
|
|
||||||
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
|
|
||||||
>
|
|
||||||
<File
|
|
||||||
RelativePath="ftmod_analog_em.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
</Filter>
|
|
||||||
<Filter
|
|
||||||
Name="Header Files"
|
|
||||||
Filter="h;hpp;hxx;hm;inl;inc;xsd"
|
|
||||||
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
|
|
||||||
>
|
|
||||||
<File
|
|
||||||
RelativePath="ftdm_analog_em.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
</Filter>
|
|
||||||
</Files>
|
|
||||||
<Globals>
|
|
||||||
</Globals>
|
|
||||||
</VisualStudioProject>
|
|
|
@ -1,23 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<ItemGroup>
|
|
||||||
<Filter Include="Source Files">
|
|
||||||
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
|
|
||||||
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
|
|
||||||
</Filter>
|
|
||||||
<Filter Include="Header Files">
|
|
||||||
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
|
|
||||||
<Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
|
|
||||||
</Filter>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ClCompile Include="ftmod_analog_em.c">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ClInclude Include="ftdm_analog_em.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
</ItemGroup>
|
|
||||||
</Project>
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -1,465 +0,0 @@
|
||||||
<?xml version="1.0" encoding="Windows-1252"?>
|
|
||||||
<VisualStudioProject
|
|
||||||
ProjectType="Visual C++"
|
|
||||||
Version="9.00"
|
|
||||||
Name="ftmod_isdn"
|
|
||||||
ProjectGUID="{729344A5-D5E9-434D-8EE8-AF8C6C795D15}"
|
|
||||||
RootNamespace="ftmod_isdn"
|
|
||||||
Keyword="Win32Proj"
|
|
||||||
TargetFrameworkVersion="196613"
|
|
||||||
>
|
|
||||||
<Platforms>
|
|
||||||
<Platform
|
|
||||||
Name="Win32"
|
|
||||||
/>
|
|
||||||
<Platform
|
|
||||||
Name="x64"
|
|
||||||
/>
|
|
||||||
</Platforms>
|
|
||||||
<ToolFiles>
|
|
||||||
</ToolFiles>
|
|
||||||
<Configurations>
|
|
||||||
<Configuration
|
|
||||||
Name="Debug|Win32"
|
|
||||||
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
|
|
||||||
IntermediateDirectory="$(ConfigurationName)"
|
|
||||||
ConfigurationType="2"
|
|
||||||
CharacterSet="1"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
Optimization="0"
|
|
||||||
AdditionalIncludeDirectories="..\..\isdn\include;..\..\include"
|
|
||||||
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;FTMOD_ISDN_EXPORTS;_CRT_SECURE_NO_WARNINGS"
|
|
||||||
MinimalRebuild="true"
|
|
||||||
BasicRuntimeChecks="3"
|
|
||||||
RuntimeLibrary="3"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
WarningLevel="4"
|
|
||||||
WarnAsError="true"
|
|
||||||
DebugInformationFormat="4"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
LinkIncremental="2"
|
|
||||||
GenerateDebugInformation="true"
|
|
||||||
SubSystem="2"
|
|
||||||
TargetMachine="1"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCALinkTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManifestTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXDCMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCBscMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCFxCopTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAppVerifierTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
/>
|
|
||||||
</Configuration>
|
|
||||||
<Configuration
|
|
||||||
Name="Release|Win32"
|
|
||||||
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
|
|
||||||
IntermediateDirectory="$(ConfigurationName)"
|
|
||||||
ConfigurationType="2"
|
|
||||||
CharacterSet="1"
|
|
||||||
WholeProgramOptimization="1"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
Optimization="2"
|
|
||||||
EnableIntrinsicFunctions="true"
|
|
||||||
AdditionalIncludeDirectories="..\..\isdn\include;..\..\include"
|
|
||||||
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;FTMOD_ISDN_EXPORTS;_CRT_SECURE_NO_WARNINGS"
|
|
||||||
RuntimeLibrary="2"
|
|
||||||
EnableFunctionLevelLinking="true"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
WarningLevel="4"
|
|
||||||
WarnAsError="true"
|
|
||||||
DebugInformationFormat="3"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
LinkIncremental="1"
|
|
||||||
GenerateDebugInformation="true"
|
|
||||||
SubSystem="2"
|
|
||||||
OptimizeReferences="2"
|
|
||||||
EnableCOMDATFolding="2"
|
|
||||||
TargetMachine="1"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCALinkTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManifestTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXDCMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCBscMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCFxCopTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAppVerifierTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
/>
|
|
||||||
</Configuration>
|
|
||||||
<Configuration
|
|
||||||
Name="Debug|x64"
|
|
||||||
OutputDirectory="$(SolutionDir)$(PlatformName)\$(ConfigurationName)"
|
|
||||||
IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
|
|
||||||
ConfigurationType="2"
|
|
||||||
CharacterSet="1"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"
|
|
||||||
TargetEnvironment="3"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
Optimization="0"
|
|
||||||
AdditionalIncludeDirectories="..\..\isdn\include;..\..\include"
|
|
||||||
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;FTMOD_ISDN_EXPORTS;_CRT_SECURE_NO_WARNINGS"
|
|
||||||
MinimalRebuild="true"
|
|
||||||
BasicRuntimeChecks="3"
|
|
||||||
RuntimeLibrary="3"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
WarningLevel="4"
|
|
||||||
WarnAsError="true"
|
|
||||||
DebugInformationFormat="3"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
LinkIncremental="2"
|
|
||||||
GenerateDebugInformation="true"
|
|
||||||
SubSystem="2"
|
|
||||||
TargetMachine="17"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCALinkTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManifestTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXDCMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCBscMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCFxCopTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAppVerifierTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
/>
|
|
||||||
</Configuration>
|
|
||||||
<Configuration
|
|
||||||
Name="Release|x64"
|
|
||||||
OutputDirectory="$(SolutionDir)$(PlatformName)\$(ConfigurationName)"
|
|
||||||
IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
|
|
||||||
ConfigurationType="2"
|
|
||||||
CharacterSet="1"
|
|
||||||
WholeProgramOptimization="1"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"
|
|
||||||
TargetEnvironment="3"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
Optimization="2"
|
|
||||||
EnableIntrinsicFunctions="true"
|
|
||||||
AdditionalIncludeDirectories="..\..\isdn\include;..\..\include"
|
|
||||||
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;FTMOD_ISDN_EXPORTS;_CRT_SECURE_NO_WARNINGS"
|
|
||||||
RuntimeLibrary="2"
|
|
||||||
EnableFunctionLevelLinking="true"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
WarningLevel="4"
|
|
||||||
WarnAsError="true"
|
|
||||||
DebugInformationFormat="3"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
LinkIncremental="1"
|
|
||||||
GenerateDebugInformation="true"
|
|
||||||
SubSystem="2"
|
|
||||||
OptimizeReferences="2"
|
|
||||||
EnableCOMDATFolding="2"
|
|
||||||
TargetMachine="17"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCALinkTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManifestTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXDCMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCBscMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCFxCopTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAppVerifierTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
/>
|
|
||||||
</Configuration>
|
|
||||||
</Configurations>
|
|
||||||
<References>
|
|
||||||
</References>
|
|
||||||
<Files>
|
|
||||||
<Filter
|
|
||||||
Name="Source Files"
|
|
||||||
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
|
|
||||||
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
|
|
||||||
>
|
|
||||||
<File
|
|
||||||
RelativePath="..\..\isdn\5ESSmes.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\..\isdn\5ESSStateNT.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\..\isdn\5ESSStateTE.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\..\isdn\DMSmes.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\..\isdn\DMSStateNT.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\..\isdn\DMSStateTE.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\..\isdn\EuroISDNStateNT.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\..\isdn\EuroISDNStateTE.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\..\isdn\mfifo.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\..\isdn\nationalmes.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\..\isdn\nationalStateNT.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\..\isdn\nationalStateTE.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="ftmod_isdn.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\..\isdn\Q921.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\..\isdn\Q931.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\..\isdn\Q931api.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\..\isdn\Q931ie.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\..\isdn\Q931mes.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\..\isdn\Q931StateNT.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\..\isdn\Q931StateTE.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\..\isdn\Q932mes.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
</Filter>
|
|
||||||
<Filter
|
|
||||||
Name="Header Files"
|
|
||||||
Filter="h;hpp;hxx;hm;inl;inc;xsd"
|
|
||||||
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
|
|
||||||
>
|
|
||||||
<File
|
|
||||||
RelativePath="..\..\isdn\include\5ESS.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\..\isdn\include\DMS.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\..\isdn\include\mfifo.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\..\isdn\include\national.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\..\isdn\include\Q921.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\..\isdn\include\Q921priv.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\..\isdn\include\Q931.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\..\isdn\include\Q931ie.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\..\isdn\include\Q932.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="ftdm_isdn.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
</Filter>
|
|
||||||
</Files>
|
|
||||||
<Globals>
|
|
||||||
</Globals>
|
|
||||||
</VisualStudioProject>
|
|
|
@ -1,110 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<ItemGroup>
|
|
||||||
<Filter Include="Source Files">
|
|
||||||
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
|
|
||||||
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
|
|
||||||
</Filter>
|
|
||||||
<Filter Include="Header Files">
|
|
||||||
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
|
|
||||||
<Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
|
|
||||||
</Filter>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ClCompile Include="..\..\isdn\5ESSmes.c">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="..\..\isdn\5ESSStateNT.c">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="..\..\isdn\5ESSStateTE.c">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="..\..\isdn\DMSmes.c">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="..\..\isdn\DMSStateNT.c">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="..\..\isdn\DMSStateTE.c">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="..\..\isdn\EuroISDNStateNT.c">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="..\..\isdn\EuroISDNStateTE.c">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="..\..\isdn\mfifo.c">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="..\..\isdn\nationalmes.c">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="..\..\isdn\nationalStateNT.c">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="..\..\isdn\nationalStateTE.c">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="ftmod_isdn.c">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="..\..\isdn\Q921.c">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="..\..\isdn\Q931.c">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="..\..\isdn\Q931api.c">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="..\..\isdn\Q931ie.c">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="..\..\isdn\Q931mes.c">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="..\..\isdn\Q931StateNT.c">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="..\..\isdn\Q931StateTE.c">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="..\..\isdn\Q932mes.c">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ClInclude Include="..\..\isdn\include\5ESS.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="..\..\isdn\include\DMS.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="..\..\isdn\include\mfifo.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="..\..\isdn\include\national.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="..\..\isdn\include\Q921.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="..\..\isdn\include\Q921priv.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="..\..\isdn\include\Q931.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="..\..\isdn\include\Q931ie.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="..\..\isdn\include\Q932.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="ftdm_isdn.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
</ItemGroup>
|
|
||||||
</Project>
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,100 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2007-2014, Anthony Minessale II
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
*
|
|
||||||
* * Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
*
|
|
||||||
* * Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* * Neither the name of the original author; nor the names of any contributors
|
|
||||||
* may be used to endorse or promote products derived from this software
|
|
||||||
* without specific prior written permission.
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
|
||||||
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
|
||||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
||||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
|
||||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
||||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
||||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
||||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef FTDM_ISDN_H
|
|
||||||
#define FTDM_ISDN_H
|
|
||||||
|
|
||||||
#define DEFAULT_DIGIT_TIMEOUT 10000 /* default overlap timeout: 10 seconds */
|
|
||||||
|
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
FTDM_ISDN_OPT_NONE = 0,
|
|
||||||
FTDM_ISDN_OPT_SUGGEST_CHANNEL = (1 << 0),
|
|
||||||
FTDM_ISDN_OPT_OMIT_DISPLAY_IE = (1 << 1), /*!< Do not send Caller name in outgoing SETUP message (= Display IE) */
|
|
||||||
FTDM_ISDN_OPT_DISABLE_TONES = (1 << 2), /*!< Disable tone generating thread (NT mode) */
|
|
||||||
|
|
||||||
FTDM_ISDN_OPT_MAX = (2 << 0)
|
|
||||||
} ftdm_isdn_opts_t;
|
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
FTDM_ISDN_RUNNING = (1 << 0),
|
|
||||||
FTDM_ISDN_TONES_RUNNING = (1 << 1),
|
|
||||||
FTDM_ISDN_STOP = (1 << 2),
|
|
||||||
|
|
||||||
FTDM_ISDN_CAPTURE = (1 << 3),
|
|
||||||
FTDM_ISDN_CAPTURE_L3ONLY = (1 << 4)
|
|
||||||
} ftdm_isdn_flag_t;
|
|
||||||
|
|
||||||
#ifdef HAVE_PCAP
|
|
||||||
struct pcap_context;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
struct ftdm_isdn_data {
|
|
||||||
Q921Data_t q921;
|
|
||||||
Q931_TrunkInfo_t q931;
|
|
||||||
ftdm_channel_t *dchan;
|
|
||||||
uint32_t flags;
|
|
||||||
int32_t mode;
|
|
||||||
int32_t digit_timeout;
|
|
||||||
ftdm_isdn_opts_t opts;
|
|
||||||
#ifdef HAVE_PCAP
|
|
||||||
struct pcap_context *pcap;
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef struct ftdm_isdn_data ftdm_isdn_data_t;
|
|
||||||
|
|
||||||
|
|
||||||
/* b-channel private data */
|
|
||||||
struct ftdm_isdn_bchan_data
|
|
||||||
{
|
|
||||||
ftdm_time_t digit_timeout;
|
|
||||||
int offset; /* offset in teletone buffer */
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef struct ftdm_isdn_bchan_data ftdm_isdn_bchan_data_t;
|
|
||||||
|
|
||||||
|
|
||||||
#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 noet expandtab:
|
|
||||||
*/
|
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,151 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2009-2012, Anthony Minessale II
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
*
|
|
||||||
* * Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
*
|
|
||||||
* * Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* * Neither the name of the original author; nor the names of any contributors
|
|
||||||
* may be used to endorse or promote products derived from this software
|
|
||||||
* without specific prior written permission.
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
|
||||||
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
|
||||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
||||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
|
||||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
||||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
||||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
||||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
#ifndef FTMOD_LIBPRI_H
|
|
||||||
#define FTMOD_LIBPRI_H
|
|
||||||
#include "freetdm.h"
|
|
||||||
#include "lpwrap_pri.h"
|
|
||||||
|
|
||||||
/* T302 Overlap receiving inter-digit timeout */
|
|
||||||
#define OVERLAP_TIMEOUT_MS_DEFAULT 5000 /* 5 sec */
|
|
||||||
#define OVERLAP_TIMEOUT_MS_MIN 3000 /* 3 sec */
|
|
||||||
#define OVERLAP_TIMEOUT_MS_MAX 30000 /* 30 sec */
|
|
||||||
|
|
||||||
/* NT-mode idle b-channel restart timer */
|
|
||||||
#define IDLE_RESTART_TIMEOUT_MS_DEFAULT 0 /* disabled */
|
|
||||||
#define IDLE_RESTART_TIMEOUT_MS_MIN 10000 /* 10 sec */
|
|
||||||
#define IDLE_RESTART_TIMEOUT_MS_MAX 86400000 /* 1 day */
|
|
||||||
|
|
||||||
/* T316 RESTART ACK wait timer */
|
|
||||||
#define T316_TIMEOUT_MS_DEFAULT 30000 /* 30 sec */
|
|
||||||
#define T316_TIMEOUT_MS_MIN 10000 /* 10 sec */
|
|
||||||
#define T316_TIMEOUT_MS_MAX 300000 /* 5 min */
|
|
||||||
|
|
||||||
/* T316 restart attempts until channel is suspended */
|
|
||||||
#define T316_ATTEMPT_LIMIT_DEFAULT 3
|
|
||||||
#define T316_ATTEMPT_LIMIT_MIN 1
|
|
||||||
#define T316_ATTEMPT_LIMIT_MAX 10
|
|
||||||
|
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
SERVICE_CHANGE_STATUS_INSERVICE = 0,
|
|
||||||
SERVICE_CHANGE_STATUS_MAINTENANCE,
|
|
||||||
SERVICE_CHANGE_STATUS_OUTOFSERVICE
|
|
||||||
} service_change_status_t;
|
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
FTMOD_LIBPRI_OPT_NONE = 0,
|
|
||||||
FTMOD_LIBPRI_OPT_SUGGEST_CHANNEL = (1 << 0),
|
|
||||||
FTMOD_LIBPRI_OPT_OMIT_DISPLAY_IE = (1 << 1),
|
|
||||||
FTMOD_LIBPRI_OPT_OMIT_REDIRECTING_NUMBER_IE = (1 << 2),
|
|
||||||
FTMOD_LIBPRI_OPT_FACILITY_AOC = (1 << 3),
|
|
||||||
|
|
||||||
FTMOD_LIBPRI_OPT_MAX = (1 << 4)
|
|
||||||
} ftdm_isdn_opts_t;
|
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
FTMOD_LIBPRI_RUNNING = (1 << 0)
|
|
||||||
} ftdm_isdn_flag_t;
|
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
FTMOD_LIBPRI_OVERLAP_NONE = 0,
|
|
||||||
FTMOD_LIBPRI_OVERLAP_RECEIVE = (1 << 0),
|
|
||||||
FTMOD_LIBPRI_OVERLAP_SEND = (1 << 1)
|
|
||||||
#define FTMOD_LIBPRI_OVERLAP_BOTH (FTMOD_LIBPRI_OVERLAP_RECEIVE | FTMOD_LIBPRI_OVERLAP_SEND)
|
|
||||||
} ftdm_isdn_overlap_t;
|
|
||||||
|
|
||||||
struct ftdm_libpri_data {
|
|
||||||
ftdm_channel_t *dchan;
|
|
||||||
ftdm_isdn_opts_t opts;
|
|
||||||
uint32_t flags;
|
|
||||||
uint32_t debug_mask;
|
|
||||||
|
|
||||||
int mode;
|
|
||||||
int dialect;
|
|
||||||
int overlap; /*!< Overlap dial flags */
|
|
||||||
int overlap_timeout_ms; /*!< Overlap dial timeout */
|
|
||||||
int idle_restart_timeout_ms; /*!< NT-mode idle b-channel restart */
|
|
||||||
int t316_timeout_ms; /*!< T316 RESTART ACK timeout */
|
|
||||||
int t316_max_attempts; /*!< T316 timeout limit */
|
|
||||||
unsigned int layer1;
|
|
||||||
unsigned int ton;
|
|
||||||
unsigned int service_message_support;
|
|
||||||
|
|
||||||
lpwrap_pri_t spri;
|
|
||||||
|
|
||||||
/* MSN filter */
|
|
||||||
ftdm_hash_t *msn_hash;
|
|
||||||
ftdm_mutex_t *msn_mutex;
|
|
||||||
|
|
||||||
/* NT-mode idle restart timer */
|
|
||||||
struct lpwrap_timer t3xx;
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef struct ftdm_libpri_data ftdm_libpri_data_t;
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* b-channel flags
|
|
||||||
*/
|
|
||||||
enum {
|
|
||||||
FTDM_LIBPRI_B_NONE = 0,
|
|
||||||
FTDM_LIBPRI_B_REMOTE_RESTART = (1 << 0), /*!< Remote triggered channel restart */
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Per-b-channel private data
|
|
||||||
*/
|
|
||||||
struct ftdm_libpri_b_chan {
|
|
||||||
struct lpwrap_timer t302; /*!< T302 overlap receive timer */
|
|
||||||
struct lpwrap_timer t316; /*!< T316 restart ack timer */
|
|
||||||
ftdm_channel_t *channel; /*!< back-pointer to b-channel */
|
|
||||||
q931_call *call; /*!< libpri opaque call handle */
|
|
||||||
uint32_t flags; /*!< channel flags */
|
|
||||||
uint32_t t316_timeout_cnt; /*!< T316 timeout counter */
|
|
||||||
int peerhangup; /*!< hangup requested from libpri (RELEASE/RELEASE_ACK/DL_RELEASE/TIMERS EXPIRY) */
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef struct ftdm_libpri_b_chan ftdm_libpri_b_chan_t;
|
|
||||||
|
|
||||||
#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 noet:
|
|
||||||
*/
|
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue