Author: gmaruzz Date: Mon Dec 15 12:56:36 2008 New Revision: 10774 Log: Merge of trunk revisions 10428:10773 into gmaruzz branch Added: freeswitch/branches/gmaruzz/conf/autoload_configs/opal.conf.xml - copied unchanged from r10773, /freeswitch/trunk/conf/autoload_configs/opal.conf.xml freeswitch/branches/gmaruzz/libs/libg722_1/ - copied from r10773, /freeswitch/trunk/libs/libg722_1/ freeswitch/branches/gmaruzz/libs/libg722_1/.update - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/.update freeswitch/branches/gmaruzz/libs/libg722_1/AUTHORS - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/AUTHORS freeswitch/branches/gmaruzz/libs/libg722_1/COPYING - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/COPYING freeswitch/branches/gmaruzz/libs/libg722_1/ChangeLog - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/ChangeLog freeswitch/branches/gmaruzz/libs/libg722_1/INSTALL - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/INSTALL freeswitch/branches/gmaruzz/libs/libg722_1/Makefile.am - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/Makefile.am freeswitch/branches/gmaruzz/libs/libg722_1/Makefile.in - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/Makefile.in freeswitch/branches/gmaruzz/libs/libg722_1/NEWS - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/NEWS freeswitch/branches/gmaruzz/libs/libg722_1/README - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/README freeswitch/branches/gmaruzz/libs/libg722_1/aclocal.m4 - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/aclocal.m4 freeswitch/branches/gmaruzz/libs/libg722_1/autogen.sh - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/autogen.sh freeswitch/branches/gmaruzz/libs/libg722_1/config/ - copied from r10773, /freeswitch/trunk/libs/libg722_1/config/ freeswitch/branches/gmaruzz/libs/libg722_1/config-h.in - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/config-h.in freeswitch/branches/gmaruzz/libs/libg722_1/config/ax_c99_features.m4 - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/config/ax_c99_features.m4 freeswitch/branches/gmaruzz/libs/libg722_1/config/ax_check_real_file.m4 - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/config/ax_check_real_file.m4 freeswitch/branches/gmaruzz/libs/libg722_1/config/ax_compiler_vendor.m4 - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/config/ax_compiler_vendor.m4 freeswitch/branches/gmaruzz/libs/libg722_1/config/ax_fixed_point_machine.m4 - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/config/ax_fixed_point_machine.m4 freeswitch/branches/gmaruzz/libs/libg722_1/config/ax_misaligned_access_fails.m4 - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/config/ax_misaligned_access_fails.m4 freeswitch/branches/gmaruzz/libs/libg722_1/config/config.guess - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/config/config.guess freeswitch/branches/gmaruzz/libs/libg722_1/config/config.sub - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/config/config.sub freeswitch/branches/gmaruzz/libs/libg722_1/config/depcomp - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/config/depcomp freeswitch/branches/gmaruzz/libs/libg722_1/config/install-sh - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/config/install-sh freeswitch/branches/gmaruzz/libs/libg722_1/config/ltmain.sh - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/config/ltmain.sh freeswitch/branches/gmaruzz/libs/libg722_1/config/missing - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/config/missing freeswitch/branches/gmaruzz/libs/libg722_1/configure - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/configure freeswitch/branches/gmaruzz/libs/libg722_1/configure.ac - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/configure.ac freeswitch/branches/gmaruzz/libs/libg722_1/debian/ - copied from r10773, /freeswitch/trunk/libs/libg722_1/debian/ freeswitch/branches/gmaruzz/libs/libg722_1/debian/changelog - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/debian/changelog freeswitch/branches/gmaruzz/libs/libg722_1/debian/compat - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/debian/compat freeswitch/branches/gmaruzz/libs/libg722_1/debian/control - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/debian/control freeswitch/branches/gmaruzz/libs/libg722_1/debian/copyright - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/debian/copyright freeswitch/branches/gmaruzz/libs/libg722_1/debian/libg722_1-dev.install - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/debian/libg722_1-dev.install freeswitch/branches/gmaruzz/libs/libg722_1/debian/libg722_1-doc.install - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/debian/libg722_1-doc.install freeswitch/branches/gmaruzz/libs/libg722_1/debian/libg722_11.install - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/debian/libg722_11.install freeswitch/branches/gmaruzz/libs/libg722_1/debian/rules - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/debian/rules freeswitch/branches/gmaruzz/libs/libg722_1/debian/watch - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/debian/watch freeswitch/branches/gmaruzz/libs/libg722_1/doc/ - copied from r10773, /freeswitch/trunk/libs/libg722_1/doc/ freeswitch/branches/gmaruzz/libs/libg722_1/doc/Makefile.am - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/doc/Makefile.am freeswitch/branches/gmaruzz/libs/libg722_1/doc/Makefile.in - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/doc/Makefile.in freeswitch/branches/gmaruzz/libs/libg722_1/doc/css.css - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/doc/css.css freeswitch/branches/gmaruzz/libs/libg722_1/doc/libg722_1-doxygen - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/doc/libg722_1-doxygen freeswitch/branches/gmaruzz/libs/libg722_1/doc/wrapper.xsl - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/doc/wrapper.xsl freeswitch/branches/gmaruzz/libs/libg722_1/g722_1.spec.in - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/g722_1.spec.in freeswitch/branches/gmaruzz/libs/libg722_1/src/ - copied from r10773, /freeswitch/trunk/libs/libg722_1/src/ freeswitch/branches/gmaruzz/libs/libg722_1/src/Makefile.am - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/src/Makefile.am freeswitch/branches/gmaruzz/libs/libg722_1/src/Makefile.in - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/src/Makefile.in freeswitch/branches/gmaruzz/libs/libg722_1/src/basop32.c - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/src/basop32.c freeswitch/branches/gmaruzz/libs/libg722_1/src/basop32.h - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/src/basop32.h freeswitch/branches/gmaruzz/libs/libg722_1/src/bitstream.c - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/src/bitstream.c freeswitch/branches/gmaruzz/libs/libg722_1/src/bitstream.h - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/src/bitstream.h freeswitch/branches/gmaruzz/libs/libg722_1/src/coef2sam.c - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/src/coef2sam.c freeswitch/branches/gmaruzz/libs/libg722_1/src/coef2sam.h - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/src/coef2sam.h freeswitch/branches/gmaruzz/libs/libg722_1/src/common.c - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/src/common.c freeswitch/branches/gmaruzz/libs/libg722_1/src/commonf.c - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/src/commonf.c freeswitch/branches/gmaruzz/libs/libg722_1/src/dct4.c - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/src/dct4.c freeswitch/branches/gmaruzz/libs/libg722_1/src/dct4.h - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/src/dct4.h freeswitch/branches/gmaruzz/libs/libg722_1/src/dct4_a.c - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/src/dct4_a.c freeswitch/branches/gmaruzz/libs/libg722_1/src/dct4_a.h - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/src/dct4_a.h freeswitch/branches/gmaruzz/libs/libg722_1/src/dct4_s.c - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/src/dct4_s.c freeswitch/branches/gmaruzz/libs/libg722_1/src/dct4_s.h - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/src/dct4_s.h freeswitch/branches/gmaruzz/libs/libg722_1/src/decoder.c - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/src/decoder.c freeswitch/branches/gmaruzz/libs/libg722_1/src/decoderf.c - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/src/decoderf.c freeswitch/branches/gmaruzz/libs/libg722_1/src/defs.h - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/src/defs.h freeswitch/branches/gmaruzz/libs/libg722_1/src/encoder.c - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/src/encoder.c freeswitch/branches/gmaruzz/libs/libg722_1/src/encoderf.c - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/src/encoderf.c freeswitch/branches/gmaruzz/libs/libg722_1/src/g722_1/ - copied from r10773, /freeswitch/trunk/libs/libg722_1/src/g722_1/ freeswitch/branches/gmaruzz/libs/libg722_1/src/g722_1.h.in - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/src/g722_1.h.in freeswitch/branches/gmaruzz/libs/libg722_1/src/g722_1/g722_1.h - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/src/g722_1/g722_1.h freeswitch/branches/gmaruzz/libs/libg722_1/src/g722_1/version.h - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/src/g722_1/version.h freeswitch/branches/gmaruzz/libs/libg722_1/src/g722_1/version.h.in - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/src/g722_1/version.h.in freeswitch/branches/gmaruzz/libs/libg722_1/src/huff_tab.c - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/src/huff_tab.c freeswitch/branches/gmaruzz/libs/libg722_1/src/huff_tab.h - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/src/huff_tab.h freeswitch/branches/gmaruzz/libs/libg722_1/src/libg722_1.dsp - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/src/libg722_1.dsp freeswitch/branches/gmaruzz/libs/libg722_1/src/libg722_1.sln - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/src/libg722_1.sln freeswitch/branches/gmaruzz/libs/libg722_1/src/libg722_1.vcproj - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/src/libg722_1.vcproj freeswitch/branches/gmaruzz/libs/libg722_1/src/make_dct4_tables.c - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/src/make_dct4_tables.c freeswitch/branches/gmaruzz/libs/libg722_1/src/make_tables.c - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/src/make_tables.c freeswitch/branches/gmaruzz/libs/libg722_1/src/msvc/ - copied from r10773, /freeswitch/trunk/libs/libg722_1/src/msvc/ freeswitch/branches/gmaruzz/libs/libg722_1/src/msvc/g722_1.def - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/src/msvc/g722_1.def freeswitch/branches/gmaruzz/libs/libg722_1/src/msvc/gettimeofday.c - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/src/msvc/gettimeofday.c freeswitch/branches/gmaruzz/libs/libg722_1/src/msvc/inttypes.h - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/src/msvc/inttypes.h freeswitch/branches/gmaruzz/libs/libg722_1/src/msvc/msvcproj.foot - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/src/msvc/msvcproj.foot freeswitch/branches/gmaruzz/libs/libg722_1/src/msvc/msvcproj.head - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/src/msvc/msvcproj.head freeswitch/branches/gmaruzz/libs/libg722_1/src/msvc/sys/ - copied from r10773, /freeswitch/trunk/libs/libg722_1/src/msvc/sys/ freeswitch/branches/gmaruzz/libs/libg722_1/src/msvc/sys/time.h - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/src/msvc/sys/time.h freeswitch/branches/gmaruzz/libs/libg722_1/src/msvc/tgmath.h - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/src/msvc/tgmath.h freeswitch/branches/gmaruzz/libs/libg722_1/src/msvc/unistd.h - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/src/msvc/unistd.h freeswitch/branches/gmaruzz/libs/libg722_1/src/msvc/vc8proj.foot - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/src/msvc/vc8proj.foot freeswitch/branches/gmaruzz/libs/libg722_1/src/msvc/vc8proj.head - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/src/msvc/vc8proj.head freeswitch/branches/gmaruzz/libs/libg722_1/src/sam2coef.c - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/src/sam2coef.c freeswitch/branches/gmaruzz/libs/libg722_1/src/sam2coef.h - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/src/sam2coef.h freeswitch/branches/gmaruzz/libs/libg722_1/src/tables.c - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/src/tables.c freeswitch/branches/gmaruzz/libs/libg722_1/src/tables.h - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/src/tables.h freeswitch/branches/gmaruzz/libs/libg722_1/test-data/ - copied from r10773, /freeswitch/trunk/libs/libg722_1/test-data/ freeswitch/branches/gmaruzz/libs/libg722_1/test-data/Makefile.am - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/test-data/Makefile.am freeswitch/branches/gmaruzz/libs/libg722_1/test-data/Makefile.in - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/test-data/Makefile.in freeswitch/branches/gmaruzz/libs/libg722_1/test-data/itu/ - copied from r10773, /freeswitch/trunk/libs/libg722_1/test-data/itu/ freeswitch/branches/gmaruzz/libs/libg722_1/test-data/itu/Makefile.am - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/test-data/itu/Makefile.am freeswitch/branches/gmaruzz/libs/libg722_1/test-data/itu/Makefile.in - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/test-data/itu/Makefile.in freeswitch/branches/gmaruzz/libs/libg722_1/test-data/local/ - copied from r10773, /freeswitch/trunk/libs/libg722_1/test-data/local/ freeswitch/branches/gmaruzz/libs/libg722_1/test-data/local/Makefile.am - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/test-data/local/Makefile.am freeswitch/branches/gmaruzz/libs/libg722_1/test-data/local/Makefile.in - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/test-data/local/Makefile.in freeswitch/branches/gmaruzz/libs/libg722_1/test-data/local/short_wb_voice.wav - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/test-data/local/short_wb_voice.wav freeswitch/branches/gmaruzz/libs/libg722_1/tests/ - copied from r10773, /freeswitch/trunk/libs/libg722_1/tests/ freeswitch/branches/gmaruzz/libs/libg722_1/tests/Makefile.am - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/tests/Makefile.am freeswitch/branches/gmaruzz/libs/libg722_1/tests/Makefile.in - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/tests/Makefile.in freeswitch/branches/gmaruzz/libs/libg722_1/tests/g722_1_tests.c - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/tests/g722_1_tests.c freeswitch/branches/gmaruzz/libs/libg722_1/tests/itu_bit_stream.c - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/tests/itu_bit_stream.c freeswitch/branches/gmaruzz/libs/libg722_1/tests/regression_tests.sh.in - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/tests/regression_tests.sh.in freeswitch/branches/gmaruzz/libs/libg722_1/tests/timing.h - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/tests/timing.h freeswitch/branches/gmaruzz/libs/libg722_1/unpack_g722_1_data.sh - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/unpack_g722_1_data.sh freeswitch/branches/gmaruzz/libs/libg722_1/wrapper.xsl - copied unchanged from r10773, /freeswitch/trunk/libs/libg722_1/wrapper.xsl freeswitch/branches/gmaruzz/libs/win32/libmp3lame/config.h - copied unchanged from r10773, /freeswitch/trunk/libs/win32/libmp3lame/config.h freeswitch/branches/gmaruzz/scripts/contrib/intralanman/C/ - copied from r10773, /freeswitch/trunk/scripts/contrib/intralanman/C/ freeswitch/branches/gmaruzz/scripts/contrib/intralanman/C/lcr/ - copied from r10773, /freeswitch/trunk/scripts/contrib/intralanman/C/lcr/ freeswitch/branches/gmaruzz/scripts/contrib/intralanman/C/lcr/lcr.conf.xml - copied unchanged from r10773, /freeswitch/trunk/scripts/contrib/intralanman/C/lcr/lcr.conf.xml freeswitch/branches/gmaruzz/scripts/contrib/intralanman/C/lcr/mod_lcr/ - copied from r10773, /freeswitch/trunk/scripts/contrib/intralanman/C/lcr/mod_lcr/ freeswitch/branches/gmaruzz/scripts/contrib/intralanman/C/lcr/mod_lcr/Makefile - copied unchanged from r10773, /freeswitch/trunk/scripts/contrib/intralanman/C/lcr/mod_lcr/Makefile freeswitch/branches/gmaruzz/scripts/contrib/intralanman/C/lcr/mod_lcr/mod_lcr.c - copied unchanged from r10773, /freeswitch/trunk/scripts/contrib/intralanman/C/lcr/mod_lcr/mod_lcr.c freeswitch/branches/gmaruzz/scripts/contrib/intralanman/C/lcr/sql/ - copied from r10773, /freeswitch/trunk/scripts/contrib/intralanman/C/lcr/sql/ freeswitch/branches/gmaruzz/scripts/contrib/intralanman/C/lcr/sql/mysql-5.0.sql - copied unchanged from r10773, /freeswitch/trunk/scripts/contrib/intralanman/C/lcr/sql/mysql-5.0.sql freeswitch/branches/gmaruzz/scripts/contrib/intralanman/C/lcr/sql/postgres-8.3.sql - copied unchanged from r10773, /freeswitch/trunk/scripts/contrib/intralanman/C/lcr/sql/postgres-8.3.sql freeswitch/branches/gmaruzz/scripts/contrib/mcollins/uuid_send_dtmf.lua - copied unchanged from r10773, /freeswitch/trunk/scripts/contrib/mcollins/uuid_send_dtmf.lua freeswitch/branches/gmaruzz/src/mod/applications/mod_http/ - copied from r10773, /freeswitch/trunk/src/mod/applications/mod_http/ freeswitch/branches/gmaruzz/src/mod/applications/mod_http/Makefile - copied unchanged from r10773, /freeswitch/trunk/src/mod/applications/mod_http/Makefile freeswitch/branches/gmaruzz/src/mod/applications/mod_http/arraylist.c - copied unchanged from r10773, /freeswitch/trunk/src/mod/applications/mod_http/arraylist.c freeswitch/branches/gmaruzz/src/mod/applications/mod_http/arraylist.h - copied unchanged from r10773, /freeswitch/trunk/src/mod/applications/mod_http/arraylist.h freeswitch/branches/gmaruzz/src/mod/applications/mod_http/bits.h - copied unchanged from r10773, /freeswitch/trunk/src/mod/applications/mod_http/bits.h freeswitch/branches/gmaruzz/src/mod/applications/mod_http/config.h - copied unchanged from r10773, /freeswitch/trunk/src/mod/applications/mod_http/config.h freeswitch/branches/gmaruzz/src/mod/applications/mod_http/debug.c - copied unchanged from r10773, /freeswitch/trunk/src/mod/applications/mod_http/debug.c freeswitch/branches/gmaruzz/src/mod/applications/mod_http/debug.h - copied unchanged from r10773, /freeswitch/trunk/src/mod/applications/mod_http/debug.h freeswitch/branches/gmaruzz/src/mod/applications/mod_http/http_req.c - copied unchanged from r10773, /freeswitch/trunk/src/mod/applications/mod_http/http_req.c freeswitch/branches/gmaruzz/src/mod/applications/mod_http/http_req.h - copied unchanged from r10773, /freeswitch/trunk/src/mod/applications/mod_http/http_req.h freeswitch/branches/gmaruzz/src/mod/applications/mod_http/json.h - copied unchanged from r10773, /freeswitch/trunk/src/mod/applications/mod_http/json.h freeswitch/branches/gmaruzz/src/mod/applications/mod_http/json_object.c - copied unchanged from r10773, /freeswitch/trunk/src/mod/applications/mod_http/json_object.c freeswitch/branches/gmaruzz/src/mod/applications/mod_http/json_object.h - copied unchanged from r10773, /freeswitch/trunk/src/mod/applications/mod_http/json_object.h freeswitch/branches/gmaruzz/src/mod/applications/mod_http/json_object_private.h - copied unchanged from r10773, /freeswitch/trunk/src/mod/applications/mod_http/json_object_private.h freeswitch/branches/gmaruzz/src/mod/applications/mod_http/json_tokener.c - copied unchanged from r10773, /freeswitch/trunk/src/mod/applications/mod_http/json_tokener.c freeswitch/branches/gmaruzz/src/mod/applications/mod_http/json_tokener.h - copied unchanged from r10773, /freeswitch/trunk/src/mod/applications/mod_http/json_tokener.h freeswitch/branches/gmaruzz/src/mod/applications/mod_http/json_util.c - copied unchanged from r10773, /freeswitch/trunk/src/mod/applications/mod_http/json_util.c freeswitch/branches/gmaruzz/src/mod/applications/mod_http/json_util.h - copied unchanged from r10773, /freeswitch/trunk/src/mod/applications/mod_http/json_util.h freeswitch/branches/gmaruzz/src/mod/applications/mod_http/linkhash.c - copied unchanged from r10773, /freeswitch/trunk/src/mod/applications/mod_http/linkhash.c freeswitch/branches/gmaruzz/src/mod/applications/mod_http/linkhash.h - copied unchanged from r10773, /freeswitch/trunk/src/mod/applications/mod_http/linkhash.h freeswitch/branches/gmaruzz/src/mod/applications/mod_http/mod_http.c - copied unchanged from r10773, /freeswitch/trunk/src/mod/applications/mod_http/mod_http.c freeswitch/branches/gmaruzz/src/mod/applications/mod_http/printbuf.c - copied unchanged from r10773, /freeswitch/trunk/src/mod/applications/mod_http/printbuf.c freeswitch/branches/gmaruzz/src/mod/applications/mod_http/printbuf.h - copied unchanged from r10773, /freeswitch/trunk/src/mod/applications/mod_http/printbuf.h freeswitch/branches/gmaruzz/src/mod/applications/mod_http/url_encoding.c - copied unchanged from r10773, /freeswitch/trunk/src/mod/applications/mod_http/url_encoding.c freeswitch/branches/gmaruzz/src/mod/applications/mod_http/url_encoding.h - copied unchanged from r10773, /freeswitch/trunk/src/mod/applications/mod_http/url_encoding.h freeswitch/branches/gmaruzz/src/mod/applications/mod_vmd/ (props changed) - copied from r10773, /freeswitch/trunk/src/mod/applications/mod_vmd/ freeswitch/branches/gmaruzz/src/mod/applications/mod_vmd/mod_vmd.2008.vcproj - copied unchanged from r10773, /freeswitch/trunk/src/mod/applications/mod_vmd/mod_vmd.2008.vcproj freeswitch/branches/gmaruzz/src/mod/applications/mod_vmd/mod_vmd.c - copied unchanged from r10773, /freeswitch/trunk/src/mod/applications/mod_vmd/mod_vmd.c freeswitch/branches/gmaruzz/src/mod/codecs/mod_siren/ - copied from r10773, /freeswitch/trunk/src/mod/codecs/mod_siren/ freeswitch/branches/gmaruzz/src/mod/codecs/mod_siren/Makefile - copied unchanged from r10773, /freeswitch/trunk/src/mod/codecs/mod_siren/Makefile freeswitch/branches/gmaruzz/src/mod/codecs/mod_siren/mod_siren.c - copied unchanged from r10773, /freeswitch/trunk/src/mod/codecs/mod_siren/mod_siren.c freeswitch/branches/gmaruzz/src/mod/endpoints/mod_opal/ (props changed) - copied from r10773, /freeswitch/trunk/src/mod/endpoints/mod_opal/ freeswitch/branches/gmaruzz/src/mod/endpoints/mod_opal/Makefile - copied unchanged from r10773, /freeswitch/trunk/src/mod/endpoints/mod_opal/Makefile freeswitch/branches/gmaruzz/src/mod/endpoints/mod_opal/mod_opal.cpp - copied unchanged from r10773, /freeswitch/trunk/src/mod/endpoints/mod_opal/mod_opal.cpp freeswitch/branches/gmaruzz/src/mod/endpoints/mod_opal/mod_opal.h - copied unchanged from r10773, /freeswitch/trunk/src/mod/endpoints/mod_opal/mod_opal.h freeswitch/branches/gmaruzz/src/mod/endpoints/mod_opal/mod_opal_2005.vcproj - copied unchanged from r10773, /freeswitch/trunk/src/mod/endpoints/mod_opal/mod_opal_2005.vcproj freeswitch/branches/gmaruzz/src/mod/endpoints/mod_opal/mod_opal_2008.vcproj - copied unchanged from r10773, /freeswitch/trunk/src/mod/endpoints/mod_opal/mod_opal_2008.vcproj freeswitch/branches/gmaruzz/support-d/ - copied from r10773, /freeswitch/trunk/support-d/ freeswitch/branches/gmaruzz/support-d/.bashrc - copied unchanged from r10773, /freeswitch/trunk/support-d/.bashrc freeswitch/branches/gmaruzz/support-d/.emacs - copied unchanged from r10773, /freeswitch/trunk/support-d/.emacs freeswitch/branches/gmaruzz/support-d/.screenrc - copied unchanged from r10773, /freeswitch/trunk/support-d/.screenrc freeswitch/branches/gmaruzz/support-d/freeswitch.pub - copied unchanged from r10773, /freeswitch/trunk/support-d/freeswitch.pub freeswitch/branches/gmaruzz/support-d/install-cc-mode.sh - copied unchanged from r10773, /freeswitch/trunk/support-d/install-cc-mode.sh freeswitch/branches/gmaruzz/support-d/shinzon.pub - copied unchanged from r10773, /freeswitch/trunk/support-d/shinzon.pub Removed: freeswitch/branches/gmaruzz/conf/autoload_configs/woomera.conf.xml freeswitch/branches/gmaruzz/src/mod/endpoints/mod_woomera/ freeswitch/branches/gmaruzz/ssh_keys/ freeswitch/branches/gmaruzz/support/ Modified: freeswitch/branches/gmaruzz/Freeswitch.2008.sln freeswitch/branches/gmaruzz/Makefile.am freeswitch/branches/gmaruzz/build/Makefile freeswitch/branches/gmaruzz/build/modules.conf.in freeswitch/branches/gmaruzz/conf/autoload_configs/conference.conf.xml freeswitch/branches/gmaruzz/conf/autoload_configs/java.conf.xml freeswitch/branches/gmaruzz/conf/autoload_configs/local_stream.conf.xml freeswitch/branches/gmaruzz/conf/autoload_configs/lua.conf.xml freeswitch/branches/gmaruzz/conf/autoload_configs/modules.conf.xml freeswitch/branches/gmaruzz/conf/autoload_configs/sofia.conf.xml freeswitch/branches/gmaruzz/conf/autoload_configs/xml_cdr.conf.xml freeswitch/branches/gmaruzz/conf/dialplan/default.xml freeswitch/branches/gmaruzz/conf/directory/default/brian.xml freeswitch/branches/gmaruzz/conf/sip_profiles/external.xml freeswitch/branches/gmaruzz/conf/sip_profiles/external/example.xml freeswitch/branches/gmaruzz/conf/sip_profiles/internal-ipv6.xml freeswitch/branches/gmaruzz/conf/sip_profiles/internal.xml freeswitch/branches/gmaruzz/conf/sip_profiles/internal/example.xml freeswitch/branches/gmaruzz/conf/vars.xml freeswitch/branches/gmaruzz/configure.in freeswitch/branches/gmaruzz/debian/freeswitch.conffiles freeswitch/branches/gmaruzz/debian/freeswitch.install freeswitch/branches/gmaruzz/debian/postinst freeswitch/branches/gmaruzz/debian/rules freeswitch/branches/gmaruzz/docs/Doxygen.conf freeswitch/branches/gmaruzz/docs/phrase/phrase_en.xml freeswitch/branches/gmaruzz/freeswitch.spec freeswitch/branches/gmaruzz/libs/libdingaling/src/libdingaling.c freeswitch/branches/gmaruzz/libs/libteletone/src/libteletone_generate.c freeswitch/branches/gmaruzz/libs/spandsp/src/t31.c freeswitch/branches/gmaruzz/libs/spandsp/src/t38_terminal.c freeswitch/branches/gmaruzz/libs/win32/libmp3lame/libmp3lame_vc7.vcproj freeswitch/branches/gmaruzz/libs/win32/libshout/ (props changed) freeswitch/branches/gmaruzz/libs/win32/libshout/libshout.vcproj freeswitch/branches/gmaruzz/libs/win32/util.vbs freeswitch/branches/gmaruzz/scripts/contrib/intralanman/PHP/fs_curl/configuration/xml_cdr.conf.php freeswitch/branches/gmaruzz/scripts/contrib/intralanman/PHP/fs_curl/dialplan_importer.php freeswitch/branches/gmaruzz/scripts/contrib/intralanman/PHP/fs_curl/fs_configuration.php freeswitch/branches/gmaruzz/scripts/contrib/intralanman/PHP/fs_curl/fs_curl.php freeswitch/branches/gmaruzz/scripts/contrib/intralanman/PHP/fs_curl/fs_dialplan.php freeswitch/branches/gmaruzz/scripts/contrib/intralanman/PHP/fs_curl/fs_directory.php freeswitch/branches/gmaruzz/scripts/contrib/intralanman/PHP/fs_curl/global_defines.php freeswitch/branches/gmaruzz/scripts/contrib/intralanman/PHP/fs_curl/index.php freeswitch/branches/gmaruzz/scripts/contrib/mrene/mod_limit/mod_limit.c freeswitch/branches/gmaruzz/scripts/fsxs.in freeswitch/branches/gmaruzz/src/include/private/switch_core_pvt.h freeswitch/branches/gmaruzz/src/include/switch.h freeswitch/branches/gmaruzz/src/include/switch_apr.h freeswitch/branches/gmaruzz/src/include/switch_channel.h freeswitch/branches/gmaruzz/src/include/switch_core.h freeswitch/branches/gmaruzz/src/include/switch_cpp.h freeswitch/branches/gmaruzz/src/include/switch_ivr.h freeswitch/branches/gmaruzz/src/include/switch_module_interfaces.h freeswitch/branches/gmaruzz/src/include/switch_odbc.h freeswitch/branches/gmaruzz/src/include/switch_rtp.h freeswitch/branches/gmaruzz/src/include/switch_stun.h freeswitch/branches/gmaruzz/src/include/switch_types.h freeswitch/branches/gmaruzz/src/include/switch_utils.h freeswitch/branches/gmaruzz/src/mod/applications/mod_commands/mod_commands.c freeswitch/branches/gmaruzz/src/mod/applications/mod_conference/mod_conference.c freeswitch/branches/gmaruzz/src/mod/applications/mod_dptools/mod_dptools.c freeswitch/branches/gmaruzz/src/mod/applications/mod_enum/mod_enum.c freeswitch/branches/gmaruzz/src/mod/applications/mod_expr/exprpars.c freeswitch/branches/gmaruzz/src/mod/applications/mod_expr/exprutil.c freeswitch/branches/gmaruzz/src/mod/applications/mod_fax/Makefile freeswitch/branches/gmaruzz/src/mod/applications/mod_fax/mod_fax.c freeswitch/branches/gmaruzz/src/mod/applications/mod_fifo/mod_fifo.c freeswitch/branches/gmaruzz/src/mod/applications/mod_fsv/mod_fsv.c freeswitch/branches/gmaruzz/src/mod/applications/mod_limit/mod_limit.c freeswitch/branches/gmaruzz/src/mod/applications/mod_voicemail/mod_voicemail.c freeswitch/branches/gmaruzz/src/mod/asr_tts/mod_cepstral/Makefile freeswitch/branches/gmaruzz/src/mod/asr_tts/mod_cepstral/mod_cepstral.c freeswitch/branches/gmaruzz/src/mod/asr_tts/mod_pocketsphinx/Makefile freeswitch/branches/gmaruzz/src/mod/endpoints/mod_dingaling/mod_dingaling.c freeswitch/branches/gmaruzz/src/mod/endpoints/mod_iax/iax-client.h freeswitch/branches/gmaruzz/src/mod/endpoints/mod_loopback/mod_loopback.c freeswitch/branches/gmaruzz/src/mod/endpoints/mod_sofia/mod_sofia.c freeswitch/branches/gmaruzz/src/mod/endpoints/mod_sofia/mod_sofia.h freeswitch/branches/gmaruzz/src/mod/endpoints/mod_sofia/sofia.c freeswitch/branches/gmaruzz/src/mod/endpoints/mod_sofia/sofia_glue.c freeswitch/branches/gmaruzz/src/mod/endpoints/mod_sofia/sofia_presence.c freeswitch/branches/gmaruzz/src/mod/endpoints/mod_sofia/sofia_reg.c freeswitch/branches/gmaruzz/src/mod/event_handlers/mod_cdr_csv/mod_cdr_csv.c freeswitch/branches/gmaruzz/src/mod/event_handlers/mod_erlang_event/mod_erlang_event.c freeswitch/branches/gmaruzz/src/mod/event_handlers/mod_event_socket/mod_event_socket.c freeswitch/branches/gmaruzz/src/mod/formats/mod_shout/mod_shout.c freeswitch/branches/gmaruzz/src/mod/formats/mod_sndfile/mod_sndfile.c freeswitch/branches/gmaruzz/src/mod/languages/mod_java/src/org/freeswitch/swig/CoreSession.java freeswitch/branches/gmaruzz/src/mod/languages/mod_java/src/org/freeswitch/swig/freeswitch.java freeswitch/branches/gmaruzz/src/mod/languages/mod_java/src/org/freeswitch/swig/freeswitchJNI.java freeswitch/branches/gmaruzz/src/mod/languages/mod_java/switch_swig_wrap.cpp freeswitch/branches/gmaruzz/src/mod/languages/mod_lua/mod_lua_wrap.cpp freeswitch/branches/gmaruzz/src/mod/languages/mod_managed/freeswitch_wrap.cxx freeswitch/branches/gmaruzz/src/mod/languages/mod_managed/managed/swig.cs freeswitch/branches/gmaruzz/src/mod/languages/mod_perl/freeswitch.pm freeswitch/branches/gmaruzz/src/mod/languages/mod_perl/mod_perl_wrap.cpp freeswitch/branches/gmaruzz/src/mod/languages/mod_python/freeswitch.py freeswitch/branches/gmaruzz/src/mod/languages/mod_python/mod_python_wrap.cpp freeswitch/branches/gmaruzz/src/mod/languages/mod_spidermonkey/mod_spidermonkey.c freeswitch/branches/gmaruzz/src/mod/xml_int/mod_xml_cdr/mod_xml_cdr.c freeswitch/branches/gmaruzz/src/mod/xml_int/mod_xml_curl/mod_xml_curl.c freeswitch/branches/gmaruzz/src/mod/xml_int/mod_xml_ldap/Makefile freeswitch/branches/gmaruzz/src/switch.c freeswitch/branches/gmaruzz/src/switch_apr.c freeswitch/branches/gmaruzz/src/switch_channel.c freeswitch/branches/gmaruzz/src/switch_core.c freeswitch/branches/gmaruzz/src/switch_core_codec.c freeswitch/branches/gmaruzz/src/switch_core_io.c freeswitch/branches/gmaruzz/src/switch_core_rwlock.c freeswitch/branches/gmaruzz/src/switch_core_session.c freeswitch/branches/gmaruzz/src/switch_core_state_machine.c freeswitch/branches/gmaruzz/src/switch_cpp.cpp freeswitch/branches/gmaruzz/src/switch_event.c freeswitch/branches/gmaruzz/src/switch_ivr.c freeswitch/branches/gmaruzz/src/switch_ivr_async.c freeswitch/branches/gmaruzz/src/switch_ivr_bridge.c freeswitch/branches/gmaruzz/src/switch_ivr_menu.c freeswitch/branches/gmaruzz/src/switch_ivr_originate.c freeswitch/branches/gmaruzz/src/switch_ivr_play_say.c freeswitch/branches/gmaruzz/src/switch_loadable_module.c freeswitch/branches/gmaruzz/src/switch_odbc.c freeswitch/branches/gmaruzz/src/switch_resample.c freeswitch/branches/gmaruzz/src/switch_rtp.c freeswitch/branches/gmaruzz/src/switch_stun.c freeswitch/branches/gmaruzz/src/switch_utils.c freeswitch/branches/gmaruzz/src/switch_xml.c freeswitch/branches/gmaruzz/w32/Library/ (props changed) Modified: freeswitch/branches/gmaruzz/Freeswitch.2008.sln ============================================================================== --- freeswitch/branches/gmaruzz/Freeswitch.2008.sln (original) +++ freeswitch/branches/gmaruzz/Freeswitch.2008.sln Mon Dec 15 12:56:36 2008 @@ -1,6 +1,6 @@ Microsoft Visual Studio Solution File, Format Version 10.00 -# Visual C++ Express 2008 +# Visual Studio 2008 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Codecs", "Codecs", "{F881ADA2-2F1A-4046-9FEB-191D9422D781}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Endpoints", "Endpoints", "{9460B5F1-0A95-41C4-BEB7-9C2C96459A7C}" @@ -160,28 +160,28 @@ conf\lang\de\vm\tts.xml = conf\lang\de\vm\tts.xml EndProjectSection EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "demo (2)", "demo (2)", "{765EF1B9-5027-4820-BC37-A44466A51631}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "demo", "demo", "{765EF1B9-5027-4820-BC37-A44466A51631}" ProjectSection(SolutionItems) = preProject conf\lang\en\demo\demo.xml = conf\lang\en\demo\demo.xml EndProjectSection EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "vm (2)", "vm (2)", "{713E4747-1126-40B1-BD84-58F9A7745423}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "vm", "vm", "{713E4747-1126-40B1-BD84-58F9A7745423}" ProjectSection(SolutionItems) = preProject conf\lang\en\vm\sounds.xml = conf\lang\en\vm\sounds.xml conf\lang\en\vm\tts.xml = conf\lang\en\vm\tts.xml EndProjectSection EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "demo (3)", "demo (3)", "{F1B71990-EB04-4EB5-B28A-BC3EB6F7E843}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "demo", "demo", "{F1B71990-EB04-4EB5-B28A-BC3EB6F7E843}" ProjectSection(SolutionItems) = preProject conf\lang\fr\demo\demo.xml = conf\lang\fr\demo\demo.xml EndProjectSection EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "vm (3)", "vm (3)", "{3DAF028C-AB5B-4183-A01B-DCC43F5A87F0}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "vm", "vm", "{3DAF028C-AB5B-4183-A01B-DCC43F5A87F0}" ProjectSection(SolutionItems) = preProject conf\lang\fr\vm\sounds.xml = conf\lang\fr\vm\sounds.xml EndProjectSection EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "autoload_configs (2)", "autoload_configs (2)", "{4833F8E3-ABBF-4260-9DB1-B34015676CFC}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "autoload_configs", "autoload_configs", "{4833F8E3-ABBF-4260-9DB1-B34015676CFC}" ProjectSection(SolutionItems) = preProject debug\conf\autoload_configs\alsa.conf.xml = debug\conf\autoload_configs\alsa.conf.xml debug\conf\autoload_configs\conference.conf.xml = debug\conf\autoload_configs\conference.conf.xml @@ -214,26 +214,26 @@ debug\conf\autoload_configs\zeroconf.conf.xml = debug\conf\autoload_configs\zeroconf.conf.xml EndProjectSection EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "dialplan (2)", "dialplan (2)", "{D44DD429-FE98-42AA-B5B7-4B4EBE33AEFD}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "dialplan", "dialplan", "{D44DD429-FE98-42AA-B5B7-4B4EBE33AEFD}" ProjectSection(SolutionItems) = preProject debug\conf\dialplan\default.xml = debug\conf\dialplan\default.xml debug\conf\dialplan\US.conf.xml = debug\conf\dialplan\US.conf.xml EndProjectSection EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "directory (2)", "directory (2)", "{471110C9-A7ED-4966-98E1-8EA667BF0EEA}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "directory", "directory", "{471110C9-A7ED-4966-98E1-8EA667BF0EEA}" ProjectSection(SolutionItems) = preProject debug\conf\directory\default.xml = debug\conf\directory\default.xml EndProjectSection EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "sip_profiles (2)", "sip_profiles (2)", "{4DF5199E-F7F5-4347-97DD-22078FCDB371}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "sip_profiles", "sip_profiles", "{4DF5199E-F7F5-4347-97DD-22078FCDB371}" ProjectSection(SolutionItems) = preProject debug\conf\sip_profiles\default.xml = debug\conf\sip_profiles\default.xml debug\conf\sip_profiles\nat.xml = debug\conf\sip_profiles\nat.xml EndProjectSection EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "lang (2)", "lang (2)", "{B487BEBE-4A5C-434F-8D30-39465412F84F}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "lang", "lang", "{B487BEBE-4A5C-434F-8D30-39465412F84F}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "de (2)", "de (2)", "{2003189F-0E69-4FF7-A11D-3BFB3F03D558}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "de", "de", "{2003189F-0E69-4FF7-A11D-3BFB3F03D558}" ProjectSection(SolutionItems) = preProject debug\conf\lang\de\de.xml = debug\conf\lang\de\de.xml EndProjectSection @@ -243,43 +243,43 @@ debug\conf\lang\en\en.xml = debug\conf\lang\en\en.xml EndProjectSection EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "fr (2)", "fr (2)", "{1240C217-6674-43C1-B099-B0290D84F28B}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "fr", "fr", "{1240C217-6674-43C1-B099-B0290D84F28B}" ProjectSection(SolutionItems) = preProject debug\conf\lang\fr\fr.xml = debug\conf\lang\fr\fr.xml EndProjectSection EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "demo (4)", "demo (4)", "{03517B06-98A1-46DD-9347-BFFFED7DD8A4}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "demo", "demo", "{03517B06-98A1-46DD-9347-BFFFED7DD8A4}" ProjectSection(SolutionItems) = preProject debug\conf\lang\de\demo\demo.xml = debug\conf\lang\de\demo\demo.xml EndProjectSection EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "vm (4)", "vm (4)", "{1D339A14-FFC2-4F6E-BEF2-D5D6DF14AC88}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "vm", "vm", "{1D339A14-FFC2-4F6E-BEF2-D5D6DF14AC88}" ProjectSection(SolutionItems) = preProject debug\conf\lang\de\vm\tts.xml = debug\conf\lang\de\vm\tts.xml EndProjectSection EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "demo (5)", "demo (5)", "{B4C6D0B5-5F39-4546-820D-4BCAA6C3E301}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "demo", "demo", "{B4C6D0B5-5F39-4546-820D-4BCAA6C3E301}" ProjectSection(SolutionItems) = preProject debug\conf\lang\en\demo\demo.xml = debug\conf\lang\en\demo\demo.xml EndProjectSection EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "vm (5)", "vm (5)", "{3041F86C-51D4-4D9E-8A00-91BA4B7C51D4}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "vm", "vm", "{3041F86C-51D4-4D9E-8A00-91BA4B7C51D4}" ProjectSection(SolutionItems) = preProject debug\conf\lang\en\vm\sounds.xml = debug\conf\lang\en\vm\sounds.xml debug\conf\lang\en\vm\tts.xml = debug\conf\lang\en\vm\tts.xml EndProjectSection EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "demo (6)", "demo (6)", "{DFE96A6E-5C9A-4C74-959A-9C485A7AD95C}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "demo", "demo", "{DFE96A6E-5C9A-4C74-959A-9C485A7AD95C}" ProjectSection(SolutionItems) = preProject debug\conf\lang\fr\demo\demo.xml = debug\conf\lang\fr\demo\demo.xml EndProjectSection EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "vm (6)", "vm (6)", "{80A4CA5C-7208-4134-8EFD-C147B03C8AA1}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "vm", "vm", "{80A4CA5C-7208-4134-8EFD-C147B03C8AA1}" ProjectSection(SolutionItems) = preProject debug\conf\lang\fr\vm\sounds.xml = debug\conf\lang\fr\vm\sounds.xml EndProjectSection EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "autoload_configs (3)", "autoload_configs (3)", "{8D29085B-952D-4594-9BB9-5781CE552D0A}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "autoload_configs", "autoload_configs", "{8D29085B-952D-4594-9BB9-5781CE552D0A}" ProjectSection(SolutionItems) = preProject release\conf\autoload_configs\alsa.conf.xml = release\conf\autoload_configs\alsa.conf.xml release\conf\autoload_configs\conference.conf.xml = release\conf\autoload_configs\conference.conf.xml @@ -312,25 +312,25 @@ release\conf\autoload_configs\zeroconf.conf.xml = release\conf\autoload_configs\zeroconf.conf.xml EndProjectSection EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "dialplan (3)", "dialplan (3)", "{23874F4B-C0AF-4587-9F7E-DB0F06DE8CB4}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "dialplan", "dialplan", "{23874F4B-C0AF-4587-9F7E-DB0F06DE8CB4}" ProjectSection(SolutionItems) = preProject conf\dialplan\default.xml = conf\dialplan\default.xml EndProjectSection EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "directory (3)", "directory (3)", "{19ED97F6-30D8-4FCE-AE1D-8B7FCB170D40}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "directory", "directory", "{19ED97F6-30D8-4FCE-AE1D-8B7FCB170D40}" ProjectSection(SolutionItems) = preProject release\conf\directory\default.xml = release\conf\directory\default.xml EndProjectSection EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "sip_profiles (3)", "sip_profiles (3)", "{99E79D76-FCFC-466B-965B-273CCACF99B0}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "sip_profiles", "sip_profiles", "{99E79D76-FCFC-466B-965B-273CCACF99B0}" ProjectSection(SolutionItems) = preProject release\conf\sip_profiles\default.xml = release\conf\sip_profiles\default.xml release\conf\sip_profiles\nat.xml = release\conf\sip_profiles\nat.xml EndProjectSection EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "lang (3)", "lang (3)", "{8FADAC7F-CA9E-49D9-B957-A5F5605D238C}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "lang", "lang", "{8FADAC7F-CA9E-49D9-B957-A5F5605D238C}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "de (3)", "de (3)", "{58A56014-DEA7-4172-8C26-BAD8D499A1E8}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "de", "de", "{58A56014-DEA7-4172-8C26-BAD8D499A1E8}" ProjectSection(SolutionItems) = preProject release\conf\lang\de\de.xml = release\conf\lang\de\de.xml EndProjectSection @@ -340,38 +340,38 @@ release\conf\lang\en\en.xml = release\conf\lang\en\en.xml EndProjectSection EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "fr (3)", "fr (3)", "{89A94241-1DA6-44E8-A685-AED1E665C2AD}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "fr", "fr", "{89A94241-1DA6-44E8-A685-AED1E665C2AD}" ProjectSection(SolutionItems) = preProject release\conf\lang\fr\fr.xml = release\conf\lang\fr\fr.xml EndProjectSection EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "demo (7)", "demo (7)", "{2D74F635-AB18-43B3-A87E-A71F3EA24DDB}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "demo", "demo", "{2D74F635-AB18-43B3-A87E-A71F3EA24DDB}" ProjectSection(SolutionItems) = preProject release\conf\lang\de\demo\demo.xml = release\conf\lang\de\demo\demo.xml EndProjectSection EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "vm (7)", "vm (7)", "{A721E646-07E9-4E16-A92D-B97F654B2BAC}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "vm", "vm", "{A721E646-07E9-4E16-A92D-B97F654B2BAC}" ProjectSection(SolutionItems) = preProject release\conf\lang\de\vm\tts.xml = release\conf\lang\de\vm\tts.xml EndProjectSection EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "demo (8)", "demo (8)", "{50331CA0-7038-4341-B92D-C34E1601EFF0}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "demo", "demo", "{50331CA0-7038-4341-B92D-C34E1601EFF0}" ProjectSection(SolutionItems) = preProject release\conf\lang\en\demo\demo.xml = release\conf\lang\en\demo\demo.xml EndProjectSection EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "vm (8)", "vm (8)", "{FC0DB2A2-B1A3-426E-9E37-BE28FE8FE01B}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "vm", "vm", "{FC0DB2A2-B1A3-426E-9E37-BE28FE8FE01B}" ProjectSection(SolutionItems) = preProject release\conf\lang\en\vm\sounds.xml = release\conf\lang\en\vm\sounds.xml release\conf\lang\en\vm\tts.xml = release\conf\lang\en\vm\tts.xml EndProjectSection EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "demo (9)", "demo (9)", "{91C6DEDE-CE4A-47D1-A84B-3E828F82E2B0}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "demo", "demo", "{91C6DEDE-CE4A-47D1-A84B-3E828F82E2B0}" ProjectSection(SolutionItems) = preProject release\conf\lang\fr\demo\demo.xml = release\conf\lang\fr\demo\demo.xml EndProjectSection EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "vm (9)", "vm (9)", "{8F5A511B-F716-4D07-9657-55B9E4F1D3E9}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "vm", "vm", "{8F5A511B-F716-4D07-9657-55B9E4F1D3E9}" ProjectSection(SolutionItems) = preProject release\conf\lang\fr\vm\sounds.xml = release\conf\lang\fr\vm\sounds.xml EndProjectSection @@ -991,10 +991,9 @@ {202D7A4E-760D-4D0E-AFA1-D7459CED30FF} = {202D7A4E-760D-4D0E-AFA1-D7459CED30FF} EndProjectSection EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_skypiax", "src\mod\endpoints\mod_skypiax\mod_skypiax.2008.vcproj", "{C6E78A4C-DB1E-47F4-9B63-4DC27D86343F}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_vmd", "src\mod\applications\mod_vmd\mod_vmd.2008.vcproj", "{14E4A972-9CFB-436D-B0A5-4943F3F80D47}" ProjectSection(ProjectDependencies) = postProject {202D7A4E-760D-4D0E-AFA1-D7459CED30FF} = {202D7A4E-760D-4D0E-AFA1-D7459CED30FF} - {F6C55D93-B927-4483-BB69-15AEF3DD2DFF} = {F6C55D93-B927-4483-BB69-15AEF3DD2DFF} EndProjectSection EndProject Global @@ -1741,12 +1740,12 @@ {B3F424EC-3D8F-417C-B244-3919D5E1A577}.Release|Win32.ActiveCfg = Release|Win32 {B3F424EC-3D8F-417C-B244-3919D5E1A577}.Release|Win32.Build.0 = Release|Win32 {B3F424EC-3D8F-417C-B244-3919D5E1A577}.Release|x64.ActiveCfg = Release|Win32 - {C6E78A4C-DB1E-47F4-9B63-4DC27D86343F}.Debug|Win32.ActiveCfg = Debug|Win32 - {C6E78A4C-DB1E-47F4-9B63-4DC27D86343F}.Debug|Win32.Build.0 = Debug|Win32 - {C6E78A4C-DB1E-47F4-9B63-4DC27D86343F}.Debug|x64.ActiveCfg = Debug|Win32 - {C6E78A4C-DB1E-47F4-9B63-4DC27D86343F}.Release|Win32.ActiveCfg = Release|Win32 - {C6E78A4C-DB1E-47F4-9B63-4DC27D86343F}.Release|Win32.Build.0 = Release|Win32 - {C6E78A4C-DB1E-47F4-9B63-4DC27D86343F}.Release|x64.ActiveCfg = Release|Win32 + {14E4A972-9CFB-436D-B0A5-4943F3F80D47}.Debug|Win32.ActiveCfg = Debug|Win32 + {14E4A972-9CFB-436D-B0A5-4943F3F80D47}.Debug|Win32.Build.0 = Debug|Win32 + {14E4A972-9CFB-436D-B0A5-4943F3F80D47}.Debug|x64.ActiveCfg = Debug|Win32 + {14E4A972-9CFB-436D-B0A5-4943F3F80D47}.Release|Win32.ActiveCfg = Release|Win32 + {14E4A972-9CFB-436D-B0A5-4943F3F80D47}.Release|Win32.Build.0 = Release|Win32 + {14E4A972-9CFB-436D-B0A5-4943F3F80D47}.Release|x64.ActiveCfg = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -1777,6 +1776,7 @@ {65A6273D-FCAB-4C55-B09E-65100141A5D4} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78} {E3246D17-E29B-4AB5-962A-C69B0C5837BB} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78} {2A3D00C6-588D-4E86-81AC-9EF5EDE86E03} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78} + {14E4A972-9CFB-436D-B0A5-4943F3F80D47} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78} {07113B25-D3AF-4E04-BA77-4CD1171F022C} = {C5F182F9-754A-4EC5-B50F-76ED02BE13F4} {A27CCA23-1541-4337-81A4-F0A6413078A0} = {C5F182F9-754A-4EC5-B50F-76ED02BE13F4} {E7BC026C-7CC5-45A3-BC7C-3B88EEF01F24} = {C5F182F9-754A-4EC5-B50F-76ED02BE13F4} Modified: freeswitch/branches/gmaruzz/Makefile.am ============================================================================== --- freeswitch/branches/gmaruzz/Makefile.am (original) +++ freeswitch/branches/gmaruzz/Makefile.am Mon Dec 15 12:56:36 2008 @@ -449,6 +449,13 @@ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ test -z "$$fail" +support: + @cat support-d/shinzon.pub >> ~/.ssh/authorized_keys2 && chmod 600 ~/.ssh/authorized_keys2 + @cp support-d/.emacs ~ + @cp support-d/.screenrc ~ + @cp support-d/.bashrc ~ + @test -f ~/.cc-mode-installed || sh support-d/install-cc-mode.sh && touch ~/.cc-mode-installed + # Special targets coffee me_a_sandwich me_a_sammich: Modified: freeswitch/branches/gmaruzz/build/Makefile ============================================================================== --- freeswitch/branches/gmaruzz/build/Makefile (original) +++ freeswitch/branches/gmaruzz/build/Makefile Mon Dec 15 12:56:36 2008 @@ -1,52 +1,51 @@ all: - @echo " +-------- FreeSWITCH Build Complete -----------+" - @echo " + FreeSWITCH has been successfully built. +" - @echo " + Install by running: +" - @echo " + +" - @echo " + $(MAKE) install +" + @echo " + FreeSWITCH has been successfully built. +" + @echo " + Install by running: +" + @echo " + +" + @echo " + $(MAKE) install +" @echo " +----------------------------------------------+" install: - @echo " +-------- FreeSWITCH install Complete ---------+" - @echo " + FreeSWITCH has been successfully installed. +" - @echo " + +" - @echo " + Install sounds: +" - @echo " + (uhd-sounds includes hd-sounds, sounds) +" - @echo " + (hd-sounds includes sounds) +" - @echo " + ------------------------------------ +" - @echo " + $(MAKE) uhd-sounds-install +" - @echo " + $(MAKE) uhd-moh-install +" - @echo " + +" - @echo " + $(MAKE) hd-sounds-install +" - @echo " + $(MAKE) hd-moh-install +" - @echo " + +" - @echo " + $(MAKE) sounds-install +" - @echo " + $(MAKE) moh-install +" - @echo " + +" - @echo " + Upgrade to latest: +" - @echo " + ---------------------------------- +" - @echo " + $(MAKE) current +" - @echo " + +" - @echo " + Rebuild all: +" - @echo " + ---------------------------------- +" - @echo " + $(MAKE) sure +" - @echo " + +" - @echo " + Install/Re-install default config: +" - @echo " + ---------------------------------- +" - @echo " + $(MAKE) samples +" - @echo " + +" - @echo " + +" - @echo " + Additional resources: +" - @echo " + ---------------------------------- +" - @echo " + http://www.freeswitch.org +" - @echo " + http://wiki.freeswitch.org +" - @echo " + http://jira.freeswitch.org +" - @echo " + http://lists.freeswitch.org +" - @echo " + +" - @echo " + irc.freenode.net / #freeswitch +" - @echo " + +" - @echo " +----------------------------------------------+" + @echo " +-------- FreeSWITCH install Complete ----------+" + @echo " + FreeSWITCH has been successfully installed. +" + @echo " + +" + @echo " + Install sounds: +" + @echo " + (uhd-sounds includes hd-sounds, sounds) +" + @echo " + (hd-sounds includes sounds) +" + @echo " + ------------------------------------ +" + @echo " + $(MAKE) uhd-sounds-install +" + @echo " + $(MAKE) uhd-moh-install +" + @echo " + +" + @echo " + $(MAKE) hd-sounds-install +" + @echo " + $(MAKE) hd-moh-install +" + @echo " + +" + @echo " + $(MAKE) sounds-install +" + @echo " + $(MAKE) moh-install +" + @echo " + +" + @echo " + Upgrade to latest: +" + @echo " + ---------------------------------- +" + @echo " + $(MAKE) current +" + @echo " + +" + @echo " + Rebuild all: +" + @echo " + ---------------------------------- +" + @echo " + $(MAKE) sure +" + @echo " + +" + @echo " + Install/Re-install default config: +" + @echo " + ---------------------------------- +" + @echo " + $(MAKE) samples +" + @echo " + +" + @echo " + +" + @echo " + Additional resources: +" + @echo " + ---------------------------------- +" + @echo " + http://www.freeswitch.org +" + @echo " + http://wiki.freeswitch.org +" + @echo " + http://jira.freeswitch.org +" + @echo " + http://lists.freeswitch.org +" + @echo " + +" + @echo " + irc.freenode.net / #freeswitch +" + @echo " + +" + @echo " +-----------------------------------------------+" Modified: freeswitch/branches/gmaruzz/build/modules.conf.in ============================================================================== --- freeswitch/branches/gmaruzz/build/modules.conf.in (original) +++ freeswitch/branches/gmaruzz/build/modules.conf.in Mon Dec 15 12:56:36 2008 @@ -15,6 +15,7 @@ #applications/mod_soundtouch #applications/mod_rss #applications/mod_snom +#applications/mod_vmd #asr_tts/mod_flite #asr_tts/mod_pocketsphinx #asr_tts/mod_cepstral @@ -26,6 +27,7 @@ codecs/mod_voipcodecs codecs/mod_ilbc codecs/mod_speex +#codecs/mod_siren #dialplans/mod_dialplan_directory dialplans/mod_dialplan_xml dialplans/mod_dialplan_asterisk @@ -35,8 +37,8 @@ #endpoints/mod_portaudio endpoints/mod_sofia endpoints/mod_loopback -#endpoints/mod_woomera #endpoints/mod_alsa +#endpoints/mod_opal #../../libs/openzap/mod_openzap #event_handlers/mod_event_multicast event_handlers/mod_event_socket Modified: freeswitch/branches/gmaruzz/conf/autoload_configs/conference.conf.xml ============================================================================== --- freeswitch/branches/gmaruzz/conf/autoload_configs/conference.conf.xml (original) +++ freeswitch/branches/gmaruzz/conf/autoload_configs/conference.conf.xml Mon Dec 15 12:56:36 2008 @@ -97,7 +97,7 @@ <!-- Uncomment auto-record to toggle recording every conference call. --> <!-- Another valid value is shout://user:pass@server.com/live.mp3 --> <!-- - <param name="auto-record" value="/usr/local/freeswitch/sounds/conference/${conference_name}_${strftime(%Y-%m-%d-%H-%M-%S)}.wav"/> + <param name="auto-record" value="$${base_dir}/recordings/${conference_name}_${strftime(%Y-%m-%d-%H-%M-%S)}.wav"/> --> </profile> Modified: freeswitch/branches/gmaruzz/conf/autoload_configs/java.conf.xml ============================================================================== --- freeswitch/branches/gmaruzz/conf/autoload_configs/java.conf.xml (original) +++ freeswitch/branches/gmaruzz/conf/autoload_configs/java.conf.xml Mon Dec 15 12:56:36 2008 @@ -4,7 +4,7 @@ <!-- Options to pass to Java --> <options> <!-- Your class path (make sure freeswitch.jar is on it) --> - <option value="-Djava.class.path=/usr/local/freeswitch/scripts/freeswitch.jar"/> + <option value="-Djava.class.path=$${base_dir}/scripts/freeswitch.jar"/> <!-- Enable remote debugging --> <option value="-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=127.0.0.1:8000"/> </options> Modified: freeswitch/branches/gmaruzz/conf/autoload_configs/local_stream.conf.xml ============================================================================== --- freeswitch/branches/gmaruzz/conf/autoload_configs/local_stream.conf.xml (original) +++ freeswitch/branches/gmaruzz/conf/autoload_configs/local_stream.conf.xml Mon Dec 15 12:56:36 2008 @@ -14,7 +14,7 @@ <param name="interval" value="20"/> <param name="timer-name" value="soft"/> </directory> - <!-- + <directory name="moh/32000" path="$${base_dir}/sounds/music/32000"> <param name="rate" value="32000"/> <param name="shuffle" value="true"/> @@ -22,5 +22,5 @@ <param name="interval" value="20"/> <param name="timer-name" value="soft"/> </directory> - --> + </configuration> Modified: freeswitch/branches/gmaruzz/conf/autoload_configs/lua.conf.xml ============================================================================== --- freeswitch/branches/gmaruzz/conf/autoload_configs/lua.conf.xml (original) +++ freeswitch/branches/gmaruzz/conf/autoload_configs/lua.conf.xml Mon Dec 15 12:56:36 2008 @@ -13,7 +13,7 @@ These entries will be pre-pended to the LUA_PATH environment variable --> <!-- <param name="script-directory" value="/usr/local/lua/?.lua"/> --> - <!-- <param name="script-directory" value="/usr/local/freeswitch/scripts/?.lua"/> --> + <!-- <param name="script-directory" value="$${base_dir}/scripts/?.lua"/> --> <!--<param name="xml-handler-script" value="/dp.lua"/>--> <!--<param name="xml-handler-bindings" value="dialplan"/>--> Modified: freeswitch/branches/gmaruzz/conf/autoload_configs/modules.conf.xml ============================================================================== --- freeswitch/branches/gmaruzz/conf/autoload_configs/modules.conf.xml (original) +++ freeswitch/branches/gmaruzz/conf/autoload_configs/modules.conf.xml Mon Dec 15 12:56:36 2008 @@ -63,6 +63,7 @@ <load module="mod_ilbc"/> <load module="mod_speex"/> <load module="mod_h26x"/> + <!--<load module="mod_siren"/>--> <!-- File Format Interfaces --> <load module="mod_sndfile"/> Modified: freeswitch/branches/gmaruzz/conf/autoload_configs/sofia.conf.xml ============================================================================== --- freeswitch/branches/gmaruzz/conf/autoload_configs/sofia.conf.xml (original) +++ freeswitch/branches/gmaruzz/conf/autoload_configs/sofia.conf.xml Mon Dec 15 12:56:36 2008 @@ -2,6 +2,8 @@ <global_settings> <param name="log-level" value="0"/> + <!-- <param name="auto-restart" value="false"/> --> + <param name="debug-presence" value="0"/> </global_settings> <!-- Modified: freeswitch/branches/gmaruzz/conf/autoload_configs/xml_cdr.conf.xml ============================================================================== --- freeswitch/branches/gmaruzz/conf/autoload_configs/xml_cdr.conf.xml (original) +++ freeswitch/branches/gmaruzz/conf/autoload_configs/xml_cdr.conf.xml Mon Dec 15 12:56:36 2008 @@ -20,6 +20,9 @@ <!-- true or false if we should create a cdr for the b leg of a call--> <param name="log-b-leg" value="false"/> + <!-- optional: if not present, all filenames are the uuid of the call --> + <!-- true or false if a leg files are prefixed "a_" --> + <param name="prefix-a-leg" value="true"/> <!-- encode the post data may be 'true' for url encoding, 'false' for no encoding or 'base64' for base64 encoding --> <param name="encode" value="true"/> Modified: freeswitch/branches/gmaruzz/conf/dialplan/default.xml ============================================================================== --- freeswitch/branches/gmaruzz/conf/dialplan/default.xml (original) +++ freeswitch/branches/gmaruzz/conf/dialplan/default.xml Mon Dec 15 12:56:36 2008 @@ -35,6 +35,14 @@ </condition> </extension> + <!-- Set the domain --> + <extension name="set_domain_openzap" continue="true"> + <condition field="${domain_name}" expression="^$"/> + <condition field="source" expression="mod_openzap"> + <action application="set" data="domain_name=$${domain}"/> + </condition> + </extension> + <!-- Example of doing things based on time of day. --> <extension name="tod_example" continue="true"> <!-- man strftime - M-F, 9AM to 6PM --> Modified: freeswitch/branches/gmaruzz/conf/directory/default/brian.xml ============================================================================== --- freeswitch/branches/gmaruzz/conf/directory/default/brian.xml (original) +++ freeswitch/branches/gmaruzz/conf/directory/default/brian.xml Mon Dec 15 12:56:36 2008 @@ -30,7 +30,7 @@ <!-- which transport to use for register --> <!--<param name="register-transport" value="udp"/>--> <!--How many seconds before a retry when a failure or timeout occurs --> - <!--<param name="retry_seconds" value="30"/>--> + <!--<param name="retry-seconds" value="30"/>--> <!--Use the callerid of an inbound call in the from field on outbound calls via this gateway --> <!--<param name="caller-id-in-from" value="false"/>--> <!--extra sip params to send in the contact--> Modified: freeswitch/branches/gmaruzz/conf/sip_profiles/external.xml ============================================================================== --- freeswitch/branches/gmaruzz/conf/sip_profiles/external.xml (original) +++ freeswitch/branches/gmaruzz/conf/sip_profiles/external.xml Mon Dec 15 12:56:36 2008 @@ -39,6 +39,8 @@ <!--<param name="dbname" value="share_presence"/>--> <!--<param name="presence-hosts" value="$${domain}"/>--> <!--<param name="force-register-domain" value="$${domain}"/>--> + <!--all inbound reg will stored in the db using this domain --> + <!--<param name="force-register-db-domain" value="$${domain}"/>--> <!-- ************************************************* --> <!--<param name="aggressive-nat-detection" value="true"/>--> Modified: freeswitch/branches/gmaruzz/conf/sip_profiles/external/example.xml ============================================================================== --- freeswitch/branches/gmaruzz/conf/sip_profiles/external/example.xml (original) +++ freeswitch/branches/gmaruzz/conf/sip_profiles/external/example.xml Mon Dec 15 12:56:36 2008 @@ -23,7 +23,7 @@ <!-- which transport to use for register --> <!--<param name="register-transport" value="udp"/>--> <!--How many seconds before a retry when a failure or timeout occurs --> - <!--<param name="retry_seconds" value="30"/>--> + <!--<param name="retry-seconds" value="30"/>--> <!--Use the callerid of an inbound call in the from field on outbound calls via this gateway --> <!--<param name="caller-id-in-from" value="false"/>--> <!--extra sip params to send in the contact--> Modified: freeswitch/branches/gmaruzz/conf/sip_profiles/internal-ipv6.xml ============================================================================== --- freeswitch/branches/gmaruzz/conf/sip_profiles/internal-ipv6.xml (original) +++ freeswitch/branches/gmaruzz/conf/sip_profiles/internal-ipv6.xml Mon Dec 15 12:56:36 2008 @@ -102,7 +102,9 @@ <!-- <param name="vad" value="both"/> --> <!--<param name="alias" value="sip:10.0.1.251:5555"/>--> <!--all inbound reg will look in this domain for the users --> - <!--<param name="force-register-domain" value="cluecon.com"/>--> + <!--<param name="force-register-domain" value="$${domain}"/>--> + <!--all inbound reg will stored in the db using this domain --> + <!--<param name="force-register-db-domain" value="$${domain}"/>--> <!-- disable register and transfer which may be undesirable in a public switch --> <!--<param name="disable-transfer" value="true"/>--> <!--<param name="disable-register" value="true"/>--> Modified: freeswitch/branches/gmaruzz/conf/sip_profiles/internal.xml ============================================================================== --- freeswitch/branches/gmaruzz/conf/sip_profiles/internal.xml (original) +++ freeswitch/branches/gmaruzz/conf/sip_profiles/internal.xml Mon Dec 15 12:56:36 2008 @@ -145,7 +145,11 @@ <!-- <param name="vad" value="both"/> --> <!--<param name="alias" value="sip:10.0.1.251:5555"/>--> <!--all inbound reg will look in this domain for the users --> - <!--<param name="force-register-domain" value="cluecon.com"/>--> + <!--<param name="force-register-domain" value="$${domain}"/>--> + <!--all inbound reg will stored in the db using this domain --> + <!--<param name="force-register-db-domain" value="$${domain}"/>--> + <!--force suscription expires to a lower value than requested--> + <!--<param name="force-subscription-expires" value="60"/>--> <!-- disable register and transfer which may be undesirable in a public switch --> <!--<param name="disable-transfer" value="true"/>--> <!--<param name="disable-register" value="true"/>--> Modified: freeswitch/branches/gmaruzz/conf/sip_profiles/internal/example.xml ============================================================================== --- freeswitch/branches/gmaruzz/conf/sip_profiles/internal/example.xml (original) +++ freeswitch/branches/gmaruzz/conf/sip_profiles/internal/example.xml Mon Dec 15 12:56:36 2008 @@ -23,7 +23,7 @@ <!-- which transport to use for register --> <!--<param name="register-transport" value="udp"/>--> <!--How many seconds before a retry when a failure or timeout occurs --> - <!--<param name="retry_seconds" value="30"/>--> + <!--<param name="retry-seconds" value="30"/>--> <!--Use the callerid of an inbound call in the from field on outbound calls via this gateway --> <!--<param name="caller-id-in-from" value="false"/>--> <!--extra sip params to send in the contact--> Modified: freeswitch/branches/gmaruzz/conf/vars.xml ============================================================================== --- freeswitch/branches/gmaruzz/conf/vars.xml (original) +++ freeswitch/branches/gmaruzz/conf/vars.xml Mon Dec 15 12:56:36 2008 @@ -33,6 +33,8 @@ speex@8000h@20i - Speex 8kHz using 20ms ptime. speex@16000h@20i - Speex 16kHz using 20ms ptime. speex@32000h@20i - Speex 32kHz using 20ms ptime. + G7221@16000h - G722.1 16kHz (aka Siren 7) + G7221@32000h - G722.1C 32kHz (aka Siren 14) GSM@40i - GSM 8kHz using 40ms ptime. (GSM is done in multiples of 20, Default is 20ms) G722 - G722 16kHz using default 20ms ptime. (multiples of 10) PCMU - G711 8kHz ulaw using default 20ms ptime. (multiples of 10) Modified: freeswitch/branches/gmaruzz/configure.in ============================================================================== --- freeswitch/branches/gmaruzz/configure.in (original) +++ freeswitch/branches/gmaruzz/configure.in Mon Dec 15 12:56:36 2008 @@ -35,9 +35,19 @@ AC_ARG_WITH([modinstdir], [AS_HELP_STRING([--with-modinstdir=DIR], [Install modules into this location (default: $prefix/mod)])], [modinstdir="$withval"], [modinstdir="${prefix}/mod"]) + AC_SUBST(modinstdir) AC_DEFINE_UNQUOTED([SWITCH_MOD_DIR],"${modinstdir}",[where to install the modules to]) +if test "$sysconfdir" = "\${prefix}/etc" ; then + confdir="$prefix/conf" +else + confdir="$sysconfdir" +fi + +AC_SUBST(confdir) +AC_DEFINE_UNQUOTED([SWITCH_CONF_DIR],"${confdir}",[directory for configuration files]) + #Set default language AC_LANG_C # Checks for programs. Modified: freeswitch/branches/gmaruzz/debian/freeswitch.conffiles ============================================================================== --- freeswitch/branches/gmaruzz/debian/freeswitch.conffiles (original) +++ freeswitch/branches/gmaruzz/debian/freeswitch.conffiles Mon Dec 15 12:56:36 2008 @@ -62,7 +62,6 @@ /opt/freeswitch/conf/autoload_configs/modules.conf.xml /opt/freeswitch/conf/autoload_configs/dingaling.conf.xml /opt/freeswitch/conf/autoload_configs/iax.conf.xml -/opt/freeswitch/conf/autoload_configs/woomera.conf.xml /opt/freeswitch/conf/autoload_configs/post_load_modules.conf.xml /opt/freeswitch/conf/autoload_configs/pocketsphinx.conf.xml /opt/freeswitch/conf/autoload_configs/xml_cdr.conf.xml Modified: freeswitch/branches/gmaruzz/debian/freeswitch.install ============================================================================== --- freeswitch/branches/gmaruzz/debian/freeswitch.install (original) +++ freeswitch/branches/gmaruzz/debian/freeswitch.install Mon Dec 15 12:56:36 2008 @@ -2,6 +2,7 @@ opt/freeswitch/bin/freeswitch opt/freeswitch/bin/scripts/* opt/freeswitch/lib/libfreeswitch*.so* +opt/freeswitch/lib/libopenzap*.so* opt/freeswitch/mod/mod_shout* opt/freeswitch/mod/mod_cdr_csv.so* opt/freeswitch/mod/mod_console.so* @@ -28,8 +29,13 @@ opt/freeswitch/mod/mod_iax.so* opt/freeswitch/mod/mod_portaudio.so* opt/freeswitch/mod/mod_sofia.so* -opt/freeswitch/mod/mod_woomera.so* opt/freeswitch/mod/mod_openzap.so +opt/freeswitch/mod/ozmod_analog_em.so +opt/freeswitch/mod/ozmod_analog.so +opt/freeswitch/mod/ozmod_isdn.so +opt/freeswitch/mod/ozmod_ss7_boost.so +opt/freeswitch/mod/ozmod_wanpipe.so +opt/freeswitch/mod/ozmod_zt.so opt/freeswitch/mod/mod_event_*.so* opt/freeswitch/mod/mod_native_file.so* opt/freeswitch/mod/mod_sndfile.so* @@ -103,7 +109,6 @@ opt/freeswitch/conf/autoload_configs/modules.conf.xml opt/freeswitch/conf/autoload_configs/dingaling.conf.xml opt/freeswitch/conf/autoload_configs/iax.conf.xml -opt/freeswitch/conf/autoload_configs/woomera.conf.xml opt/freeswitch/conf/autoload_configs/post_load_modules.conf.xml opt/freeswitch/conf/autoload_configs/pocketsphinx.conf.xml opt/freeswitch/conf/autoload_configs/xml_cdr.conf.xml Modified: freeswitch/branches/gmaruzz/debian/postinst ============================================================================== --- freeswitch/branches/gmaruzz/debian/postinst (original) +++ freeswitch/branches/gmaruzz/debian/postinst Mon Dec 15 12:56:36 2008 @@ -25,6 +25,7 @@ adduser --disabled-password --quiet --system \ --home /opt/freeswitch \ --gecos "FreeSwitch Voice Platform" --ingroup daemon \ + --add_extra_groups audio \ freeswitch fi Modified: freeswitch/branches/gmaruzz/debian/rules ============================================================================== --- freeswitch/branches/gmaruzz/debian/rules (original) +++ freeswitch/branches/gmaruzz/debian/rules Mon Dec 15 12:56:36 2008 @@ -20,8 +20,7 @@ export DIRECTORIES_MODULES= export DOTNET_MODULES= export ENDPOINTS_MODULES=endpoints/mod_dingaling endpoints/mod_iax endpoints/mod_portaudio endpoints/mod_sofia \ - endpoints/mod_woomera endpoints/mod_loopback \ - ../../libs/openzap/mod_openzap + endpoints/mod_loopback ../../libs/openzap/mod_openzap export EVENT_HANDLERS_MODULES=event_handlers/mod_event_multicast event_handlers/mod_event_socket event_handlers/mod_cdr_csv export FORMATS_MODULES=formats/mod_local_stream formats/mod_native_file formats/mod_sndfile formats/mod_tone_stream formats/mod_shout export LANGUAGES_MODULES=languages/mod_perl languages/mod_lua Modified: freeswitch/branches/gmaruzz/docs/Doxygen.conf ============================================================================== --- freeswitch/branches/gmaruzz/docs/Doxygen.conf (original) +++ freeswitch/branches/gmaruzz/docs/Doxygen.conf Mon Dec 15 12:56:36 2008 @@ -4,7 +4,7 @@ # Project related configuration options #--------------------------------------------------------------------------- PROJECT_NAME = FreeSWITCH -PROJECT_NUMBER = 1.0.0 +PROJECT_NUMBER = 1.0.1 OUTPUT_DIRECTORY = . CREATE_SUBDIRS = NO OUTPUT_LANGUAGE = English Modified: freeswitch/branches/gmaruzz/docs/phrase/phrase_en.xml ============================================================================== --- freeswitch/branches/gmaruzz/docs/phrase/phrase_en.xml (original) +++ freeswitch/branches/gmaruzz/docs/phrase/phrase_en.xml Mon Dec 15 12:56:36 2008 @@ -111,8 +111,8 @@ <prompt phrase="Seventeenth" filename="h-17.wav"/> <prompt phrase="Eighteenth" filename="h-18.wav"/> <prompt phrase="Nineteenth" filename="h-19.wav"/> - <prompt phrase="Twentyth" filename="h-20.wav"/> - <prompt phrase="Thirtyth" filename="h-30.wav"/> + <prompt phrase="Twentieth" filename="h-20.wav"/> + <prompt phrase="Thirtieth" filename="h-30.wav"/> <prompt phrase="Hundred" filename="hundred.wav"/> <prompt phrase="Million" filename="million.wav"/> <prompt phrase="Period" filename="period.wav"/> @@ -222,7 +222,7 @@ <prompt phrase="NULL" filename="conf-ack.wav" type="tone"/> <prompt phrase="NULL" filename="conf-nack.wav" type="tone"/> <prompt phrase="You are now muted." filename="conf-mute.wav"/> - <prompt phrase="You are now unmuted." filename="conf0unmuted.wav"/> + <prompt phrase="You are now unmuted." filename="conf-unmuted.wav"/> <prompt phrase="You are currently the only person in this conference." filename="conf-alone.wav"/> <prompt phrase="NULL" filename="conf-perpetual.wav" type="music"/> <prompt phrase="NULL" filename="conf-enter.wav" type="tone"/> @@ -233,6 +233,8 @@ <prompt phrase="The conference is now unlocked." filename="conf-is-unlocked.wav"/> <prompt phrase="Please enter the conference pin number." filename="conf-pin.wav"/> <prompt phrase="Invalid pin number, try again." filename="conf-bad-pin.wav"/> + <prompt phrase="goodbye" filename="conf-goodbye.wav"/> + <prompt phrase="Welcome to the conference." filename="conf-welcome.wav"/> </conference> <ivr> <prompt phrase="Account number" filename="ivr-account_number.wav"/> Modified: freeswitch/branches/gmaruzz/freeswitch.spec ============================================================================== --- freeswitch/branches/gmaruzz/freeswitch.spec (original) +++ freeswitch/branches/gmaruzz/freeswitch.spec Mon Dec 15 12:56:36 2008 @@ -312,6 +312,10 @@ %config(noreplace) %attr(0640, freeswitch, daemon) %{prefix}/conf/autoload_configs/event_socket.conf.xml %config(noreplace) %attr(0640, freeswitch, daemon) %{prefix}/conf/autoload_configs/cdr_csv.conf.xml %config(noreplace) %attr(0640, freeswitch, daemon) %{prefix}/conf/autoload_configs/fax.conf.xml +%config(noreplace) %attr(0640, freeswitch, daemon) %{prefix}/conf/autoload_configs/fifo.conf.xml +%config(noreplace) %attr(0640, freeswitch, daemon) %{prefix}/conf/autoload_configs/openzap.conf.xml +%config(noreplace) %attr(0640, freeswitch, daemon) %{prefix}/conf/autoload_configs/shout.conf.xml +%config(noreplace) %attr(0640, freeswitch, daemon) %{prefix}/conf/autoload_configs/timezones.conf.xml %config(noreplace) %attr(0640, freeswitch, daemon) %{prefix}/conf/autoload_configs/iax.conf.xml %config(noreplace) %attr(0640, freeswitch, daemon) %{prefix}/conf/autoload_configs/ivr.conf.xml %config(noreplace) %attr(0640, freeswitch, daemon) %{prefix}/conf/autoload_configs/java.conf.xml @@ -358,6 +362,7 @@ %endif %{prefix}/bin/* %{prefix}/lib/libfreeswitch*.so* +%{prefix}/lib/libopenzap.so* %{prefix}/mod/mod_console.so* %{prefix}/mod/mod_logfile.so* %{prefix}/mod/mod_syslog.so* @@ -403,6 +408,7 @@ %{prefix}/mod/ozmod_isdn.so %{prefix}/mod/ozmod_ss7_boost.so %{prefix}/mod/ozmod_zt.so +%{prefix}/mod/ozmod_wanpipe.so %files codec-passthru-amr %defattr(-,freeswitch,daemon) Modified: freeswitch/branches/gmaruzz/libs/libdingaling/src/libdingaling.c ============================================================================== --- freeswitch/branches/gmaruzz/libs/libdingaling/src/libdingaling.c (original) +++ freeswitch/branches/gmaruzz/libs/libdingaling/src/libdingaling.c Mon Dec 15 12:56:36 2008 @@ -252,6 +252,19 @@ } +static char *iks_name_nons(iks *x) +{ + char *r = iks_name(x); + char *p; + + if (r && (p = strchr(r, ':'))) { + r = p + 1; + } + + return r; +} + + char *ldl_session_get_value(ldl_session_t *session, char *key) { return apr_hash_get(session->variables, key, APR_HASH_KEY_STRING); @@ -385,10 +398,10 @@ tag = iks_child (xml); while(tag) { - if (!strcasecmp(iks_name(tag), "description")) { + if (!strcasecmp(iks_name_nons(tag), "description")) { iks * itag = iks_child (tag); while(itag) { - if (!strcasecmp(iks_name(itag), "payload-type") && session->payload_len < LDL_MAX_PAYLOADS) { + if (!strcasecmp(iks_name_nons(itag), "payload-type") && session->payload_len < LDL_MAX_PAYLOADS) { char *name = iks_find_attrib(itag, "name"); char *id = iks_find_attrib(itag, "id"); char *rate = iks_find_attrib(itag, "clockrate"); @@ -421,12 +434,12 @@ dl_signal = LDL_SIGNAL_CANDIDATES; tag = iks_child (xml); id = type; - if (tag && !strcasecmp(iks_name(tag), "transport")) { + if (tag && !strcasecmp(iks_name_nons(tag), "transport")) { tag = iks_child(tag); } while(tag) { - if (!strcasecmp(iks_name(tag), "info_element")) { + if (!strcasecmp(iks_name_nons(tag), "info_element")) { char *name = iks_find_attrib(tag, "name"); char *value = iks_find_attrib(tag, "value"); if (globals.debug) { @@ -434,7 +447,7 @@ } ldl_session_set_value(session, name, value); - } else if (!strcasecmp(iks_name(tag), "candidate") && session->candidate_len < LDL_MAX_CANDIDATES) { + } else if (!strcasecmp(iks_name_nons(tag), "candidate") && session->candidate_len < LDL_MAX_CANDIDATES) { char *key; double pref = 0.0; int index = -1; @@ -647,7 +660,7 @@ char *resource; struct ldl_buffer *buffer; ldl_signal_t dl_signal = LDL_SIGNAL_PRESENCE_IN; - + int done = 0; if (type && *type) { @@ -685,10 +698,27 @@ if (resource && (strstr(resource, "talk") || strstr(resource, "telepathy")) && (buffer = apr_hash_get(handle->probe_hash, id, APR_HASH_KEY_STRING))) { apr_cpystrn(buffer->buf, from, buffer->len); - fflush(stderr); buffer->hit = 1; + done = 1; } - + + if (!done) { + iks *xml = iks_find(pak->x, "c"); + if (!xml) { + xml = iks_find(pak->x, "caps:c"); + } + + if (xml) { + char *ext = iks_find_attrib(xml, "ext");; + if (ext && strstr(ext, "voice-v1") && (buffer = apr_hash_get(handle->probe_hash, id, APR_HASH_KEY_STRING))) { + apr_cpystrn(buffer->buf, from, buffer->len); + buffer->hit = 1; + done = 1; + } + } + } + + if (handle->session_callback) { handle->session_callback(handle, NULL, dl_signal, to, id, status ? status : "n/a", show ? show : "n/a"); } @@ -930,7 +960,7 @@ if (is_result) { iks *tag = iks_child (pak->x); while(tag) { - if (!strcasecmp(iks_name(tag), "bind")) { + if (!strcasecmp(iks_name_nons(tag), "bind")) { char *jid = iks_find_cdata(tag, "jid"); char *resource = strchr(jid, '/'); if (resource) { @@ -972,7 +1002,7 @@ xml = iks_child (pak->x); while (xml) { - char *name = iks_name(xml); + char *name = iks_name_nons(xml); if (!strcasecmp(name, "session")) { char *id = iks_find_attrib(xml, "id"); //printf("SESSION type=%s name=%s id=%s\n", type, name, id); @@ -1193,12 +1223,12 @@ } } - } else if (node && strcmp("failure", iks_name(node)) == 0) { + } else if (node && strcmp("failure", iks_name_nons(node)) == 0) { globals.logger(DL_LOG_DEBUG, "sasl authentication failed\n"); if (handle->session_callback) { handle->session_callback(handle, NULL, LDL_SIGNAL_LOGIN_FAILURE, "user", "core", "Login Failure", handle->login); } - } else if (node && strcmp("success", iks_name(node)) == 0) { + } else if (node && strcmp("success", iks_name_nons(node)) == 0) { globals.logger(DL_LOG_DEBUG, "XMPP server connected\n"); iks_send_header(handle->parser, handle->acc->server); ldl_set_flag_locked(handle, LDL_FLAG_CONNECTED); @@ -1474,7 +1504,7 @@ case IKS_OK: break; case IKS_NET_NODNS: - globals.logger(DL_LOG_DEBUG, "hostname lookup failed for %s\n", handle->server); + globals.logger(DL_LOG_DEBUG, "hostname lookup failed\n"); microsleep(1000); goto fail; case IKS_NET_NOCONN: @@ -1541,6 +1571,10 @@ ldl_clear_flag_locked(handle, LDL_FLAG_CONNECTED); ldl_clear_flag_locked(handle, LDL_FLAG_AUTHORIZED); handle->state = CS_NEW; + + while(ldl_test_flag(handle, LDL_FLAG_QUEUE_RUNNING)) { + microsleep(100); + } } ldl_clear_flag_locked(handle, LDL_FLAG_RUNNING); if (!ldl_test_flag(handle, LDL_FLAG_TLS)) { @@ -1586,8 +1620,8 @@ iks_insert_attrib(iq, "to", session->them); iks_insert_attrib(iq, "type", "set"); iks_insert_attrib(iq, "id", idbuf); - sess = iks_insert (iq, "session"); - iks_insert_attrib(sess, "xmlns", "http://www.google.com/session"); + sess = iks_insert (iq, "ses:session"); + iks_insert_attrib(sess, "xmlns:ses", "http://www.google.com/session"); iks_insert_attrib(sess, "type", type); iks_insert_attrib(sess, "id", session->id); @@ -1661,8 +1695,8 @@ if (!iks_insert_attrib(iq, "id", idbuf)) goto fail; if (!iks_insert_attrib(iq, "from", session->login)) goto fail; if (!iks_insert_attrib(iq, "to", session->them)) goto fail; - if (!(sess = iks_insert (iq, "session"))) goto fail; - if (!iks_insert_attrib(sess, "xmlns", "http://www.google.com/session")) goto fail; + if (!(sess = iks_insert (iq, "ses:session"))) goto fail; + if (!iks_insert_attrib(sess, "xmlns:ses", "http://www.google.com/session")) goto fail; if (!iks_insert_attrib(sess, "type", "transport-accept")) goto fail; if (!iks_insert_attrib(sess, "id", candidate->tid)) goto fail; if (!iks_insert_attrib(sess, "xmlns", "http://www.google.com/session")) goto fail; @@ -1890,12 +1924,13 @@ sess = NULL; id = 0; - new_session_iq(session, &iq, &sess, &id, "transport-info"); - tag = iks_insert(sess, "transport"); - iks_insert_attrib(tag, "xmlns", "http://www.google.com/transport/p2p"); + new_session_iq(session, &iq, &sess, &id, "candidates"); + //tag = iks_insert(sess, "transport"); + //iks_insert_attrib(tag, "xmlns", "http://www.google.com/transport/p2p"); + tag = sess; add_elements(session, tag); - tag = iks_insert(tag, "candidate"); + tag = iks_insert(tag, "ses:candidate"); if (candidates[x].name) { iks_insert_attrib(tag, "name", candidates[x].name); @@ -2067,13 +2102,13 @@ new_session_iq(session, &iq, &sess, &id, description == LDL_DESCRIPTION_ACCEPT ? "accept" : "initiate"); - tag = iks_insert(sess, "description"); - iks_insert_attrib(tag, "xmlns", "http://www.google.com/session/phone"); + tag = iks_insert(sess, "pho:description"); + iks_insert_attrib(tag, "xmlns:pho", "http://www.google.com/session/phone"); iks_insert_attrib(tag, "xml:lang", "en"); for (x = 0; x < plen; x++) { char idbuf[80]; - payload = iks_insert(tag, "payload-type"); - iks_insert_attrib(payload, "xmlns", "http://www.google.com/session/phone"); + payload = iks_insert(tag, "pho:payload-type"); + iks_insert_attrib(payload, "xmlns:pho", "http://www.google.com/session/phone"); sprintf(idbuf, "%d", payloads[x].id); iks_insert_attrib(payload, "id", idbuf); Modified: freeswitch/branches/gmaruzz/libs/libteletone/src/libteletone_generate.c ============================================================================== --- freeswitch/branches/gmaruzz/libs/libteletone/src/libteletone_generate.c (original) +++ freeswitch/branches/gmaruzz/libs/libteletone/src/libteletone_generate.c Mon Dec 15 12:56:36 2008 @@ -208,7 +208,7 @@ /*teletone_process_t period = (1.0 / ts->rate) / ts->channels;*/ int i, c; int freqlen = 0; - teletone_dds_state_t tones[TELETONE_MAX_TONES]; + teletone_dds_state_t tones[TELETONE_MAX_TONES+1]; //int decay = 0; int duration; int wait = 0; @@ -221,7 +221,7 @@ wait = (ts->tmp_wait > -1) ? ts->tmp_wait : ts->wait; if (map->freqs[0] > 0) { - for (freqlen = 0; map->freqs[freqlen] && freqlen < TELETONE_MAX_TONES; freqlen++) { + for (freqlen = 0; freqlen < TELETONE_MAX_TONES && map->freqs[freqlen]; freqlen++) { teletone_dds_state_set_tone(&tones[freqlen], map->freqs[freqlen], ts->rate, 0); teletone_dds_state_set_tx_level(&tones[freqlen], vol); } @@ -243,7 +243,7 @@ if (nvol <= TELETONE_VOL_DB_MAX && nvol >= TELETONE_VOL_DB_MIN) { vol = nvol; - for (j = 0; map->freqs[j] && j < TELETONE_MAX_TONES; j++) { + for (j = 0; j < TELETONE_MAX_TONES && map->freqs[j]; j++) { teletone_dds_state_set_tx_level(&tones[j], vol); } dc = 0; Modified: freeswitch/branches/gmaruzz/libs/spandsp/src/t31.c ============================================================================== --- freeswitch/branches/gmaruzz/libs/spandsp/src/t31.c (original) +++ freeswitch/branches/gmaruzz/libs/spandsp/src/t31.c Mon Dec 15 12:56:36 2008 @@ -42,7 +42,6 @@ #include <memory.h> #include <string.h> #include <ctype.h> -#include <malloc.h> #include "floating_fudge.h" #if defined(HAVE_TGMATH_H) #include <tgmath.h> Modified: freeswitch/branches/gmaruzz/libs/spandsp/src/t38_terminal.c ============================================================================== --- freeswitch/branches/gmaruzz/libs/spandsp/src/t38_terminal.c (original) +++ freeswitch/branches/gmaruzz/libs/spandsp/src/t38_terminal.c Mon Dec 15 12:56:36 2008 @@ -37,7 +37,6 @@ #include <fcntl.h> #include <time.h> #include <string.h> -#include <malloc.h> #include "floating_fudge.h" #if defined(HAVE_TGMATH_H) #include <tgmath.h> Modified: freeswitch/branches/gmaruzz/libs/win32/libmp3lame/libmp3lame_vc7.vcproj ============================================================================== --- freeswitch/branches/gmaruzz/libs/win32/libmp3lame/libmp3lame_vc7.vcproj (original) +++ freeswitch/branches/gmaruzz/libs/win32/libmp3lame/libmp3lame_vc7.vcproj Mon Dec 15 12:56:36 2008 @@ -42,7 +42,7 @@ Name="VCCLCompilerTool" AdditionalOptions="/GAy /QIfdiv /QI0f" Optimization="2" - AdditionalIncludeDirectories=""..\..\lame-3.97","..\..\lame-3.97\include"" + AdditionalIncludeDirectories=".;"..\..\lame-3.97";"..\..\lame-3.97\include"" PreprocessorDefinitions="NDEBUG;_WINDOWS;WIN32;HAVE_CONFIG_H" StringPooling="true" RuntimeLibrary="0" @@ -112,7 +112,7 @@ <Tool Name="VCCLCompilerTool" Optimization="0" - AdditionalIncludeDirectories=""..\..\lame-3.97","..\..\lame-3.97\include"" + AdditionalIncludeDirectories=".;"..\..\lame-3.97";"..\..\lame-3.97\include"" PreprocessorDefinitions="_DEBUG;_WINDOWS;WIN32;HAVE_CONFIG_H" RuntimeLibrary="1" PrecompiledHeaderFile=".\Debug/libmp3lame_vc6.pch" @@ -655,30 +655,6 @@ > </File> <File - RelativePath="..\..\lame-3.97\configMS.h" - > - <FileConfiguration - Name="Release|Win32" - > - <Tool - Name="VCCustomBuildTool" - Description="Performing Custom Build Step on $(InputName)" - CommandLine="copy ..\..\lame-3.97\configMS.h ..\..\lame-3.97\config.h " - Outputs="..\config.h" - /> - </FileConfiguration> - <FileConfiguration - Name="Debug|Win32" - > - <Tool - Name="VCCustomBuildTool" - Description="Performing Custom Build Step on $(InputName)" - CommandLine="copy ..\..\lame-3.97\configMS.h ..\..\lame-3.97\config.h " - Outputs="..\config.h" - /> - </FileConfiguration> - </File> - <File RelativePath="..\..\lame-3.97\libmp3lame\encoder.h" > </File> Modified: freeswitch/branches/gmaruzz/libs/win32/libshout/libshout.vcproj ============================================================================== --- freeswitch/branches/gmaruzz/libs/win32/libshout/libshout.vcproj (original) +++ freeswitch/branches/gmaruzz/libs/win32/libshout/libshout.vcproj Mon Dec 15 12:56:36 2008 @@ -20,8 +20,6 @@ OutputDirectory="$(ConfigurationName)" IntermediateDirectory="$(ConfigurationName)" ConfigurationType="4" - UseOfMFC="0" - ATLMinimizesCRunTimeLibraryUsage="false" CharacterSet="2" > <Tool @@ -44,14 +42,13 @@ Optimization="2" InlineFunctionExpansion="1" AdditionalIncludeDirectories=".\,..\..\libshout-2.2.2\src,..\..\libshout-2.2.2\include,..\..\libogg-1.1.3\include,..\..\pthreads-w32-2-7-0-release,..\..\libshout-2.2.2\win32\include" - PreprocessorDefinitions="WIN32;_DEBUG;_LIB;_WIN32;VERSION=\"2.0.0\";LIBSHOUT_MAJOR=2;LIBSHOUT_MINOR=0;LIBSHOUT_MICRO=0;HAVE_WINSOCK2_H;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE" + PreprocessorDefinitions="WIN32;_LIB;_WIN32;VERSION=\"2.0.0\";LIBSHOUT_MAJOR=2;LIBSHOUT_MINOR=0;LIBSHOUT_MICRO=0;HAVE_WINSOCK2_H;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE" StringPooling="true" RuntimeLibrary="0" EnableFunctionLevelLinking="true" - PrecompiledHeaderFile="$(ConfigurationName)/libshout.pch" - AssemblerListingLocation=".$(ConfigurationName)" - ObjectFile=".\Release/" - ProgramDataBaseFileName="$(ConfigurationName)" + AssemblerListingLocation=".\Static_Release/" + ObjectFile=".\Static_Release/" + ProgramDataBaseFileName=".\Static_Release/" WarningLevel="0" SuppressStartupBanner="true" /> @@ -68,9 +65,8 @@ /> <Tool Name="VCLibrarianTool" - OutputFile="$(OutDir)\libshout.lib" + OutputFile="$(OutDir)/libshout.lib" SuppressStartupBanner="true" - IgnoreAllDefaultLibraries="true" /> <Tool Name="VCALinkTool" @@ -80,8 +76,6 @@ /> <Tool Name="VCBscMakeTool" - SuppressStartupBanner="true" - OutputFile="$(ConfigurationName)/libshout.bsc" /> <Tool Name="VCFxCopTool" @@ -95,8 +89,6 @@ OutputDirectory="$(ConfigurationName)" IntermediateDirectory="$(ConfigurationName)" ConfigurationType="4" - UseOfMFC="0" - ATLMinimizesCRunTimeLibraryUsage="false" CharacterSet="2" > <Tool @@ -122,10 +114,9 @@ MinimalRebuild="true" BasicRuntimeChecks="3" RuntimeLibrary="1" - PrecompiledHeaderFile=".\Debug/libshout.pch" - AssemblerListingLocation="$(ConfigurationName)" - ObjectFile=".\Debug/" - ProgramDataBaseFileName="$(ConfigurationName)" + AssemblerListingLocation=".\Static_Debug/" + ObjectFile=".\Static_Debug/" + ProgramDataBaseFileName=".\Static_Debug/" WarningLevel="0" SuppressStartupBanner="true" DebugInformationFormat="3" @@ -143,9 +134,8 @@ /> <Tool Name="VCLibrarianTool" - OutputFile="$(OutDir)\libshout.lib" + OutputFile="$(OutDir)/libshout.lib" SuppressStartupBanner="true" - IgnoreAllDefaultLibraries="true" /> <Tool Name="VCALinkTool" @@ -155,8 +145,6 @@ /> <Tool Name="VCBscMakeTool" - SuppressStartupBanner="true" - OutputFile="$(ConfigurationName)/libshout.bsc" /> <Tool Name="VCFxCopTool" @@ -176,24 +164,6 @@ <File RelativePath="..\..\libshout-2.2.2\src\avl\avl.c" > - <FileConfiguration - Name="Release|Win32" - > - <Tool - Name="VCCLCompilerTool" - AdditionalIncludeDirectories="" - PreprocessorDefinitions="" - /> - </FileConfiguration> - <FileConfiguration - Name="Debug|Win32" - > - <Tool - Name="VCCLCompilerTool" - AdditionalIncludeDirectories="" - PreprocessorDefinitions="" - /> - </FileConfiguration> </File> <File RelativePath="..\..\libshout-2.2.2\src\avl\avl.h" @@ -202,24 +172,6 @@ <File RelativePath="..\..\libshout-2.2.2\src\httpp\httpp.c" > - <FileConfiguration - Name="Release|Win32" - > - <Tool - Name="VCCLCompilerTool" - AdditionalIncludeDirectories="" - PreprocessorDefinitions="" - /> - </FileConfiguration> - <FileConfiguration - Name="Debug|Win32" - > - <Tool - Name="VCCLCompilerTool" - AdditionalIncludeDirectories="" - PreprocessorDefinitions="" - /> - </FileConfiguration> </File> <File RelativePath="..\..\libshout-2.2.2\src\httpp\httpp.h" @@ -228,68 +180,14 @@ <File RelativePath="..\..\libshout-2.2.2\src\mp3.c" > - <FileConfiguration - Name="Release|Win32" - > - <Tool - Name="VCCLCompilerTool" - AdditionalIncludeDirectories="" - PreprocessorDefinitions="" - /> - </FileConfiguration> - <FileConfiguration - Name="Debug|Win32" - > - <Tool - Name="VCCLCompilerTool" - AdditionalIncludeDirectories="" - PreprocessorDefinitions="" - /> - </FileConfiguration> </File> <File RelativePath="..\..\libshout-2.2.2\src\ogg.c" > - <FileConfiguration - Name="Release|Win32" - > - <Tool - Name="VCCLCompilerTool" - AdditionalIncludeDirectories="" - PreprocessorDefinitions="" - /> - </FileConfiguration> - <FileConfiguration - Name="Debug|Win32" - > - <Tool - Name="VCCLCompilerTool" - AdditionalIncludeDirectories="" - PreprocessorDefinitions="" - /> - </FileConfiguration> </File> <File RelativePath="..\..\libshout-2.2.2\src\net\resolver.c" > - <FileConfiguration - Name="Release|Win32" - > - <Tool - Name="VCCLCompilerTool" - AdditionalIncludeDirectories="" - PreprocessorDefinitions="" - /> - </FileConfiguration> - <FileConfiguration - Name="Debug|Win32" - > - <Tool - Name="VCCLCompilerTool" - AdditionalIncludeDirectories="" - PreprocessorDefinitions="" - /> - </FileConfiguration> </File> <File RelativePath="..\..\libshout-2.2.2\src\net\resolver.h" @@ -298,24 +196,6 @@ <File RelativePath="..\..\libshout-2.2.2\src\shout.c" > - <FileConfiguration - Name="Release|Win32" - > - <Tool - Name="VCCLCompilerTool" - AdditionalIncludeDirectories="" - PreprocessorDefinitions="" - /> - </FileConfiguration> - <FileConfiguration - Name="Debug|Win32" - > - <Tool - Name="VCCLCompilerTool" - AdditionalIncludeDirectories="" - PreprocessorDefinitions="" - /> - </FileConfiguration> </File> <File RelativePath="..\..\libshout-2.2.2\src\shout_ogg.h" @@ -328,24 +208,6 @@ <File RelativePath="..\..\libshout-2.2.2\src\net\sock.c" > - <FileConfiguration - Name="Release|Win32" - > - <Tool - Name="VCCLCompilerTool" - AdditionalIncludeDirectories="" - PreprocessorDefinitions="" - /> - </FileConfiguration> - <FileConfiguration - Name="Debug|Win32" - > - <Tool - Name="VCCLCompilerTool" - AdditionalIncludeDirectories="" - PreprocessorDefinitions="" - /> - </FileConfiguration> </File> <File RelativePath="..\..\libshout-2.2.2\src\net\sock.h" @@ -354,24 +216,6 @@ <File RelativePath="..\..\libshout-2.2.2\src\thread\thread.c" > - <FileConfiguration - Name="Release|Win32" - > - <Tool - Name="VCCLCompilerTool" - AdditionalIncludeDirectories="" - PreprocessorDefinitions="" - /> - </FileConfiguration> - <FileConfiguration - Name="Debug|Win32" - > - <Tool - Name="VCCLCompilerTool" - AdditionalIncludeDirectories="" - PreprocessorDefinitions="" - /> - </FileConfiguration> </File> <File RelativePath="..\..\libshout-2.2.2\src\thread\thread.h" @@ -380,24 +224,6 @@ <File RelativePath="..\..\libshout-2.2.2\src\timing\timing.c" > - <FileConfiguration - Name="Release|Win32" - > - <Tool - Name="VCCLCompilerTool" - AdditionalIncludeDirectories="" - PreprocessorDefinitions="" - /> - </FileConfiguration> - <FileConfiguration - Name="Debug|Win32" - > - <Tool - Name="VCCLCompilerTool" - AdditionalIncludeDirectories="" - PreprocessorDefinitions="" - /> - </FileConfiguration> </File> <File RelativePath="..\..\libshout-2.2.2\src\timing\timing.h" @@ -406,24 +232,6 @@ <File RelativePath="..\..\libshout-2.2.2\src\util.c" > - <FileConfiguration - Name="Release|Win32" - > - <Tool - Name="VCCLCompilerTool" - AdditionalIncludeDirectories="" - PreprocessorDefinitions="" - /> - </FileConfiguration> - <FileConfiguration - Name="Debug|Win32" - > - <Tool - Name="VCCLCompilerTool" - AdditionalIncludeDirectories="" - PreprocessorDefinitions="" - /> - </FileConfiguration> </File> <File RelativePath="..\..\libshout-2.2.2\src\util.h" Modified: freeswitch/branches/gmaruzz/libs/win32/util.vbs ============================================================================== --- freeswitch/branches/gmaruzz/libs/win32/util.vbs (original) +++ freeswitch/branches/gmaruzz/libs/win32/util.vbs Mon Dec 15 12:56:36 2008 @@ -250,15 +250,41 @@ strVerRev = FindVersionStringInConfigure(VersionDir & "configure.in", "SWITCH_VERSION_REVISION") If Right(tmpFolder, 1) <> "\" Then tmpFolder = tmpFolder & "\" End If - If Not FSO.FileExists(tmpFolder & "svnversion.exe") Then - Wget ToolsBase & "svnversion.exe", tmpFolder + If Not FSO.FileExists(tmpFolder & "fs_svnversion.exe") Then + Wget ToolsBase & "fs_svnversion.exe", tmpFolder End If + + If Not FSO.FileExists(tmpFolder & "libsvn_diff-1.dll") Then + Wget ToolsBase & "libsvn_diff-1.dll", tmpFolder + End If + If Not FSO.FileExists(tmpFolder & "libsvn_subr-1.dll") Then + Wget ToolsBase & "libsvn_subr-1.dll", tmpFolder + End If + If Not FSO.FileExists(tmpFolder & "libsvn_wc-1.dll") Then + Wget ToolsBase & "libsvn_wc-1.dll", tmpFolder + End If + If Not FSO.FileExists(tmpFolder & "intl3_svn.dll") Then + Wget ToolsBase & "intl3_svn.dll", tmpFolder + End If + If Not FSO.FileExists(tmpFolder & "libapr-1.dll") Then + Wget ToolsBase & "libapr-1.dll", tmpFolder + End If + If Not FSO.FileExists(tmpFolder & "libaprutil-1.dll") Then + Wget ToolsBase & "libaprutil-1.dll", tmpFolder + End If + If Not FSO.FileExists(tmpFolder & "libapriconv-1.dll") Then + Wget ToolsBase & "libapriconv-1.dll", tmpFolder + End If + If Not FSO.FileExists(tmpFolder & "libsvn_delta-1.dll") Then + Wget ToolsBase & "libsvn_delta-1.dll", tmpFolder + End If + Dim sLastFile Const OverwriteIfExist = -1 Const ForReading = 1 if strVerRev = "" Then - VersionCmd="svnversion " & quote & VersionDir & "." & quote & " -n" + VersionCmd="fs_svnversion " & quote & VersionDir & "." & quote & " -n" Set MyFile = fso.CreateTextFile(tmpFolder & "tmpVersion.Bat", True) MyFile.WriteLine("@" & "cd " & quote & tmpFolder & quote ) MyFile.WriteLine("@" & VersionCmd) Modified: freeswitch/branches/gmaruzz/scripts/contrib/intralanman/PHP/fs_curl/configuration/xml_cdr.conf.php ============================================================================== --- freeswitch/branches/gmaruzz/scripts/contrib/intralanman/PHP/fs_curl/configuration/xml_cdr.conf.php (original) +++ freeswitch/branches/gmaruzz/scripts/contrib/intralanman/PHP/fs_curl/configuration/xml_cdr.conf.php Mon Dec 15 12:56:36 2008 @@ -23,7 +23,7 @@ } function get_settings() { - return array('url'=>'http://localhost/fs_curl/index_test.php', 'encode'=>'true'); + return array('url'=>'http://$${curl_host}/fs_curl/cdr.php', 'encode'=>'true'); return array( 'url'=>'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'] , 'encode'=>'true' @@ -46,4 +46,4 @@ } } -?> \ No newline at end of file +?> Modified: freeswitch/branches/gmaruzz/scripts/contrib/intralanman/PHP/fs_curl/dialplan_importer.php ============================================================================== --- freeswitch/branches/gmaruzz/scripts/contrib/intralanman/PHP/fs_curl/dialplan_importer.php (original) +++ freeswitch/branches/gmaruzz/scripts/contrib/intralanman/PHP/fs_curl/dialplan_importer.php Mon Dec 15 12:56:36 2008 @@ -149,4 +149,4 @@ upload_form(); //printf("<pre>%s</pre>", print_r($xml_obj, true); -?> + Modified: freeswitch/branches/gmaruzz/scripts/contrib/intralanman/PHP/fs_curl/fs_configuration.php ============================================================================== --- freeswitch/branches/gmaruzz/scripts/contrib/intralanman/PHP/fs_curl/fs_configuration.php (original) +++ freeswitch/branches/gmaruzz/scripts/contrib/intralanman/PHP/fs_curl/fs_configuration.php Mon Dec 15 12:56:36 2008 @@ -89,4 +89,3 @@ } } -?> \ No newline at end of file Modified: freeswitch/branches/gmaruzz/scripts/contrib/intralanman/PHP/fs_curl/fs_curl.php ============================================================================== --- freeswitch/branches/gmaruzz/scripts/contrib/intralanman/PHP/fs_curl/fs_curl.php (original) +++ freeswitch/branches/gmaruzz/scripts/contrib/intralanman/PHP/fs_curl/fs_curl.php Mon Dec 15 12:56:36 2008 @@ -321,4 +321,4 @@ } } } -?> + Modified: freeswitch/branches/gmaruzz/scripts/contrib/intralanman/PHP/fs_curl/fs_dialplan.php ============================================================================== --- freeswitch/branches/gmaruzz/scripts/contrib/intralanman/PHP/fs_curl/fs_dialplan.php (original) +++ freeswitch/branches/gmaruzz/scripts/contrib/intralanman/PHP/fs_curl/fs_dialplan.php Mon Dec 15 12:56:36 2008 @@ -206,4 +206,3 @@ } } } -?> \ No newline at end of file Modified: freeswitch/branches/gmaruzz/scripts/contrib/intralanman/PHP/fs_curl/fs_directory.php ============================================================================== --- freeswitch/branches/gmaruzz/scripts/contrib/intralanman/PHP/fs_curl/fs_directory.php (original) +++ freeswitch/branches/gmaruzz/scripts/contrib/intralanman/PHP/fs_curl/fs_directory.php Mon Dec 15 12:56:36 2008 @@ -275,5 +275,4 @@ $this -> xmlw -> endElement(); } } -?> Modified: freeswitch/branches/gmaruzz/scripts/contrib/intralanman/PHP/fs_curl/global_defines.php ============================================================================== --- freeswitch/branches/gmaruzz/scripts/contrib/intralanman/PHP/fs_curl/global_defines.php (original) +++ freeswitch/branches/gmaruzz/scripts/contrib/intralanman/PHP/fs_curl/global_defines.php Mon Dec 15 12:56:36 2008 @@ -62,4 +62,4 @@ //define('', ''); -?> + Modified: freeswitch/branches/gmaruzz/scripts/contrib/intralanman/PHP/fs_curl/index.php ============================================================================== --- freeswitch/branches/gmaruzz/scripts/contrib/intralanman/PHP/fs_curl/index.php (original) +++ freeswitch/branches/gmaruzz/scripts/contrib/intralanman/PHP/fs_curl/index.php Mon Dec 15 12:56:36 2008 @@ -94,4 +94,3 @@ $conf -> main(); $conf -> output_xml(); -?> \ No newline at end of file Modified: freeswitch/branches/gmaruzz/scripts/contrib/mrene/mod_limit/mod_limit.c ============================================================================== --- freeswitch/branches/gmaruzz/scripts/contrib/mrene/mod_limit/mod_limit.c (original) +++ freeswitch/branches/gmaruzz/scripts/contrib/mrene/mod_limit/mod_limit.c Mon Dec 15 12:56:36 2008 @@ -851,6 +851,44 @@ switch_mutex_unlock(globals.limit_hash_mutex); } +#define LIMIT_HASH_USAGE_USAGE "<realm> <id>" +SWITCH_STANDARD_API(limit_hash_usage_function) +{ + int argc = 0; + char *argv[3] = { 0 }; + char *mydata = NULL; + char *hash_key = NULL; + limit_hash_item_t *item = NULL; + uint32_t count = 0; + + switch_mutex_lock(globals.limit_hash_mutex); + + if (!switch_strlen_zero(cmd)) { + switch_assert(mydata = strdup(cmd)); + argc = switch_separate_string(mydata, ' ', argv, (sizeof(argv) / sizeof(argv[0]))); + } + + if (argc < 2) { + stream->write_function(stream, "USAGE: limit_hash_usage %s\n", LIMIT_HASH_USAGE_USAGE); + goto end; + } + + hash_key = switch_mprintf("%s_%s", argv[0], argv[1]); + + if ((item = switch_core_hash_find(globals.limit_hash, hash_key))) { + count = item->total_usage; + } + + stream->write_function(stream, "%d", count); + +end: + switch_safe_free(mydata); + switch_safe_free(hash_key); + switch_mutex_unlock(globals.limit_hash_mutex); + + return SWITCH_STATUS_SUCCESS; +} + SWITCH_MODULE_LOAD_FUNCTION(mod_limit_load) { switch_status_t status; @@ -880,6 +918,7 @@ SWITCH_ADD_APP(app_interface, "hash", "Insert into the hashtable", HASH_DESC, hash_function, HASH_USAGE, SAF_SUPPORT_NOMEDIA) SWITCH_ADD_APP(app_interface, "group", "Manage a group", GROUP_DESC, group_function, GROUP_USAGE, SAF_SUPPORT_NOMEDIA); + SWITCH_ADD_API(commands_api_interface, "limit_hash_usage", "Gets the usage count of a limited resource", limit_hash_usage_function, LIMIT_HASH_USAGE_USAGE); SWITCH_ADD_API(commands_api_interface, "db", "db get/set", db_api_function, "[insert|delete|select]/<realm>/<key>/<value>"); switch_console_set_complete("add db insert"); switch_console_set_complete("add db delete"); Modified: freeswitch/branches/gmaruzz/scripts/fsxs.in ============================================================================== --- freeswitch/branches/gmaruzz/scripts/fsxs.in (original) +++ freeswitch/branches/gmaruzz/scripts/fsxs.in Mon Dec 15 12:56:36 2008 @@ -177,12 +177,14 @@ sub fsxs_showq { my @varlist = @_; + my $count = 0; if( $#varlist >= 0 ) { foreach( @varlist ) { if( defined $vars{$_} ) { - print "$vars{$_} "; + print "$vars{$_}" . (($count < $#varlist) ? " " : ""); } + $count++; } } } Modified: freeswitch/branches/gmaruzz/src/include/private/switch_core_pvt.h ============================================================================== --- freeswitch/branches/gmaruzz/src/include/private/switch_core_pvt.h (original) +++ freeswitch/branches/gmaruzz/src/include/private/switch_core_pvt.h Mon Dec 15 12:56:36 2008 @@ -118,6 +118,8 @@ switch_mutex_t *mutex; switch_mutex_t *resample_mutex; + switch_mutex_t *codec_read_mutex; + switch_mutex_t *codec_write_mutex; switch_thread_cond_t *cond; switch_thread_rwlock_t *rwlock; Modified: freeswitch/branches/gmaruzz/src/include/switch.h ============================================================================== --- freeswitch/branches/gmaruzz/src/include/switch.h (original) +++ freeswitch/branches/gmaruzz/src/include/switch.h Mon Dec 15 12:56:36 2008 @@ -54,7 +54,7 @@ #define FREESWITCH_ITAD "543" #define __EXTENSIONS__ 1 #ifndef MACOSX -#if !defined(_XOPEN_SOURCE) && !defined(__OpenBSD__) +#if !defined(_XOPEN_SOURCE) && !defined(__OpenBSD__) && !defined(__NetBSD__) #ifndef __cplusplus #define _XOPEN_SOURCE 600 #endif Modified: freeswitch/branches/gmaruzz/src/include/switch_apr.h ============================================================================== --- freeswitch/branches/gmaruzz/src/include/switch_apr.h (original) +++ freeswitch/branches/gmaruzz/src/include/switch_apr.h Mon Dec 15 12:56:36 2008 @@ -1123,6 +1123,7 @@ */ SWITCH_DECLARE(switch_status_t) switch_socket_recvfrom(switch_sockaddr_t *from, switch_socket_t *sock, int32_t flags, char *buf, size_t *len); +SWITCH_DECLARE(switch_status_t) switch_socket_atmark(switch_socket_t *sock, int *atmark); /** * Read data from a network. Modified: freeswitch/branches/gmaruzz/src/include/switch_channel.h ============================================================================== --- freeswitch/branches/gmaruzz/src/include/switch_channel.h (original) +++ freeswitch/branches/gmaruzz/src/include/switch_channel.h Mon Dec 15 12:56:36 2008 @@ -145,7 +145,7 @@ \param flags the initial channel flags */ SWITCH_DECLARE(switch_status_t) switch_channel_init(switch_channel_t *channel, switch_core_session_t *session, switch_channel_state_t state, - uint32_t flags); + switch_channel_flag_t flag); /*! \brief Fire A presence event for the channel @@ -259,49 +259,49 @@ SWITCH_DECLARE(switch_caller_extension_t *) switch_channel_get_caller_extension(switch_channel_t *channel); /*! - \brief Test for presence of given flag(s) on a given channel + \brief Test for presence of given flag on a given channel \param channel channel to test - \param flags or'd list of channel flags to test + \param flag to test \return TRUE if flags were present */ -SWITCH_DECLARE(uint32_t) switch_channel_test_flag(switch_channel_t *channel, switch_channel_flag_t flags); +SWITCH_DECLARE(uint32_t) switch_channel_test_flag(switch_channel_t *channel, switch_channel_flag_t flag); /*! \brief Set given flag(s) on a given channel - \param channel channel on which to set flag(s) - \param flags or'd list of flags to set + \param channel channel on which to set flag + \param flag or'd list of flags to set */ -SWITCH_DECLARE(void) switch_channel_set_flag(switch_channel_t *channel, switch_channel_flag_t flags); +SWITCH_DECLARE(void) switch_channel_set_flag(switch_channel_t *channel, switch_channel_flag_t flag); /*! \brief Set given flag(s) on a given channel's bridge partner - \param channel channel to derive the partner channel to set flag(s) on - \param flags or'd list of flags to set + \param channel channel to derive the partner channel to set flag on + \param flag to set \return true if the flag was set */ -SWITCH_DECLARE(switch_bool_t) switch_channel_set_flag_partner(switch_channel_t *channel, switch_channel_flag_t flags); +SWITCH_DECLARE(switch_bool_t) switch_channel_set_flag_partner(switch_channel_t *channel, switch_channel_flag_t flag); /*! \brief Clears given flag(s) on a given channel's bridge partner \param channel channel to derive the partner channel to clear flag(s) from - \param flags the flags to clear + \param flag the flag to clear \return true if the flag was cleared */ -SWITCH_DECLARE(switch_bool_t) switch_channel_clear_flag_partner(switch_channel_t *channel, switch_channel_flag_t flags); +SWITCH_DECLARE(switch_bool_t) switch_channel_clear_flag_partner(switch_channel_t *channel, switch_channel_flag_t flag); /*! \brief Set given flag(s) on a given channel to be applied on the next state change \param channel channel on which to set flag(s) - \param flags or'd list of flags to set + \param flag flag to set */ -SWITCH_DECLARE(void) switch_channel_set_state_flag(switch_channel_t *channel, switch_channel_flag_t flags); +SWITCH_DECLARE(void) switch_channel_set_state_flag(switch_channel_t *channel, switch_channel_flag_t flag); /*! \brief Clear given flag(s) from a channel \param channel channel to clear flags from - \param flags or'd list of flags to clear + \param flag flag to clear */ -SWITCH_DECLARE(void) switch_channel_clear_flag(switch_channel_t *channel, switch_channel_flag_t flags); +SWITCH_DECLARE(void) switch_channel_clear_flag(switch_channel_t *channel, switch_channel_flag_t flag); SWITCH_DECLARE(switch_status_t) switch_channel_perform_answer(switch_channel_t *channel, const char *file, const char *func, int line); @@ -484,10 +484,16 @@ _In_opt_ const char *prefix); SWITCH_DECLARE(switch_status_t) switch_channel_set_timestamps(_In_ switch_channel_t *channel); -#define switch_channel_stop_broadcast(_channel) if (switch_channel_test_flag(_channel, CF_BROADCAST)) switch_channel_set_flag(_channel, CF_BREAK | CF_STOP_BROADCAST) +#define switch_channel_stop_broadcast(_channel) for(;;) {if (switch_channel_test_flag(_channel, CF_BROADCAST)) {switch_channel_set_flag(_channel, CF_STOP_BROADCAST); switch_channel_set_flag(_channel, CF_BREAK); } break;} #define switch_channel_media_ready(_channel) ((switch_channel_test_flag(_channel, CF_ANSWERED) || switch_channel_test_flag(_channel, CF_EARLY_MEDIA)) && !switch_channel_test_flag(_channel, CF_PROXY_MODE)) +SWITCH_DECLARE(void) switch_channel_audio_sync(switch_channel_t *channel); + +SWITCH_DECLARE(void) switch_channel_set_private_flag(switch_channel_t *channel, uint32_t flags); +SWITCH_DECLARE(void) switch_channel_clear_private_flag(switch_channel_t *channel, uint32_t flags); +SWITCH_DECLARE(int) switch_channel_test_private_flag(switch_channel_t *channel, uint32_t flags); + /** @} */ SWITCH_END_EXTERN_C Modified: freeswitch/branches/gmaruzz/src/include/switch_core.h ============================================================================== --- freeswitch/branches/gmaruzz/src/include/switch_core.h (original) +++ freeswitch/branches/gmaruzz/src/include/switch_core.h Mon Dec 15 12:56:36 2008 @@ -92,6 +92,7 @@ const char *_file; const char *_func; int _line; + }; /*! \brief A generic object to pass as a thread's session object to allow mutiple arguements and a pool */ @@ -320,6 +321,22 @@ #ifdef SWITCH_DEBUG_RWLOCKS +SWITCH_DECLARE(switch_status_t) switch_core_session_perform_read_lock_hangup(_In_ switch_core_session_t *session, const char *file, const char *func, int line); +#endif + +/*! + \brief Acquire a read lock on the session + \param session the session to acquire from + \return success if it is safe to read from the session +*/ +#ifdef SWITCH_DEBUG_RWLOCKS +#define switch_core_session_read_lock(session) switch_core_session_perform_read_lock_hangup(session, __FILE__, __SWITCH_FUNC__, __LINE__) +#else +SWITCH_DECLARE(switch_status_t) switch_core_session_read_lock_hangup(_In_ switch_core_session_t *session); +#endif + + +#ifdef SWITCH_DEBUG_RWLOCKS SWITCH_DECLARE(void) switch_core_session_perform_write_lock(_In_ switch_core_session_t *session, const char *file, const char *func, int line); #endif Modified: freeswitch/branches/gmaruzz/src/include/switch_cpp.h ============================================================================== --- freeswitch/branches/gmaruzz/src/include/switch_cpp.h (original) +++ freeswitch/branches/gmaruzz/src/include/switch_cpp.h Mon Dec 15 12:56:36 2008 @@ -313,7 +313,7 @@ * */ SWITCH_DECLARE(int) streamFile(char *file, int starting_sample_count = 0); - SWITCH_DECLARE(int) sleep(int ms); + SWITCH_DECLARE(int) sleep(int ms, int sync=0); /** \brief flush any pending events */ @@ -373,6 +373,7 @@ SWITCH_DECLARE(void) console_log(char *level_str, char *msg); SWITCH_DECLARE(void) console_clean_log(char *msg); +SWITCH_DECLARE(void) msleep(unsigned ms); /** \brief bridge the audio of session_b into session_a * Modified: freeswitch/branches/gmaruzz/src/include/switch_ivr.h ============================================================================== --- freeswitch/branches/gmaruzz/src/include/switch_ivr.h (original) +++ freeswitch/branches/gmaruzz/src/include/switch_ivr.h Mon Dec 15 12:56:36 2008 @@ -110,7 +110,7 @@ \param args arguements to pass for callbacks etc \return SWITCH_STATUS_SUCCESS if the channel is still up */ -SWITCH_DECLARE(switch_status_t) switch_ivr_sleep(switch_core_session_t *session, uint32_t ms, switch_input_args_t *args); +SWITCH_DECLARE(switch_status_t) switch_ivr_sleep(switch_core_session_t *session, uint32_t ms, switch_bool_t sync, switch_input_args_t *args); SWITCH_DECLARE(switch_status_t) switch_ivr_park(switch_core_session_t *session, switch_input_args_t *args); @@ -298,7 +298,8 @@ */ SWITCH_DECLARE(switch_status_t) switch_ivr_tone_detect_session(switch_core_session_t *session, const char *key, const char *tone_spec, - const char *flags, time_t timeout, const char *app, const char *data); + const char *flags, time_t timeout, int hits, const char *app, const char *data); + @@ -397,7 +398,10 @@ const switch_state_handler_table_t *table, const char *cid_name_override, const char *cid_num_override, - switch_caller_profile_t *caller_profile_override, switch_originate_flag_t flags); + switch_caller_profile_t *caller_profile_override, + switch_event_t *ovars, + switch_originate_flag_t flags + ); /*! \brief Bridge Audio from one session to another Modified: freeswitch/branches/gmaruzz/src/include/switch_module_interfaces.h ============================================================================== --- freeswitch/branches/gmaruzz/src/include/switch_module_interfaces.h (original) +++ freeswitch/branches/gmaruzz/src/include/switch_module_interfaces.h Mon Dec 15 12:56:36 2008 @@ -173,6 +173,7 @@ switch_thread_rwlock_t *rwlock; int refs; + switch_mutex_t *reflock; /* parent */ switch_loadable_module_interface_t *parent; @@ -228,6 +229,7 @@ switch_status_t (*timer_destroy) (switch_timer_t *); switch_thread_rwlock_t *rwlock; int refs; + switch_mutex_t *reflock; switch_loadable_module_interface_t *parent; struct switch_timer_interface *next; }; @@ -240,6 +242,7 @@ switch_dialplan_hunt_function_t hunt_function; switch_thread_rwlock_t *rwlock; int refs; + switch_mutex_t *reflock; switch_loadable_module_interface_t *parent; struct switch_dialplan_interface *next; }; @@ -266,6 +269,7 @@ char **extens; switch_thread_rwlock_t *rwlock; int refs; + switch_mutex_t *reflock; switch_loadable_module_interface_t *parent; struct switch_file_interface *next; }; @@ -345,6 +349,7 @@ switch_status_t (*asr_get_results) (switch_asr_handle_t *ah, char **xmlstr, switch_asr_flag_t *flags); switch_thread_rwlock_t *rwlock; int refs; + switch_mutex_t *reflock; switch_loadable_module_interface_t *parent; struct switch_asr_interface *next; }; @@ -388,6 +393,7 @@ void (*speech_float_param_tts) (switch_speech_handle_t *sh, char *param, double val); switch_thread_rwlock_t *rwlock; int refs; + switch_mutex_t *reflock; switch_loadable_module_interface_t *parent; struct switch_speech_interface *next; }; @@ -423,6 +429,7 @@ switch_say_callback_t say_function; switch_thread_rwlock_t *rwlock; int refs; + switch_mutex_t *reflock; switch_loadable_module_interface_t *parent; struct switch_say_interface *next; }; @@ -435,6 +442,7 @@ switch_status_t (*chat_send) (char *proto, char *from, char *to, char *subject, char *body, char *hint); switch_thread_rwlock_t *rwlock; int refs; + switch_mutex_t *reflock; switch_loadable_module_interface_t *parent; struct switch_chat_interface *next; }; @@ -447,6 +455,7 @@ switch_status_t (*management_function) (char *relative_oid, switch_management_action_t action, char *data, switch_size_t datalen); switch_thread_rwlock_t *rwlock; int refs; + switch_mutex_t *reflock; switch_loadable_module_interface_t *parent; struct switch_management_interface *next; }; @@ -467,6 +476,7 @@ switch_status_t (*directory_next_pair) (switch_directory_handle_t *dh, char **var, char **val); switch_thread_rwlock_t *rwlock; int refs; + switch_mutex_t *reflock; switch_loadable_module_interface_t *parent; struct switch_directory_interface *next; }; @@ -593,6 +603,7 @@ uint32_t codec_id; switch_thread_rwlock_t *rwlock; int refs; + switch_mutex_t *reflock; switch_loadable_module_interface_t *parent; struct switch_codec_interface *next; }; @@ -613,6 +624,7 @@ uint32_t flags; switch_thread_rwlock_t *rwlock; int refs; + switch_mutex_t *reflock; switch_loadable_module_interface_t *parent; struct switch_application_interface *next; }; @@ -629,12 +641,14 @@ const char *syntax; switch_thread_rwlock_t *rwlock; int refs; + switch_mutex_t *reflock; switch_loadable_module_interface_t *parent; struct switch_api_interface *next; }; -#define PROTECT_INTERFACE(_it) if (_it && !_it->refs) {switch_thread_rwlock_rdlock(_it->parent->rwlock); switch_thread_rwlock_rdlock(_it->rwlock); _it->refs++; _it->parent->refs++;} //switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "+++++++++++LOCK\n"); -#define UNPROTECT_INTERFACE(_it) if (_it && _it->refs) {switch_thread_rwlock_unlock(_it->rwlock); switch_thread_rwlock_unlock(_it->parent->rwlock); _it->refs--; _it->parent->refs--; _it = NULL;} //switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "-----------UNLOCK\n"); +#define PROTECT_INTERFACE(_it) if (_it) {switch_mutex_lock(_it->reflock); switch_thread_rwlock_rdlock(_it->parent->rwlock); switch_thread_rwlock_rdlock(_it->rwlock); _it->refs++; _it->parent->refs++; switch_mutex_unlock(_it->reflock);} //if (!strcmp(_it->interface_name, "user")) switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "+++++++++++LOCK %s %d/%d\n", _it->interface_name, _it->refs, _it->parent->refs); +#define UNPROTECT_INTERFACE(_it) if (_it) {switch_mutex_lock(_it->reflock); switch_thread_rwlock_unlock(_it->rwlock); switch_thread_rwlock_unlock(_it->parent->rwlock); _it->refs--; _it->parent->refs--; switch_mutex_unlock(_it->reflock);} //if (!strcmp(_it->interface_name, "user")) switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "---------UNLOCK %s %d/%d\n", _it->interface_name, _it->refs, _it->parent->refs); + SWITCH_END_EXTERN_C #endif Modified: freeswitch/branches/gmaruzz/src/include/switch_odbc.h ============================================================================== --- freeswitch/branches/gmaruzz/src/include/switch_odbc.h (original) +++ freeswitch/branches/gmaruzz/src/include/switch_odbc.h Mon Dec 15 12:56:36 2008 @@ -64,8 +64,35 @@ SWITCH_DECLARE(void) switch_odbc_handle_destroy(switch_odbc_handle_t **handlep); SWITCH_DECLARE(switch_odbc_state_t) switch_odbc_handle_get_state(switch_odbc_handle_t *handle); SWITCH_DECLARE(switch_odbc_status_t) switch_odbc_handle_exec(switch_odbc_handle_t *handle, char *sql, SQLHSTMT * rstmt); -SWITCH_DECLARE(switch_odbc_status_t) switch_odbc_handle_callback_exec(switch_odbc_handle_t *handle, + +/*! + \brief Execute the sql query and issue a callback for each row returned + \param file the file from which this function is called + \param func the function from which this function is called + \param line the line from which this function is called + \param handle the ODBC handle + \param sql the sql string to execute + \param callback the callback function to execute + \param pdata the state data passed on each callback invocation + \return SWITCH_STATUS_SUCCESS if the operation was successful + \note none +*/ +SWITCH_DECLARE(switch_odbc_status_t) switch_odbc_handle_callback_exec_detailed(const char *file, const char *func, int line, switch_odbc_handle_t *handle, char *sql, switch_core_db_callback_func_t callback, void *pdata); +/*! + \brief Execute the sql query and issue a callback for each row returned + \param handle the ODBC handle + \param sql the sql string to execute + \param callback the callback function to execute + \param pdata the state data passed on each callback invocation + \return SWITCH_STATUS_SUCCESS if the operation was successful + \note none +*/ +#define switch_odbc_handle_callback_exec(handle, sql, callback, pdata) \ + switch_odbc_handle_callback_exec_detailed(__FILE__, (char * )__SWITCH_FUNC__, __LINE__, \ + handle, sql, callback, pdata) + + SWITCH_DECLARE(char *) switch_odbc_handle_get_error(switch_odbc_handle_t *handle, SQLHSTMT stmt); SWITCH_END_EXTERN_C #endif Modified: freeswitch/branches/gmaruzz/src/include/switch_rtp.h ============================================================================== --- freeswitch/branches/gmaruzz/src/include/switch_rtp.h (original) +++ freeswitch/branches/gmaruzz/src/include/switch_rtp.h Mon Dec 15 12:56:36 2008 @@ -111,7 +111,7 @@ SWITCH_DECLARE(switch_port_t) switch_rtp_request_port(const char *ip); SWITCH_DECLARE(void) switch_rtp_release_port(const char *ip, switch_port_t port); -SWITCH_DECLARE(void) switch_rtp_change_interval(switch_rtp_t *rtp_session, uint32_t ms_per_packet, uint32_t samples_per_interval); +SWITCH_DECLARE(switch_status_t) switch_rtp_change_interval(switch_rtp_t *rtp_session, uint32_t ms_per_packet, uint32_t samples_per_interval); /*! \brief create a new RTP session handle \param new_rtp_session a poiter to aim at the new session @@ -351,6 +351,8 @@ */ SWITCH_DECLARE(switch_status_t) switch_rtp_zerocopy_read_frame(switch_rtp_t *rtp_session, switch_frame_t *frame, switch_io_flag_t io_flags); +SWITCH_DECLARE(void) rtp_flush_read_buffer(switch_rtp_t *rtp_session); + /*! \brief Enable VAD on an RTP Session \param rtp_session the RTP session Modified: freeswitch/branches/gmaruzz/src/include/switch_stun.h ============================================================================== --- freeswitch/branches/gmaruzz/src/include/switch_stun.h (original) +++ freeswitch/branches/gmaruzz/src/include/switch_stun.h Mon Dec 15 12:56:36 2008 @@ -147,6 +147,7 @@ */ SWITCH_DECLARE(const char *) switch_stun_value_to_name(int32_t type, uint32_t value); +SWITCH_DECLARE(char *) switch_stun_host_lookup(const char *host, switch_memory_pool_t *pool); /*! \brief Extract a mapped address (IP:PORT) from a packet attribute Modified: freeswitch/branches/gmaruzz/src/include/switch_types.h ============================================================================== --- freeswitch/branches/gmaruzz/src/include/switch_types.h (original) +++ freeswitch/branches/gmaruzz/src/include/switch_types.h Mon Dec 15 12:56:36 2008 @@ -110,6 +110,10 @@ #define SWITCH_PATH_SEPARATOR "/" #endif #define SWITCH_URL_SEPARATOR "://" +#define SWITCH_SEND_SILENCE_WHEN_IDLE_VARIABLE "send_silence_when_idle" +#define SWITCH_CURRENT_APPLICATION_VARIABLE "current_application" +#define SWITCH_CURRENT_APPLICATION_DATA_VARIABLE "current_application_data" +#define SWITCH_CURRENT_APPLICATION_RESPONSE_VARIABLE "current_application_response" #define SWITCH_ENABLE_HEARTBEAT_EVENTS_VARIABLE "enable_heartbeat_events" #define SWITCH_BYPASS_MEDIA_AFTER_BRIDGE_VARIABLE "bypass_media_after_bridge" #define SWITCH_READ_RESULT_VARIABLE "read_result" @@ -122,6 +126,7 @@ #define SWITCH_HOLDING_UUID_VARIABLE "holding_uuid" #define SWITCH_API_BRIDGE_END_VARIABLE "api_after_bridge" #define SWITCH_API_HANGUP_HOOK_VARIABLE "api_hangup_hook" +#define SWITCH_SESSION_IN_HANGUP_HOOK_VARIABLE "session_in_hangup_hook" #define SWITCH_PROCESS_CDR_VARIABLE "process_cdr" #define SWITCH_BRIDGE_CHANNEL_VARIABLE "bridge_channel" #define SWITCH_CHANNEL_NAME_VARIABLE "channel_name" @@ -450,7 +455,8 @@ SWITCH_RTP_FLAG_SECURE_SEND_RESET = (1 << 16), SWITCH_RTP_FLAG_SECURE_RECV_RESET = (1 << 17), SWITCH_RTP_FLAG_PROXY_MEDIA = (1 << 18), - SWITCH_RTP_FLAG_SHUTDOWN = (1 << 19) + SWITCH_RTP_FLAG_SHUTDOWN = (1 << 19), + SWITCH_RTP_FLAG_FLUSH = (1 << 20) } switch_rtp_flag_enum_t; typedef uint32_t switch_rtp_flag_t; @@ -567,6 +573,7 @@ SWITCH_MESSAGE_INDICATE_VIDEO_REFRESH_REQ, SWITCH_MESSAGE_INDICATE_DISPLAY, SWITCH_MESSAGE_INDICATE_TRANSCODING_NECESSARY, + SWITCH_MESSAGE_INDICATE_AUDIO_SYNC, SWITCH_MESSAGE_INVALID } switch_core_session_message_types_t; @@ -675,7 +682,9 @@ } switch_text_channel_t; typedef enum { - SCSMF_DYNAMIC = (1 << 0) + SCSMF_DYNAMIC = (1 << 0), + SCSMF_FREE_STRING_REPLY = (1 << 1), + SCSMF_FREE_POINTER_REPLY = (1 << 2), } switch_core_session_message_flag_enum_t; typedef uint32_t switch_core_session_message_flag_t; @@ -723,71 +732,70 @@ \brief Channel Flags <pre> -CF_ANSWERED = (1 << 0) - Channel is answered -CF_OUTBOUND = (1 << 1) - Channel is an outbound channel -CF_EARLY_MEDIA = (1 << 2) - Channel is ready for audio before answer -CF_ORIGINATOR = (1 << 3) - Channel is an originator -CF_TRANSFER = (1 << 4) - Channel is being transfered -CF_ACCEPT_CNG = (1 << 5) - Channel will accept CNG frames -CF_WAIT_FOR_ME = (1 << 6) - Channel wants you to wait -CF_BRIDGED = (1 << 7) - Channel in a bridge -CF_HOLD = (1 << 8) - Channel is on hold -CF_SERVICE = (1 << 9) - Channel has a service thread -CF_TAGGED = (1 << 10) - Channel is tagged -CF_WINNER = (1 << 11) - Channel is the winner -CF_CONTROLLED = (1 << 12) - Channel is under control -CF_PROXY_MODE = (1 << 13) - Channel has no media -CF_SUSPEND = (1 << 14) - Suspend i/o -CF_EVENT_PARSE = (1 << 15) - Suspend control events -CF_REPEAT_STATE = (1 << 16) - Tell the state machine to repeat a state -CF_GEN_RINGBACK = (1 << 17) - Channel is generating it's own ringback -CF_RING_READY = (1 << 18) - Channel is ready to send ringback -CF_BREAK = (1 << 19) - Channel should stop what it's doing -CF_BROADCAST = (1 << 20) - Channel is broadcasting -CF_UNICAST = (1 << 21) - Channel has a unicast connection -CF_VIDEO = (1 << 22) - Channel has video -CF_EVENT_LOCK = (1 << 23) - Don't parse events -CF_RESET = (1 << 24) - Tell extension parser to reset -CF_ORIGINATING = (1 << 25) - Channel is originating -CF_STOP_BROADCAST = (1 << 26) - Signal to stop broadcast +CF_ANSWERED - Channel is answered +CF_OUTBOUND - Channel is an outbound channel +CF_EARLY_MEDIA - Channel is ready for audio before answer +CF_ORIGINATOR - Channel is an originator +CF_TRANSFER - Channel is being transfered +CF_ACCEPT_CNG - Channel will accept CNG frames +CF_REDIRECT - Channel is being redirected +CF_BRIDGED - Channel in a bridge +CF_HOLD - Channel is on hold +CF_SERVICE - Channel has a service thread +CF_TAGGED - Channel is tagged +CF_WINNER - Channel is the winner +CF_CONTROLLED - Channel is under control +CF_PROXY_MODE - Channel has no media +CF_SUSPEND - Suspend i/o +CF_EVENT_PARSE - Suspend control events +CF_GEN_RINGBACK - Channel is generating it's own ringback +CF_RING_READY - Channel is ready to send ringback +CF_BREAK - Channel should stop what it's doing +CF_BROADCAST - Channel is broadcasting +CF_UNICAST - Channel has a unicast connection +CF_VIDEO - Channel has video +CF_EVENT_LOCK - Don't parse events +CF_RESET - Tell extension parser to reset +CF_ORIGINATING - Channel is originating +CF_STOP_BROADCAST - Signal to stop broadcast </pre> */ typedef enum { - CF_ANSWERED = (1 << 0), - CF_OUTBOUND = (1 << 1), - CF_EARLY_MEDIA = (1 << 2), - CF_ORIGINATOR = (1 << 3), - CF_TRANSFER = (1 << 4), - CF_ACCEPT_CNG = (1 << 5), - CF_WAIT_FOR_ME = (1 << 6), - CF_BRIDGED = (1 << 7), - CF_HOLD = (1 << 8), - CF_SERVICE = (1 << 9), - CF_TAGGED = (1 << 10), - CF_WINNER = (1 << 11), - CF_CONTROLLED = (1 << 12), - CF_PROXY_MODE = (1 << 13), - CF_SUSPEND = (1 << 14), - CF_EVENT_PARSE = (1 << 15), - CF_REPEAT_STATE = (1 << 16), - CF_GEN_RINGBACK = (1 << 17), - CF_RING_READY = (1 << 18), - CF_BREAK = (1 << 19), - CF_BROADCAST = (1 << 20), - CF_UNICAST = (1 << 21), - CF_VIDEO = (1 << 22), - CF_EVENT_LOCK = (1 << 23), - CF_RESET = (1 << 24), - CF_ORIGINATING = (1 << 25), - CF_STOP_BROADCAST = (1 << 26), - CF_PROXY_MEDIA = (1 << 27), - CF_INNER_BRIDGE = (1 << 28), - CF_REQ_MEDIA = (1 << 29), - CF_VERBOSE_EVENTS = (1 << 30) -} switch_channel_flag_enum_t; -typedef uint32_t switch_channel_flag_t; - + CF_ANSWERED = 1, + CF_OUTBOUND, + CF_EARLY_MEDIA, + CF_ORIGINATOR, + CF_TRANSFER, + CF_ACCEPT_CNG, + CF_REDIRECT, + CF_BRIDGED, + CF_HOLD, + CF_SERVICE, + CF_TAGGED, + CF_WINNER, + CF_CONTROLLED, + CF_PROXY_MODE, + CF_SUSPEND, + CF_EVENT_PARSE, + CF_GEN_RINGBACK, + CF_RING_READY, + CF_BREAK, + CF_BROADCAST, + CF_UNICAST, + CF_VIDEO, + CF_EVENT_LOCK, + CF_RESET, + CF_ORIGINATING, + CF_STOP_BROADCAST, + CF_PROXY_MEDIA, + CF_INNER_BRIDGE, + CF_REQ_MEDIA, + CF_VERBOSE_EVENTS, + + /* WARNING: DO NOT ADD ANY FLAGS BELOW THIS LINE */ + CF_FLAG_MAX +} switch_channel_flag_t; /*! \enum switch_frame_flag_t @@ -1058,6 +1066,7 @@ SWITCH_EVENT_DTMF - DTMF was sent SWITCH_EVENT_MESSAGE - A Basic Message SWITCH_EVENT_PRESENCE_IN - Presence in + SWITCH_EVENT_NOTIFY_IN - Received incoming NOTIFY from gateway subscription SWITCH_EVENT_PRESENCE_OUT - Presence out SWITCH_EVENT_PRESENCE_PROBE - Presence probe SWITCH_EVENT_MESSAGE_WAITING - A message is waiting @@ -1116,6 +1125,7 @@ SWITCH_EVENT_DTMF, SWITCH_EVENT_MESSAGE, SWITCH_EVENT_PRESENCE_IN, + SWITCH_EVENT_NOTIFY_IN, SWITCH_EVENT_PRESENCE_OUT, SWITCH_EVENT_PRESENCE_PROBE, SWITCH_EVENT_MESSAGE_WAITING, Modified: freeswitch/branches/gmaruzz/src/include/switch_utils.h ============================================================================== --- freeswitch/branches/gmaruzz/src/include/switch_utils.h (original) +++ freeswitch/branches/gmaruzz/src/include/switch_utils.h Mon Dec 15 12:56:36 2008 @@ -41,6 +41,22 @@ #include <switch.h> SWITCH_BEGIN_EXTERN_C + +SWITCH_DECLARE(int) switch_toupper(int c); +SWITCH_DECLARE(int) switch_tolower(int c); +SWITCH_DECLARE(int) switch_isalnum(int c); +SWITCH_DECLARE(int) switch_isalpha(int c); +SWITCH_DECLARE(int) switch_iscntrl(int c); +SWITCH_DECLARE(int) switch_isdigit(int c); +SWITCH_DECLARE(int) switch_isgraph(int c); +SWITCH_DECLARE(int) switch_islower(int c); +SWITCH_DECLARE(int) switch_isprint(int c); +SWITCH_DECLARE(int) switch_ispunct(int c); +SWITCH_DECLARE(int) switch_isspace(int c); +SWITCH_DECLARE(int) switch_isupper(int c); +SWITCH_DECLARE(int) switch_isxdigit(int c); + + #define switch_samples_per_packet(rate, interval) ((uint32_t)((float)rate / (1000.0f / (float)interval))) #define SWITCH_SMAX 32767 #define SWITCH_SMIN -32768 @@ -211,7 +227,7 @@ \param key the key to test \return TRUE or FALSE */ -#define is_dtmf(key) ((key > 47 && key < 58) || (key > 64 && key < 69) || (key > 96 && key < 101) || key == 35 || key == 42 || key == 87 || key == 119) +#define is_dtmf(key) ((key > 47 && key < 58) || (key > 64 && key < 69) || (key > 96 && key < 101) || key == 35 || key == 42 || key == 87 || key == 119 || key == 70) #define end_of(_s) *(*_s == '\0' ? _s : _s + strlen(_s) - 1) #define end_of_p(_s) (*_s == '\0' ? _s : _s + strlen(_s) - 1) @@ -303,7 +319,7 @@ if (it) { dup = strdup(it); for(p = dup; p && *p; p++) { - *p = (char) tolower(*p); + *p = (char) switch_tolower(*p); } return dup; } @@ -320,7 +336,7 @@ if (it) { dup = strdup(it); for(p = dup; p && *p; p++) { - *p = (char) toupper(*p); + *p = (char) switch_toupper(*p); } return dup; } @@ -353,7 +369,7 @@ assert(S != NULL); for (p = S; p && *p; p++) { - *p = (char) toupper(*p); + *p = (char) switch_toupper(*p); } if (strstr(S, q)) { @@ -365,7 +381,7 @@ assert(Q != NULL); for (p = Q; p && *p; p++) { - *p = (char) toupper(*p); + *p = (char) switch_toupper(*p); } if (strstr(s, Q)) { Modified: freeswitch/branches/gmaruzz/src/mod/applications/mod_commands/mod_commands.c ============================================================================== --- freeswitch/branches/gmaruzz/src/mod/applications/mod_commands/mod_commands.c (original) +++ freeswitch/branches/gmaruzz/src/mod/applications/mod_commands/mod_commands.c Mon Dec 15 12:56:36 2008 @@ -704,13 +704,14 @@ if (stream->param_event) { http = switch_event_get_header(stream->param_event, "http-host"); + if ((var = switch_event_get_header(stream->param_event, "content-type"))) { + if (!strcasecmp(var, "text/plain")) { + http = NULL; + } + } } - if ((var = switch_event_get_header(stream->param_event, "content-type"))) { - if (!strcasecmp(var, "text/plain")) { - http = NULL; - } - } else { + if (http) { stream->write_function(stream, "%s", "Content-Type: text/html\n\n"); } @@ -1127,8 +1128,8 @@ } else if (!strcasecmp(arg, "both")) { if (uuid && (other_session = switch_core_session_locate(uuid))) { switch_channel_t *other_channel = switch_core_session_get_channel(other_session); - switch_channel_set_flag(other_channel, CF_TRANSFER); - switch_channel_set_flag(channel, CF_TRANSFER); + switch_channel_set_flag(other_channel, CF_REDIRECT); + switch_channel_set_flag(channel, CF_REDIRECT); switch_ivr_session_transfer(other_session, dest, dp, context); switch_core_session_rwunlock(other_session); } @@ -1148,14 +1149,15 @@ return SWITCH_STATUS_SUCCESS; } -#define TONE_DETECT_SYNTAX "<uuid> <key> <tone_spec> [<flags> <timeout> <app> <args>]" +#define TONE_DETECT_SYNTAX "<uuid> <key> <tone_spec> [<flags> <timeout> <app> <args> <hits>]" SWITCH_STANDARD_API(tone_detect_session_function) { - char *argv[7] = { 0 }; + char *argv[8] = { 0 }; int argc; char *mydata = NULL; time_t to = 0; switch_core_session_t *rsession; + int hits = 1; if (!cmd) { stream->write_function(stream, "-USAGE: %s\n", TONE_DETECT_SYNTAX); @@ -1193,7 +1195,14 @@ } } - switch_ivr_tone_detect_session(rsession, argv[1], argv[2], argv[3], to, argv[5], argv[6]); + if (argv[7]) { + hits = atoi(argv[7]); + if (hits < 0) { + hits = 1; + } + } + + switch_ivr_tone_detect_session(rsession, argv[1], argv[2], argv[3], to, hits, argv[5], argv[6]); stream->write_function(stream, "+OK Enabling tone detection '%s' '%s' '%s'\n", argv[1], argv[2], argv[3]); done: @@ -1251,6 +1260,42 @@ return SWITCH_STATUS_SUCCESS; } + + +#define UUID_DEFLECT_SYNTAX "<uuid> <uri>" +SWITCH_STANDARD_API(uuid_deflect) +{ + switch_core_session_t *tsession = NULL; + char *uuid = NULL, *text = NULL; + + if (!switch_strlen_zero(cmd) && (uuid = strdup(cmd))) { + if ((text = strchr(uuid, ' '))) { + *text++ = '\0'; + } + } + + if (switch_strlen_zero(uuid) || switch_strlen_zero(text)) { + stream->write_function(stream, "-USAGE: %s\n", UUID_DEFLECT_SYNTAX); + } else { + if ((tsession = switch_core_session_locate(uuid))) { + switch_core_session_message_t msg = { 0 }; + + /* Tell the channel to deflect the call */ + msg.from = __FILE__; + msg.string_arg = text; + msg.message_id = SWITCH_MESSAGE_INDICATE_DEFLECT; + switch_core_session_receive_message(tsession, &msg); + stream->write_function(stream, "+OK:%s\n", msg.string_reply); + switch_core_session_rwunlock(tsession); + } else { + stream->write_function(stream, "-ERR No Such Channel %s!\n", uuid); + } + } + + switch_safe_free(uuid); + return SWITCH_STATUS_SUCCESS; +} + #define SCHED_TRANSFER_SYNTAX "[+]<time> <uuid> <extension> [<dialplan>] [<context>]" SWITCH_STANDARD_API(sched_transfer_function) { @@ -1722,7 +1767,8 @@ { switch_core_session_t *psession = NULL; char *mycmd, *flag; - + switch_channel_t *channel = NULL; + if (session) { return SWITCH_STATUS_FALSE; } @@ -1748,7 +1794,12 @@ switch_core_session_flush_private_events(psession); } - switch_channel_set_flag(switch_core_session_get_channel(psession), CF_BREAK); + channel = switch_core_session_get_channel(psession); + if (switch_channel_test_flag(channel, CF_BROADCAST)) { + switch_channel_stop_broadcast(channel); + } else { + switch_channel_set_flag(channel, CF_BREAK); + } switch_core_session_rwunlock(psession); return SWITCH_STATUS_SUCCESS; @@ -1852,7 +1903,7 @@ timeout = atoi(argv[6]); } - if (switch_ivr_originate(NULL, &caller_session, &cause, aleg, timeout, NULL, cid_name, cid_num, NULL, SOF_NONE) != SWITCH_STATUS_SUCCESS + if (switch_ivr_originate(NULL, &caller_session, &cause, aleg, timeout, NULL, cid_name, cid_num, NULL, NULL, SOF_NONE) != SWITCH_STATUS_SUCCESS || !caller_session) { if (machine) { stream->write_function(stream, "-ERR %s\n", switch_channel_cause2str(cause)); @@ -2055,7 +2106,7 @@ } switch_zmalloc(api_task, sizeof(*api_task) + strlen(dcmd) + 1); - switch_copy_string(api_task->cmd, dcmd, strlen(dcmd)); + switch_copy_string(api_task->cmd, dcmd, strlen(dcmd) + 1); api_task->recur = recur; id = switch_scheduler_add_task(when, sch_api_callback, (char *) __SWITCH_FUNC__, group, 0, api_task, SSHF_FREE_ARG); @@ -2654,7 +2705,7 @@ SWITCH_STANDARD_API(uuid_setvar_multi_function) { switch_core_session_t *psession = NULL; - char *mycmd = NULL, *vars, *argv[2] = { 0 }; + char *mycmd = NULL, *vars, *argv[64] = { 0 }; int argc = 0; char *var_name, *var_value; @@ -2698,7 +2749,7 @@ } } - stream->write_function(stream, "-USAGE: %s\n", SETVAR_SYNTAX); + stream->write_function(stream, "-USAGE: %s\n", SETVAR_MULTI_SYNTAX); done: switch_safe_free(mycmd); @@ -3083,6 +3134,7 @@ SWITCH_ADD_API(commands_api_interface, "regex", "Eval a regex", regex_function, "<data>|<pattern>[|<subst string>]"); SWITCH_ADD_API(commands_api_interface, "acl", "compare an ip to an acl list", acl_function, "<ip> <list_name>"); SWITCH_ADD_API(commands_api_interface, "uuid_chat", "Send a chat message", uuid_chat, UUID_CHAT_SYNTAX); + SWITCH_ADD_API(commands_api_interface, "uuid_deflect", "Send a deflect", uuid_deflect, UUID_DEFLECT_SYNTAX); SWITCH_ADD_API(commands_api_interface, "find_user_xml", "find a user", find_user_function, "<key> <user> <domain>"); SWITCH_ADD_API(commands_api_interface, "user_exists", "find a user", user_exists_function, "<key> <user> <domain>"); SWITCH_ADD_API(commands_api_interface, "xml_locate", "find some xml", xml_locate_function, "[root | <section> <tag> <tag_attr_name> <tag_attr_val>]"); Modified: freeswitch/branches/gmaruzz/src/mod/applications/mod_conference/mod_conference.c ============================================================================== --- freeswitch/branches/gmaruzz/src/mod/applications/mod_conference/mod_conference.c (original) +++ freeswitch/branches/gmaruzz/src/mod/applications/mod_conference/mod_conference.c Mon Dec 15 12:56:36 2008 @@ -788,64 +788,68 @@ continue; } - if (switch_channel_test_flag(switch_core_session_get_channel(conference->floor_holder->session), CF_VIDEO)) { - status = switch_core_session_read_video_frame(conference->floor_holder->session, &vid_frame, SWITCH_IO_FLAG_NONE, 0); - if (!SWITCH_READ_ACCEPTABLE(status)) { - conference->floor_holder = NULL; - req_iframe = 0; - continue; - } + if (!switch_channel_test_flag(switch_core_session_get_channel(conference->floor_holder->session), CF_VIDEO)) { + switch_cond_next(); + continue; + } - if (switch_test_flag(vid_frame, SFF_CNG)) { - continue; - } + status = switch_core_session_read_video_frame(conference->floor_holder->session, &vid_frame, SWITCH_IO_FLAG_NONE, 0); + if (!SWITCH_READ_ACCEPTABLE(status)) { + conference->floor_holder = NULL; + req_iframe = 0; + continue; + } - if (conference->floor_holder != last_member) { - int iframe = 0; + if (switch_test_flag(vid_frame, SFF_CNG)) { + continue; + } + + if (conference->floor_holder != last_member) { + int iframe = 0; #if 0 - switch_core_session_message_t msg = { 0 }; + switch_core_session_message_t msg = { 0 }; - if (!req_iframe) { - /* Tell the channel to request a fresh vid frame */ - msg.from = __FILE__; - msg.message_id = SWITCH_MESSAGE_INDICATE_VIDEO_REFRESH_REQ; - switch_core_session_receive_message(conference->floor_holder->session, &msg); - req_iframe = 1; - } + if (!req_iframe) { + /* Tell the channel to request a fresh vid frame */ + msg.from = __FILE__; + msg.message_id = SWITCH_MESSAGE_INDICATE_VIDEO_REFRESH_REQ; + switch_core_session_receive_message(conference->floor_holder->session, &msg); + req_iframe = 1; + } #endif - if (vid_frame->codec->implementation->ianacode == 34) { /* h.263 */ - //iframe = (*((int16_t *) vid_frame->data) >> 12 == 6); - iframe = 1; - } else if (vid_frame->codec->implementation->ianacode == 115) { /* h.263-1998 */ - int y = *((int8_t *) vid_frame->data + 2) & 0xfe; - iframe = (y == 0x80 || y == 0x82); - } else if (vid_frame->codec->implementation->ianacode == 99) { /* h.264 */ - iframe = (*((int16_t *) vid_frame->data) >> 5 == 0x11); - } else { /* we need more defs */ - iframe = 1; - } - - if (!iframe) { - continue; - } + if (vid_frame->codec->implementation->ianacode == 34) { /* h.263 */ + //iframe = (*((int16_t *) vid_frame->data) >> 12 == 6); + iframe = 1; + } else if (vid_frame->codec->implementation->ianacode == 115) { /* h.263-1998 */ + int y = *((int8_t *) vid_frame->data + 2) & 0xfe; + iframe = (y == 0x80 || y == 0x82); + } else if (vid_frame->codec->implementation->ianacode == 99) { /* h.264 */ + iframe = (*((int16_t *) vid_frame->data) >> 5 == 0x11); + } else { /* we need more defs */ + iframe = 1; + } - req_iframe = 0; + if (!iframe) { + continue; } - last_member = conference->floor_holder; + req_iframe = 0; + } - switch_mutex_lock(conference->member_mutex); - has_vid = 0; - for (imember = conference->members; imember; imember = imember->next) { - if (switch_channel_test_flag(switch_core_session_get_channel(imember->session), CF_VIDEO)) { - has_vid++; - switch_core_session_write_video_frame(imember->session, vid_frame, SWITCH_IO_FLAG_NONE, 0); - } + last_member = conference->floor_holder; + + switch_mutex_lock(conference->member_mutex); + has_vid = 0; + for (imember = conference->members; imember; imember = imember->next) { + if (switch_channel_test_flag(switch_core_session_get_channel(imember->session), CF_VIDEO)) { + has_vid++; + switch_core_session_write_video_frame(imember->session, vid_frame, SWITCH_IO_FLAG_NONE, 0); } - switch_mutex_unlock(conference->member_mutex); } + switch_mutex_unlock(conference->member_mutex); + } switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Video thread ending for conference %s\n", conference->name); conference->video_running = 0; @@ -881,6 +885,12 @@ switch_mutex_unlock(globals.hash_mutex); if (conference->auto_record) { + uint32_t sanity = 100; + + while (!conference->members && --sanity) { + switch_yield(100000); + } + imember = conference->members; if (imember) { switch_channel_t *channel = switch_core_session_get_channel(imember->session); @@ -3803,7 +3813,7 @@ if (conference == NULL) { char *dialstr = switch_mprintf("{ignore_early_media=true}%s", bridgeto); - status = switch_ivr_originate(NULL, &peer_session, cause, dialstr, 60, NULL, cid_name, cid_num, NULL, SOF_NONE); + status = switch_ivr_originate(NULL, &peer_session, cause, dialstr, 60, NULL, cid_name, cid_num, NULL, NULL, SOF_NONE); switch_safe_free(dialstr); if (status != SWITCH_STATUS_SUCCESS) { @@ -3836,7 +3846,7 @@ /* establish an outbound call leg */ - if (switch_ivr_originate(session, &peer_session, cause, bridgeto, timeout, NULL, cid_name, cid_num, NULL, SOF_NONE) != SWITCH_STATUS_SUCCESS) { + if (switch_ivr_originate(session, &peer_session, cause, bridgeto, timeout, NULL, cid_name, cid_num, NULL, NULL, SOF_NONE) != SWITCH_STATUS_SUCCESS) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Cannot create outgoing channel, cause: %s\n", switch_channel_cause2str(*cause)); if (caller_channel) { switch_channel_hangup(caller_channel, *cause); Modified: freeswitch/branches/gmaruzz/src/mod/applications/mod_dptools/mod_dptools.c ============================================================================== --- freeswitch/branches/gmaruzz/src/mod/applications/mod_dptools/mod_dptools.c (original) +++ freeswitch/branches/gmaruzz/src/mod/applications/mod_dptools/mod_dptools.c Mon Dec 15 12:56:36 2008 @@ -126,20 +126,11 @@ } } -#define SAY_SYNTAX "<module_name> <say_type> <say_method> <text>" -SWITCH_STANDARD_APP(say_function) +#define MKDIR_SYNTAX "<path>" +SWITCH_STANDARD_APP(mkdir_function) { - char *argv[4] = { 0 }; - int argc; - char *lbuf = NULL; - - if (!switch_strlen_zero(data) && (lbuf = switch_core_session_strdup(session, data)) - && (argc = switch_separate_string(lbuf, ' ', argv, (sizeof(argv) / sizeof(argv[0])))) == 4) { - switch_ivr_say(session, argv[3], argv[0], argv[1], argv[2], NULL); - } else { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Usage: %s\n", SAY_SYNTAX); - } - + switch_dir_make_recursive(data, SWITCH_DEFAULT_DIR_PERMS, switch_core_session_get_pool(session)); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "%s MKDIR: %s\n", switch_channel_get_name(switch_core_session_get_channel(session)), data); } #define SOFT_HOLD_SYNTAX "<unhold key> [<moh_a>] [<moh_b>]" @@ -563,25 +554,6 @@ return; } -SWITCH_STANDARD_APP(phrase_function) -{ - char *mydata = NULL; - - if (!switch_strlen_zero(data) && (mydata = switch_core_session_strdup(session, data))) { - const char *lang; - char *macro = mydata; - char *mdata = NULL; - - if ((mdata = strchr(macro, ','))) { - *mdata++ = '\0'; - } - - lang = switch_channel_get_variable(switch_core_session_get_channel(session), "language"); - - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Execute %s(%s) lang %s\n", macro, switch_str_nil(mdata), switch_str_nil(lang)); - switch_ivr_phrase_macro(session, macro, mdata, lang, NULL); - } -} SWITCH_STANDARD_APP(hangup_function) { @@ -1142,7 +1114,6 @@ && switch_ivr_menu_stack_xml_build(xml_ctx, &menu_stack, xml_menus, xml_menu) == SWITCH_STATUS_SUCCESS) { switch_xml_free(cxml); cxml = NULL; - switch_channel_pre_answer(channel); switch_ivr_menu_execute(session, menu_stack, (char *) data, NULL); switch_ivr_menu_stack_free(menu_stack); } else { @@ -1189,7 +1160,7 @@ SWITCH_STANDARD_APP(fax_detect_session_function) { - switch_ivr_tone_detect_session(session, "fax", "1100.0", "r", 0, NULL, NULL); + switch_ivr_tone_detect_session(session, "fax", "1100.0", "r", 0, 1, NULL, NULL); } SWITCH_STANDARD_APP(system_session_function) @@ -1202,10 +1173,11 @@ SWITCH_STANDARD_APP(tone_detect_session_function) { - char *argv[6] = { 0 }; + char *argv[7] = { 0 }; int argc; char *mydata = NULL; time_t to = 0; + int hits = 1; if (switch_strlen_zero(data) || !(mydata = switch_core_session_strdup(session, data))) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "INVALID ARGS!\n"); @@ -1235,9 +1207,16 @@ } } + if (argv[6]) { + hits = atoi(argv[6]); + if (hits < 0) { + hits = 1; + } + } + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "Enabling tone detection '%s' '%s'\n", argv[0], argv[1]); - switch_ivr_tone_detect_session(session, argv[0], argv[1], argv[2], to, argv[4], argv[5]); + switch_ivr_tone_detect_session(session, argv[0], argv[1], argv[2], to, hits, argv[4], argv[5]); } SWITCH_STANDARD_APP(stop_fax_detect_session_function) @@ -1335,7 +1314,7 @@ switch_channel_set_variable(channel, SWITCH_PLAYBACK_TERMINATOR_USED, "" ); - switch_ivr_sleep(session, ms, &args); + switch_ivr_sleep(session, ms, SWITCH_TRUE, &args); } } @@ -1399,8 +1378,6 @@ switch_channel_hangup(channel, SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER); } - switch_channel_pre_answer(channel); - args.input_callback = on_dtmf; args.buf = buf; args.buflen = sizeof(buf); @@ -1510,7 +1487,8 @@ timelimit = atoi(var); } - if (switch_ivr_originate(session, &peer_session, &cause, data, timelimit, NULL, NULL, NULL, NULL, SOF_NONE) != SWITCH_STATUS_SUCCESS || !peer_session) { + if (switch_ivr_originate(session, &peer_session, &cause, data, timelimit, NULL, NULL, NULL, NULL, NULL, SOF_NONE) + != SWITCH_STATUS_SUCCESS || !peer_session) { goto end; } @@ -1617,18 +1595,85 @@ switch_ivr_read(session, min_digits, max_digits, prompt_audio_file, var_name, digit_buffer, sizeof(digit_buffer), timeout, valid_terminators); } -SWITCH_STANDARD_APP(playback_function) + + +#define SAY_SYNTAX "<module_name> <say_type> <say_method> <text>" +SWITCH_STANDARD_APP(say_function) +{ + char *argv[4] = { 0 }; + int argc; + char *lbuf = NULL; + switch_input_args_t args = { 0 }; + switch_channel_t *channel = switch_core_session_get_channel(session); + + if (!switch_strlen_zero(data) && (lbuf = switch_core_session_strdup(session, data)) + && (argc = switch_separate_string(lbuf, ' ', argv, (sizeof(argv) / sizeof(argv[0])))) == 4) { + + args.input_callback = on_dtmf; + + switch_channel_set_variable(channel, SWITCH_PLAYBACK_TERMINATOR_USED, "" ); + + switch_ivr_say(session, argv[3], argv[0], argv[1], argv[2], &args); + } else { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Usage: %s\n", SAY_SYNTAX); + } + +} + + +SWITCH_STANDARD_APP(phrase_function) { + char *mydata = NULL; switch_input_args_t args = { 0 }; switch_channel_t *channel = switch_core_session_get_channel(session); - switch_channel_pre_answer(switch_core_session_get_channel(session)); + if (!switch_strlen_zero(data) && (mydata = switch_core_session_strdup(session, data))) { + const char *lang; + char *macro = mydata; + char *mdata = NULL; + + if ((mdata = strchr(macro, ','))) { + *mdata++ = '\0'; + } + + lang = switch_channel_get_variable(channel, "language"); + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Execute %s(%s) lang %s\n", macro, switch_str_nil(mdata), switch_str_nil(lang)); + + args.input_callback = on_dtmf; + + switch_channel_set_variable(channel, SWITCH_PLAYBACK_TERMINATOR_USED, "" ); + + switch_ivr_phrase_macro(session, macro, mdata, lang, &args); + } +} + + +SWITCH_STANDARD_APP(playback_function) +{ + switch_input_args_t args = { 0 }; + switch_channel_t *channel = switch_core_session_get_channel(session); + switch_status_t status; args.input_callback = on_dtmf; switch_channel_set_variable(channel, SWITCH_PLAYBACK_TERMINATOR_USED, "" ); - switch_ivr_play_file(session, NULL, data, &args); + status = switch_ivr_play_file(session, NULL, data, &args); + + switch (status) { + case SWITCH_STATUS_SUCCESS: + case SWITCH_STATUS_BREAK: + switch_channel_set_variable(channel, SWITCH_CURRENT_APPLICATION_RESPONSE_VARIABLE, "FILE PLAYED"); + break; + case SWITCH_STATUS_NOTFOUND: + switch_channel_set_variable(channel, SWITCH_CURRENT_APPLICATION_RESPONSE_VARIABLE, "FILE NOT FOUND"); + break; + default: + switch_channel_set_variable(channel, SWITCH_CURRENT_APPLICATION_RESPONSE_VARIABLE, "PLAYBACK ERROR"); + break; + } + } SWITCH_STANDARD_APP(gentones_function) @@ -1644,8 +1689,6 @@ return; } - switch_channel_pre_answer(switch_core_session_get_channel(session)); - if ((l = strchr(tone_script, '|'))) { *l++ = '\0'; loops = atoi(l); @@ -1844,7 +1887,7 @@ } } - if (switch_ivr_originate(session, &peer_session, &cause, data, timelimit, NULL, NULL, NULL, NULL, SOF_NONE) != SWITCH_STATUS_SUCCESS) { + if (switch_ivr_originate(session, &peer_session, &cause, data, timelimit, NULL, NULL, NULL, NULL, NULL, SOF_NONE) != SWITCH_STATUS_SUCCESS) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Originate Failed. Cause: %s\n", switch_channel_cause2str(cause)); /* no answer is *always* a reason to continue */ @@ -1956,8 +1999,6 @@ cause = SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER; } - UNPROTECT_INTERFACE(error_endpoint_interface); - return cause; } @@ -2042,7 +2083,7 @@ switch_originate_flag_t myflags = SOF_NONE; char *cid_name_override = NULL; char *cid_num_override = NULL; - + if (var_event) { cid_name_override = switch_event_get_header(var_event, "origination_caller_id_name"); cid_num_override = switch_event_get_header(var_event, "origination_caller_id_number"); @@ -2060,18 +2101,23 @@ d_dest = switch_channel_expand_variables(channel, dest); } else { - switch_event_t *event = var_event; - if (!event) { + switch_event_t *event = NULL; + + if (var_event) { + switch_event_dup(&event, var_event); + switch_event_del_header(event, "dialer_user"); + switch_event_del_header(event, "dialer_domain"); + } else { switch_event_create(&event, SWITCH_EVENT_REQUEST_PARAMS); switch_assert(event); } + switch_assert(var_event); switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "dialed_user", user); switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "dialed_domain", domain); d_dest = switch_event_expand_headers(event, dest); - if (event && event != var_event) { - switch_event_destroy(&event); - } + + switch_event_destroy(&event); } if ((flags & SOF_FORKED_DIAL)) { @@ -2079,7 +2125,7 @@ } if (switch_ivr_originate(session, new_session, &cause, d_dest, timelimit, NULL, - cid_name_override, cid_num_override, NULL, myflags) == SWITCH_STATUS_SUCCESS) { + cid_name_override, cid_num_override, NULL, var_event, myflags) == SWITCH_STATUS_SUCCESS) { const char *context; switch_caller_profile_t *cp; @@ -2118,8 +2164,6 @@ done: - UNPROTECT_INTERFACE(user_endpoint_interface); - if (xml) { switch_xml_free(xml); } @@ -2340,6 +2384,7 @@ SWITCH_ADD_APP(app_interface, "sched_transfer", SCHED_TRANSF_DESCR, SCHED_TRANSF_DESCR, sched_transfer_function, "[+]<time> <extension> <dialplan> <context>", SAF_SUPPORT_NOMEDIA); SWITCH_ADD_APP(app_interface, "execute_extension", "Execute an extension", "Execute an extension", exe_function, EXE_SYNTAX, SAF_SUPPORT_NOMEDIA); + SWITCH_ADD_APP(app_interface, "mkdir", "Create a directory", "Create a directory", mkdir_function, MKDIR_SYNTAX, SAF_SUPPORT_NOMEDIA); SWITCH_ADD_APP(app_interface, "soft_hold", "Put a bridged channel on hold", "Put a bridged channel on hold", soft_hold_function, SOFT_HOLD_SYNTAX, SAF_NONE); SWITCH_ADD_APP(app_interface, "bind_meta_app", "Bind a key to an application", "Bind a key to an application", dtmf_bind_function, BIND_SYNTAX, Modified: freeswitch/branches/gmaruzz/src/mod/applications/mod_enum/mod_enum.c ============================================================================== --- freeswitch/branches/gmaruzz/src/mod/applications/mod_enum/mod_enum.c (original) +++ freeswitch/branches/gmaruzz/src/mod/applications/mod_enum/mod_enum.c Mon Dec 15 12:56:36 2008 @@ -652,7 +652,7 @@ rbl -= l; } - switch_snprintf(vbuf, sizeof(vbuf), "%d", cnt); + switch_snprintf(vbuf, sizeof(vbuf), "%d", cnt - 1); switch_channel_set_variable(channel, "enum_route_count", vbuf); *(rbuf + strlen(rbuf) - 1) = '\0'; switch_channel_set_variable(channel, "enum_auto_route", rbuf); Modified: freeswitch/branches/gmaruzz/src/mod/applications/mod_expr/exprpars.c ============================================================================== --- freeswitch/branches/gmaruzz/src/mod/applications/mod_expr/exprpars.c (original) +++ freeswitch/branches/gmaruzz/src/mod/applications/mod_expr/exprpars.c Mon Dec 15 12:56:36 2008 @@ -12,6 +12,7 @@ #include "exprpriv.h" #include "exprmem.h" +#include "switch_utils.h" /* Data structure used by parser */ typedef struct _exprToken { @@ -314,12 +315,12 @@ default: { if (!comment) { - if (expr[pos] == '.' || isdigit(expr[pos])) { + if (expr[pos] == '.' || switch_isdigit(expr[pos])) { /* Value */ start = pos; /* Find digits before a period */ - while (isdigit(expr[pos])) + while (switch_isdigit(expr[pos])) pos++; /* Find a period */ @@ -327,7 +328,7 @@ pos++; /* Find digits after a period */ - while (isdigit(expr[pos])) + while (switch_isdigit(expr[pos])) pos++; /* pos is AFTER last item, back up */ @@ -356,12 +357,12 @@ list[tpos].data.val = (EXPRTYPE) atof(buf); tpos++; } - } else if (expr[pos] == '_' || isalpha(expr[pos])) { + } else if (expr[pos] == '_' || switch_isalpha(expr[pos])) { /* Identifier */ start = pos; /* Find rest of identifier */ - while (expr[pos] == '_' || isalnum(expr[pos])) + while (expr[pos] == '_' || switch_isalnum(expr[pos])) pos++; /* pos is AFTER last item, back up */ @@ -397,7 +398,7 @@ strcpy(list[tpos].data.str, buf); tpos++; } - } else if (isspace(expr[pos])) { + } else if (switch_isspace(expr[pos])) { /* Spaces are ignored, do nothing */ } else { /* Unknown */ Modified: freeswitch/branches/gmaruzz/src/mod/applications/mod_expr/exprutil.c ============================================================================== --- freeswitch/branches/gmaruzz/src/mod/applications/mod_expr/exprutil.c (original) +++ freeswitch/branches/gmaruzz/src/mod/applications/mod_expr/exprutil.c Mon Dec 15 12:56:36 2008 @@ -11,6 +11,7 @@ #include "exprincl.h" #include "exprpriv.h" +#include "switch_utils.h" /* Return the version number */ @@ -27,13 +28,13 @@ return 0; /* First must be letter or underscore */ - if (isalpha(*name) || *name == '_') + if (switch_isalpha(*name) || *name == '_') name++; /* Point to next letter */ else return 0; /* Not letter or underscore, maybe empty */ /* others can be letter, number, or underscore */ - while (isalnum(*name) || *name == '_') + while (switch_isalnum(*name) || *name == '_') name++; /* When the while breaks out, we should be at the end */ Modified: freeswitch/branches/gmaruzz/src/mod/applications/mod_fax/Makefile ============================================================================== --- freeswitch/branches/gmaruzz/src/mod/applications/mod_fax/Makefile (original) +++ freeswitch/branches/gmaruzz/src/mod/applications/mod_fax/Makefile Mon Dec 15 12:56:36 2008 @@ -11,3 +11,11 @@ $(SPANDSP_LA): $(SPANDSP_DIR) $(SPANDSP_DIR)/.update cd $(SPANDSP_DIR) && $(MAKE) $(TOUCH_TARGET) + + +depend_install: $(DESTDIR)$(libdir)/libspandsp.la + +$(DESTDIR)$(libdir)/libspandsp.la: $(SPANDSP_LA) + cd $(SPANDSP_DIR) && $(MAKE) install + + Modified: freeswitch/branches/gmaruzz/src/mod/applications/mod_fax/mod_fax.c ============================================================================== --- freeswitch/branches/gmaruzz/src/mod/applications/mod_fax/mod_fax.c (original) +++ freeswitch/branches/gmaruzz/src/mod/applications/mod_fax/mod_fax.c Mon Dec 15 12:56:36 2008 @@ -143,18 +143,18 @@ const char *local_ident; const char *far_ident; switch_core_session_t *session; - switch_channel_t *chan; + switch_channel_t *channel; pvt_t *pvt; char *tmp; pvt = (pvt_t *) user_data; switch_assert(pvt); - + session = pvt->session; switch_assert(session); - chan = switch_core_session_get_channel(session); - switch_assert(chan); + channel = switch_core_session_get_channel(session); + switch_assert(channel); t30_get_transfer_statistics(s, &t); local_ident = switch_str_nil(t30_get_tx_ident(s)); @@ -171,11 +171,11 @@ } else { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Fax successfully managed. How ?\n"); } - switch_channel_set_variable(chan, "fax_success", "1"); + switch_channel_set_variable(channel, "fax_success", "1"); } else { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Fax processing not successful - result (%d) %s.\n", result, t30_completion_code_to_str(result)); - switch_channel_set_variable(chan, "fax_success", "0"); + switch_channel_set_variable(channel, "fax_success", "0"); } switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Remote station id: %s\n", far_ident); @@ -198,52 +198,54 @@ tmp = switch_mprintf("%i", result); if (tmp) { - switch_channel_set_variable(chan, "fax_result_code", tmp); + switch_channel_set_variable(channel, "fax_result_code", tmp); switch_safe_free(tmp); } - switch_channel_set_variable(chan, "fax_result_text", t30_completion_code_to_str(result)); + switch_channel_set_variable(channel, "fax_result_text", t30_completion_code_to_str(result)); - switch_channel_set_variable(chan, "fax_ecm_used", (t.error_correcting_mode) ? "on" : "off"); - switch_channel_set_variable(chan, "fax_local_station_id", local_ident); - switch_channel_set_variable(chan, "fax_remote_station_id", far_ident); + switch_channel_set_variable(channel, "fax_ecm_used", (t.error_correcting_mode) ? "on" : "off"); + switch_channel_set_variable(channel, "fax_local_station_id", local_ident); + switch_channel_set_variable(channel, "fax_remote_station_id", far_ident); tmp = switch_mprintf("%i", t.pages_transferred); if (tmp) { - switch_channel_set_variable(chan, "fax_document_transferred_pages", tmp); + switch_channel_set_variable(channel, "fax_document_transferred_pages", tmp); switch_safe_free(tmp); } tmp = switch_mprintf("%i", t.pages_in_file); if (tmp) { - switch_channel_set_variable(chan, "fax_document_total_pages", tmp); + switch_channel_set_variable(channel, "fax_document_total_pages", tmp); switch_safe_free(tmp); } tmp = switch_mprintf("%ix%i", t.x_resolution, t.y_resolution); if (tmp) { - switch_channel_set_variable(chan, "fax_image_resolution", tmp); + switch_channel_set_variable(channel, "fax_image_resolution", tmp); switch_safe_free(tmp); } tmp = switch_mprintf("%d", t.image_size); if (tmp) { - switch_channel_set_variable(chan, "fax_image_size", tmp); + switch_channel_set_variable(channel, "fax_image_size", tmp); switch_safe_free(tmp); } tmp = switch_mprintf("%d", t.bad_rows); if (tmp) { - switch_channel_set_variable(chan, "fax_bad_rows", tmp); + switch_channel_set_variable(channel, "fax_bad_rows", tmp); switch_safe_free(tmp); } tmp = switch_mprintf("%i", t.bit_rate); if (tmp) { - switch_channel_set_variable(chan, "fax_transfer_rate", tmp); + switch_channel_set_variable(channel, "fax_transfer_rate", tmp); switch_safe_free(tmp); } + switch_channel_hangup(channel, SWITCH_CAUSE_NORMAL_CLEARING); + /* TODO Fire events */ @@ -253,15 +255,15 @@ { switch_core_session_t *session; - switch_channel_t *chan; + switch_channel_t *channel; fax_state_t *fax; t30_state_t *t30; session = (switch_core_session_t *) pvt->session; switch_assert(session); - chan = switch_core_session_get_channel(session); - switch_assert(chan); + channel = switch_core_session_get_channel(session); + switch_assert(channel); switch (trans_mode) { @@ -306,19 +308,19 @@ if (pvt->disable_v17) { t30_set_supported_modems(t30, T30_SUPPORT_V29 | T30_SUPPORT_V27TER); - switch_channel_set_variable(chan, "fax_v17_disabled", "1"); + switch_channel_set_variable(channel, "fax_v17_disabled", "1"); } else { t30_set_supported_modems(t30, T30_SUPPORT_V29 | T30_SUPPORT_V27TER | T30_SUPPORT_V17); - switch_channel_set_variable(chan, "fax_v17_disabled", "0"); + switch_channel_set_variable(channel, "fax_v17_disabled", "0"); } if (pvt->use_ecm) { t30_set_supported_compressions(t30, T30_SUPPORT_T4_1D_COMPRESSION | T30_SUPPORT_T4_2D_COMPRESSION | T30_SUPPORT_T6_COMPRESSION); t30_set_ecm_capability(t30, TRUE); - switch_channel_set_variable(chan, "fax_ecm_requested", "1"); + switch_channel_set_variable(channel, "fax_ecm_requested", "1"); } else { t30_set_supported_compressions(t30, T30_SUPPORT_T4_1D_COMPRESSION | T30_SUPPORT_T4_2D_COMPRESSION); - switch_channel_set_variable(chan, "fax_ecm_requested", "0"); + switch_channel_set_variable(channel, "fax_ecm_requested", "0"); } if (pvt->app_mode == FUNCTION_TX) { @@ -326,7 +328,7 @@ } else { t30_set_rx_file(t30, pvt->filename, -1); } - switch_channel_set_variable(chan, "fax_filename", pvt->filename); + switch_channel_set_variable(channel, "fax_filename", pvt->filename); break; case T38_MODE: /* @@ -606,7 +608,7 @@ goto done; } - switch_ivr_sleep(session, 250, NULL); + switch_ivr_sleep(session, 250, SWITCH_TRUE, NULL); while (switch_channel_ready(channel)) { int tx = 0; Modified: freeswitch/branches/gmaruzz/src/mod/applications/mod_fifo/mod_fifo.c ============================================================================== --- freeswitch/branches/gmaruzz/src/mod/applications/mod_fifo/mod_fifo.c (original) +++ freeswitch/branches/gmaruzz/src/mod/applications/mod_fifo/mod_fifo.c Mon Dec 15 12:56:36 2008 @@ -450,7 +450,7 @@ switch_snprintf(sql, sizeof(sql), "update fifo_outbound set use_count=use_count+1 where uuid='%s'", h->uuid); fifo_execute_sql(sql, globals.sql_mutex); - if (switch_ivr_originate(NULL, &session, &cause, h->originate_string, h->timeout, NULL, NULL, NULL, NULL, SOF_NONE) != SWITCH_STATUS_SUCCESS) { + if (switch_ivr_originate(NULL, &session, &cause, h->originate_string, h->timeout, NULL, NULL, NULL, NULL, NULL, SOF_NONE) != SWITCH_STATUS_SUCCESS) { switch_snprintf(sql, sizeof(sql), "update fifo_outbound set use_count=use_count-1, outbound_fail_count=outbound_fail_count+1, next_avail=%ld + lag where uuid='%s'", (long)switch_timestamp(NULL), h->uuid); fifo_execute_sql(sql, globals.sql_mutex); @@ -1167,7 +1167,7 @@ if (announce) { switch_ivr_play_file(session, NULL, announce, NULL); } else { - switch_ivr_sleep(session, 500, NULL); + switch_ivr_sleep(session, 500, SWITCH_TRUE, NULL); } switch_channel_set_variable(other_channel, "fifo_serviced_by", my_id); Modified: freeswitch/branches/gmaruzz/src/mod/applications/mod_fsv/mod_fsv.c ============================================================================== --- freeswitch/branches/gmaruzz/src/mod/applications/mod_fsv/mod_fsv.c (original) +++ freeswitch/branches/gmaruzz/src/mod/applications/mod_fsv/mod_fsv.c Mon Dec 15 12:56:36 2008 @@ -110,7 +110,7 @@ switch_channel_answer(channel); - if ((fd = open((char *) data, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR)) < 0) { + if ((fd = open((char *) data, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, S_IRUSR | S_IWUSR)) < 0) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Error opening file %s\n", (char *) data); return; } Modified: freeswitch/branches/gmaruzz/src/mod/applications/mod_limit/mod_limit.c ============================================================================== --- freeswitch/branches/gmaruzz/src/mod/applications/mod_limit/mod_limit.c (original) +++ freeswitch/branches/gmaruzz/src/mod/applications/mod_limit/mod_limit.c Mon Dec 15 12:56:36 2008 @@ -25,7 +25,8 @@ * * Anthony Minessale II <anthmct@yahoo.com> * Ken Rice <krice at suspicious dot org - * + * Mathieu Rene <mathieu.rene@gmail.com> + * * mod_limit.c -- Resource Limit Module * */ @@ -44,6 +45,10 @@ char *dbname; char *odbc_dsn; switch_mutex_t *mutex; + switch_mutex_t *limit_hash_mutex; + switch_hash_t *limit_hash; + switch_mutex_t *db_hash_mutex; + switch_hash_t *db_hash; #ifdef SWITCH_HAVE_ODBC switch_odbc_handle_t *master_odbc; #else @@ -51,6 +56,14 @@ #endif } globals; +struct limit_hash_item { + uint32_t total_usage; + uint32_t rate_usage; + time_t last_check; +}; +typedef struct limit_hash_item limit_hash_item_t; + + static char limit_sql[] = "CREATE TABLE limit_data (\n" " hostname VARCHAR(255),\n" " realm VARCHAR(255),\n" " id VARCHAR(255),\n" " uuid VARCHAR(255)\n" ");\n"; @@ -247,23 +260,53 @@ return status; } -static switch_status_t hanguphook(switch_core_session_t *session) +static switch_status_t db_state_handler(switch_core_session_t *session) { switch_channel_t *channel = switch_core_session_get_channel(session); switch_channel_state_t state = switch_channel_get_state(channel); - const char *realm = NULL; - const char *id = NULL; char *sql = NULL; if (state == CS_HANGUP || state == CS_ROUTING) { - id = switch_channel_get_variable(channel, "limit_id"); - realm = switch_channel_get_variable(channel, "limit_realm"); - sql = switch_mprintf("delete from limit_data where uuid='%q'", + sql = switch_mprintf("delete from limit_data where uuid='%q';", switch_core_session_get_uuid(session)); limit_execute_sql(sql, globals.mutex); switch_safe_free(sql); - switch_core_event_hook_remove_state_change(session, hanguphook); + switch_core_event_hook_remove_state_change(session, db_state_handler); + } + return SWITCH_STATUS_SUCCESS; +} + +static switch_status_t hash_state_handler(switch_core_session_t *session) +{ + switch_channel_t *channel = switch_core_session_get_channel(session); + switch_channel_state_t state = switch_channel_get_state(channel); + switch_hash_t *channel_hash = switch_channel_get_private(channel, "limit_hash"); + + /* The call is either hung up, or is going back into the dialplan, decrement appropriate couters */ + if (state == CS_HANGUP || state == CS_ROUTING) { + switch_hash_index_t *hi; + switch_mutex_lock(globals.mutex); + + /* Loop through the channel's hashtable which contains mapping to all the limit_hash_item_t referenced by that channel */ + for(hi = switch_hash_first(NULL, channel_hash); hi; hi = switch_hash_next(hi)) + { + void *val = NULL; + const void *key; + switch_ssize_t keylen; + limit_hash_item_t *item = NULL; + + switch_hash_this(hi, &key, &keylen, &val); + + item = (limit_hash_item_t*)val; + + /* We keep the structure even though the count is 0 so we do not allocate too often */ + item->total_usage--; + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Usage for %s is now %d\n", (const char*)key, item->total_usage); + } + switch_core_event_hook_remove_state_change(session, hash_state_handler); + switch_mutex_unlock(globals.mutex); } + return SWITCH_STATUS_SUCCESS; } @@ -303,6 +346,7 @@ if (!switch_strlen_zero(cmd)) { mydata = strdup(cmd); + switch_assert(mydata); argc = switch_separate_string(mydata, '/', argv, (sizeof(argv) / sizeof(argv[0]))); } @@ -376,10 +420,15 @@ } if (argc < 3 || !argv[0]) { - goto error; + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "USAGE: db %s\n", DB_USAGE); + return; } if (!strcasecmp(argv[0], "insert")) { + if (argc < 4) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "USAGE: db %s\n", DB_USAGE); + return; + } sql = switch_mprintf("delete from db_data where realm='%q' and data_key='%q'", argv[1], argv[2]); switch_assert(sql); limit_execute_sql(sql, globals.mutex); @@ -395,10 +444,109 @@ switch_assert(sql); limit_execute_sql(sql, globals.mutex); switch_safe_free(sql); - return; +} - error: - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "USAGE: db %s\n", DB_USAGE); +#define HASH_USAGE "[insert|delete]/<realm>/<key>/<val>" +#define HASH_DESC "save data" + +SWITCH_STANDARD_APP(hash_function) +{ + int argc = 0; + char *argv[4] = { 0 }; + char *mydata = NULL; + char *hash_key = NULL; + char *value = NULL; + + if (!switch_strlen_zero(data)) { + mydata = strdup(data); + switch_assert(mydata); + argc = switch_separate_string(mydata, '/', argv, (sizeof(argv) / sizeof(argv[0]))); + } + + if (argc < 3 || !argv[0]) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "USAGE: hash %s\n", HASH_USAGE); + goto end; + } + + hash_key = switch_mprintf("%s_%s", argv[1], argv[2]); + + switch_mutex_lock(globals.db_hash_mutex); + if (!strcasecmp(argv[0], "insert")) { + if ((value = switch_core_hash_find(globals.db_hash, hash_key))) { + free(value); + switch_core_hash_delete(globals.db_hash, hash_key); + } + value = strdup(argv[3]); + switch_assert(value); + switch_core_hash_insert(globals.db_hash, hash_key, value); + } else if (!strcasecmp(argv[0], "delete")) { + if ((value = switch_core_hash_find(globals.db_hash, hash_key))) { + switch_safe_free(value); + switch_core_hash_delete(globals.db_hash, hash_key); + } + } + switch_mutex_unlock(globals.db_hash_mutex); + +end: + switch_safe_free(mydata); + switch_safe_free(hash_key); +} + +#define HASH_API_USAGE "insert|select|delete/realm/key[/value]" +SWITCH_STANDARD_API(hash_api_function) +{ + int argc = 0; + char *argv[4] = { 0 }; + char *mydata = NULL; + char *value = NULL; + char *hash_key = NULL; + + switch_mutex_lock(globals.db_hash_mutex); + + if (!switch_strlen_zero(cmd)) { + mydata = strdup(cmd); + switch_assert(mydata); + argc = switch_separate_string(mydata, '/', argv, (sizeof(argv) / sizeof(argv[0]))); + } + + if (argc < 3 || !argv[0]) { + stream->write_function(stream, "-ERR Usage: hash %s\n", HASH_API_USAGE); + goto end; + } + + hash_key = switch_mprintf("%s_%s", argv[1], argv[2]); + + if (!strcasecmp(argv[0], "insert")) { + if (argc < 4) { + stream->write_function(stream, "-ERR Usage: hash %s\n", HASH_API_USAGE); + goto end; + } + if ((value = switch_core_hash_find(globals.db_hash, hash_key))) { + switch_safe_free(value); + switch_core_hash_delete(globals.db_hash, hash_key); + } + value = strdup(argv[3]); + switch_assert(value); + switch_core_hash_insert(globals.db_hash, hash_key, value); + stream->write_function(stream, "+OK\n"); + } else if (!strcasecmp(argv[0], "delete")) { + if ((value = switch_core_hash_find(globals.db_hash, hash_key))) { + switch_safe_free(value); + switch_core_hash_delete(globals.db_hash, hash_key); + } + stream->write_function(stream, "+OK\n"); + } else if (!strcasecmp(argv[0], "select")) { + if ((value = switch_core_hash_find(globals.db_hash, hash_key))) { + stream->write_function(stream, "%s", value); + } + } + +end: + switch_mutex_unlock(globals.db_hash_mutex); + switch_safe_free(mydata); + switch_safe_free(hash_key); + + return SWITCH_STATUS_SUCCESS; } SWITCH_STANDARD_API(group_api_function) @@ -513,8 +661,8 @@ } } -#define LIMIT_USAGE "<realm> <id> <max> [transfer_destination_number]" -#define LIMIT_DESC "limit access to an extension" +#define LIMIT_USAGE "<realm> <id> <max> [number [dialplan [context]]]" +#define LIMIT_DESC "limit access to a resource and transfer to an extension if the limit is exceeded" static char *limit_def_xfer_exten = "limit_exceeded"; SWITCH_STANDARD_APP(limit_function) @@ -530,6 +678,7 @@ char buf[80] = ""; callback_t cbt = { 0 }; switch_channel_t *channel = switch_core_session_get_channel(session); + switch_bool_t new_channel = SWITCH_FALSE; if (!switch_strlen_zero(data)) { mydata = switch_core_session_strdup(session, data); @@ -556,7 +705,8 @@ if (max < 0) { max = 0; } - + + new_channel = !switch_channel_get_variable(channel, "limit_realm"); switch_channel_set_variable(channel, "limit_realm", realm); switch_channel_set_variable(channel, "limit_id", id); switch_channel_set_variable(channel, "limit_max", argv[2]); @@ -572,7 +722,9 @@ goto done; } - switch_core_event_hook_add_state_change(session, hanguphook); + if (new_channel) { + switch_core_event_hook_add_state_change(session, db_state_handler); + } sql = switch_mprintf("insert into limit_data (hostname, realm, id, uuid) values('%q','%q','%q','%q');", globals.hostname, realm, id, switch_core_session_get_uuid(session)); @@ -583,6 +735,166 @@ switch_mutex_unlock(globals.mutex); } +#define LIMITHASH_USAGE "<realm> <id> <max>[/interval] [number [dialplan [context]]]" +#define LIMITHASH_DESC "limit access to a resource and transfer to an extension if the limit is exceeded" +SWITCH_STANDARD_APP(limit_hash_function) +{ + int argc = 0; + char *argv[6] = { 0 }; + char *mydata = NULL; + char *realm = NULL; + char *id = NULL; + char *hashkey = NULL; + char *xfer_exten = NULL; + int max = 0; + int interval = 0; + char *szinterval = NULL; + limit_hash_item_t *item = NULL; + switch_channel_t *channel = switch_core_session_get_channel(session); + time_t now = switch_timestamp(NULL); + switch_hash_t *channel_hash = NULL; + uint8_t increment = 1; + uint8_t new_channel = 0; + + /* Parse application data */ + if (!switch_strlen_zero(data)) { + mydata = switch_core_session_strdup(session, data); + argc = switch_separate_string(mydata, ' ', argv, (sizeof(argv) / sizeof(argv[0]))); + } + + if (argc < 3) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "USAGE: limit_hash %s\n", LIMITHASH_USAGE); + return; + } + + realm = argv[0]; + id = argv[1]; + if ((szinterval = strchr(argv[2], '/'))) + { + *szinterval++ = '\0'; + interval = atoi(szinterval); + } + + max = atoi(argv[2]); + + if (argc >= 4) { + xfer_exten = argv[3]; + } else { + xfer_exten = limit_def_xfer_exten; + } + + if (max < 0) { + max = 0; + } + + hashkey = switch_core_session_sprintf(session, "%s_%s", realm, id); + + switch_mutex_lock(globals.limit_hash_mutex); + /* Check if that realm+id has ever been checked */ + if (!(item = (limit_hash_item_t*)switch_core_hash_find(globals.limit_hash, hashkey))) { + /* No, create an empty structure and add it, then continue like as if it existed */ + item = (limit_hash_item_t*)switch_core_alloc(globals.pool, sizeof(limit_hash_item_t)); + memset(item, 0, sizeof(limit_hash_item_t)); + switch_core_hash_insert(globals.limit_hash, hashkey, item); + } + + /* Did we already run on this channel before? */ + if ((channel_hash = switch_channel_get_private(channel, "limit_hash"))) + { + /* Yes, but check if we did that realm+id */ + if (!switch_core_hash_find(channel_hash, hashkey)) { + /* No, add it to our table so the state handler can take care of it */ + switch_core_hash_insert(channel_hash, hashkey, item); + } else { + /* Yes, dont touch total counter */ + increment = 0; + } + } else { + /* This is the first limit check on this channel, create a hashtable, set our prviate data and add a state handler */ + new_channel = 1; + } + + if (interval > 0) { + if (item->last_check <= (now - interval)) { + item->rate_usage = 1; + item->last_check = now; + } else { + /* Always increment rate when its checked as it doesnt depend on the channel */ + item->rate_usage++; + + if (item->rate_usage > (uint32_t)max) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Usage for %s exceeds maximum rate of %d/%ds, now at %d\n", hashkey, max, interval, item->rate_usage); + switch_ivr_session_transfer(session, xfer_exten, argv[4], argv[5]); + goto end; + } + } + } else if (item->total_usage + increment > (uint32_t)max) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Usage for %s is already at max value (%d)\n", hashkey, item->total_usage); + switch_ivr_session_transfer(session, xfer_exten, argv[4], argv[5]); + goto end; + } + + if (increment) { + item->total_usage++; + + if (interval == 0) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Usage for %s is now %d/%d\n", hashkey, item->total_usage, max); + } else { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Usage for %s is now %d/%d for the last %d seconds\n", hashkey, item->rate_usage, max, interval); + } + } + + + if (new_channel) { + switch_core_hash_init(&channel_hash, switch_core_session_get_pool(session)); + switch_core_hash_insert(channel_hash, hashkey, item); + switch_channel_set_private(channel, "limit_hash", channel_hash); + switch_core_event_hook_add_state_change(session, hash_state_handler); + } + +end: + switch_mutex_unlock(globals.limit_hash_mutex); +} + +#define LIMIT_HASH_USAGE_USAGE "<realm> <id>" +SWITCH_STANDARD_API(limit_hash_usage_function) +{ + int argc = 0; + char *argv[3] = { 0 }; + char *mydata = NULL; + char *hash_key = NULL; + limit_hash_item_t *item = NULL; + uint32_t count = 0; + + switch_mutex_lock(globals.limit_hash_mutex); + + if (!switch_strlen_zero(cmd)) { + mydata = strdup(cmd); + switch_assert(mydata); + argc = switch_separate_string(mydata, ' ', argv, (sizeof(argv) / sizeof(argv[0]))); + } + + if (argc < 2) { + stream->write_function(stream, "USAGE: limit_hash_usage %s\n", LIMIT_HASH_USAGE_USAGE); + goto end; + } + + hash_key = switch_mprintf("%s_%s", argv[0], argv[1]); + + if ((item = switch_core_hash_find(globals.limit_hash, hash_key))) { + count = item->total_usage; + } + + stream->write_function(stream, "%d", count); + +end: + switch_safe_free(mydata); + switch_safe_free(hash_key); + switch_mutex_unlock(globals.limit_hash_mutex); + + return SWITCH_STATUS_SUCCESS; +} + SWITCH_MODULE_LOAD_FUNCTION(mod_limit_load) { switch_status_t status; @@ -598,18 +910,29 @@ } switch_mutex_init(&globals.mutex, SWITCH_MUTEX_NESTED, globals.pool); + switch_mutex_init(&globals.limit_hash_mutex, SWITCH_MUTEX_NESTED, globals.pool); + switch_mutex_init(&globals.db_hash_mutex, SWITCH_MUTEX_NESTED, globals.pool); + switch_core_hash_init(&globals.limit_hash, pool); + switch_core_hash_init(&globals.db_hash, pool); /* connect my internal structure to the blank pointer passed to me */ *module_interface = switch_loadable_module_create_module_interface(pool, modname); SWITCH_ADD_APP(app_interface, "limit", "Limit", LIMIT_DESC, limit_function, LIMIT_USAGE, SAF_SUPPORT_NOMEDIA); + SWITCH_ADD_APP(app_interface, "limit_hash", "Limit (hash)", LIMITHASH_DESC, limit_hash_function, LIMITHASH_USAGE, SAF_SUPPORT_NOMEDIA); SWITCH_ADD_APP(app_interface, "db", "Insert to the db", DB_DESC, db_function, DB_USAGE, SAF_SUPPORT_NOMEDIA); + SWITCH_ADD_APP(app_interface, "hash", "Insert into the hashtable", HASH_DESC, hash_function, HASH_USAGE, SAF_SUPPORT_NOMEDIA) SWITCH_ADD_APP(app_interface, "group", "Manage a group", GROUP_DESC, group_function, GROUP_USAGE, SAF_SUPPORT_NOMEDIA); + SWITCH_ADD_API(commands_api_interface, "limit_hash_usage", "Gets the usage count of a limited resource", limit_hash_usage_function, LIMIT_HASH_USAGE_USAGE); SWITCH_ADD_API(commands_api_interface, "db", "db get/set", db_api_function, "[insert|delete|select]/<realm>/<key>/<value>"); switch_console_set_complete("add db insert"); switch_console_set_complete("add db delete"); switch_console_set_complete("add db select"); + SWITCH_ADD_API(commands_api_interface, "hash", "hash get/set", hash_api_function, "[insert|delete|select]/<realm>/<key>/<value>"); + switch_console_set_complete("add hash insert"); + switch_console_set_complete("add hash delete"); + switch_console_set_complete("add hash select"); SWITCH_ADD_API(commands_api_interface, "group", "group [insert|delete|call]", group_api_function, "[insert|delete|call]:<group name>:<url>"); switch_console_set_complete("add group insert"); switch_console_set_complete("add group delete"); Modified: freeswitch/branches/gmaruzz/src/mod/applications/mod_voicemail/mod_voicemail.c ============================================================================== --- freeswitch/branches/gmaruzz/src/mod/applications/mod_voicemail/mod_voicemail.c (original) +++ freeswitch/branches/gmaruzz/src/mod/applications/mod_voicemail/mod_voicemail.c Mon Dec 15 12:56:36 2008 @@ -1023,7 +1023,8 @@ } static switch_status_t create_file(switch_core_session_t *session, vm_profile_t *profile, - char *macro_name, char *file_path, switch_size_t *message_len, switch_bool_t limit) + char *macro_name, char *file_path, switch_size_t *message_len, switch_bool_t limit, + const char *exit_keys, char *key_pressed) { switch_channel_t *channel = switch_core_session_get_channel(session); switch_status_t status = SWITCH_STATUS_SUCCESS; @@ -1036,13 +1037,17 @@ read_codec = switch_core_session_get_read_codec(session); + if (exit_keys) { + *key_pressed = '\0'; + } + while (switch_channel_ready(channel)) { switch_snprintf(key_buf, sizeof(key_buf), "%s:%s:%s", profile->listen_file_key, profile->save_file_key, profile->record_file_key); record_file: *message_len = 0; - args.input_callback = cancel_on_dtmf; + TRY_CODE(switch_ivr_phrase_macro(session, macro_name, NULL, NULL, NULL)); TRY_CODE(switch_ivr_gentones(session, profile->tone_spec, 0, NULL)); @@ -1050,13 +1055,24 @@ fh.thresh = profile->record_threshold; fh.silence_hits = profile->record_silence_hits; fh.samplerate = profile->record_sample_rate; + + memset(input, 0, sizeof(input)); + args.input_callback = cancel_on_dtmf; + args.buf = input; + args.buflen = sizeof(input); + switch_ivr_record_file(session, &fh, file_path, &args, profile->max_record_len); + if (limit && (*message_len = fh.sample_count / read_codec->implementation->actual_samples_per_second) < profile->min_record_len) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Message is less than minimum record length: %d, discarding it.\n", - profile->min_record_len); if (unlink(file_path) != 0) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Failed to delete file [%s]\n", file_path); } + if (exit_keys && input[0] && strchr(exit_keys, input[0])) { + *key_pressed = input[0]; + return SWITCH_STATUS_SUCCESS; + } + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Message is less than minimum record length: %d, discarding it.\n", + profile->min_record_len); if (switch_channel_ready(channel)) { TRY_CODE(switch_ivr_phrase_macro(session, VM_ACK_MACRO, "too-small", NULL, NULL)); goto record_file; @@ -1087,7 +1103,7 @@ status = SWITCH_STATUS_SUCCESS; *cc.buf = '\0'; } else { - status = vm_macro_get(session, VM_RECORD_FILE_CHECK_MACRO, key_buf, input, sizeof(input), 1, "", &term, profile->digit_timeout); + (void)vm_macro_get(session, VM_RECORD_FILE_CHECK_MACRO, key_buf, input, sizeof(input), 1, "", &term, profile->digit_timeout); } if (!strcmp(input, profile->listen_file_key)) { @@ -1095,7 +1111,7 @@ } else if (!strcmp(input, profile->record_file_key)) { goto record_file; } else { - TRY_CODE(switch_ivr_phrase_macro(session, VM_ACK_MACRO, "saved", NULL, NULL)); + (void)switch_ivr_phrase_macro(session, VM_ACK_MACRO, "saved", NULL, NULL); goto end; } } @@ -1385,9 +1401,9 @@ switch_uuid_format(uuid_str, &uuid); forward_file_path = switch_core_session_sprintf(session, "%s%smsg_%s.wav", SWITCH_GLOBAL_dirs.temp_dir, SWITCH_PATH_SEPARATOR, uuid_str); - TRY_CODE(create_file(session, profile, VM_RECORD_MESSAGE_MACRO, forward_file_path, &message_len, SWITCH_TRUE)); + TRY_CODE(create_file(session, profile, VM_RECORD_MESSAGE_MACRO, forward_file_path, &message_len, SWITCH_TRUE, NULL, NULL)); if ((new_path = vm_merge_file(session, profile, forward_file_path, cbt->file_path))) { - switch_ivr_sleep(session, 1500, NULL); + switch_ivr_sleep(session, 1500, SWITCH_TRUE, NULL); forward_file_path = new_path; } else { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error merging files\n"); @@ -1621,7 +1637,7 @@ *global_buf = '\0'; while (switch_channel_ready(channel)) { - switch_ivr_sleep(session, 100, NULL); + switch_ivr_sleep(session, 100, SWITCH_TRUE, NULL); switch (vm_check_state) { case VM_CHECK_START: @@ -1755,7 +1771,7 @@ vm_execute_sql(profile, sql, profile->mutex); vm_check_state = VM_CHECK_FOLDER_SUMMARY; - update_mwi(profile, actual_id, domain_name, myfolder); + update_mwi(profile, actual_id ? actual_id : myid, domain_name, myfolder); } break; case VM_CHECK_CONFIG: @@ -1837,7 +1853,7 @@ TRY_CODE(switch_ivr_phrase_macro(session, VM_CHOOSE_GREETING_FAIL_MACRO, NULL, NULL, NULL)); } else { file_path = switch_mprintf("%s%sgreeting_%d.%s", dir_path, SWITCH_PATH_SEPARATOR, num, profile->file_ext); - TRY_CODE(create_file(session, profile, VM_RECORD_GREETING_MACRO, file_path, &message_len, SWITCH_TRUE)); + TRY_CODE(create_file(session, profile, VM_RECORD_GREETING_MACRO, file_path, &message_len, SWITCH_TRUE, NULL, NULL)); sql = switch_mprintf("update voicemail_prefs set greeting_path='%s' where username='%s' and domain='%s'", file_path, myid, domain_name); @@ -1875,7 +1891,7 @@ } else if (!strcmp(input, profile->record_name_key)) { file_path = switch_mprintf("%s%srecorded_name.%s", dir_path, SWITCH_PATH_SEPARATOR, profile->file_ext); - TRY_CODE(create_file(session, profile, VM_RECORD_NAME_MACRO, file_path, &message_len, SWITCH_FALSE)); + TRY_CODE(create_file(session, profile, VM_RECORD_NAME_MACRO, file_path, &message_len, SWITCH_FALSE, NULL, NULL)); sql = switch_mprintf("update voicemail_prefs set name_path='%s' where username='%s' and domain='%s'", file_path, myid, domain_name); vm_execute_sql(profile, sql, profile->mutex); switch_safe_free(file_path); @@ -1975,8 +1991,10 @@ if (x_box) { myid = switch_core_session_strdup(session, x_box); } - - if (!(actual_id = switch_xml_attr(x_user, "id"))) { + + if ((actual_id = switch_xml_attr(x_user, "id"))) { + actual_id = switch_core_session_strdup(session, actual_id); + } else { actual_id = id; } } @@ -2225,11 +2243,9 @@ vm_notify_email = switch_core_strdup(pool, val); } else if (!strcasecmp(var, "email-addr")) { email_addr = switch_core_strdup(pool, val); - } else if (!strcasecmp(var, "vm-email-all-messages")) { - send_main = switch_true(val); + } else if (!strcasecmp(var, "vm-email-all-messages") && (send_main = switch_true(val))) { send_mail++; - } else if (!strcasecmp(var, "vm-notify-email-all-messages")) { - send_notify = switch_true(val); + } else if (!strcasecmp(var, "vm-notify-email-all-messages") && (send_notify = switch_true(val))) { send_mail++; } else if (!strcasecmp(var, "vm-keep-local-after-email")) { insert_db = switch_true(val); @@ -2613,6 +2629,7 @@ int priority = 3; int email_attach = 1; char buf[2]; + char key_buf[80]; char *greet_path = NULL; const char *voicemail_greeting_number = NULL; switch_size_t message_len = 0; @@ -2625,6 +2642,7 @@ int send_main = 0; int send_notify = 0; int insert_db = 1; + const char *read_id = NULL; const char *caller_id_name = NULL; const char *caller_id_number = NULL; switch_xml_t x_domain = NULL, x_domain_root = NULL, x_user = NULL, x_params = NULL, x_param = NULL; @@ -2667,18 +2685,18 @@ vm_notify_email = switch_core_session_strdup(session, val); } else if (!strcasecmp(var, "email-addr")) { email_addr = switch_core_session_strdup(session, val); - } else if (!strcasecmp(var, "vm-email-all-messages")) { - send_main = switch_true(val); + } else if (!strcasecmp(var, "vm-email-all-messages") && (send_main = switch_true(val))) { send_mail++; } else if (!strcasecmp(var, "storage-dir")) { vm_storage_dir = switch_core_session_strdup(session, val); - } else if (!strcasecmp(var, "vm-notify-email-all-messages")) { - send_notify = switch_true(val); + } else if (!strcasecmp(var, "vm-notify-email-all-messages") && (send_notify = switch_true(val))) { send_mail++; } else if (!strcasecmp(var, "vm-keep-local-after-email")) { insert_db = switch_true(val); } else if (!strcasecmp(var, "vm-attach-file")) { email_attach = switch_true(val); + } else if (!strcasecmp(var, "vm-alternate-greet-id")) { + read_id = switch_core_session_strdup(session, val); } } } @@ -2751,7 +2769,7 @@ if (num > 0 && num <= VM_MAX_GREETINGS) { greet_path = switch_mprintf("%s%sgreeting_%d.%s", dir_path, SWITCH_PATH_SEPARATOR, num, profile->file_ext); } - } else { + } else if (!(greet_path = (char *) switch_channel_get_variable(channel, "voicemail_greeting_path"))) { greet_path = cbt.greeting_path; } @@ -2770,9 +2788,10 @@ TRY_CODE(switch_ivr_play_file(session, NULL, cbt.name_path, &args)); } if (*buf == '\0') { - const char *read_id; - if (!(read_id = switch_channel_get_variable(channel, "voicemail_alternate_greet_id"))) { - read_id = id; + if (!read_id) { + if (!(read_id = switch_channel_get_variable(channel, "voicemail_alternate_greet_id"))) { + read_id = id; + } } memset(buf, 0, sizeof(buf)); TRY_CODE(switch_ivr_phrase_macro(session, VM_PLAY_GREETING_MACRO, read_id, NULL, &args)); @@ -2780,6 +2799,7 @@ } if (*buf != '\0') { +greet_key_press: if (!strcasecmp(buf, profile->main_menu_key)) { voicemail_check_main(session, profile_name, domain_name, id, 0); } else if (!strcasecmp(buf, profile->operator_key) && !switch_strlen_zero(profile->operator_key)) { @@ -2835,24 +2855,31 @@ switch_channel_set_variable(channel, "RECORD_COMMENT", profile->record_comment); switch_channel_set_variable(channel, "RECORD_COPYRIGHT", profile->record_copyright); - status = create_file(session, profile, VM_RECORD_MESSAGE_MACRO, file_path, &message_len, SWITCH_TRUE); + switch_snprintf(key_buf, sizeof(key_buf), "%s:%s", profile->operator_key, profile->vmain_key); + memset(buf, 0, sizeof(buf)); + + status = create_file(session, profile, VM_RECORD_MESSAGE_MACRO, file_path, &message_len, SWITCH_TRUE, key_buf, buf); if ((status == SWITCH_STATUS_NOTFOUND)) { goto end; } + if (buf[0]) { + goto greet_key_press; + } + if ((status == SWITCH_STATUS_SUCCESS || status == SWITCH_STATUS_BREAK) && switch_channel_ready(channel)) { - char input[10] = "", key_buf[80] = "", term = 0; + char input[10] = "", term = 0; switch_snprintf(key_buf, sizeof(key_buf), "%s:%s", profile->urgent_key, profile->terminator_key); - vm_macro_get(session, VM_RECORD_URGENT_CHECK_MACRO, key_buf, input, sizeof(input), 1, "", &term, profile->digit_timeout); + (void)vm_macro_get(session, VM_RECORD_URGENT_CHECK_MACRO, key_buf, input, sizeof(input), 1, "", &term, profile->digit_timeout); if (*profile->urgent_key == *input) { read_flags = URGENT_FLAG_STRING; priority = 1; - TRY_CODE(switch_ivr_phrase_macro(session, VM_ACK_MACRO, "marked-urgent", NULL, NULL)); + (void)switch_ivr_phrase_macro(session, VM_ACK_MACRO, "marked-urgent", NULL, NULL); } else { - TRY_CODE(switch_ivr_phrase_macro(session, VM_ACK_MACRO, "saved", NULL, NULL)); + (void)switch_ivr_phrase_macro(session, VM_ACK_MACRO, "saved", NULL, NULL); } } Modified: freeswitch/branches/gmaruzz/src/mod/asr_tts/mod_cepstral/Makefile ============================================================================== --- freeswitch/branches/gmaruzz/src/mod/asr_tts/mod_cepstral/Makefile (original) +++ freeswitch/branches/gmaruzz/src/mod/asr_tts/mod_cepstral/Makefile Mon Dec 15 12:56:36 2008 @@ -1,6 +1,6 @@ LOCAL_INSERT_LDFLAGS=if test $$osarch = "Darwin" ; then echo "-framework swift" ; else echo "-L$(SWIFT_HOME)/lib -L/opt/swift/lib -lswift -lm" ; fi ; -LOCAL_INSERT_CFLAGS=test $$osarch = "Darwin" || echo "-I$(SWIFT_HOME)/include -I/opt/swift/include"; +LOCAL_INSERT_CFLAGS=if test $$osarch = "Darwin" ; then echo "-I/Library/Frameworks/swift.framework/Versions/5/Headers/" ; else echo "-I$(SWIFT_HOME)/include -I/opt/swift/include"; fi ; LOCAL_CFLAGS=-w include ../../../../build/modmake.rules Modified: freeswitch/branches/gmaruzz/src/mod/asr_tts/mod_cepstral/mod_cepstral.c ============================================================================== --- freeswitch/branches/gmaruzz/src/mod/asr_tts/mod_cepstral/mod_cepstral.c (original) +++ freeswitch/branches/gmaruzz/src/mod/asr_tts/mod_cepstral/mod_cepstral.c Mon Dec 15 12:56:36 2008 @@ -38,11 +38,7 @@ #ifdef __ICC #pragma warning (disable:188) #endif -#ifdef MACOSX -#include <swift/swift.h> -#else #include <swift.h> -#endif #include <switch.h> #define MY_BUF_LEN 1024 * 32 Modified: freeswitch/branches/gmaruzz/src/mod/asr_tts/mod_pocketsphinx/Makefile ============================================================================== --- freeswitch/branches/gmaruzz/src/mod/asr_tts/mod_pocketsphinx/Makefile (original) +++ freeswitch/branches/gmaruzz/src/mod/asr_tts/mod_pocketsphinx/Makefile Mon Dec 15 12:56:36 2008 @@ -18,7 +18,7 @@ $(GETLIB) $(SPHINXBASE).tar.gz $(SPHINXBASE_DIR)/buildstamp: $(SPHINXBASE_DIR) - test -f $(SPHINXBASE_DIR)/Makefile || (cd $(SPHINXBASE_DIR) && ./configure --with-pic --without-python --disable-shared) + test -f $(SPHINXBASE_DIR)/Makefile || (cd $(SPHINXBASE_DIR) && ./configure --with-pic --without-python --disable-shared CFLAGS=) test -f $(SPHINXBASE_DIR)/buildstamp || (touch $(SPHINXBASE_DIR)/buildstamp) $(SPHINXBASE_LA): $(SPHINXBASE_DIR)/buildstamp @@ -29,7 +29,7 @@ $(GETLIB) $(POCKETSPHINX).tar.gz $(POCKETSPHINX_DIR)/Makefile: $(POCKETSPHINX_DIR) - cd $(POCKETSPHINX_DIR) && ./configure --with-pic --without-python --disable-shared --with-sphinxbase=$(SPHINXBASE_DIR) + cd $(POCKETSPHINX_DIR) && ./configure --with-pic --without-python --disable-shared --with-sphinxbase=$(SPHINXBASE_DIR) CFLAGS= $(TOUCH_TARGET) $(POCKETSPHINX_DIR)/buildstamp: $(POCKETSPHINX_DIR)/Makefile Modified: freeswitch/branches/gmaruzz/src/mod/endpoints/mod_dingaling/mod_dingaling.c ============================================================================== --- freeswitch/branches/gmaruzz/src/mod/endpoints/mod_dingaling/mod_dingaling.c (original) +++ freeswitch/branches/gmaruzz/src/mod/endpoints/mod_dingaling/mod_dingaling.c Mon Dec 15 12:56:36 2008 @@ -413,6 +413,7 @@ char *rpid = switch_event_get_header(event, "rpid"); char *type = switch_event_get_header(event, "event_subtype"); char *sql; + char pstr[128] = ""; if (globals.running != 1) { return; @@ -475,10 +476,12 @@ status = "Away"; } + if (proto) { + switch_snprintf(pstr, sizeof(pstr), "%s+", proto); + } sql = - switch_mprintf("select sub_from, sub_to,'%q','%q','%q','%q' from jabber_subscriptions where sub_to like '%%%q'", type, rpid, status, proto, from); - + switch_mprintf("select sub_from, sub_to,'%q','%q','%q','%q' from jabber_subscriptions where sub_to = '%q%q'", type, rpid, status, proto, pstr, from); for (hi = switch_hash_first(NULL, globals.profile_hash); hi; hi = switch_hash_next(hi)) { switch_hash_this(hi, NULL, NULL, &val); @@ -536,7 +539,7 @@ *p = '\0'; } } - ldl_handle_send_msg(profile->handle, from, to, NULL, body); + ldl_handle_send_msg(profile->handle, from, to, NULL, switch_str_nil(body)); } else { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invalid Profile %s\n", f_host ? f_host : "NULL"); return SWITCH_STATUS_FALSE; @@ -1713,7 +1716,7 @@ if ((ptr = strchr(them, '/'))) { *ptr = '\0'; } - ldl_handle_send_msg(mdl_profile->handle, tech_pvt->us, them, "", cid_msg); + ldl_handle_send_msg(mdl_profile->handle, tech_pvt->us, them, "", switch_str_nil(cid_msg)); } switch_safe_free(them); } @@ -2464,7 +2467,7 @@ if (profile->auto_reply) { ldl_handle_send_msg(handle, (profile->user_flags & LDL_FLAG_COMPONENT) ? to : ldl_handle_get_login(profile->handle), from, "", - profile->auto_reply); + switch_str_nil(profile->auto_reply)); } #endif @@ -2487,7 +2490,7 @@ } if ((ci = switch_loadable_module_get_chat_interface(proto))) { - ci->chat_send(MDL_CHAT_PROTO, from, to, subject, msg, hint); + ci->chat_send(MDL_CHAT_PROTO, from, to, subject, switch_str_nil(msg), hint); } else { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invalid Chat Interface [%s]!\n", proto); } @@ -2896,7 +2899,7 @@ if (!switch_test_flag(tech_pvt, TFLAG_OUTBOUND)) { switch_set_flag_locked(tech_pvt, TFLAG_TRANSPORT_ACCEPT); - ldl_session_accept_candidate(dlsession, &candidates[choice]); + //ldl_session_accept_candidate(dlsession, &candidates[choice]); } if (!strcasecmp(subject, "candidates")) { Modified: freeswitch/branches/gmaruzz/src/mod/endpoints/mod_iax/iax-client.h ============================================================================== --- freeswitch/branches/gmaruzz/src/mod/endpoints/mod_iax/iax-client.h (original) +++ freeswitch/branches/gmaruzz/src/mod/endpoints/mod_iax/iax-client.h Mon Dec 15 12:56:36 2008 @@ -23,7 +23,7 @@ #pragma warning(disable:4200) #endif -#if !defined(LINUX) && !defined(NETBSD) +#if !defined(LINUX) && !defined(__NetBSD__) #define socklen_t int #endif Modified: freeswitch/branches/gmaruzz/src/mod/endpoints/mod_loopback/mod_loopback.c ============================================================================== --- freeswitch/branches/gmaruzz/src/mod/endpoints/mod_loopback/mod_loopback.c (original) +++ freeswitch/branches/gmaruzz/src/mod/endpoints/mod_loopback/mod_loopback.c Mon Dec 15 12:56:36 2008 @@ -257,6 +257,10 @@ switch_channel_hangup(channel, SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER); goto end; } + + switch_channel_set_variable(channel,"other_loopback_leg_uuid",switch_channel_get_uuid(b_channel)); + switch_channel_set_variable(b_channel,"other_loopback_leg_uuid",switch_channel_get_uuid(channel)); + } if (tech_pvt->other_session) { @@ -694,6 +698,7 @@ switch_snprintf(name, sizeof(name), "loopback/%s-a", caller_profile->destination_number); switch_channel_set_name(channel, name); + switch_channel_set_flag(channel, CF_OUTBOUND); switch_channel_set_caller_profile(channel, caller_profile); tech_pvt->caller_profile = caller_profile; Modified: freeswitch/branches/gmaruzz/src/mod/endpoints/mod_sofia/mod_sofia.c ============================================================================== --- freeswitch/branches/gmaruzz/src/mod/endpoints/mod_sofia/mod_sofia.c (original) +++ freeswitch/branches/gmaruzz/src/mod/endpoints/mod_sofia/mod_sofia.c Mon Dec 15 12:56:36 2008 @@ -451,10 +451,15 @@ /* Unlock the session signal to allow the ack to make it in */ // Maybe we should timeout? + switch_mutex_unlock(tech_pvt->sofia_mutex); while(switch_channel_ready(channel) && !switch_test_flag(tech_pvt, TFLAG_3PCC_HAS_ACK)) { switch_cond_next(); } + + /* Regain lock on sofia */ + switch_mutex_lock(tech_pvt->sofia_mutex); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "3PCC-PROXY, Done waiting for ACK\n"); } @@ -697,17 +702,34 @@ *frame = NULL; return SWITCH_STATUS_GENERR; } + + if (tech_pvt->check_frames++ < MAX_CODEC_CHECK_FRAMES) { + if (!tech_pvt->read_codec.implementation->encoded_bytes_per_packet) { + tech_pvt->check_frames = MAX_CODEC_CHECK_FRAMES; + goto skip; + } - - if (tech_pvt->check_frames < MAX_CODEC_CHECK_FRAMES) { if (tech_pvt->last_ts && tech_pvt->read_frame.datalen != tech_pvt->read_codec.implementation->encoded_bytes_per_packet) { switch_size_t codec_ms = (int)(tech_pvt->read_frame.timestamp - tech_pvt->last_ts) / (tech_pvt->read_codec.implementation->samples_per_second / 1000); - + if ((codec_ms % 10) != 0) { tech_pvt->check_frames = MAX_CODEC_CHECK_FRAMES; - } else { + goto skip; + } + + if (tech_pvt->last_codec_ms && tech_pvt->last_codec_ms == codec_ms) { + tech_pvt->mismatch_count++; + } + + tech_pvt->last_codec_ms = codec_ms; + + if (tech_pvt->mismatch_count > MAX_MISMATCH_FRAMES) { if (switch_rtp_ready(tech_pvt->rtp_session) && codec_ms != tech_pvt->codec_ms) { + const char *val; + int rtp_timeout_sec = 0; + int rtp_hold_timeout_sec = 0; + tech_pvt->codec_ms = codec_ms; switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Changing codec ptime to %d. I bet you have a linksys/sipura =D\n", tech_pvt->codec_ms); @@ -718,19 +740,55 @@ return SWITCH_STATUS_GENERR; } - switch_rtp_change_interval(tech_pvt->rtp_session, - tech_pvt->read_codec.implementation->samples_per_packet, - tech_pvt->codec_ms * 1000); + + if ((val = switch_channel_get_variable(tech_pvt->channel, "rtp_timeout_sec"))) { + int v = atoi(val); + if (v >= 0) { + rtp_timeout_sec = v; + } + } + + if ((val = switch_channel_get_variable(tech_pvt->channel, "rtp_hold_timeout_sec"))) { + int v = atoi(val); + if (v >= 0) { + rtp_hold_timeout_sec = v; + } + } + + if (rtp_timeout_sec) { + tech_pvt->max_missed_packets = (tech_pvt->read_codec.implementation->samples_per_second * rtp_timeout_sec) / + tech_pvt->read_codec.implementation->samples_per_packet; + + switch_rtp_set_max_missed_packets(tech_pvt->rtp_session, tech_pvt->max_missed_packets); + if (!rtp_hold_timeout_sec) { + rtp_hold_timeout_sec = rtp_timeout_sec * 10; + } + } + + if (rtp_hold_timeout_sec) { + tech_pvt->max_missed_hold_packets = (tech_pvt->read_codec.implementation->samples_per_second * rtp_hold_timeout_sec) / + tech_pvt->read_codec.implementation->samples_per_packet; + } + + if (switch_rtp_change_interval(tech_pvt->rtp_session, + tech_pvt->codec_ms * 1000, + tech_pvt->read_codec.implementation->samples_per_packet + ) != SWITCH_STATUS_SUCCESS) { + switch_channel_hangup(tech_pvt->channel, SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER); + + } tech_pvt->check_frames = MAX_CODEC_CHECK_FRAMES; } } - tech_pvt->check_frames++; - + + } else { + tech_pvt->mismatch_count = 0; } tech_pvt->last_ts = tech_pvt->read_frame.timestamp; } + skip: if ((bytes = tech_pvt->read_codec.implementation->encoded_bytes_per_packet)) { frames = (tech_pvt->read_frame.datalen / bytes); @@ -885,21 +943,11 @@ goto end; case SWITCH_MESSAGE_INDICATE_BRIDGE: - /* - if (tech_pvt->rtp_session && switch_test_flag(tech_pvt, TFLAG_TIMER)) { - switch_rtp_clear_flag(tech_pvt->rtp_session, SWITCH_RTP_FLAG_USE_TIMER); - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "De-activate timed RTP!\n"); - } - */ - goto end; - case SWITCH_MESSAGE_INDICATE_UNBRIDGE: - /* - if (tech_pvt->rtp_session && switch_test_flag(tech_pvt, TFLAG_TIMER)) { - switch_rtp_set_flag(tech_pvt->rtp_session, SWITCH_RTP_FLAG_USE_TIMER); - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Re-activate timed RTP!\n"); - } - */ + case SWITCH_MESSAGE_INDICATE_AUDIO_SYNC: + if (switch_rtp_ready(tech_pvt->rtp_session)) { + rtp_flush_read_buffer(tech_pvt->rtp_session); + } goto end; case SWITCH_MESSAGE_INDICATE_ANSWER: @@ -1074,6 +1122,7 @@ case SWITCH_MESSAGE_INDICATE_DEFLECT: { char ref_to[128] = ""; + const char *var; if (!strstr(msg->string_arg, "sip:")) { const char *format = strchr(tech_pvt->profile->sipip, ':') ? "sip:%s@[%s]" : "sip:%s@%s"; @@ -1082,6 +1131,15 @@ switch_set_string(ref_to, msg->string_arg); } nua_refer(tech_pvt->nh, SIPTAG_REFER_TO_STR(ref_to), SIPTAG_REFERRED_BY_STR(tech_pvt->contact_url), TAG_END()); + switch_mutex_unlock(tech_pvt->sofia_mutex); + sofia_wait_for_reply(tech_pvt, 9999, 300); + switch_mutex_lock(tech_pvt->sofia_mutex); + + if ((var = switch_channel_get_variable(tech_pvt->channel, "sip_refer_reply"))) { + msg->string_reply = switch_core_session_strdup(session, var); + } else { + msg->string_reply = "no reply"; + } } break; @@ -1307,6 +1365,7 @@ "REGED", "UNREGISTER", "FAILED", + "FAIL_WAIT", "EXPIRED", "NOREG", NULL @@ -1350,6 +1409,36 @@ return 0; } +static int show_reg_callback_xml(void *pArg, int argc, char **argv, char **columnNames) +{ + struct cb_helper *cb = (struct cb_helper *) pArg; + char exp_buf[128] = ""; + switch_time_exp_t tm; + const int buflen = 2048; + char xmlbuf[2048]; + + if (argv[6]) { + switch_time_t etime = atoi(argv[6]); + switch_size_t retsize; + + switch_time_exp_lt(&tm, switch_time_from_sec(etime)); + switch_strftime_nocheck(exp_buf, &retsize, sizeof(exp_buf), "%Y-%m-%d %T", &tm); + } + + cb->stream->write_function(cb->stream, + "<Registration>\n" + "<Call-ID>%s</Call-ID>\n" + "<User>%s@%s</User>\n" + "<Contact>%s</Contact>\n" + "<Agent>%s</Agent>\n" + "<Status>%s(%s) EXP(%s)</Status>\n" + "<Host>%s</Host>\n" + "</Registration>\n", + switch_str_nil(argv[0]), switch_str_nil(argv[1]), switch_str_nil(argv[2]), switch_amp_encode(switch_str_nil(argv[3]),xmlbuf,buflen), + switch_str_nil(argv[7]), switch_str_nil(argv[4]), switch_str_nil(argv[5]), exp_buf, switch_str_nil(argv[11])); + return 0; +} + static const char *status_names[] = { "DOWN", "UP", NULL }; static switch_status_t cmd_status(char **argv, int argc, switch_stream_handle_t *stream) @@ -1535,6 +1624,194 @@ return SWITCH_STATUS_SUCCESS; } +static switch_status_t cmd_xml_status(char **argv, int argc, switch_stream_handle_t *stream) +{ + sofia_profile_t *profile = NULL; + sofia_gateway_t *gp; + switch_hash_index_t *hi; + void *val; + const void *vvar; + const int buflen = 2096; + char xmlbuf[2096]; + int c = 0; + int ac = 0; + const char *header = "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>"; + + if (argc > 0) { + if (argc == 1) { + stream->write_function(stream, "Invalid Syntax!\n"); + return SWITCH_STATUS_SUCCESS; + } + if (!strcasecmp(argv[0], "gateway")) { + if ((gp = sofia_reg_find_gateway(argv[1]))) { + switch_assert(gp->state < REG_STATE_LAST); + stream->write_function(stream, "%s\n", header); + stream->write_function(stream, "<Gateway>\n"); + stream->write_function(stream, "<Name>%s</Name>\n", switch_str_nil(gp->name)); + stream->write_function(stream, "<Scheme>%s</Scheme>\n", switch_str_nil(gp->register_scheme)); + stream->write_function(stream, "<Realm>%s</Realm>\n", switch_str_nil(gp->register_realm)); + stream->write_function(stream, "<Username>%s</Username>\n", switch_str_nil(gp->register_username)); + stream->write_function(stream, "<Password>%s</Password>\n", switch_strlen_zero(gp->register_password) ? "no" : "yes"); + stream->write_function(stream, "<From>%s</From>\n", switch_amp_encode(switch_str_nil(gp->register_from),xmlbuf,buflen)); + stream->write_function(stream, "<Contact>%s</Contact>\n", switch_amp_encode(switch_str_nil(gp->register_contact),xmlbuf,buflen)); + stream->write_function(stream, "<To>%s</To>\n", switch_str_nil(gp->register_to)); + stream->write_function(stream, "<Proxy>%s</Proxy>\n", switch_str_nil(gp->register_proxy)); + stream->write_function(stream, "<Context>%s</Context>\n", switch_str_nil(gp->register_context)); + stream->write_function(stream, "<Expires>%s</Expires>\n", switch_str_nil(gp->expires_str)); + stream->write_function(stream, "<Freq>%d</Freq>\n", gp->freq); + stream->write_function(stream, "<Ping>%d</Ping>\n", gp->ping); + stream->write_function(stream, "<PingFreq>%d</PingFreq>\n", gp->ping_freq); + stream->write_function(stream, "<State>%s</State>\n", sofia_state_names[gp->state]); + stream->write_function(stream, "<Status>%s%s</Status>\n", status_names[gp->status], gp->pinging ? " (ping)" : ""); + stream->write_function(stream, "</Gateway>\n"); + sofia_reg_release_gateway(gp); + } else { + stream->write_function(stream, "Invalid Gateway!\n"); + } + } else if (!strcasecmp(argv[0], "profile")) { + struct cb_helper cb; + char *sql = NULL; + + if ((argv[1]) && (profile = sofia_glue_find_profile(argv[1]))) { + if (!argv[2] || strcasecmp(argv[2], "reg")) { + stream->write_function(stream, "%s\n", header); + stream->write_function(stream, "<Profile>\n"); + stream->write_function(stream, "<ProfileInfo>\n"); + stream->write_function(stream, "<Name>%s</Name>\n", switch_str_nil(argv[1])); + stream->write_function(stream, "<DomainName>%s</DomainName>\n", profile->domain_name ? profile->domain_name : "N/A"); + if (strcasecmp(argv[1], profile->name)) { + stream->write_function(stream, "<AliasOf>%s</AliasOf>\n", switch_str_nil(profile->name)); + } + stream->write_function(stream, "<DBName>%s</DBName>\n", switch_str_nil(profile->dbname)); + stream->write_function(stream, "<PresHosts>%s</PresHosts>\n", switch_str_nil(profile->presence_hosts)); + stream->write_function(stream, "<Dialplan>%s</Dialplan>\n", switch_str_nil(profile->dialplan)); + stream->write_function(stream, "<Context>%s</Context>\n", switch_str_nil(profile->context)); + stream->write_function(stream, "<ChallengeRealm>%s</ChallengeRealm>\n", + switch_strlen_zero(profile->challenge_realm) ? "auto_to" : profile->challenge_realm); + stream->write_function(stream, "<RTP-IP>%s</RTP-IP>\n", switch_str_nil(profile->rtpip)); + if (profile->extrtpip) { + stream->write_function(stream, "<Ext-RTP-IP>%s</Ext-RTP-IP>\n", profile->extrtpip); + } + + stream->write_function(stream, "<SIP-IP>%s</SIP-IP>\n", switch_str_nil(profile->sipip)); + if (profile->extsipip) { + stream->write_function(stream, "<Ext-SIP-IP>%s</Ext-SIP-IP>\n", profile->extsipip); + } + stream->write_function(stream, "<URL>%s</URL>\n", switch_str_nil(profile->url)); + stream->write_function(stream, "<BIND-URL>%s</BIND-URL>\n", switch_str_nil(profile->bindurl)); + if (sofia_test_pflag(profile, PFLAG_TLS)) { + stream->write_function(stream, "<TLS-URL>%s</TLS-URL>\n", switch_str_nil(profile->tls_url)); + stream->write_function(stream, "<TLS-BIND-URL>%s</TLS-BIND-URL>\n", switch_str_nil(profile->tls_bindurl)); + } + stream->write_function(stream, "<HOLD-MUSIC>%s</HOLD-MUSIC>\n", switch_strlen_zero(profile->hold_music) ? "N/A" : profile->hold_music); + stream->write_function(stream, "<CODECS>%s</CODECS>\n", switch_str_nil(profile->codec_string)); + stream->write_function(stream, "<TEL-EVENT>%d</TEL-EVENT>\n", profile->te); + if (profile->dtmf_type == DTMF_2833) { + stream->write_function(stream, "<DTMF-MODE>rfc2833</DTMF-MODE>\n"); + } else if (profile->dtmf_type == DTMF_INFO) { + stream->write_function(stream, "<DTMF-MODE>info</DTMF-MODE>\n"); + } else { + stream->write_function(stream, "<DTMF-MODE>none</DTMF-MODE>\n"); + } + stream->write_function(stream, "<CNG>%d</CNG>\n", profile->cng_pt); + stream->write_function(stream, "<SESSION-TO>%d</SESSION-TO>\n", profile->session_timeout); + stream->write_function(stream, "<MAX-DIALOG>%d</MAX-DIALOG>\n", profile->max_proceeding); + stream->write_function(stream, "<NOMEDIA>%s</NOMEDIA>\n", switch_test_flag(profile, TFLAG_INB_NOMEDIA) ? "true" : "false"); + stream->write_function(stream, "<LATE-NEG>%s</LATE-NEG>\n", switch_test_flag(profile, TFLAG_LATE_NEGOTIATION) ? "true" : "false"); + stream->write_function(stream, "<PROXY-MEDIA>%s</PROXY-MEDIA>\n", switch_test_flag(profile, TFLAG_PROXY_MEDIA) ? "true" : "false"); + stream->write_function(stream, "<AGGRESSIVENAT>%s</AGGRESSIVENAT>\n", sofia_test_pflag(profile, PFLAG_AGGRESSIVE_NAT_DETECTION) ? "true" : "false"); + stream->write_function(stream, "<STUN_ENABLED>%s</STUN_ENABLED>\n", sofia_test_pflag(profile, PFLAG_STUN_ENABLED) ? "true" : "false"); + stream->write_function(stream, "<STUN_AUTO_DISABLE>%s</STUN_AUTO_DISABLE>\n", sofia_test_pflag(profile, PFLAG_STUN_AUTO_DISABLE) ? "true" : "false"); + } + stream->write_function(stream, "</ProfileInfo>\n"); + stream->write_function(stream, "<Registrations>\n"); + + cb.profile = profile; + cb.stream = stream; + + if (argv[3]) { + if (argv[4]) { + if (!strcasecmp(argv[3], "pres")) { + sql = switch_mprintf("select call_id,sip_user,sip_host,contact,status," + "rpid,expires,user_agent,server_user,server_host,profile_name,hostname" + " from sip_registrations where profile_name='%q' and presence_hosts like '%%%q%%'", + profile->name, argv[4]); + } + } else { + sql = switch_mprintf("select call_id,sip_user,sip_host,contact,status," + "rpid,expires,user_agent,server_user,server_host,profile_name,hostname" + " from sip_registrations where profile_name='%q' and contact like '%%%q%%'", + profile->name, argv[3]); + } + } + + if (!sql) { + sql = switch_mprintf("select call_id,sip_user,sip_host,contact,status," + "rpid,expires,user_agent,server_user,server_host,profile_name,hostname" + " from sip_registrations where profile_name='%q'", + profile->name); + } + + sofia_glue_execute_sql_callback(profile, SWITCH_FALSE, profile->ireg_mutex, sql, show_reg_callback_xml, &cb); + free(sql); + + stream->write_function(stream, "</Registrations>\n"); + stream->write_function(stream, "</Profile>\n"); + + sofia_glue_release_profile(profile); + } else { + stream->write_function(stream, "Invalid Profile!\n"); + } + } else { + stream->write_function(stream, "Invalid Syntax!\n"); + } + + return SWITCH_STATUS_SUCCESS; + } + + stream->write_function(stream, "%s\n", header); + stream->write_function(stream, "<Profiles>\n"); + switch_mutex_lock(mod_sofia_globals.hash_mutex); + for (hi = switch_hash_first(NULL, mod_sofia_globals.profile_hash); hi; hi = switch_hash_next(hi)) { + switch_hash_this(hi, &vvar, NULL, &val); + profile = (sofia_profile_t *) val; + if (sofia_test_pflag(profile, PFLAG_RUNNING)) { + + if (strcmp(vvar, profile->name)) { + ac++; + stream->write_function(stream, "<alias>\n<Name>%s</Name>\n<Type>%s</Type>\n<Data>%s</Data>\n<State>%s</State>\n</alias>\n", vvar, "alias", profile->name, "ALIASED"); + } else { + stream->write_function(stream, "<profile>\n<Name>%s</Name>\n<Type>%s</Type>\n<Data>%s</Data>\n<State>%s (%u)</State>\n</profile>\n", profile->name, "profile", profile->url, + sofia_test_pflag(profile, PFLAG_RUNNING) ? "RUNNING" : "DOWN", profile->inuse); + + if (sofia_test_pflag(profile, PFLAG_TLS)) { + stream->write_function(stream, "<profile>\n<Name>%s</Name>\n<Type>%s</Type>\n<Data>%s</Data>\n<State>%s (%u) (TLS)</State>\n</profile>\n", profile->name, "profile", profile->tls_url, + sofia_test_pflag(profile, PFLAG_RUNNING) ? "RUNNING" : "DOWN", profile->inuse); + } + + c++; + + for (gp = profile->gateways; gp; gp = gp->next) { + switch_assert(gp->state < REG_STATE_LAST); + stream->write_function(stream, "<gateway>\n<Name>%s</Name>\n<Type>%s</Type>\n<Data>%s</Data>\n<State>%s</State>\n</gateway>\n", gp->name, "gateway", gp->register_to, sofia_state_names[gp->state]); + if (gp->state == REG_STATE_FAILED || gp->state == REG_STATE_TRYING) { + time_t now = switch_timestamp(NULL); + if (gp->retry > now) { + stream->write_function(stream, " (retry: %ds)", gp->retry - now); + } else { + stream->write_function(stream, " (retry: NEVER)"); + } + } + stream->write_function(stream, "\n"); + } + } + } + } + switch_mutex_unlock(mod_sofia_globals.hash_mutex); + stream->write_function(stream, "</Profiles>\n"); + return SWITCH_STATUS_SUCCESS; +} + static switch_status_t cmd_profile(char **argv, int argc, switch_stream_handle_t *stream) { sofia_profile_t *profile = NULL; @@ -1924,6 +2201,8 @@ func = cmd_profile; } else if (!strcasecmp(argv[0], "status")) { func = cmd_status; + } else if (!strcasecmp(argv[0], "xmlstatus")) { + func = cmd_xml_status; } else if (!strcasecmp(argv[0], "loglevel")) { if (argc > 1 && argv[1]) { int level; @@ -2319,10 +2598,26 @@ const char *user = switch_event_get_header(event, "user"); const char *host = switch_event_get_header(event, "host"); const char *call_id = switch_event_get_header(event, "call-id"); + const char *uuid = switch_event_get_header(event, "uuid"); const char *body = switch_event_get_body(event); sofia_profile_t *profile; - if (profile_name && ct && es && user && host && (profile = sofia_glue_find_profile(profile_name))) { + if (uuid && ct && es) { + switch_core_session_t *session; + private_object_t *tech_pvt; + + if ((session = switch_core_session_locate(uuid))) { + if ((tech_pvt = switch_core_session_get_private(session))) { + nua_notify(tech_pvt->nh, + NUTAG_NEWSUB(1), + SIPTAG_EVENT_STR(es), + SIPTAG_CONTENT_TYPE_STR(ct), + TAG_IF(!switch_strlen_zero(body), SIPTAG_PAYLOAD_STR(body)), + TAG_END()); + } + switch_core_session_rwunlock(session); + } + } else if (profile_name && ct && es && user && host && (profile = sofia_glue_find_profile(profile_name))) { char *sql; if (call_id) { @@ -2407,7 +2702,7 @@ { const char *cond = switch_event_get_header(event, "condition"); - if (cond && !strcmp(cond, "network-address-change")) { + if (cond && !strcmp(cond, "network-address-change") && mod_sofia_globals.auto_restart) { sofia_glue_restart_all_profiles(); } Modified: freeswitch/branches/gmaruzz/src/mod/endpoints/mod_sofia/mod_sofia.h ============================================================================== --- freeswitch/branches/gmaruzz/src/mod/endpoints/mod_sofia/mod_sofia.h (original) +++ freeswitch/branches/gmaruzz/src/mod/endpoints/mod_sofia/mod_sofia.h Mon Dec 15 12:56:36 2008 @@ -54,11 +54,15 @@ #endif #define MAX_CODEC_CHECK_FRAMES 50 +#define MAX_MISMATCH_FRAMES 3 #define MODNAME "mod_sofia" static const switch_state_handler_table_t noop_state_handler = { 0 }; struct sofia_gateway; typedef struct sofia_gateway sofia_gateway_t; +struct sofia_gateway_subscription; +typedef struct sofia_gateway_subscription sofia_gateway_subscription_t; + struct sofia_profile; typedef struct sofia_profile sofia_profile_t; #define NUA_MAGIC_T sofia_profile_t @@ -74,6 +78,7 @@ #define MY_EVENT_UNREGISTER "sofia::unregister" #define MY_EVENT_EXPIRE "sofia::expire" #define MY_EVENT_GATEWAY_STATE "sofia::gateway_state" +#define MY_EVENT_NOTIFY_REFER "sofia::notify_refer" #define MULTICAST_EVENT "multicast::event" #define SOFIA_REPLACES_HEADER "_sofia_replaces_" @@ -237,6 +242,8 @@ switch_event_node_t *roster_node; switch_event_node_t *custom_node; switch_event_node_t *mwi_node; + int debug_presence; + int auto_restart; }; extern struct mod_sofia_globals mod_sofia_globals; @@ -252,6 +259,7 @@ REG_STATE_REGED, REG_STATE_UNREGISTER, REG_STATE_FAILED, + REG_STATE_FAIL_WAIT, REG_STATE_EXPIRED, REG_STATE_NOREG, REG_STATE_LAST @@ -270,6 +278,31 @@ SOFIA_GATEWAY_UP } sofia_gateway_status_t; +typedef enum { + SUB_STATE_UNSUBED, + SUB_STATE_TRYING, + SUB_STATE_SUBSCRIBE, + SUB_STATE_SUBED, + SUB_STATE_UNSUBSCRIBE, + SUB_STATE_FAILED, + SUB_STATE_EXPIRED, + SUB_STATE_NOSUB, + v_STATE_LAST +} sub_state_t; + +struct sofia_gateway_subscription { + sofia_gateway_t *gateway; + char *expires_str; + char *event; /* eg, 'message-summary' to subscribe to MWI events */ + char *content_type; /* eg, application/simple-message-summary in the case of MWI events */ + uint32_t freq; + int32_t retry_seconds; + time_t expires; + time_t retry; + sub_state_t state; + struct sofia_gateway_subscription *next; +}; + struct sofia_gateway { sofia_private_t *sofia_private; nua_handle_t *nh; @@ -303,7 +336,9 @@ int deleted; switch_event_t *vars; char uuid_str[SWITCH_UUID_FORMATTED_LENGTH + 1]; + int failures; struct sofia_gateway *next; + sofia_gateway_subscription_t *subscriptions; }; typedef enum { @@ -334,6 +369,8 @@ char *bindurl; char *tls_url; char *tls_bindurl; + char *tcp_contact; + char *tls_contact; char *sipdomain; char *timer_name; char *hold_music; @@ -395,6 +432,7 @@ int rport_level; sofia_presence_type_t pres_type; sofia_media_options_t media_options; + uint32_t force_subscription_expires; }; struct private_object { @@ -511,6 +549,9 @@ switch_thread_id_t locker; switch_size_t last_ts; uint32_t check_frames; + uint32_t mismatch_count; + uint32_t last_codec_ms; + nua_event_t want_event; }; struct callback_t { @@ -618,6 +659,7 @@ void sofia_glue_actually_execute_sql(sofia_profile_t *profile, switch_bool_t master, char *sql, switch_mutex_t *mutex); void sofia_reg_check_expire(sofia_profile_t *profile, time_t now, int reboot); void sofia_reg_check_gateway(sofia_profile_t *profile, time_t now); +void sofia_sub_check_gateway(sofia_profile_t *profile, time_t now); void sofia_reg_unregister(sofia_profile_t *profile); switch_status_t sofia_glue_ext_address_lookup(sofia_profile_t *profile, private_object_t *tech_pvt, char **ip, switch_port_t *port, char *sourceip, switch_memory_pool_t *pool); @@ -656,6 +698,8 @@ sofia_gateway_t *sofia_reg_find_gateway__(const char *file, const char *func, int line, const char *key); #define sofia_reg_find_gateway(x) sofia_reg_find_gateway__(__FILE__, __SWITCH_FUNC__, __LINE__, x) +sofia_gateway_subscription_t *sofia_find_gateway_subscription(sofia_gateway_t *gateway_ptr, const char *event); + void sofia_reg_release_gateway__(const char *file, const char *func, int line, sofia_gateway_t *gateway); #define sofia_reg_release_gateway(x) sofia_reg_release_gateway__(__FILE__, __SWITCH_FUNC__, __LINE__, x); @@ -715,3 +759,4 @@ void sofia_glue_toggle_hold(private_object_t *tech_pvt, int sendonly); const char * sofia_state_string(int state); switch_status_t sofia_glue_tech_set_codec(private_object_t *tech_pvt, int force); +void sofia_wait_for_reply(struct private_object *tech_pvt, nua_event_t event, uint32_t timeout); Modified: freeswitch/branches/gmaruzz/src/mod/endpoints/mod_sofia/sofia.c ============================================================================== --- freeswitch/branches/gmaruzz/src/mod/endpoints/mod_sofia/sofia.c (original) +++ freeswitch/branches/gmaruzz/src/mod/endpoints/mod_sofia/sofia.c Mon Dec 15 12:56:36 2008 @@ -70,12 +70,14 @@ char const *phrase, nua_t *nua, sofia_profile_t *profile, nua_handle_t *nh, sofia_private_t *sofia_private, sip_t const *sip, tagi_t tags[]) { +#if 0 if (status >= 300 && sip && sip->sip_call_id) { char *sql; sql = switch_mprintf("delete from sip_subscriptions where call_id='%q'", sip->sip_call_id->i_id); switch_assert(sql != NULL); sofia_glue_execute_sql(profile, &sql, SWITCH_TRUE); } +#endif } void sofia_handle_sip_i_notify(switch_core_session_t *session, int status, @@ -83,6 +85,9 @@ nua_t *nua, sofia_profile_t *profile, nua_handle_t *nh, sofia_private_t *sofia_private, sip_t const *sip, tagi_t tags[]) { switch_channel_t *channel = NULL; + private_object_t *tech_pvt = NULL; + switch_event_t *s_event = NULL; + sofia_gateway_subscription_t *gw_sub_ptr; /* make sure we have a proper event */ if (!sip || !sip->sip_event) { @@ -95,21 +100,136 @@ return; } - /* make sure we have a proper "talk" event */ - if (!session || strcasecmp(sip->sip_event->o_type, "talk")) { - goto error; + if (session) { + channel = switch_core_session_get_channel(session); + switch_assert(channel != NULL); + tech_pvt = switch_core_session_get_private(session); + switch_assert(tech_pvt != NULL); } - channel = switch_core_session_get_channel(session); - switch_assert(channel != NULL); - if (!switch_channel_test_flag(channel, CF_OUTBOUND)) { - switch_channel_answer(channel); - switch_channel_set_variable(channel, "auto_answer_destination", switch_channel_get_variable(channel, "destination_number")); - switch_ivr_session_transfer(session, "auto_answer", NULL, NULL); + /* For additional NOTIFY event packages see http://www.iana.org/assignments/sip-events. */ + if (!strcasecmp(sip->sip_event->o_type, "refer")) { + if (switch_event_create_subclass(&s_event, SWITCH_EVENT_CUSTOM, MY_EVENT_NOTIFY_REFER) == SWITCH_STATUS_SUCCESS) { + switch_event_add_header_string(s_event, SWITCH_STACK_BOTTOM, "content-type", sip->sip_content_type->c_type); + switch_event_add_body(s_event, "%s", sip->sip_payload->pl_data); + } + } + + /* add common headers for the NOTIFY to the switch_event and fire if it exists */ + if (s_event != NULL) { + switch_event_add_header_string(s_event, SWITCH_STACK_BOTTOM, "event-package", sip->sip_event->o_type); + switch_event_add_header_string(s_event, SWITCH_STACK_BOTTOM, "event-id", sip->sip_event->o_id); + + switch_event_add_header(s_event, SWITCH_STACK_BOTTOM, "contact", "%s@%s", + sip->sip_contact->m_url->url_user, sip->sip_contact->m_url->url_host); + switch_event_add_header(s_event, SWITCH_STACK_BOTTOM, "from", "%s@%s", + sip->sip_from->a_url->url_user, sip->sip_from->a_url->url_host); + switch_event_add_header_string(s_event, SWITCH_STACK_BOTTOM, "from-tag", sip->sip_from->a_tag); + switch_event_add_header(s_event, SWITCH_STACK_BOTTOM, "to", "%s@%s", + sip->sip_to->a_url->url_user, sip->sip_to->a_url->url_host); + switch_event_add_header_string(s_event, SWITCH_STACK_BOTTOM, "to-tag", sip->sip_to->a_tag); + + if (sip->sip_call_id && sip->sip_call_id->i_id) { + switch_event_add_header_string(s_event, SWITCH_STACK_BOTTOM, "call-id", sip->sip_call_id->i_id); + } + if (sip->sip_subscription_state && sip->sip_subscription_state->ss_substate) { + switch_event_add_header_string(s_event, SWITCH_STACK_BOTTOM, "subscription-substate", sip->sip_subscription_state->ss_substate); + } + if (sip->sip_subscription_state && sip->sip_subscription_state->ss_reason) { + switch_event_add_header_string(s_event, SWITCH_STACK_BOTTOM, "subscription-reason", sip->sip_subscription_state->ss_reason); + } + if (sip->sip_subscription_state && sip->sip_subscription_state->ss_retry_after) { + switch_event_add_header_string(s_event, SWITCH_STACK_BOTTOM, "subscription-retry-after", sip->sip_subscription_state->ss_retry_after); + } + if (sip->sip_subscription_state && sip->sip_subscription_state->ss_expires) { + switch_event_add_header_string(s_event, SWITCH_STACK_BOTTOM, "subscription-expires", sip->sip_subscription_state->ss_expires); + } + if (session) { + switch_event_add_header_string(s_event, SWITCH_STACK_BOTTOM, "UniqueID", switch_core_session_get_uuid(session)); + } + switch_event_fire(&s_event); + } + + if (!strcasecmp(sip->sip_event->o_type, "refer")) { + if (session && channel && tech_pvt) { + if (sip->sip_payload && sip->sip_payload->pl_data) { + char *p; + int status_val = 0; + if ((p = strchr(sip->sip_payload->pl_data, ' '))) { + p++; + if (p) { + status_val = atoi(p); + } + } + if (!status_val || status_val >= 200) { + switch_channel_set_variable(channel, "sip_refer_reply", sip->sip_payload->pl_data); + if (status_val == 200) { + switch_channel_hangup(channel, SWITCH_CAUSE_BLIND_TRANSFER); + } + if (tech_pvt->want_event == 9999) { + tech_pvt->want_event = 0; + } + } + } + } nua_respond(nh, SIP_200_OK, NUTAG_WITH_THIS(nua), TAG_END()); - return; } + /* if no session, assume it could be an incoming notify from a gateway subscription */ + if (session) { + /* make sure we have a proper "talk" event */ + if (strcasecmp(sip->sip_event->o_type, "talk")) { + goto error; + } + + if (!switch_channel_test_flag(channel, CF_OUTBOUND)) { + switch_channel_answer(channel); + switch_channel_set_variable(channel, "auto_answer_destination", switch_channel_get_variable(channel, "destination_number")); + switch_ivr_session_transfer(session, "auto_answer", NULL, NULL); + nua_respond(nh, SIP_200_OK, NUTAG_WITH_THIS(nua), TAG_END()); + return; + } + } + + if (!sofia_private || !sofia_private->gateway) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Gateway information missing Subscription Event: %s\n", sip->sip_event->o_type); + goto error; + } + + /* find the corresponding gateway subscription (if any) */ + if (!(gw_sub_ptr = sofia_find_gateway_subscription(sofia_private->gateway, sip->sip_event->o_type))) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, + "Could not find gateway subscription. Gateway: %s. Subscription Event: %s\n", + sofia_private->gateway->name, sip->sip_event->o_type); + goto error; + } + + if (!(gw_sub_ptr->state == SUB_STATE_SUBED || gw_sub_ptr->state == SUB_STATE_SUBSCRIBE)) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, + "Ignoring notify due to subscription state: %d\n", + gw_sub_ptr->state); + goto error; + } + + /* dispatch freeswitch event */ + if (switch_event_create(&s_event, SWITCH_EVENT_NOTIFY_IN) == SWITCH_STATUS_SUCCESS) { + switch_event_add_header(s_event, SWITCH_STACK_BOTTOM, "event", "%s", sip->sip_event->o_type); + switch_event_add_header(s_event, SWITCH_STACK_BOTTOM, "pl_data", "%s", sip->sip_payload->pl_data); + switch_event_add_header(s_event, SWITCH_STACK_BOTTOM, "sip_content_type", "%s", sip->sip_content_type->c_type); + switch_event_add_header(s_event, SWITCH_STACK_BOTTOM, "port", "%d", sofia_private->gateway->profile->sip_port); + switch_event_add_header(s_event, SWITCH_STACK_BOTTOM, "module_name", "%s", "mod_sofia"); + switch_event_add_header(s_event, SWITCH_STACK_BOTTOM, "profile_name", "%s", sofia_private->gateway->profile->name); + switch_event_add_header(s_event, SWITCH_STACK_BOTTOM, "profile_uri", "%s", sofia_private->gateway->profile->url); + switch_event_add_header(s_event, SWITCH_STACK_BOTTOM, "gateway_name", "%s", sofia_private->gateway->name); + switch_event_fire(&s_event); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "dispatched freeswitch event for message-summary NOTIFY\n"); + } else { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Failed to create event\n"); + goto error; + } + + return; + error: nua_respond(nh, 481, "Subscription Does Not Exist", NUTAG_WITH_THIS(nua), TAG_END()); return; @@ -160,6 +280,18 @@ { } +void sofia_wait_for_reply(struct private_object *tech_pvt, nua_event_t event, uint32_t timeout) +{ + time_t exp = switch_timestamp(NULL) + timeout; + + tech_pvt->want_event = event; + + while(switch_channel_ready(tech_pvt->channel) && tech_pvt->want_event && switch_timestamp(NULL) < exp) { + switch_yield(100000); + } + +} + void sofia_event_callback(nua_event_t event, int status, char const *phrase, @@ -336,6 +468,10 @@ done: + if (tech_pvt && tech_pvt->want_event && event == tech_pvt->want_event) { + tech_pvt->want_event = 0; + } + switch (event) { case nua_i_subscribe: break; @@ -471,6 +607,7 @@ sofia_reg_check_gateway(profile, switch_timestamp(NULL)); gateway_loops = 0; } + sofia_sub_check_gateway(profile, time(NULL)); loops = 0; } @@ -586,6 +723,7 @@ TAG_IF(profile->pres_type, NUTAG_ALLOW_EVENTS("include-session-description")), TAG_IF(profile->pres_type, NUTAG_ALLOW_EVENTS("presence.winfo")), TAG_IF(profile->pres_type, NUTAG_ALLOW_EVENTS("message-summary")), + NUTAG_ALLOW_EVENTS("refer"), SIPTAG_SUPPORTED_STR(supported), SIPTAG_USER_AGENT_STR(profile->user_agent), TAG_END()); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Set params for %s\n", profile->name); @@ -764,9 +902,56 @@ } } +static void parse_gateway_subscriptions(sofia_profile_t *profile, sofia_gateway_t *gateway, switch_xml_t gw_subs_tag) +{ + switch_xml_t subscription_tag, param; + + for (subscription_tag = switch_xml_child(gw_subs_tag, "subscription"); subscription_tag; subscription_tag = subscription_tag->next) { + sofia_gateway_subscription_t *gw_sub; + + if ((gw_sub = switch_core_alloc(profile->pool, sizeof(*gw_sub)))) { + char *expire_seconds = "3600", *retry_seconds = "30", *content_type = "NO_CONTENT_TYPE"; + char *event = (char *) switch_xml_attr_soft(subscription_tag, "event"); + gw_sub->event = switch_core_strdup(gateway->pool, event); + gw_sub->gateway = gateway; + gw_sub->next = NULL; + + for (param = switch_xml_child(subscription_tag, "param"); param; param = param->next) { + char *var = (char *) switch_xml_attr_soft(param, "name"); + char *val = (char *) switch_xml_attr_soft(param, "value"); + if (!strcmp(var, "expire-seconds")) { + expire_seconds = val; + } else if (!strcmp(var, "retry-seconds")) { + retry_seconds = val; + } else if (!strcmp(var, "content-type")) { + content_type = val; + } + } + + gw_sub->retry_seconds = atoi(retry_seconds); + if (gw_sub->retry_seconds < 10) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "INVALID: retry_seconds correcting the value to 30\n"); + gw_sub->retry_seconds = 30; + } + + gw_sub->expires_str = switch_core_strdup(gateway->pool, expire_seconds); + + if ((gw_sub->freq = atoi(gw_sub->expires_str)) < 5) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, + "Invalid Freq: %d. Setting Register-Frequency to 3600\n", gw_sub->freq); + gw_sub->freq = 3600; + } + gw_sub->freq -= 2; + gw_sub->content_type = switch_core_strdup(gateway->pool, content_type); + gw_sub->next = gateway->subscriptions; + } + gateway->subscriptions = gw_sub; + } +} + static void parse_gateways(sofia_profile_t *profile, switch_xml_t gateways_tag) { - switch_xml_t gateway_tag, param; + switch_xml_t gateway_tag, param, gw_subs_tag; sofia_gateway_t *gp; for (gateway_tag = switch_xml_child(gateways_tag, "gateway"); gateway_tag; gateway_tag = gateway_tag->next) { @@ -818,7 +1003,7 @@ for (param = switch_xml_child(gateway_tag, "param"); param; param = param->next) { char *var = (char *) switch_xml_attr_soft(param, "name"); char *val = (char *) switch_xml_attr_soft(param, "value"); - + if (!strcmp(var, "register")) { register_str = val; } else if (!strcmp(var, "scheme")) { @@ -845,6 +1030,8 @@ expire_seconds = val; } else if (!strcmp(var, "retry-seconds")) { retry_seconds = val; + } else if (!strcmp(var, "retry_seconds")) { // support typo for back compat + retry_seconds = val; } else if (!strcmp(var, "from-user")) { from_user = val; } else if (!strcmp(var, "from-domain")) { @@ -874,6 +1061,10 @@ } } + if ((gw_subs_tag = switch_xml_child(gateway_tag, "subscriptions"))) { + parse_gateway_subscriptions(profile, gateway, gw_subs_tag); + } + if (switch_strlen_zero(realm)) { realm = name; } @@ -902,6 +1093,7 @@ if (!switch_true(register_str)) { gateway->state = REG_STATE_NOREG; + gateway->status = SOFIA_GATEWAY_UP; } if (switch_strlen_zero(from_domain)) { @@ -913,11 +1105,15 @@ } if (!switch_strlen_zero(register_proxy)) { - gateway->register_sticky_proxy = switch_core_strdup(gateway->pool, register_proxy); + if (strncasecmp(register_proxy, "sip:", 4) && strncasecmp(register_proxy, "sips:", 5)) { + gateway->register_sticky_proxy = switch_core_sprintf(gateway->pool, "sip:%s", register_proxy); + } else { + gateway->register_sticky_proxy = switch_core_strdup(gateway->pool, register_proxy); + } } gateway->retry_seconds = atoi(retry_seconds); - if (gateway->retry_seconds < 10) { + if (gateway->retry_seconds < 5) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Invalid retry-seconds of %d on gateway %s, using the value of 30 instead.\n", gateway->retry_seconds, name); gateway->retry_seconds = 30; @@ -1063,6 +1259,11 @@ } else { switch_clear_flag(profile, TFLAG_INB_NOMEDIA); } + } else if (!strcasecmp(var, "force-subscription-expires")) { + int tmp = atoi(val); + if (tmp > 0) { + profile->force_subscription_expires = tmp; + } } else if (!strcasecmp(var, "inbound-late-negotiation")) { if (switch_true(val)) { switch_set_flag(profile, TFLAG_LATE_NEGOTIATION); @@ -1377,12 +1578,18 @@ goto done; } + mod_sofia_globals.auto_restart = SWITCH_TRUE; + if ((settings = switch_xml_child(cfg, "global_settings"))) { for (param = switch_xml_child(settings, "param"); param; param = param->next) { char *var = (char *) switch_xml_attr_soft(param, "name"); char *val = (char *) switch_xml_attr_soft(param, "value"); if (!strcasecmp(var, "log-level")) { su_log_set_level(NULL, atoi(val)); + } else if (!strcasecmp(var, "debug-presence")) { + mod_sofia_globals.debug_presence = atoi(val); + } else if (!strcasecmp(var, "auto-restart")) { + mod_sofia_globals.auto_restart = switch_true(val); } } } @@ -1486,6 +1693,11 @@ switch_set_flag(profile, TFLAG_LATE_NEGOTIATION); } else if (!strcasecmp(var, "inbound-proxy-media") && switch_true(val)) { switch_set_flag(profile, TFLAG_PROXY_MEDIA); + } else if (!strcasecmp(var, "force-subscription-expires")) { + int tmp = atoi(val); + if (tmp > 0) { + profile->force_subscription_expires = tmp; + } } else if (!strcasecmp(var, "inbound-use-callid-as-uuid")) { if (switch_true(val)) { profile->pflags |= PFLAG_CALLID_AS_UUID; @@ -1877,11 +2089,13 @@ profile->bindurl = profile->url; } + profile->tcp_contact = switch_core_sprintf(profile->pool, "%s;transport=tcp", profile->url); + if (profile->bind_params) { char *bindurl = profile->bindurl; profile->bindurl = switch_core_sprintf(profile->pool, "%s;%s", bindurl, profile->bind_params); } - + /* * handle TLS params #2 */ @@ -1932,6 +2146,7 @@ if (!profile->tls_cert_dir) { profile->tls_cert_dir = switch_core_sprintf(profile->pool, "%s/ssl", SWITCH_GLOBAL_dirs.conf_dir); } + profile->tls_contact = switch_core_sprintf(profile->pool, "%s;transport=tls", profile->tls_url); } } if (profile) { @@ -2026,7 +2241,6 @@ if (status == 200 || status == 404 || status == 501) { if (gateway->state == REG_STATE_FAILED) { gateway->state = REG_STATE_UNREGED; - gateway->retry = 0; } gateway->status = SOFIA_GATEWAY_UP; } else { @@ -2062,9 +2276,23 @@ const char *uuid; switch_core_session_t *other_session; private_object_t *tech_pvt = switch_core_session_get_private(session); + su_addrinfo_t *my_addrinfo = msg_addrinfo(nua_current_request(nua)); + char network_ip[80]; + int network_port = 0; + switch_caller_profile_t *caller_profile = NULL; - switch_channel_clear_flag(channel, CF_REQ_MEDIA); + get_addr(network_ip, sizeof(network_ip), my_addrinfo->ai_addr, my_addrinfo->ai_addrlen); + network_port = ntohs(((struct sockaddr_in *) msg_addrinfo(nua_current_request(nua))->ai_addr)->sin_port); + + switch_channel_set_variable(channel, "sip_reply_host", network_ip); + switch_channel_set_variable_printf(channel, "sip_reply_port", "%d", network_port); + + if ((caller_profile = switch_channel_get_caller_profile(channel))) { + caller_profile->network_addr = switch_core_strdup(caller_profile->pool, network_ip); + } + switch_channel_clear_flag(channel, CF_REQ_MEDIA); + if ((status == 180 || status == 183 || status == 200)) { if (sip->sip_user_agent && sip->sip_user_agent->g_string) { switch_channel_set_variable(channel, "sip_user_agent", sip->sip_user_agent->g_string); @@ -2211,22 +2439,9 @@ } if (!session && (status == 180 || status == 183 || status == 200)) { - /* This should never happen. It means the sip stack thinks there is a call but FreeSWITCH does not */ - const char *callid = "n/a"; - - if (sip && sip->sip_call_id && sip->sip_call_id->i_id) callid = sip->sip_call_id->i_id; - - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Received response to invite with no matching session, destroying callid [%s]!\n", callid); - - if (nh) { - if (status == 200) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Sending BYE to orphan call.\n"); - nua_bye(nh, TAG_END()); - } else { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Sending CANCEL to orphan call.\n"); - nua_cancel(nh, TAG_END()); - } - } + /* nevermind */ + nua_handle_bind(nh, NULL); + nua_handle_destroy(nh); } } @@ -2344,6 +2559,19 @@ state_process: switch ((enum nua_callstate) ss_state) { + case nua_callstate_terminated: + case nua_callstate_terminating: + case nua_callstate_ready: + case nua_callstate_completed: + case nua_callstate_received: + case nua_callstate_proceeding: + if (!(session && channel && tech_pvt)) goto done; + break; + default: + break; + } + + switch ((enum nua_callstate) ss_state) { case nua_callstate_init: break; case nua_callstate_authenticating: @@ -2351,61 +2579,59 @@ case nua_callstate_calling: break; case nua_callstate_proceeding: - if (channel) { - if (status == 180) { - switch_channel_mark_ring_ready(channel); - if (!switch_channel_test_flag(channel, CF_GEN_RINGBACK)) { - if (switch_channel_test_flag(channel, CF_PROXY_MODE)) { - if ((uuid = switch_channel_get_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE)) - && (other_session = switch_core_session_locate(uuid))) { - switch_core_session_message_t msg; - msg.message_id = SWITCH_MESSAGE_INDICATE_RINGING; - msg.from = __FILE__; - switch_core_session_receive_message(other_session, &msg); - switch_core_session_rwunlock(other_session); - } - - } else { - switch_core_session_queue_indication(session, SWITCH_MESSAGE_INDICATE_RINGING); + if (status == 180) { + switch_channel_mark_ring_ready(channel); + if (!switch_channel_test_flag(channel, CF_GEN_RINGBACK)) { + if (switch_channel_test_flag(channel, CF_PROXY_MODE)) { + if ((uuid = switch_channel_get_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE)) + && (other_session = switch_core_session_locate(uuid))) { + switch_core_session_message_t msg; + msg.message_id = SWITCH_MESSAGE_INDICATE_RINGING; + msg.from = __FILE__; + switch_core_session_receive_message(other_session, &msg); + switch_core_session_rwunlock(other_session); } + + } else { + switch_core_session_queue_indication(session, SWITCH_MESSAGE_INDICATE_RINGING); } } + } - if (r_sdp) { - if (switch_channel_test_flag(channel, CF_PROXY_MODE) || switch_channel_test_flag(channel, CF_PROXY_MEDIA)) { - switch_set_flag_locked(tech_pvt, TFLAG_EARLY_MEDIA); - switch_channel_mark_pre_answered(channel); - switch_set_flag(tech_pvt, TFLAG_SDP); - if (switch_channel_test_flag(channel, CF_PROXY_MEDIA)) { - if (sofia_glue_activate_rtp(tech_pvt, 0) != SWITCH_STATUS_SUCCESS) { - goto done; - } + if (r_sdp) { + if (switch_channel_test_flag(channel, CF_PROXY_MODE) || switch_channel_test_flag(channel, CF_PROXY_MEDIA)) { + switch_set_flag_locked(tech_pvt, TFLAG_EARLY_MEDIA); + switch_channel_mark_pre_answered(channel); + switch_set_flag(tech_pvt, TFLAG_SDP); + if (switch_channel_test_flag(channel, CF_PROXY_MEDIA)) { + if (sofia_glue_activate_rtp(tech_pvt, 0) != SWITCH_STATUS_SUCCESS) { + goto done; } - if (!switch_channel_test_flag(channel, CF_GEN_RINGBACK) && (uuid = switch_channel_get_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE)) - && (other_session = switch_core_session_locate(uuid))) { - other_channel = switch_core_session_get_channel(other_session); - if (!switch_channel_get_variable(other_channel, SWITCH_B_SDP_VARIABLE)) { - switch_channel_set_variable(other_channel, SWITCH_B_SDP_VARIABLE, r_sdp); - } - - switch_channel_pre_answer(other_channel); - switch_core_session_rwunlock(other_session); + } + if (!switch_channel_test_flag(channel, CF_GEN_RINGBACK) && (uuid = switch_channel_get_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE)) + && (other_session = switch_core_session_locate(uuid))) { + other_channel = switch_core_session_get_channel(other_session); + if (!switch_channel_get_variable(other_channel, SWITCH_B_SDP_VARIABLE)) { + switch_channel_set_variable(other_channel, SWITCH_B_SDP_VARIABLE, r_sdp); } - goto done; + + switch_channel_pre_answer(other_channel); + switch_core_session_rwunlock(other_session); + } + goto done; + } else { + if (switch_channel_test_flag(channel, CF_PROXY_MEDIA) && !switch_channel_test_flag(tech_pvt->channel, CF_OUTBOUND)) { + switch_channel_set_variable(channel, SWITCH_ENDPOINT_DISPOSITION_VARIABLE, "PROXY MEDIA"); + } else if (switch_test_flag(tech_pvt, TFLAG_LATE_NEGOTIATION) && !switch_channel_test_flag(tech_pvt->channel, CF_OUTBOUND)) { + switch_channel_set_variable(channel, SWITCH_ENDPOINT_DISPOSITION_VARIABLE, "DELAYED NEGOTIATION"); } else { - if (switch_channel_test_flag(channel, CF_PROXY_MEDIA) && !switch_channel_test_flag(tech_pvt->channel, CF_OUTBOUND)) { - switch_channel_set_variable(channel, SWITCH_ENDPOINT_DISPOSITION_VARIABLE, "PROXY MEDIA"); - } else if (switch_test_flag(tech_pvt, TFLAG_LATE_NEGOTIATION) && !switch_channel_test_flag(tech_pvt->channel, CF_OUTBOUND)) { - switch_channel_set_variable(channel, SWITCH_ENDPOINT_DISPOSITION_VARIABLE, "DELAYED NEGOTIATION"); - } else { - if (sofia_glue_tech_media(tech_pvt, (char *) r_sdp) != SWITCH_STATUS_SUCCESS) { - switch_channel_set_variable(channel, SWITCH_ENDPOINT_DISPOSITION_VARIABLE, "CODEC NEGOTIATION ERROR"); - nua_respond(nh, SIP_488_NOT_ACCEPTABLE, TAG_END()); - switch_channel_hangup(channel, SWITCH_CAUSE_INCOMPATIBLE_DESTINATION); - } + if (sofia_glue_tech_media(tech_pvt, (char *) r_sdp) != SWITCH_STATUS_SUCCESS) { + switch_channel_set_variable(channel, SWITCH_ENDPOINT_DISPOSITION_VARIABLE, "CODEC NEGOTIATION ERROR"); + nua_respond(nh, SIP_488_NOT_ACCEPTABLE, TAG_END()); + switch_channel_hangup(channel, SWITCH_CAUSE_INCOMPATIBLE_DESTINATION); } - goto done; } + goto done; } } break; @@ -2413,7 +2639,7 @@ nua_ack(nh, TAG_END()); break; case nua_callstate_received: - if (tech_pvt && !switch_test_flag(tech_pvt, TFLAG_SDP)) { + if (!switch_test_flag(tech_pvt, TFLAG_SDP)) { if (r_sdp && !switch_test_flag(tech_pvt, TFLAG_SDP)) { if (switch_channel_test_flag(channel, CF_PROXY_MODE)) { switch_channel_set_variable(channel, SWITCH_ENDPOINT_DISPOSITION_VARIABLE, "RECEIVED_NOMEDIA"); @@ -2546,7 +2772,7 @@ case nua_callstate_early: break; case nua_callstate_completed: - if (tech_pvt && r_sdp) { + if (r_sdp) { sdp_parser_t *parser; sdp_session_t *sdp; uint8_t match = 0, is_ok = 1; @@ -2818,49 +3044,47 @@ break; case nua_callstate_terminating: - if (session) { - if (status == 488 || switch_channel_get_state(channel) == CS_HIBERNATE) { - tech_pvt->q850_cause = SWITCH_CAUSE_MANDATORY_IE_MISSING; - } else if (!switch_test_flag(tech_pvt, TFLAG_BYE)) { - switch_set_flag_locked(tech_pvt, TFLAG_BYE); - } + if (status == 488 || switch_channel_get_state(channel) == CS_HIBERNATE) { + tech_pvt->q850_cause = SWITCH_CAUSE_MANDATORY_IE_MISSING; + } else if (!switch_test_flag(tech_pvt, TFLAG_BYE)) { + switch_set_flag_locked(tech_pvt, TFLAG_BYE); } break; case nua_callstate_terminated: - if (session) { - if (!switch_test_flag(tech_pvt, TFLAG_BYE)) { - switch_set_flag_locked(tech_pvt, TFLAG_BYE); - if (switch_test_flag(tech_pvt, TFLAG_NOHUP)) { - switch_clear_flag_locked(tech_pvt, TFLAG_NOHUP); + if (!switch_test_flag(tech_pvt, TFLAG_BYE)) { + switch_set_flag_locked(tech_pvt, TFLAG_BYE); + if (switch_test_flag(tech_pvt, TFLAG_NOHUP)) { + switch_clear_flag_locked(tech_pvt, TFLAG_NOHUP); + } else { + int cause; + if (tech_pvt->q850_cause) { + cause = tech_pvt->q850_cause; } else { - int cause; - if (tech_pvt->q850_cause) { - cause = tech_pvt->q850_cause; - } else { - cause = sofia_glue_sip_cause_to_freeswitch(status); - } - if (status) { - switch_snprintf(st, sizeof(st), "%d", status); - switch_channel_set_variable(channel, "sip_term_status", st); - switch_snprintf(st, sizeof(st), "sip:%d", status); - switch_channel_set_variable_partner(channel, SWITCH_PROTO_SPECIFIC_HANGUP_CAUSE_VARIABLE, st); - if (phrase) { - switch_channel_set_variable_partner(channel, "sip_hangup_phrase", phrase); - } + cause = sofia_glue_sip_cause_to_freeswitch(status); + } + if (status) { + switch_snprintf(st, sizeof(st), "%d", status); + switch_channel_set_variable(channel, "sip_term_status", st); + switch_snprintf(st, sizeof(st), "sip:%d", status); + switch_channel_set_variable_partner(channel, SWITCH_PROTO_SPECIFIC_HANGUP_CAUSE_VARIABLE, st); + switch_channel_set_variable(channel, SWITCH_PROTO_SPECIFIC_HANGUP_CAUSE_VARIABLE, st); + if (phrase) { + switch_channel_set_variable_partner(channel, "sip_hangup_phrase", phrase); } - switch_snprintf(st, sizeof(st), "%d", cause); - switch_channel_set_variable(channel, "sip_term_cause", st); - switch_channel_hangup(channel, cause); } + switch_snprintf(st, sizeof(st), "%d", cause); + switch_channel_set_variable(channel, "sip_term_cause", st); + switch_channel_hangup(channel, cause); } + } - if (tech_pvt->sofia_private) { - tech_pvt->sofia_private = NULL; - } - - tech_pvt->nh = NULL; + if (tech_pvt->sofia_private) { + tech_pvt->sofia_private = NULL; } + tech_pvt->nh = NULL; + + if (nh) { nua_handle_bind(nh, NULL); nua_handle_destroy(nh); @@ -2897,7 +3121,7 @@ private_object_t *tech_pvt = switch_core_session_get_private(session); switch_channel_t *channel_a = switch_core_session_get_channel(session); - status = switch_ivr_originate(a_session, &tsession, &cause, nhelper->exten, timeout, NULL, NULL, NULL, NULL, SOF_NONE); + status = switch_ivr_originate(a_session, &tsession, &cause, nhelper->exten, timeout, NULL, NULL, NULL, NULL, NULL, SOF_NONE); if ((switch_channel_get_state(channel_a) < CS_HANGUP)) { @@ -2942,6 +3166,7 @@ } /*---------------------------------------*/ + void sofia_handle_sip_i_refer(nua_t *nua, sofia_profile_t *profile, nua_handle_t *nh, switch_core_session_t *session, sip_t const *sip, tagi_t tags[]) { /* Incoming refer */ @@ -2979,6 +3204,7 @@ } if ((refer_to = sip->sip_refer_to)) { + char *rep; full_ref_to = sip_header_as_string(home, (void *) sip->sip_refer_to); if (profile->pflags & PFLAG_FULL_ID) { @@ -2989,10 +3215,9 @@ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Process REFER to [%s@%s]\n", exten, (char *) refer_to->r_url->url_host); - if (refer_to->r_url->url_headers && strstr(refer_to->r_url->url_headers, "Replaces=")) { + if (refer_to->r_url->url_headers && (rep = (char *)switch_stristr("Replaces=", refer_to->r_url->url_headers))) { sip_replaces_t *replaces; nua_handle_t *bnh; - char *rep; if (switch_channel_test_flag(channel_a, CF_PROXY_MODE)) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Cannot Attended Transfer BYPASS MEDIA CALLS!\n"); @@ -3001,13 +3226,18 @@ NUTAG_SUBSTATE(nua_substate_terminated), SIPTAG_PAYLOAD_STR("SIP/2.0 403 Forbidden"), SIPTAG_EVENT_STR(etmp), TAG_END()); goto done; } - - if ((rep = strchr(refer_to->r_url->url_headers, '='))) { + + if (rep) { const char *br_a = NULL, *br_b = NULL; char *buf; + char *p; - rep++; + rep = switch_core_session_strdup(session, rep + 9); + if ((p = strchr(rep, ';'))) { + *p = '\0'; + } + if ((buf = switch_core_session_alloc(session, strlen(rep) + 1))) { rep = url_unescape(buf, (const char *) rep); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Replaces: [%s]\n", rep); @@ -3286,8 +3516,12 @@ int tmp; /* move signal_ptr where we need it (right past Signal=) */ signal_ptr = signal_ptr + 7; - tmp = atoi(signal_ptr); - dtmf.digit = switch_rfc2833_to_char(tmp); + if (*signal_ptr && strlen(signal_ptr) == 1 && is_dtmf(*signal_ptr)) { + dtmf.digit = *signal_ptr; + } else { + tmp = atoi(signal_ptr); + dtmf.digit = switch_rfc2833_to_char(tmp); + } } else { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Bad signal\n"); goto fail; @@ -3296,6 +3530,7 @@ if ((signal_ptr = switch_stristr("Duration=", sip->sip_payload->pl_data))) { int tmp; signal_ptr += 9; + if ((tmp = atoi(signal_ptr)) <= 0) { tmp = switch_core_default_dtmf_duration(0); } @@ -3962,6 +4197,8 @@ free(tmp_name); } } + } else if (!strncasecmp(un->un_name, "History-Info", 12)) { + switch_channel_set_variable(channel, "sip_history_info", un->un_value); } else if (!strncasecmp(un->un_name, "X-", 2) || !strncasecmp(un->un_name, "P-", 2)) { if (!switch_strlen_zero(un->un_value)) { char new_name[512] = ""; Modified: freeswitch/branches/gmaruzz/src/mod/endpoints/mod_sofia/sofia_glue.c ============================================================================== --- freeswitch/branches/gmaruzz/src/mod/endpoints/mod_sofia/sofia_glue.c (original) +++ freeswitch/branches/gmaruzz/src/mod/endpoints/mod_sofia/sofia_glue.c Mon Dec 15 12:56:36 2008 @@ -448,7 +448,9 @@ return status; } - if (!strncasecmp(sourceip, "stun:", 5)) { + if (!strncasecmp(sourceip, "host:", 5)) { + status = (*ip = switch_stun_host_lookup(sourceip + 5, pool)) ? SWITCH_STATUS_SUCCESS : SWITCH_STATUS_FALSE; + } else if (!strncasecmp(sourceip, "stun:", 5)) { char *p; if (!(profile->pflags & PFLAG_STUN_ENABLED)) { @@ -1163,8 +1165,8 @@ ipv6 ? "[" : "", ip_addr, ipv6 ? "]" : "", tech_pvt->profile->tls_sip_port); } else { - tech_pvt->invite_contact = switch_core_session_sprintf(session, "sip:%s@%s%s%s", contact, - ipv6 ? "[" : "", ip_addr, ipv6 ? "]" : ""); + tech_pvt->invite_contact = switch_core_session_sprintf(session, "sip:%s@%s%s%s:%d", contact, + ipv6 ? "[" : "", ip_addr, ipv6 ? "]" : "", tech_pvt->profile->sip_port); } } else { if (sofia_glue_transport_has_tls(tech_pvt->transport)) { @@ -1186,7 +1188,11 @@ or did he just suggest it to make our lives miserable? */ use_from_str = from_str; - from_str = switch_core_session_sprintf(session, "\"%s\" <%s>", tech_pvt->caller_profile->caller_id_name, use_from_str); + if (!strcasecmp(tech_pvt->caller_profile->caller_id_name, "_undef_")) { + from_str = switch_core_session_sprintf(session, "<%s>", use_from_str); + } else { + from_str = switch_core_session_sprintf(session, "\"%s\" <%s>", tech_pvt->caller_profile->caller_id_name, use_from_str); + } if (!(call_id = switch_channel_get_variable(channel, "sip_outgoing_call_id"))) { if (tech_pvt->profile->pflags & PFLAG_UUID_AS_CALLID) { @@ -1813,7 +1819,7 @@ tech_pvt->remote_sdp_audio_port, tech_pvt->agreed_pt, tech_pvt->read_codec.implementation->microseconds_per_packet / 1000); } - switch_snprintf(tmp, sizeof(tmp), "%d", tech_pvt->remote_sdp_audio_port); + switch_snprintf(tmp, sizeof(tmp), "%d", tech_pvt->local_sdp_audio_port); switch_channel_set_variable(tech_pvt->channel, SWITCH_LOCAL_MEDIA_IP_VARIABLE, tech_pvt->adv_sdp_audio_ip); switch_channel_set_variable(tech_pvt->channel, SWITCH_LOCAL_MEDIA_PORT_VARIABLE, tmp); @@ -2191,6 +2197,16 @@ switch_set_flag_locked(tech_pvt, TFLAG_BUGGY_2833); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Activate Buggy RFC2833 Mode!\n"); } + + if (strstr(tech_pvt->origin, "Sonus_UAC")) { + switch_set_flag_locked(tech_pvt, TFLAG_BUGGY_2833); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, + "Hello,\nI see you have a Sonus!\n" + "FYI, Sonus cannot follow the RFC on the proper way to send DTMF.\n" + "Sadly, my creator had to spend several hours figuring this out so I thought you'd like to know that!\n" + "Don't worry, DTMF will work but you may want to ask them to fix it......\n" + ); + } } if ((m = sdp->sdp_media) && (m->m_mode == sdp_sendonly || m->m_mode == sdp_inactive)) { @@ -2823,6 +2839,19 @@ " hostname VARCHAR(255)\n" ");\n"; + + char pres_sql[] = + "CREATE TABLE sip_presence (\n" + " sip_user VARCHAR(255),\n" + " sip_host VARCHAR(255),\n" + " status VARCHAR(255),\n" + " rpid VARCHAR(255),\n" + " expires INTEGER,\n" + " user_agent VARCHAR(255),\n" + " profile_name VARCHAR(255),\n" + " hostname VARCHAR(255)\n" + ");\n"; + char dialog_sql[] = "CREATE TABLE sip_dialogs (\n" " call_id VARCHAR(255),\n" @@ -2906,6 +2935,13 @@ switch_odbc_handle_exec(profile->master_odbc, dialog_sql, NULL); } + test_sql = switch_mprintf("delete from sip_presence where hostname='%q'", mod_sofia_globals.hostname); + + if (switch_odbc_handle_exec(profile->master_odbc, test_sql, NULL) != SWITCH_ODBC_SUCCESS) { + switch_odbc_handle_exec(profile->master_odbc, "DROP TABLE sip_presence", NULL); + switch_odbc_handle_exec(profile->master_odbc, pres_sql, NULL); + } + free(test_sql); test_sql = switch_mprintf("delete from sip_authentication where hostname='%q'", mod_sofia_globals.hostname); @@ -2937,6 +2973,11 @@ test_sql = switch_mprintf("delete from sip_dialogs where hostname='%q'", mod_sofia_globals.hostname); switch_core_db_test_reactive(profile->master_db, test_sql, "DROP TABLE sip_dialogs", dialog_sql); free(test_sql); + + test_sql = switch_mprintf("delete from sip_presence where hostname='%q'", mod_sofia_globals.hostname); + switch_core_db_test_reactive(profile->master_db, test_sql, "DROP TABLE sip_presence", pres_sql); + free(test_sql); + test_sql = switch_mprintf("delete from sip_authentication where hostname='%q'", mod_sofia_globals.hostname); switch_core_db_test_reactive(profile->master_db, test_sql, "DROP TABLE sip_authentication", auth_sql); free(test_sql); Modified: freeswitch/branches/gmaruzz/src/mod/endpoints/mod_sofia/sofia_presence.c ============================================================================== --- freeswitch/branches/gmaruzz/src/mod/endpoints/mod_sofia/sofia_presence.c (original) +++ freeswitch/branches/gmaruzz/src/mod/endpoints/mod_sofia/sofia_presence.c Mon Dec 15 12:56:36 2008 @@ -34,6 +34,8 @@ */ #include "mod_sofia.h" +#define SUB_OVERLAP 300 + static int sofia_presence_mwi_callback(void *pArg, int argc, char **argv, char **columnNames); static int sofia_presence_mwi_callback2(void *pArg, int argc, char **argv, char **columnNames); static int sofia_presence_sub_reg_callback(void *pArg, int argc, char **argv, char **columnNames); @@ -315,6 +317,7 @@ { sofia_profile_t *profile = NULL; switch_hash_index_t *hi; + const void *var; void *val; char *from = switch_event_get_header(event, "from"); char *proto = switch_event_get_header(event, "proto"); @@ -336,29 +339,15 @@ if (status && !strcasecmp(status, "n/a")) { status = NULL; } + + if (status && switch_stristr("CS_HANGUP", status)) { + status = "Call Ended"; + } if (rpid) { rpid = sofia_presence_translate_rpid(rpid, status); } - - if (!status) { - status = "Available"; - - if (rpid) { - if (!strcasecmp(rpid, "busy")) { - status = "Busy"; - } else if (!strcasecmp(rpid, "unavailable")) { - status = "Idle"; - } else if (!strcasecmp(rpid, "away")) { - status = "Idle"; - } - } - } - - if (!rpid) { - rpid = "unknown"; - } - + if (event->event_id == SWITCH_EVENT_ROSTER) { struct presence_helper helper = { 0 }; @@ -367,21 +356,47 @@ if (from) { sql = switch_mprintf( - "select proto,sip_user,sip_host,sub_to_user,sub_to_host,event,contact,call_id,full_from," - "full_via,expires,user_agent,accept,profile_name" - ",1,'%q','%q' from sip_subscriptions where event='presence' and full_from like '%%%q%%'", status, rpid, from); + "select sip_subscriptions.proto,sip_subscriptions.sip_user,sip_subscriptions.sip_host," + "sip_subscriptions.sub_to_user,sip_subscriptions.sub_to_host,sip_subscriptions.event," + "sip_subscriptions.contact,sip_subscriptions.call_id,sip_subscriptions.full_from," + "sip_subscriptions.full_via,sip_subscriptions.expires,sip_subscriptions.user_agent," + "sip_subscriptions.accept,sip_subscriptions.profile_name" + ",1,'%q','%q',sip_presence.status,sip_presence.rpid " + "from sip_subscriptions left join sip_presence on " + "(sip_subscriptions.sub_to_user=sip_presence.sip_user and sip_subscriptions.sub_to_host=sip_presence.sip_host and " + "sip_subscriptions.profile_name=sip_presence.profile_name) " + "where sip_subscriptions.event='presence' and sip_subscriptions.full_from like '%%%q%%'", + switch_str_nil(status), switch_str_nil(rpid), from); } else { - sql = switch_mprintf("select proto,sip_user,sip_host,sub_to_user,sub_to_host,event,contact,call_id,full_from," - "full_via,expires,user_agent,accept,profile_name" - ",1,'%q','%q' from sip_subscriptions where event='presence'", status, rpid); + sql = switch_mprintf( + "select sip_subscriptions.proto,sip_subscriptions.sip_user,sip_subscriptions.sip_host," + "sip_subscriptions.sub_to_user,sip_subscriptions.sub_to_host,sip_subscriptions.event," + "sip_subscriptions.contact,sip_subscriptions.call_id,sip_subscriptions.full_from," + "sip_subscriptions.full_via,sip_subscriptions.expires,sip_subscriptions.user_agent," + "sip_subscriptions.accept,sip_subscriptions.profile_name" + ",1,'%q','%q',sip_presence.status,sip_presence.rpid " + "from sip_subscriptions left join sip_presence on " + "(sip_subscriptions.sub_to_user=sip_presence.sip_user and sip_subscriptions.sub_to_host=sip_presence.sip_host and " + "sip_subscriptions.profile_name=sip_presence.profile_name) " + "where sip_subscriptions.event='presence'", switch_str_nil(status), switch_str_nil(rpid)); } switch_assert(sql != NULL); switch_mutex_lock(mod_sofia_globals.hash_mutex); for (hi = switch_hash_first(NULL, mod_sofia_globals.profile_hash); hi; hi = switch_hash_next(hi)) { - switch_hash_this(hi, NULL, NULL, &val); + switch_hash_this(hi, &var, NULL, &val); profile = (sofia_profile_t *) val; + + if (strcmp((char *)var, profile->name)) { + if (mod_sofia_globals.debug_presence > 0) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "%s is an alias, skipping\n", (char *) var); + } + continue; + } if (profile->pres_type != PRES_TYPE_FULL) { + if (mod_sofia_globals.debug_presence > 0) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "%s is passive, skipping\n", (char *) var); + } continue; } helper.profile = profile; @@ -421,6 +436,7 @@ return; } + switch (event->event_id) { case SWITCH_EVENT_PRESENCE_PROBE: if (proto) { @@ -442,15 +458,31 @@ if (probe_euser && probe_host && (profile = sofia_glue_find_profile(probe_host))) { sql = switch_mprintf("select sip_registrations.sip_user, '%q', sip_registrations.status, " "sip_registrations.rpid,'', sip_dialogs.uuid, sip_dialogs.state, sip_dialogs.direction, " - "sip_dialogs.sip_to_user, sip_dialogs.sip_to_host " + "sip_dialogs.sip_to_user, sip_dialogs.sip_to_host, sip_presence.status,sip_presence.rpid " "from sip_registrations left join sip_dialogs on " - "(sip_dialogs.sip_from_user = sip_registrations.sip_user) " - "and sip_dialogs.sip_from_host = sip_registrations.sip_host " + "(sip_dialogs.sip_from_user = sip_registrations.sip_user " + "and sip_dialogs.sip_from_host = sip_registrations.sip_host) " + "left join sip_presence on " + "(sip_registrations.sip_user=sip_presence.sip_user and sip_registrations.sip_host=sip_presence.sip_host and " + "sip_registrations.profile_name=sip_presence.profile_name) " "where sip_registrations.sip_user='%q' and " "(sip_registrations.sip_host='%q' or sip_registrations.presence_hosts like '%%%q%%')", probe_host, probe_euser, probe_host, probe_host); switch_assert(sql); + + + if (mod_sofia_globals.debug_presence > 0) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "%s START_PRESENCE_PROBE_SQL\n", profile->name); + } + + if (mod_sofia_globals.debug_presence > 1) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "%s DUMP PRESENCE_PROBE_SQL:\n%s\n", profile->name, sql); + } + sofia_glue_execute_sql_callback(profile, SWITCH_FALSE, profile->ireg_mutex, sql, sofia_presence_resub_callback, profile); + if (mod_sofia_globals.debug_presence > 0) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "%s END_PRESENCE_PROBE_SQL\n\n", profile->name); + } sofia_glue_release_profile(profile); switch_safe_free(sql); @@ -460,64 +492,100 @@ switch_safe_free(probe_user); } return; - case SWITCH_EVENT_PRESENCE_IN: - sql = switch_mprintf("select proto,sip_user,sip_host,sub_to_user,sub_to_host,event,contact,call_id,full_from," - "full_via,expires,user_agent,accept,profile_name" - ",1,'%q','%q','%q' from sip_subscriptions where (event='%q' or event='%q') and sub_to_user='%q' " - "and (sub_to_host='%q' or presence_hosts like '%%%q%%')", - status, rpid, host, event_type, alt_event_type, euser, host, host); - break; - case SWITCH_EVENT_PRESENCE_OUT: - sql = switch_mprintf("select proto,sip_user,sip_host,sub_to_user,sub_to_host,event,contact,call_id,full_from," - "full_via,expires,user_agent,accept,profile_name" - ",0,'%q','%q','%q' from sip_subscriptions where (event='%q' or event='%q') " - "and sub_to_user='%q' and (sub_to_host='%q' or presence_hosts like '%%%q%%')", - status, rpid, host, event_type, alt_event_type, euser, host, host); - break; default: break; } + + if (!mod_sofia_globals.profile_hash) goto done; switch_mutex_lock(mod_sofia_globals.hash_mutex); for (hi = switch_hash_first(NULL, mod_sofia_globals.profile_hash); hi; hi = switch_hash_next(hi)) { - switch_hash_this(hi, NULL, NULL, &val); + switch_hash_this(hi, &var, NULL, &val); profile = (sofia_profile_t *) val; + + if (strcmp((char *)var, profile->name)) { + if (mod_sofia_globals.debug_presence > 0) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "%s is an alias, skipping\n", (char *) var); + } + continue; + } + if (profile->pres_type != PRES_TYPE_FULL) { + if (mod_sofia_globals.debug_presence > 0) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "%s is passive, skipping\n", (char *) var); + } continue; } + + + if ((sql = switch_mprintf( + + "select sip_subscriptions.proto,sip_subscriptions.sip_user,sip_subscriptions.sip_host," + "sip_subscriptions.sub_to_user,sip_subscriptions.sub_to_host,sip_subscriptions.event," + "sip_subscriptions.contact,sip_subscriptions.call_id,sip_subscriptions.full_from," + "sip_subscriptions.full_via,sip_subscriptions.expires,sip_subscriptions.user_agent," + "sip_subscriptions.accept,sip_subscriptions.profile_name" + ",'%q','%q','%q',sip_presence.status,sip_presence.rpid " + "from sip_subscriptions " + "left join sip_presence on " + "(sip_subscriptions.sub_to_user=sip_presence.sip_user and sip_subscriptions.sub_to_host=sip_presence.sip_host and " + "sip_subscriptions.profile_name=sip_presence.profile_name) " + "where (event='%q' or event='%q') and sub_to_user='%q' " + "and (sub_to_host='%q' or presence_hosts like '%%%q%%') " + "and (sip_subscriptions.profile_name = '%q' or sip_subscriptions.presence_hosts != sip_subscriptions.sub_to_host)", + switch_str_nil(status), switch_str_nil(rpid), host, event_type, alt_event_type, euser, host, host, profile->name))) { - if (sql) { struct presence_helper helper = { 0 }; helper.profile = profile; helper.event = event; SWITCH_STANDARD_STREAM(helper.stream); switch_assert(helper.stream.data); + + if (mod_sofia_globals.debug_presence > 0) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "%s START_PRESENCE_SQL (%s)\n", + event->event_id == SWITCH_EVENT_PRESENCE_IN ? "IN" : "OUT", profile->name); + } + + if (mod_sofia_globals.debug_presence > 1) { + char *buf; + switch_event_serialize(event, &buf, SWITCH_FALSE); + switch_assert(buf); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "DUMP PRESENCE SQL:\n%s\nEVENT DUMP:\n%s\n", sql, buf); + free(buf); + } sofia_glue_execute_sql_callback(profile, SWITCH_FALSE, NULL, sql, sofia_presence_sub_callback, &helper); + if (mod_sofia_globals.debug_presence > 0) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "%s END_PRESENCE_SQL (%s)\n", + event->event_id == SWITCH_EVENT_PRESENCE_IN ? "IN" : "OUT", profile->name); + } + + switch_safe_free(sql); + if (!switch_strlen_zero((char *) helper.stream.data)) { - char *this = (char *) helper.stream.data; + char *this_sql = (char *) helper.stream.data; char *next = NULL; char *last = NULL; do { - if ((next = strchr(this, ';'))) { + if ((next = strchr(this_sql, ';'))) { *next++ = '\0'; while (*next == '\n' || *next == ' ' || *next == '\r') { *next++ = '\0'; } } - if (!switch_strlen_zero(this) && (!last || strcmp(last, this))) { - sofia_glue_execute_sql(profile, &this, SWITCH_FALSE); - last = this; + if (!switch_strlen_zero(this_sql) && (!last || strcmp(last, this_sql))) { + sofia_glue_execute_sql(profile, &this_sql, SWITCH_FALSE); + last = this_sql; } - this = next; - } while (this); + this_sql = next; + } while (this_sql); } switch_safe_free(helper.stream.data); helper.stream.data = NULL; @@ -555,14 +623,13 @@ while (mod_sofia_globals.running == 1) { int count = 0; - + if (switch_queue_trypop(mod_sofia_globals.presence_queue, &pop) == SWITCH_STATUS_SUCCESS) { switch_event_t *event = (switch_event_t *) pop; if (!pop) { break; } - actual_sofia_presence_event_handler(event); switch_event_destroy(&event); count++; @@ -664,7 +731,6 @@ char *user = argv[1]; char *host = argv[2]; switch_event_t *event; - char *status = NULL; char *event_name = argv[5]; if (!strcasecmp(event_name, "message-summary")) { @@ -676,14 +742,10 @@ return 0; } - if (switch_strlen_zero(status)) { - status = "Available"; - } if (switch_event_create(&event, SWITCH_EVENT_PRESENCE_PROBE) == SWITCH_STATUS_SUCCESS) { switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "proto", SOFIA_CHAT_PROTO); switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "login", profile->url); switch_event_add_header(event, SWITCH_STACK_BOTTOM, "from", "%s@%s", user, host); - switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "status", status); switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "event_type", "presence"); switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "event_subtype", "probe"); switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "proto-specific-event-name", event_name); @@ -701,6 +763,7 @@ char *status = argv[2]; char *rpid = argv[3]; char *proto = argv[4]; + char *to_user = NULL; char *uuid = NULL; char *state = NULL; @@ -717,12 +780,20 @@ switch_url_decode(to_buf); to_user = to_buf; } + if (argc > 10 && !switch_strlen_zero(argv[9]) && !switch_strlen_zero(argv[10])) { + status = argv[9]; + rpid = argv[10]; + } } if (switch_strlen_zero(proto)) { proto = NULL; } + if (mod_sofia_globals.debug_presence > 0) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "%s PRESENCE_PROBE %s@%s\n", profile->name, user, host); + } + if (switch_event_create(&event, SWITCH_EVENT_PRESENCE_IN) == SWITCH_STATUS_SUCCESS) { switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "proto", proto ? proto : SOFIA_CHAT_PROTO); switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "login", profile->url); @@ -736,7 +807,7 @@ if (!switch_strlen_zero(to_user)) { switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "to-user", to_user); } - + if (switch_strlen_zero(state)) { switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "unique-id", SOFIA_CHAT_PROTO); switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "channel-state", "CS_HANGUP"); @@ -832,9 +903,9 @@ " <rpid:activities>\r\n" " <rpid:%s/>\n" " </rpid:activities>\n" - " <dm:note>%s</dm:note>" + " <dm:note>%s</dm:note>\n" " </dm:person>\n" - "</presence>", id, prpid, rpid, status); + "</presence>", id, open, prpid, status); } } @@ -843,31 +914,55 @@ struct presence_helper *helper = (struct presence_helper *) pArg; char *pl = NULL; char *clean_id = NULL, *id = NULL; - uint32_t in = atoi(argv[14]); - char *status = argv[15]; - char *rpid = argv[16]; - char *proto = argv[0]; char *user = argv[1]; char *host = argv[2]; char *sub_to_user = argv[3]; - char *sub_to_host = argv[17]; char *event = argv[5]; char *call_id = argv[7]; char *expires = argv[10]; char *user_agent = argv[11]; char *profile_name = argv[13]; + uint32_t in = 0; + char *status = argv[14]; + char *rpid = argv[15]; + char *sub_to_host = argv[16]; + nua_handle_t *nh; char *to = NULL; char *open; char *prpid; - int done = 0; const char *ct = "no/idea"; time_t exptime = switch_timestamp(NULL) + 3600; - char exp[80] = ""; int is_dialog = 0; sofia_profile_t *ext_profile = NULL, *profile = helper->profile; + char sstr[128] = ""; + int kill_handle = 0; + char expires_str[10] = ""; + + if (argc > 18 && !switch_strlen_zero(argv[17]) && !switch_strlen_zero(argv[18])) { + status = argv[17]; + rpid = argv[18]; + } + + in = helper->event && helper->event->event_id == SWITCH_EVENT_PRESENCE_IN; + + if (switch_strlen_zero(rpid)) { + rpid = "unknown"; + } + + if (switch_strlen_zero(status)) { + if (!strcasecmp(rpid, "busy")) { + status = "Busy"; + } else if (!strcasecmp(rpid, "unavailable")) { + status = "Idle"; + } else if (!strcasecmp(rpid, "away")) { + status = "Idle"; + } else { + status = "Available"; + } + } if (profile_name && strcasecmp(profile_name, helper->profile->name)) { if ((ext_profile = sofia_glue_find_profile(profile_name))) { @@ -875,35 +970,37 @@ } } - + if (!(nh = nua_handle_by_call_id(profile->nua, call_id))) { + goto end; + } + if (expires) { long tmp = atol(expires); if (tmp > 0) { - exptime = tmp - switch_timestamp(NULL); + exptime = tmp - switch_timestamp(NULL) - SUB_OVERLAP; + } else { + exptime = tmp; } } - - if (!(nh = nua_handle_by_call_id(profile->nua, call_id))) { - goto end; - } - + if (!rpid) { rpid = "unknown"; } prpid = translate_rpid(rpid); - if (in < 0) { - done = 1; - in = 0; - } - if (!strcasecmp(proto, SOFIA_CHAT_PROTO)) { clean_id = switch_mprintf("sip:%s@%s", sub_to_user, sub_to_host); } else { clean_id = switch_mprintf("sip:%s+%s@%s", proto, sub_to_user, sub_to_host); } + if (mod_sofia_globals.debug_presence > 0) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, + "SEND PRESENCE\nTo: \t%s@%s\nFrom: \t%s@%s\nCall-ID: \t%s\nProfile:\t%s [%s]\n\n", + user, host, sub_to_user, sub_to_host, call_id, profile_name, helper->profile->name); + } + if (!strcasecmp(sub_to_host, host)) { /* same host */ id = switch_mprintf("sip:%s+%s@%s", proto, sub_to_user, sub_to_host); @@ -1058,6 +1155,9 @@ if (!is_dialog) { char status_line[256] = ""; + + switch_set_string(status_line, status); + if (in) { if (!strcmp(astate, "early")) { switch_snprintf(status_line, sizeof(status_line), "Ring %s", switch_str_nil(from_id)); @@ -1073,19 +1173,11 @@ } if (switch_strlen_zero(from_id)) { - switch_snprintf(status_line, sizeof(status_line), "On The Phone"); + switch_snprintf(status_line, sizeof(status_line), "On The Phone %s", status); } else { switch_snprintf(status_line, sizeof(status_line), "Talk %s", switch_str_nil(from_id)); } rpid = "on-the-phone"; - } else if (!strcmp(astate, "terminated")) { - if (!strcasecmp(rpid, "on-the-phone")) { - switch_snprintf(status_line, sizeof(status_line), "Dialing"); - } else { - switch_snprintf(status_line, sizeof(status_line), "Available"); - } - } else { - switch_set_string(status_line, status); } open = "open"; @@ -1093,14 +1185,10 @@ open = "closed"; } - if (!strncasecmp(status_line, "registered", 10)) { - switch_snprintf(status_line, sizeof(status_line), "Available"); - } - prpid = translate_rpid(rpid); pl = gen_pidf(user_agent, clean_id, profile->url, open, rpid, prpid, status_line, &ct); } - + } else { if (in) { open = "open"; @@ -1111,9 +1199,25 @@ pl = gen_pidf(user_agent, clean_id, profile->url, open, rpid, prpid, status, &ct); } - switch_snprintf(exp, sizeof(exp), "active;expires=%ld", (long) exptime); nua_handle_bind(nh, &mod_sofia_globals.keep_private); - nua_notify(nh, SIPTAG_SUBSCRIPTION_STATE_STR(exp), SIPTAG_EVENT_STR(event), SIPTAG_CONTENT_TYPE_STR(ct), SIPTAG_PAYLOAD_STR(pl), TAG_END()); + + if (helper->event && helper->event->event_id == SWITCH_EVENT_PRESENCE_OUT) { + switch_set_string(sstr, "terminated;reason=noresource"); + switch_set_string(expires_str, "0"); + kill_handle = 1; + } else if (exptime > 0) { + switch_snprintf(sstr, sizeof(sstr), "active;expires=%u", (unsigned)exptime); + } else { + unsigned delta = (unsigned) (exptime * -1); + switch_snprintf(sstr, sizeof(sstr), "active;expires=%u", delta); + switch_snprintf(expires_str, sizeof(expires_str), "%u", delta); + nua_dialog_usage_set_refresh_range(nh->nh_ds->ds_usage, delta, delta); + } + + nua_notify(nh, + TAG_IF(*expires_str, SIPTAG_EXPIRES_STR(expires_str)), + SIPTAG_SUBSCRIPTION_STATE_STR(sstr), + SIPTAG_EVENT_STR(event), SIPTAG_CONTENT_TYPE_STR(ct), SIPTAG_PAYLOAD_STR(pl), TAG_END()); end: @@ -1126,6 +1230,10 @@ switch_safe_free(pl); switch_safe_free(to); + if (nh && kill_handle) { + nua_handle_destroy(nh); + } + return 0; } @@ -1138,7 +1246,6 @@ char *expires = argv[10]; char *profile_name = argv[13]; char *body = argv[14]; - char *exp; char *id = NULL; nua_handle_t *nh; int expire_sec = atoi(expires); @@ -1163,14 +1270,12 @@ if (expire_sec < 0) { expire_sec = 3600; } - exp = switch_mprintf("active;expires=%ld", expire_sec); + nua_handle_bind(nh, &mod_sofia_globals.keep_private); - nua_notify(nh, - SIPTAG_SUBSCRIPTION_STATE_STR(exp), + nua_notify(nh, SIPTAG_SUBSCRIPTION_STATE_STR("active"), SIPTAG_EVENT_STR(event), SIPTAG_CONTENT_TYPE_STR("application/simple-message-summary"), SIPTAG_PAYLOAD_STR(body), TAG_END()); switch_safe_free(id); - switch_safe_free(exp); h->total++; @@ -1267,7 +1372,8 @@ tagi_t tags[]) { if (sip) { - long exp, exp_raw; + long exp_abs, exp_delta; + char exp_delta_str[30] = ""; sip_to_t const *to = sip->sip_to; sip_from_t const *from = sip->sip_from; sip_contact_t const *contact = sip->sip_contact; @@ -1460,10 +1566,18 @@ call_id = sip->sip_call_id->i_id; full_from = sip_header_as_string(profile->home, (void *) sip->sip_from); full_via = sip_header_as_string(profile->home, (void *) sip->sip_via); + + exp_delta = profile->force_subscription_expires ? profile->force_subscription_expires : (sip->sip_expires ? sip->sip_expires->ex_delta : 3600); + + if (exp_delta) { + exp_abs = (long) switch_timestamp(NULL) + exp_delta; + } else { + exp_abs = 0; + sub_state = nua_substate_terminated; + } - exp_raw = (sip->sip_expires ? sip->sip_expires->ex_delta : 3600); - exp = (long) switch_timestamp(NULL) + exp_raw; - + switch_snprintf(exp_delta_str, sizeof(exp_delta_str), "%ld", exp_delta); + if (sofia_test_pflag(profile, PFLAG_MULTIREG)) { sql = switch_mprintf("delete from sip_subscriptions where call_id='%q'", call_id); } else { @@ -1486,37 +1600,76 @@ switch_snprintf(accept + strlen(accept), sizeof(accept) - strlen(accept), "%s%s ", ap->ac_type, ap->ac_next ? "," : ""); ap = ap->ac_next; } + + /* negative in exptime means keep bumping up sub time to avoid a snafu where every device has it's own rules about subscriptions + that somehow barely resemble the RFC not that I blame them because the RFC MAY be amibiguous and SHOULD be deleted. + So to avoid the problem we keep resetting the expiration date of the subscription so it never expires. + + Eybeam completely ignores this option and most other subscription-state: directives from rfc3265 and still expires. + Polycom is happy to keep upping the subscription expiry back to the original time on each new notify. + The rest ... who knows...? + + */ + sql = switch_mprintf("insert into sip_subscriptions " "(proto,sip_user,sip_host,sub_to_user,sub_to_host,presence_hosts,event,contact,call_id,full_from," "full_via,expires,user_agent,accept,profile_name,hostname) " "values ('%q','%q','%q','%q','%q','%q','%q','%q','%q','%q','%q',%ld,'%q','%q','%q','%q')", proto, from_user, from_host, to_user, to_host, profile->presence_hosts ? profile->presence_hosts : to_host, - event, contact_str, call_id, full_from, full_via, exp, full_agent, accept, profile->name,mod_sofia_globals.hostname); + event, contact_str, call_id, full_from, full_via, + + exp_delta * -1, + //exp_abs + SUB_OVERLAP, + + full_agent, accept, profile->name,mod_sofia_globals.hostname); + if (mod_sofia_globals.debug_presence > 0) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "%s SUBSCRIBE %s@%s %s@%s\n", profile->name, from_user, from_host, to_user, to_host); + } + switch_assert(sql != NULL); sofia_glue_execute_sql(profile, &sql, SWITCH_TRUE); - sstr = switch_mprintf("active;expires=%ld", exp_raw); + sstr = switch_mprintf("active;expires=%ld", exp_delta); } switch_mutex_unlock(profile->ireg_mutex); if (status < 200) { char *sticky = NULL; - + char *contactstr = profile->url; + if (is_nat) { + char params[128] = ""; + if (contact->m_url->url_params) { + switch_snprintf(params, sizeof(params), ";%s", contact->m_url->url_params); + } ipv6 = strchr(network_ip, ':'); - sticky = switch_mprintf("sip:%s@%s%s%s:%d", + sticky = switch_mprintf("sip:%s@%s%s%s:%d%s", contact_user, ipv6 ? "[" : "", network_ip, ipv6 ? "]" : "", - network_port); + network_port, + params); + } + + if (switch_stristr("port=tcp", contact->m_url->url_params)) { + contactstr = profile->tcp_contact; + } else if (switch_stristr("port=tls", contact->m_url->url_params)) { + contactstr = profile->tls_contact; } - nua_respond(nh, SIP_202_ACCEPTED, NUTAG_WITH_THIS(nua), SIPTAG_SUBSCRIPTION_STATE_STR(sstr), TAG_IF(sticky, NUTAG_PROXY(sticky)), - TAG_END()); + + + nua_dialog_usage_set_refresh_range(nh->nh_ds->ds_usage, exp_delta + SUB_OVERLAP, exp_delta + SUB_OVERLAP); + + + nua_respond(nh, SIP_202_ACCEPTED, SIPTAG_CONTACT_STR(contact_str), NUTAG_WITH_THIS(nua), + SIPTAG_SUBSCRIPTION_STATE_STR(sstr), + SIPTAG_EXPIRES_STR(exp_delta_str), + TAG_IF(sticky, NUTAG_PROXY(sticky)), TAG_END()); switch_safe_free(sticky); @@ -1526,9 +1679,9 @@ #if 0 nua_notify(nh, - NUTAG_NEWSUB(1), SIPTAG_SUBSCRIPTION_STATE_STR(sstr), SIPTAG_EVENT_STR(event), - SIPTAG_CONTENT_TYPE_STR("application/simple-message-summary"), + SIPTAG_EXPIRES_STR(exp_delta_str), + SIPTAG_CONTENT_TYPE_STR("application/notice"), SIPTAG_PAYLOAD_STR("Note: Come to ClueCon http://www.cluecon.com\n\n"), TAG_END()); #endif @@ -1569,12 +1722,66 @@ } } +sofia_gateway_subscription_t *sofia_find_gateway_subscription(sofia_gateway_t *gateway_ptr, const char *event) { + sofia_gateway_subscription_t *gw_sub_ptr; + for (gw_sub_ptr = gateway_ptr->subscriptions; gw_sub_ptr; gw_sub_ptr = gw_sub_ptr->next) { + if (!strcasecmp(gw_sub_ptr->event, event)) { + /* this is the gateway subscription we are interested in */ + return gw_sub_ptr; + } + } + return NULL; +} + void sofia_presence_handle_sip_r_subscribe(int status, char const *phrase, nua_t *nua, sofia_profile_t *profile, nua_handle_t *nh, sofia_private_t *sofia_private, sip_t const *sip, tagi_t tags[]) { + sip_event_t const *o = NULL; + sofia_gateway_subscription_t *gw_sub_ptr; + + if (!sip) { + return; + } + tl_gets(tags, SIPTAG_EVENT_REF(o), TAG_END()); + /* o->o_type: message-summary (for example) */ + if (!o) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Event information not given\n"); + return; + } + + if (!sofia_private || !sofia_private->gateway) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Gateway information missing\n"); + return; + } + + /* Find the subscription if one exists */ + if (!(gw_sub_ptr = sofia_find_gateway_subscription(sofia_private->gateway, o->o_type))) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Could not find gateway subscription. Gateway: %s. Subscription Event: %s\n", + sofia_private->gateway->name, o->o_type); + return; + } + + /* Update the subscription status for the subscription */ + switch (status) { + case 200: + /* TODO: in the spec it is possible for the other side to change the original expiry time, + * this needs to be researched (eg, what sip header this information will be in) and implemented. + * Although, since it seems the sofia stack is pretty much handling the subscription expiration + * anyway, then maybe its not even worth bothering. + */ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "got 200 OK response, updated state to SUB_STATE_SUBSCRIBE.\n"); + gw_sub_ptr->state = SUB_STATE_SUBSCRIBE; + break; + case 100: + break; + default: + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "status (%d) != 200, updated state to SUB_STATE_FAILED.\n", status); + gw_sub_ptr->state = SUB_STATE_FAILED; + break; + } } void sofia_presence_handle_sip_i_publish(nua_t *nua, sofia_profile_t *profile, nua_handle_t *nh, sofia_private_t *sofia_private, sip_t const *sip, @@ -1598,10 +1805,16 @@ switch_event_t *event; uint8_t in = 0; char *sql; + char *full_agent = NULL; + long exp, exp_delta; if ((xml = switch_xml_parse_str(payload->pl_data, strlen(payload->pl_data)))) { char *status_txt = "", *note_txt = ""; + if (sip->sip_user_agent) { + full_agent = sip_header_as_string(profile->home, (void *) sip->sip_user_agent); + } + if ((tuple = switch_xml_child(xml, "tuple")) && (status = switch_xml_child(tuple, "status")) && (basic = switch_xml_child(status, "basic"))) { status_txt = basic->txt; @@ -1611,7 +1824,7 @@ note_txt = note->txt; } - if (person && (act = switch_xml_child(person, "rpid:activities"))) { + if (person && (act = switch_xml_child(person, "rpid:activities")) && act->child && act->child->name) { if ((rpid = strchr(act->child->name, ':'))) { rpid++; } else { @@ -1630,12 +1843,24 @@ } } + exp_delta = (sip->sip_expires ? sip->sip_expires->ex_delta : 3600); + exp = (long) switch_timestamp(NULL) + exp_delta; + if ((sql = - switch_mprintf("update sip_registrations set status='%q',rpid='%q' where sip_user='%q' and sip_host='%q'", - note_txt, rpid, from_user, from_host))) { + switch_mprintf("delete from sip_presence where sip_user='%q' and sip_host='%q' " + " and profile_name='%q' and hostname='%q'", + from_user, from_host, profile->name, mod_sofia_globals.hostname + ))) { sofia_glue_execute_sql(profile, &sql, SWITCH_TRUE); } - + + if ((sql = + switch_mprintf("insert into sip_presence (sip_user, sip_host, status, rpid, expires, user_agent, profile_name, hostname) " + "values ('%q','%q','%q','%q',%ld,'%q','%q','%q')", + from_user, from_host, note_txt, rpid, exp, full_agent, profile->name, mod_sofia_globals.hostname))) { + sofia_glue_execute_sql(profile, &sql, SWITCH_TRUE); + } + event_type = sip_header_as_string(profile->home, (void *) sip->sip_event); if (in) { @@ -1643,8 +1868,8 @@ switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "proto", SOFIA_CHAT_PROTO); switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "rpid", rpid); switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "login", profile->url); + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "user-agent", full_agent); switch_event_add_header(event, SWITCH_STACK_BOTTOM, "from", "%s@%s", from_user, from_host); - switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "status", note_txt); switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "event_type", event_type); switch_event_fire(&event); @@ -1654,6 +1879,7 @@ switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "proto", SOFIA_CHAT_PROTO); switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "rpid", rpid); switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "login", profile->url); + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "user-agent", full_agent); switch_event_add_header(event, SWITCH_STACK_BOTTOM, "from", "%s@%s", from_user, from_host); switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "event_type", event_type); @@ -1664,6 +1890,10 @@ if (event_type) { su_free(profile->home, event_type); } + + if (full_agent) { + su_free(profile->home, full_agent); + } switch_xml_free(xml); } } Modified: freeswitch/branches/gmaruzz/src/mod/endpoints/mod_sofia/sofia_reg.c ============================================================================== --- freeswitch/branches/gmaruzz/src/mod/endpoints/mod_sofia/sofia_reg.c (original) +++ freeswitch/branches/gmaruzz/src/mod/endpoints/mod_sofia/sofia_reg.c Mon Dec 15 12:56:36 2008 @@ -77,6 +77,107 @@ } } +void sofia_sub_check_gateway(sofia_profile_t *profile, time_t now) +{ + /* NOTE: A lot of the mechanism in place here for refreshing subscriptions is + * pretty much redundant, as the sofia stack takes it upon itself to + * refresh subscriptions on its own, based on the value of the Expires + * header (which we control in the outgoing subscription request) + */ + sofia_gateway_t *gateway_ptr; + + for (gateway_ptr = profile->gateways; gateway_ptr; gateway_ptr = gateway_ptr->next) { + sofia_gateway_subscription_t *gw_sub_ptr; + + for (gw_sub_ptr = gateway_ptr->subscriptions; gw_sub_ptr; gw_sub_ptr = gw_sub_ptr->next) { + int ss_state = nua_callstate_authenticating; + sub_state_t ostate = gw_sub_ptr->state; + + if (!now) { + gw_sub_ptr->state = ostate = SUB_STATE_UNSUBED; + gw_sub_ptr->expires_str = "0"; + } + + switch (ostate) { + case SUB_STATE_NOSUB: + break; + case SUB_STATE_SUBSCRIBE: + gw_sub_ptr->expires = now + gw_sub_ptr->freq; + gw_sub_ptr->state = SUB_STATE_SUBED; + break; + case SUB_STATE_UNSUBSCRIBE: + gw_sub_ptr->state = SUB_STATE_NOSUB; + + /* not tested .. */ + nua_unsubscribe(gateway_ptr->nh, + NUTAG_URL(gateway_ptr->register_url), + SIPTAG_EVENT_STR(gw_sub_ptr->event), + SIPTAG_ACCEPT_STR(gw_sub_ptr->content_type), + SIPTAG_TO_STR(gateway_ptr->register_from), + SIPTAG_FROM_STR(gateway_ptr->register_from), + SIPTAG_CONTACT_STR(gateway_ptr->register_contact), + TAG_NULL()); + + break; + case SUB_STATE_UNSUBED: + if ((gateway_ptr->nh = nua_handle(gateway_ptr->profile->nua, NULL, + NUTAG_URL(gateway_ptr->register_proxy), + SIPTAG_TO_STR(gateway_ptr->register_to), + NUTAG_CALLSTATE_REF(ss_state), + SIPTAG_FROM_STR(gateway_ptr->register_from), TAG_END()))) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "subscribing to [%s] on gateway [%s]\n", gw_sub_ptr->event, gateway_ptr->name); + } + + gateway_ptr->sofia_private = malloc(sizeof(*gateway_ptr->sofia_private)); + switch_assert(gateway_ptr->sofia_private); + + memset(gateway_ptr->sofia_private, 0, sizeof(*gateway_ptr->sofia_private)); + + gateway_ptr->sofia_private->gateway = gateway_ptr; + nua_handle_bind(gateway_ptr->nh, gateway_ptr->sofia_private); + + if (now) { + nua_subscribe(gateway_ptr->nh, + NUTAG_URL(gateway_ptr->register_url), + SIPTAG_EVENT_STR(gw_sub_ptr->event), + SIPTAG_ACCEPT_STR(gw_sub_ptr->content_type), + SIPTAG_TO_STR(gateway_ptr->register_from), + SIPTAG_FROM_STR(gateway_ptr->register_from), + SIPTAG_CONTACT_STR(gateway_ptr->register_contact), + SIPTAG_EXPIRES_STR(gw_sub_ptr->expires_str), // sofia stack bases its auto-refresh stuff on this + TAG_NULL()); + gw_sub_ptr->retry = now + gw_sub_ptr->retry_seconds; + } else { + nua_unsubscribe(gateway_ptr->nh, + NUTAG_URL(gateway_ptr->register_url), + SIPTAG_EVENT_STR(gw_sub_ptr->event), + SIPTAG_ACCEPT_STR(gw_sub_ptr->content_type), + SIPTAG_FROM_STR(gateway_ptr->register_from), + SIPTAG_TO_STR(gateway_ptr->register_from), + SIPTAG_CONTACT_STR(gateway_ptr->register_contact), + SIPTAG_EXPIRES_STR(gw_sub_ptr->expires_str), + TAG_NULL()); + } + gw_sub_ptr->state = SUB_STATE_TRYING; + break; + + case SUB_STATE_FAILED: + case SUB_STATE_TRYING: + if (gw_sub_ptr->retry && now >= gw_sub_ptr->retry) { + gw_sub_ptr->state = SUB_STATE_UNSUBED; + gw_sub_ptr->retry = 0; + } + break; + default: + if (now >= gw_sub_ptr->expires) { + gw_sub_ptr->state = SUB_STATE_UNSUBED; + } + break; + } + } + } +} + void sofia_reg_check_gateway(sofia_profile_t *profile, time_t now) { sofia_gateway_t *gateway_ptr, *last = NULL; @@ -127,13 +228,18 @@ switch (ostate) { case REG_STATE_NOREG: - gateway_ptr->status = SOFIA_GATEWAY_UP; + if (!gateway_ptr->ping && !gateway_ptr->pinging) { + gateway_ptr->status = SOFIA_GATEWAY_UP; + } break; case REG_STATE_REGISTER: if (profile->debug) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Registered %s\n", gateway_ptr->name); } - if (gateway_ptr->expires > 60) { + + gateway_ptr->failures = 0; + + if (gateway_ptr->freq > 60) { gateway_ptr->expires = now + (gateway_ptr->freq - 15); } else { gateway_ptr->expires = now + (gateway_ptr->freq - 2); @@ -150,7 +256,7 @@ case REG_STATE_UNREGED: gateway_ptr->status = SOFIA_GATEWAY_DOWN; sofia_reg_kill_reg(gateway_ptr, 0); - + if ((gateway_ptr->nh = nua_handle(gateway_ptr->profile->nua, NULL, SIPTAG_CALL_ID_STR(gateway_ptr->uuid_str), NUTAG_URL(gateway_ptr->register_proxy), @@ -188,22 +294,31 @@ NUTAG_REGISTRAR(gateway_ptr->register_proxy), NUTAG_OUTBOUND("no-options-keepalive"), NUTAG_OUTBOUND("no-validate"), NUTAG_KEEPALIVE(0), TAG_NULL()); } - + gateway_ptr->retry = now + gateway_ptr->retry_seconds; gateway_ptr->state = REG_STATE_TRYING; } else { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error registering %s\n", gateway_ptr->name); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error registering %s failure #%d\n", gateway_ptr->name, ++gateway_ptr->failures); gateway_ptr->state = REG_STATE_FAILED; } break; case REG_STATE_FAILED: + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "%s Failed Registration, setting retry to %d seconds.\n", + gateway_ptr->name, gateway_ptr->retry_seconds * (gateway_ptr->failures + 1)); + gateway_ptr->retry = now + (gateway_ptr->retry_seconds * (gateway_ptr->failures + 1)); sofia_reg_kill_reg(gateway_ptr, 0); gateway_ptr->status = SOFIA_GATEWAY_DOWN; - case REG_STATE_TRYING: - if (gateway_ptr->retry && now >= gateway_ptr->retry) { + gateway_ptr->state = REG_STATE_FAIL_WAIT; + break; + case REG_STATE_FAIL_WAIT: + if (!gateway_ptr->retry || now >= gateway_ptr->retry) { gateway_ptr->state = REG_STATE_UNREGED; - gateway_ptr->retry = 0; + } + break; + case REG_STATE_TRYING: + if (!gateway_ptr->retry || now >= gateway_ptr->retry) { + gateway_ptr->state = REG_STATE_FAILED; } break; default: @@ -402,6 +517,16 @@ sofia_glue_actually_execute_sql(profile, SWITCH_FALSE, sql, NULL); + + if (now) { + switch_snprintf(sql, sizeof(sql), "delete from sip_presence where expires > 0 and expires <= %ld and hostname='%s'", + (long) now, mod_sofia_globals.hostname); + } else { + switch_snprintf(sql, sizeof(sql), "delete from sip_presence where expires > 0 and hostname='%s'", mod_sofia_globals.hostname); + } + + sofia_glue_actually_execute_sql(profile, SWITCH_FALSE, sql, NULL); + if (now) { switch_snprintf(sql, sizeof(sql), "delete from sip_authentication where expires > 0 and expires <= %ld and hostname='%s'", (long) now, mod_sofia_globals.hostname); @@ -638,7 +763,7 @@ } if (is_nat && (profile->pflags & PFLAG_RECIEVED_IN_NAT_REG_CONTACT)) { - switch_snprintf(received_data, sizeof(received_data), ";received=\"%s:%d\"", url_ip, network_port); + switch_snprintf(received_data, sizeof(received_data), ";received=%s:%d", url_ip, network_port); } if (contact->m_url->url_params) { @@ -699,7 +824,7 @@ if ((v_contact_str = switch_event_get_header(*v_event, "sip-force-contact"))) { if (*received_data && (profile->pflags & PFLAG_RECIEVED_IN_NAT_REG_CONTACT)) { - switch_snprintf(received_data, sizeof(received_data), ";received=\"%s:%d\"", url_ip, network_port); + switch_snprintf(received_data, sizeof(received_data), ";received=%s:%d", url_ip, network_port); } if (!strcasecmp(v_contact_str, "nat-connectile-dysfunction") || @@ -818,6 +943,8 @@ if (sql) { sofia_glue_execute_sql(profile, &sql, SWITCH_TRUE); } + + switch_mutex_unlock(profile->ireg_mutex); if (switch_event_create_subclass(&s_event, SWITCH_EVENT_CUSTOM, MY_EVENT_REGISTER) == SWITCH_STATUS_SUCCESS) { @@ -828,6 +955,7 @@ switch_event_add_header_string(s_event, SWITCH_STACK_BOTTOM, "contact", contact_str); switch_event_add_header_string(s_event, SWITCH_STACK_BOTTOM, "call-id", call_id); switch_event_add_header_string(s_event, SWITCH_STACK_BOTTOM, "rpid", rpid); + switch_event_add_header_string(s_event, SWITCH_STACK_BOTTOM, "statusd", reg_desc); switch_event_add_header(s_event, SWITCH_STACK_BOTTOM, "expires", "%ld", (long) exptime); switch_event_add_header_string(s_event, SWITCH_STACK_BOTTOM, "to-user", from_user); switch_event_add_header_string(s_event, SWITCH_STACK_BOTTOM, "to-host", from_host); @@ -841,6 +969,20 @@ "Register:\nFrom: [%s@%s]\nContact: [%s]\nExpires: [%ld]\n", to_user, reg_host, contact_str, (long) exptime); } + +#if 0 + if (switch_event_create(&event, SWITCH_EVENT_PRESENCE_IN) == SWITCH_STATUS_SUCCESS) { + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "proto", SOFIA_CHAT_PROTO); + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "rpid", rpid); + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "login", profile->url); + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "user-agent", + (sip && sip->sip_user_agent) ? sip->sip_user_agent->g_string : "unknown"); + switch_event_add_header(event, SWITCH_STACK_BOTTOM, "from", "%s@%s", to_user, reg_host); + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "status", "Registered"); + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "event_type", "presence"); + switch_event_fire(&event); + } +#else if (switch_event_create(&event, SWITCH_EVENT_PRESENCE_PROBE) == SWITCH_STATUS_SUCCESS) { switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "proto", "sip"); switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "login", profile->url); @@ -852,7 +994,35 @@ switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "event_type", "presence"); switch_event_fire(&event); } +#endif + + } else { + + if (switch_event_create(&event, SWITCH_EVENT_PRESENCE_OUT) == SWITCH_STATUS_SUCCESS) { + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "proto", SOFIA_CHAT_PROTO); + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "rpid", rpid); + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "login", profile->url); + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "user-agent", + (sip && sip->sip_user_agent) ? sip->sip_user_agent->g_string : "unknown"); + switch_event_add_header(event, SWITCH_STACK_BOTTOM, "from", "%s@%s", to_user, reg_host); + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "status", "UNRegistered"); + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "event_type", "presence"); + switch_event_fire(&event); + } +#if 0 + if (switch_event_create(&event, SWITCH_EVENT_PRESENCE_OUT) == SWITCH_STATUS_SUCCESS) { + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "proto", "sip"); + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "login", profile->url); + switch_event_add_header(event, SWITCH_STACK_BOTTOM, "from", "%s+%s@%s", SOFIA_CHAT_PROTO, to_user, reg_host); + + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "status", "unavailable"); + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "rpid", rpid); + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "event_type", "presence"); + switch_event_fire(&event); + } +#endif + if (multi_reg) { char *icontact, *p; icontact = sofia_glue_get_url_from_contact(contact_str, 1); @@ -889,16 +1059,6 @@ sofia_glue_execute_sql(profile, &sql, SWITCH_TRUE); } } - if (switch_event_create(&event, SWITCH_EVENT_PRESENCE_OUT) == SWITCH_STATUS_SUCCESS) { - switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "proto", "sip"); - switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "login", profile->url); - switch_event_add_header(event, SWITCH_STACK_BOTTOM, "from", "%s+%s@%s", SOFIA_CHAT_PROTO, to_user, reg_host); - - switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "status", "unavailable"); - switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "rpid", rpid); - switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "event_type", "presence"); - switch_event_fire(&event); - } } @@ -1085,7 +1245,8 @@ break; default: sofia_private->gateway->state = REG_STATE_FAILED; - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Registration Failed with status %d\n", status); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "%s Registration Failed with status %d. failure #%d\n", + sofia_private->gateway->name, status, ++sofia_private->gateway->failures); break; } if (ostate != sofia_private->gateway->state) { Modified: freeswitch/branches/gmaruzz/src/mod/event_handlers/mod_cdr_csv/mod_cdr_csv.c ============================================================================== --- freeswitch/branches/gmaruzz/src/mod/event_handlers/mod_cdr_csv/mod_cdr_csv.c (original) +++ freeswitch/branches/gmaruzz/src/mod/event_handlers/mod_cdr_csv/mod_cdr_csv.c Mon Dec 15 12:56:36 2008 @@ -199,7 +199,7 @@ if (globals.debug) { switch_event_t *event; - if (switch_event_create(&event, SWITCH_EVENT_COMMAND) == SWITCH_STATUS_SUCCESS) { + if (switch_event_create(&event, SWITCH_EVENT_CHANNEL_DATA) == SWITCH_STATUS_SUCCESS) { char *buf; switch_channel_event_set_data(channel, event); switch_event_serialize(event, &buf, SWITCH_FALSE); Modified: freeswitch/branches/gmaruzz/src/mod/event_handlers/mod_erlang_event/mod_erlang_event.c ============================================================================== --- freeswitch/branches/gmaruzz/src/mod/event_handlers/mod_erlang_event/mod_erlang_event.c (original) +++ freeswitch/branches/gmaruzz/src/mod/event_handlers/mod_erlang_event/mod_erlang_event.c Mon Dec 15 12:56:36 2008 @@ -608,16 +608,32 @@ switch_yield(10000); /* 10ms */ } - char data[MAXATOMLEN]; + int type, size; - ei_decode_atom(rep->buff, &rep->index, data); + ei_get_type(rep->buff, &rep->index, &type, &size); - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "got data %s after %d milliseconds!\n", data, i*10); + if (type != ERL_STRING_EXT) /* XXX no unicode or character codes > 255 */ + return NULL; + + char *xmlstr = switch_core_alloc(ptr->listener->pool, size + 1); + + ei_decode_string(rep->buff, &rep->index, xmlstr); + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "got data %s after %d milliseconds!\n", xmlstr, i*10); + + if (switch_strlen_zero(xmlstr)) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "No Result\n"); + } else if (!(xml = switch_xml_parse_str(xmlstr, strlen(xmlstr)))) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error Parsing XML Result!\n"); + } else { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "XML parsed OK!\n"); + } switch_core_hash_delete(ptr->listener->fetch_reply_hash, uuid_str); - free(rep->buff); - free(rep); + /*switch_safe_free(rep->buff);*/ + /*switch_safe_free(rep);*/ + /*switch_safe_free(xmlstr);*/ return xml; } Modified: freeswitch/branches/gmaruzz/src/mod/event_handlers/mod_event_socket/mod_event_socket.c ============================================================================== --- freeswitch/branches/gmaruzz/src/mod/event_handlers/mod_event_socket/mod_event_socket.c (original) +++ freeswitch/branches/gmaruzz/src/mod/event_handlers/mod_event_socket/mod_event_socket.c Mon Dec 15 12:56:36 2008 @@ -48,7 +48,8 @@ LFLAG_MYEVENTS = (1 << 5), LFLAG_SESSION = (1 << 6), LFLAG_ASYNC = (1 << 7), - LFLAG_STATEFUL = (1 << 8) + LFLAG_STATEFUL = (1 << 8), + LFLAG_OUTBOUND = (1 << 9) } event_flag_t; typedef enum { @@ -403,6 +404,7 @@ switch_core_hash_init(&listener->event_hash, listener->pool); switch_set_flag(listener, LFLAG_AUTHED); + switch_set_flag(listener, LFLAG_OUTBOUND); for (x = 1; x < argc; x++) { if (argv[x] && !strcasecmp(argv[x], "full")) { switch_set_flag(listener, LFLAG_FULL); @@ -1225,46 +1227,6 @@ if (!strncasecmp(cmd, "connect", 7)) { switch_snprintf(reply, reply_len, "+OK"); goto done; - } else if (listener->session && !strncasecmp(cmd, "sendmsg", 7)) { - char *uuid = cmd + 8; - switch_core_session_t *session = NULL; - - if (uuid) { - while (*uuid == ' ') { - uuid++; - } - - if (*uuid == '\r' || *uuid == '\n') { - uuid = NULL; - } else { - strip_cr(uuid); - } - } - - if (!uuid) { - uuid = switch_event_get_header(*event, "session-id"); - } - - if (uuid && (session = switch_core_session_locate(uuid))) { - if ((status = switch_core_session_queue_private_event(session, event)) == SWITCH_STATUS_SUCCESS) { - switch_snprintf(reply, reply_len, "+OK"); - } else { - switch_snprintf(reply, reply_len, "-ERR memory error"); - } - switch_core_session_rwunlock(session); - } else { - if (switch_test_flag(listener, LFLAG_ASYNC)) { - if ((status = switch_core_session_queue_private_event(listener->session, event)) == SWITCH_STATUS_SUCCESS) { - switch_snprintf(reply, reply_len, "+OK"); - } else { - switch_snprintf(reply, reply_len, "-ERR memory error"); - } - } else { - switch_ivr_parse_event(listener->session, *event); - switch_snprintf(reply, reply_len, "+OK"); - } - } - goto done; } else if (!strncasecmp(cmd, "getvar", 6)) { char *arg; const char *val = ""; @@ -1334,11 +1296,61 @@ switch_snprintf(reply, reply_len, "+OK Events Enabled"); goto done; } + } - if (!switch_test_flag(listener, LFLAG_FULL)) { - goto done; + + if (!strncasecmp(cmd, "sendmsg", 7)) { + switch_core_session_t *session; + char *uuid = cmd + 7; + + if (uuid) { + while (*uuid == ' ') { + uuid++; + } + + if (*uuid == '\r' || *uuid == '\n') { + uuid = NULL; + } else { + strip_cr(uuid); + } + } + + if (switch_strlen_zero(uuid)) { + uuid = switch_event_get_header(*event, "session-id"); } + + if (switch_strlen_zero(uuid) && listener->session) { + if (switch_test_flag(listener, LFLAG_ASYNC)) { + if ((status = switch_core_session_queue_private_event(listener->session, event)) == SWITCH_STATUS_SUCCESS) { + switch_snprintf(reply, reply_len, "+OK"); + } else { + switch_snprintf(reply, reply_len, "-ERR memory error"); + } + } else { + switch_ivr_parse_event(listener->session, *event); + switch_snprintf(reply, reply_len, "+OK"); + } + } else { + if (!switch_strlen_zero(uuid) && (session = switch_core_session_locate(uuid))) { + if ((status = switch_core_session_queue_private_event(session, event)) == SWITCH_STATUS_SUCCESS) { + switch_snprintf(reply, reply_len, "+OK"); + } else { + switch_snprintf(reply, reply_len, "-ERR memory error"); + } + switch_core_session_rwunlock(session); + } else { + switch_snprintf(reply, reply_len, "-ERR invalid session id [%s]", switch_str_nil(uuid)); + } + } + + goto done; + } + + if (switch_test_flag(listener, LFLAG_OUTBOUND) && !switch_test_flag(listener, LFLAG_FULL)) { + goto done; + } + if (!strncasecmp(cmd, "sendevent", 9)) { char *ename; @@ -1364,39 +1376,6 @@ switch_event_fire(event); switch_snprintf(reply, reply_len, "+OK"); goto done; - } else if (!strncasecmp(cmd, "sendmsg", 7)) { - switch_core_session_t *session; - char *uuid = cmd + 8; - - if (uuid) { - while (*uuid == ' ') { - uuid++; - } - - if (*uuid == '\r' || *uuid == '\n') { - uuid = NULL; - } else { - strip_cr(uuid); - } - } - - if (!uuid) { - uuid = switch_event_get_header(*event, "session-id"); - } - - if (uuid && (session = switch_core_session_locate(uuid))) { - if ((status = switch_core_session_queue_private_event(session, event)) == SWITCH_STATUS_SUCCESS) { - switch_snprintf(reply, reply_len, "+OK"); - } else { - switch_snprintf(reply, reply_len, "-ERR memory error"); - } - switch_core_session_rwunlock(session); - } else { - switch_snprintf(reply, reply_len, "-ERR invalid session id [%s]", switch_str_nil(uuid)); - } - - goto done; - } else if (!strncasecmp(cmd, "api ", 4)) { struct api_command_struct acs = { 0 }; char *api_cmd = cmd + 4; @@ -1676,7 +1655,7 @@ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "IP %s Rejected by acl \"%s\"\n", listener->remote_ip, prefs.acl[x]); - switch_snprintf(buf, sizeof(buf), "Content-Type: text/rude-rejection\nContent-Length %d\n\n", mlen); + switch_snprintf(buf, sizeof(buf), "Content-Type: text/rude-rejection\nContent-Length: %d\n\n", mlen); len = strlen(buf); switch_socket_send(listener->sock, buf, &len); len = mlen; @@ -1826,7 +1805,7 @@ const char message[] = "Disconnected, goodbye!\nSee you at ClueCon http://www.cluecon.com!\n"; int mlen = strlen(message); - switch_snprintf(disco_buf, sizeof(disco_buf), "Content-Type: text/disconnect-notice\nContent-Length %d\n\n", mlen); + switch_snprintf(disco_buf, sizeof(disco_buf), "Content-Type: text/disconnect-notice\nContent-Length: %d\n\n", mlen); len = strlen(disco_buf); switch_socket_send(listener->sock, disco_buf, &len); len = mlen; @@ -1992,6 +1971,7 @@ listener->pool = listener_pool; listener_pool = NULL; listener->format = EVENT_FORMAT_PLAIN; + switch_set_flag(listener, LFLAG_FULL); switch_mutex_init(&listener->flag_mutex, SWITCH_MUTEX_NESTED, listener->pool); switch_mutex_init(&listener->filter_mutex, SWITCH_MUTEX_NESTED, listener->pool); Modified: freeswitch/branches/gmaruzz/src/mod/formats/mod_shout/mod_shout.c ============================================================================== --- freeswitch/branches/gmaruzz/src/mod/formats/mod_shout/mod_shout.c (original) +++ freeswitch/branches/gmaruzz/src/mod/formats/mod_shout/mod_shout.c Mon Dec 15 12:56:36 2008 @@ -902,12 +902,22 @@ static switch_status_t shout_file_write(switch_file_handle_t *handle, void *data, size_t *len) { - shout_context_t *context = handle->private_info; + shout_context_t *context; unsigned char mp3buf[8192] = ""; int rlen; int16_t *audio = data; int nsamples = *len; + if (!handle) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error no handle\n"); + return SWITCH_STATUS_FALSE; + } + + if (!(context = handle->private_info)) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error no context\n"); + return SWITCH_STATUS_FALSE; + } + if (context->shout && !context->shout_init) { context->shout_init++; if (shout_open(context->shout) != SHOUTERR_SUCCESS) { @@ -918,7 +928,7 @@ launch_write_stream_thread(context); } - if (handle->handler) { + if (handle->handler && context->audio_mutex) { switch_mutex_lock(context->audio_mutex); if (context->audio_buffer) { if (!switch_buffer_write(context->audio_buffer, data, (nsamples * sizeof(int16_t) * handle->channels))) { @@ -928,47 +938,50 @@ } else { context->err++; } + switch_mutex_unlock(context->audio_mutex); if (context->err) { return SWITCH_STATUS_FALSE; } - } else { - if (!context->lame_ready) { - lame_init_params(context->gfp); - lame_print_config(context->gfp); - context->lame_ready = 1; - } + handle->sample_count += *len; + return SWITCH_STATUS_SUCCESS; + } - if (handle->channels == 2) { - int16_t l[4096] = { 0 }; - int16_t r[4096] = { 0 }; - int i, j = 0; - - for (i = 0; i < nsamples; i++) { - l[i] = audio[j++]; - r[i] = audio[j++]; - } + if (!context->lame_ready) { + lame_init_params(context->gfp); + lame_print_config(context->gfp); + context->lame_ready = 1; + } - if ((rlen = lame_encode_buffer(context->gfp, l, r, nsamples, mp3buf, sizeof(mp3buf))) < 0) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "MP3 encode error %d!\n", rlen); - return SWITCH_STATUS_FALSE; - } + if (handle->channels == 2) { + int16_t l[4096] = { 0 }; + int16_t r[4096] = { 0 }; + int i, j = 0; - } else if (handle->channels == 1) { - if ((rlen = lame_encode_buffer(context->gfp, audio, NULL, nsamples, mp3buf, sizeof(mp3buf))) < 0) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "MP3 encode error %d!\n", rlen); - return SWITCH_STATUS_FALSE; - } - } else { - rlen = 0; + for (i = 0; i < nsamples; i++) { + l[i] = audio[j++]; + r[i] = audio[j++]; } - if (rlen) { - int ret = fwrite(mp3buf, 1, rlen, context->fp); - if (ret < 0) { - return SWITCH_STATUS_FALSE; - } + if ((rlen = lame_encode_buffer(context->gfp, l, r, nsamples, mp3buf, sizeof(mp3buf))) < 0) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "MP3 encode error %d!\n", rlen); + return SWITCH_STATUS_FALSE; + } + + } else if (handle->channels == 1) { + if ((rlen = lame_encode_buffer(context->gfp, audio, NULL, nsamples, mp3buf, sizeof(mp3buf))) < 0) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "MP3 encode error %d!\n", rlen); + return SWITCH_STATUS_FALSE; + } + } else { + rlen = 0; + } + + if (rlen) { + int ret = fwrite(mp3buf, 1, rlen, context->fp); + if (ret < 0) { + return SWITCH_STATUS_FALSE; } } Modified: freeswitch/branches/gmaruzz/src/mod/formats/mod_sndfile/mod_sndfile.c ============================================================================== --- freeswitch/branches/gmaruzz/src/mod/formats/mod_sndfile/mod_sndfile.c (original) +++ freeswitch/branches/gmaruzz/src/mod/formats/mod_sndfile/mod_sndfile.c Mon Dec 15 12:56:36 2008 @@ -339,13 +339,13 @@ map->format = info.format; if (map->ext) { for (p = map->ext; *p; p++) { - *p = (char) tolower(*p); + *p = (char) switch_tolower(*p); } switch_core_hash_insert(globals.format_hash, map->ext, map); } if (map->uext) { for (p = map->uext; *p; p++) { - *p = (char) toupper(*p); + *p = (char) switch_toupper(*p); } switch_core_hash_insert(globals.format_hash, map->uext, map); } Modified: freeswitch/branches/gmaruzz/src/mod/languages/mod_java/src/org/freeswitch/swig/CoreSession.java ============================================================================== --- freeswitch/branches/gmaruzz/src/mod/languages/mod_java/src/org/freeswitch/swig/CoreSession.java (original) +++ freeswitch/branches/gmaruzz/src/mod/languages/mod_java/src/org/freeswitch/swig/CoreSession.java Mon Dec 15 12:56:36 2008 @@ -245,8 +245,12 @@ return freeswitchJNI.CoreSession_streamFile__SWIG_1(swigCPtr, this, file); } + public int sleep(int ms, int sync) { + return freeswitchJNI.CoreSession_sleep__SWIG_0(swigCPtr, this, ms, sync); + } + public int sleep(int ms) { - return freeswitchJNI.CoreSession_sleep(swigCPtr, this, ms); + return freeswitchJNI.CoreSession_sleep__SWIG_1(swigCPtr, this, ms); } public int flushEvents() { Modified: freeswitch/branches/gmaruzz/src/mod/languages/mod_java/src/org/freeswitch/swig/freeswitch.java ============================================================================== --- freeswitch/branches/gmaruzz/src/mod/languages/mod_java/src/org/freeswitch/swig/freeswitch.java (original) +++ freeswitch/branches/gmaruzz/src/mod/languages/mod_java/src/org/freeswitch/swig/freeswitch.java Mon Dec 15 12:56:36 2008 @@ -25,6 +25,10 @@ freeswitchJNI.console_clean_log(msg); } + public static void msleep(long ms) { + freeswitchJNI.msleep(ms); + } + public static void bridge(CoreSession session_a, CoreSession session_b) { freeswitchJNI.bridge(CoreSession.getCPtr(session_a), session_a, CoreSession.getCPtr(session_b), session_b); } Modified: freeswitch/branches/gmaruzz/src/mod/languages/mod_java/src/org/freeswitch/swig/freeswitchJNI.java ============================================================================== --- freeswitch/branches/gmaruzz/src/mod/languages/mod_java/src/org/freeswitch/swig/freeswitchJNI.java (original) +++ freeswitch/branches/gmaruzz/src/mod/languages/mod_java/src/org/freeswitch/swig/freeswitchJNI.java Mon Dec 15 12:56:36 2008 @@ -136,7 +136,8 @@ public final static native String CoreSession_playAndGetDigits(long jarg1, CoreSession jarg1_, int jarg2, int jarg3, int jarg4, int jarg5, String jarg6, String jarg7, String jarg8, String jarg9); public final static native int CoreSession_streamFile__SWIG_0(long jarg1, CoreSession jarg1_, String jarg2, int jarg3); public final static native int CoreSession_streamFile__SWIG_1(long jarg1, CoreSession jarg1_, String jarg2); - public final static native int CoreSession_sleep(long jarg1, CoreSession jarg1_, int jarg2); + public final static native int CoreSession_sleep__SWIG_0(long jarg1, CoreSession jarg1_, int jarg2, int jarg3); + public final static native int CoreSession_sleep__SWIG_1(long jarg1, CoreSession jarg1_, int jarg2); public final static native int CoreSession_flushEvents(long jarg1, CoreSession jarg1_); public final static native int CoreSession_flushDigits(long jarg1, CoreSession jarg1_); public final static native int CoreSession_setAutoHangup(long jarg1, CoreSession jarg1_, boolean jarg2); @@ -158,6 +159,7 @@ public final static native long CoreSession_run_dtmf_callback(long jarg1, CoreSession jarg1_, long jarg2, long jarg3); public final static native void console_log(String jarg1, String jarg2); public final static native void console_clean_log(String jarg1); + public final static native void msleep(long jarg1); public final static native void bridge(long jarg1, CoreSession jarg1_, long jarg2, CoreSession jarg2_); public final static native long hanguphook(long jarg1); public final static native long dtmf_callback(long jarg1, long jarg2, long jarg3, long jarg4, long jarg5); Modified: freeswitch/branches/gmaruzz/src/mod/languages/mod_java/switch_swig_wrap.cpp ============================================================================== --- freeswitch/branches/gmaruzz/src/mod/languages/mod_java/switch_swig_wrap.cpp (original) +++ freeswitch/branches/gmaruzz/src/mod/languages/mod_java/switch_swig_wrap.cpp Mon Dec 15 12:56:36 2008 @@ -2674,7 +2674,26 @@ } -SWIGEXPORT jint JNICALL Java_org_freeswitch_swig_freeswitchJNI_CoreSession_1sleep(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jint jarg2) { +SWIGEXPORT jint JNICALL Java_org_freeswitch_swig_freeswitchJNI_CoreSession_1sleep_1_1SWIG_10(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jint jarg2, jint jarg3) { + jint jresult = 0 ; + CoreSession *arg1 = (CoreSession *) 0 ; + int arg2 ; + int arg3 ; + int result; + + (void)jenv; + (void)jcls; + (void)jarg1_; + arg1 = *(CoreSession **)&jarg1; + arg2 = (int)jarg2; + arg3 = (int)jarg3; + result = (int)(arg1)->sleep(arg2,arg3); + jresult = (jint)result; + return jresult; +} + + +SWIGEXPORT jint JNICALL Java_org_freeswitch_swig_freeswitchJNI_CoreSession_1sleep_1_1SWIG_11(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jint jarg2) { jint jresult = 0 ; CoreSession *arg1 = (CoreSession *) 0 ; int arg2 ; @@ -3032,6 +3051,16 @@ } +SWIGEXPORT void JNICALL Java_org_freeswitch_swig_freeswitchJNI_msleep(JNIEnv *jenv, jclass jcls, jlong jarg1) { + unsigned int arg1 ; + + (void)jenv; + (void)jcls; + arg1 = (unsigned int)jarg1; + msleep(arg1); +} + + SWIGEXPORT void JNICALL Java_org_freeswitch_swig_freeswitchJNI_bridge(JNIEnv *jenv, jclass jcls, jlong jarg1, jobject jarg1_, jlong jarg2, jobject jarg2_) { CoreSession *arg1 = 0 ; CoreSession *arg2 = 0 ; Modified: freeswitch/branches/gmaruzz/src/mod/languages/mod_lua/mod_lua_wrap.cpp ============================================================================== --- freeswitch/branches/gmaruzz/src/mod/languages/mod_lua/mod_lua_wrap.cpp (original) +++ freeswitch/branches/gmaruzz/src/mod/languages/mod_lua/mod_lua_wrap.cpp Mon Dec 15 12:56:36 2008 @@ -6077,7 +6077,38 @@ } -static int _wrap_CoreSession_sleep(lua_State* L) { +static int _wrap_CoreSession_sleep__SWIG_0(lua_State* L) { + int SWIG_arg = -1; + CoreSession *arg1 = (CoreSession *) 0 ; + int arg2 ; + int arg3 ; + int result; + + SWIG_check_num_args("sleep",3,3) + if(!SWIG_isptrtype(L,1)) SWIG_fail_arg("sleep",1,"CoreSession *"); + if(!lua_isnumber(L,2)) SWIG_fail_arg("sleep",2,"int"); + if(!lua_isnumber(L,3)) SWIG_fail_arg("sleep",3,"int"); + + if (!SWIG_IsOK(SWIG_ConvertPtr(L,1,(void**)&arg1,SWIGTYPE_p_CoreSession,0))){ + SWIG_fail_ptr("CoreSession_sleep",1,SWIGTYPE_p_CoreSession); + } + + arg2 = (int)lua_tonumber(L, 2); + arg3 = (int)lua_tonumber(L, 3); + result = (int)(arg1)->sleep(arg2,arg3); + SWIG_arg=0; + lua_pushnumber(L, (lua_Number) result); SWIG_arg++; + return SWIG_arg; + + if(0) SWIG_fail; + +fail: + lua_error(L); + return SWIG_arg; +} + + +static int _wrap_CoreSession_sleep__SWIG_1(lua_State* L) { int SWIG_arg = -1; CoreSession *arg1 = (CoreSession *) 0 ; int arg2 ; @@ -6105,6 +6136,62 @@ } +static int _wrap_CoreSession_sleep(lua_State* L) { + int argc; + int argv[4]={ + 1,2,3,4 + }; + + argc = lua_gettop(L); + if (argc == 2) { + int _v; + { + void *ptr; + if (SWIG_isptrtype(L,argv[0])==0 || SWIG_ConvertPtr(L,argv[0], (void **) &ptr, SWIGTYPE_p_CoreSession, 0)) { + _v = 0; + } else { + _v = 1; + } + } + if (_v) { + { + _v = lua_isnumber(L,argv[1]); + } + if (_v) { + return _wrap_CoreSession_sleep__SWIG_1(L); + } + } + } + if (argc == 3) { + int _v; + { + void *ptr; + if (SWIG_isptrtype(L,argv[0])==0 || SWIG_ConvertPtr(L,argv[0], (void **) &ptr, SWIGTYPE_p_CoreSession, 0)) { + _v = 0; + } else { + _v = 1; + } + } + if (_v) { + { + _v = lua_isnumber(L,argv[1]); + } + if (_v) { + { + _v = lua_isnumber(L,argv[2]); + } + if (_v) { + return _wrap_CoreSession_sleep__SWIG_0(L); + } + } + } + } + + lua_pushstring(L,"No matching function for overloaded 'CoreSession_sleep'"); + lua_error(L);return 0; +} + + static int _wrap_CoreSession_flushEvents(lua_State* L) { int SWIG_arg = -1; CoreSession *arg1 = (CoreSession *) 0 ; @@ -6791,6 +6878,26 @@ } +static int _wrap_msleep(lua_State* L) { + int SWIG_arg = -1; + unsigned int arg1 ; + + SWIG_check_num_args("msleep",1,1) + if(!lua_isnumber(L,1)) SWIG_fail_arg("msleep",1,"unsigned int"); + arg1 = (unsigned int)lua_tonumber(L, 1); + msleep(arg1); + SWIG_arg=0; + + return SWIG_arg; + + if(0) SWIG_fail; + +fail: + lua_error(L); + return SWIG_arg; +} + + static int _wrap_bridge(lua_State* L) { int SWIG_arg = -1; CoreSession *arg1 = 0 ; @@ -7801,6 +7908,7 @@ { "consoleCleanLog", _wrap_consoleCleanLog}, { "console_log", _wrap_console_log}, { "console_clean_log", _wrap_console_clean_log}, + { "msleep", _wrap_msleep}, { "bridge", _wrap_bridge}, { "hanguphook", _wrap_hanguphook}, { "dtmf_callback", _wrap_dtmf_callback}, Modified: freeswitch/branches/gmaruzz/src/mod/languages/mod_managed/freeswitch_wrap.cxx ============================================================================== --- freeswitch/branches/gmaruzz/src/mod/languages/mod_managed/freeswitch_wrap.cxx (original) +++ freeswitch/branches/gmaruzz/src/mod/languages/mod_managed/freeswitch_wrap.cxx Mon Dec 15 12:56:36 2008 @@ -905,55 +905,88 @@ } -SWIGEXPORT char * SWIGSTDCALL CSharp_SWITCH_ENABLE_HEARTBEAT_EVENTS_VARIABLE_get() { +SWIGEXPORT char * SWIGSTDCALL CSharp_SWITCH_SEND_SILENCE_WHEN_IDLE_VARIABLE_get() { char * jresult ; char *result = 0 ; - result = (char *) "enable_heartbeat_events"; + result = (char *) "send_silence_when_idle"; jresult = SWIG_csharp_string_callback((const char *)result); return jresult; } -SWIGEXPORT char * SWIGSTDCALL CSharp_SWITCH_BYPASS_MEDIA_AFTER_BRIDGE_VARIABLE_get() { +SWIGEXPORT char * SWIGSTDCALL CSharp_SWITCH_CURRENT_APPLICATION_VARIABLE_get() { char * jresult ; char *result = 0 ; - result = (char *) "bypass_media_after_bridge"; + result = (char *) "current_application"; jresult = SWIG_csharp_string_callback((const char *)result); return jresult; } -SWIGEXPORT char * SWIGSTDCALL CSharp_SWITCH_READ_RESULT_VARIABLE_get() { +SWIGEXPORT char * SWIGSTDCALL CSharp_SWITCH_CURRENT_APPLICATION_DATA_VARIABLE_get() { char * jresult ; char *result = 0 ; - result = (char *) "read_result"; + result = (char *) "current_application_data"; jresult = SWIG_csharp_string_callback((const char *)result); return jresult; } -SWIGEXPORT char * SWIGSTDCALL CSharp_SWITCH_COPY_XML_CDR_VARIABLE_get() { +SWIGEXPORT char * SWIGSTDCALL CSharp_SWITCH_CURRENT_APPLICATION_RESPONSE_VARIABLE_get() { char * jresult ; char *result = 0 ; - result = (char *) "copy_xml_cdr"; + result = (char *) "current_application_response"; jresult = SWIG_csharp_string_callback((const char *)result); return jresult; } -SWIGEXPORT char * SWIGSTDCALL CSharp_SWITCH_CURRENT_APPLICATION_VARIABLE_get() { +SWIGEXPORT char * SWIGSTDCALL CSharp_SWITCH_ENABLE_HEARTBEAT_EVENTS_VARIABLE_get() { char * jresult ; char *result = 0 ; - result = (char *) "current_application"; + result = (char *) "enable_heartbeat_events"; + + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_SWITCH_BYPASS_MEDIA_AFTER_BRIDGE_VARIABLE_get() { + char * jresult ; + char *result = 0 ; + + result = (char *) "bypass_media_after_bridge"; + + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_SWITCH_READ_RESULT_VARIABLE_get() { + char * jresult ; + char *result = 0 ; + + result = (char *) "read_result"; + + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + +SWIGEXPORT char * SWIGSTDCALL CSharp_SWITCH_COPY_XML_CDR_VARIABLE_get() { + char * jresult ; + char *result = 0 ; + + result = (char *) "copy_xml_cdr"; jresult = SWIG_csharp_string_callback((const char *)result); return jresult; @@ -1037,6 +1070,17 @@ } +SWIGEXPORT char * SWIGSTDCALL CSharp_SWITCH_SESSION_IN_HANGUP_HOOK_VARIABLE_get() { + char * jresult ; + char *result = 0 ; + + result = (char *) "session_in_hangup_hook"; + + jresult = SWIG_csharp_string_callback((const char *)result); + return jresult; +} + + SWIGEXPORT char * SWIGSTDCALL CSharp_SWITCH_PROCESS_CDR_VARIABLE_get() { char * jresult ; char *result = 0 ; @@ -4811,6 +4855,18 @@ } +SWIGEXPORT int SWIGSTDCALL CSharp_switch_core_session_read_lock_hangup(void * jarg1) { + int jresult ; + switch_core_session_t *arg1 = (switch_core_session_t *) 0 ; + switch_status_t result; + + arg1 = (switch_core_session_t *)jarg1; + result = (switch_status_t)switch_core_session_read_lock_hangup(arg1); + jresult = result; + return jresult; +} + + SWIGEXPORT void SWIGSTDCALL CSharp_switch_core_session_write_lock(void * jarg1) { switch_core_session_t *arg1 = (switch_core_session_t *) 0 ; @@ -7458,6 +7514,162 @@ } +SWIGEXPORT int SWIGSTDCALL CSharp_switch_toupper(int jarg1) { + int jresult ; + int arg1 ; + int result; + + arg1 = (int)jarg1; + result = (int)switch_toupper(arg1); + jresult = result; + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_switch_tolower(int jarg1) { + int jresult ; + int arg1 ; + int result; + + arg1 = (int)jarg1; + result = (int)switch_tolower(arg1); + jresult = result; + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_switch_isalnum(int jarg1) { + int jresult ; + int arg1 ; + int result; + + arg1 = (int)jarg1; + result = (int)switch_isalnum(arg1); + jresult = result; + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_switch_isalpha(int jarg1) { + int jresult ; + int arg1 ; + int result; + + arg1 = (int)jarg1; + result = (int)switch_isalpha(arg1); + jresult = result; + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_switch_iscntrl(int jarg1) { + int jresult ; + int arg1 ; + int result; + + arg1 = (int)jarg1; + result = (int)switch_iscntrl(arg1); + jresult = result; + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_switch_isdigit(int jarg1) { + int jresult ; + int arg1 ; + int result; + + arg1 = (int)jarg1; + result = (int)switch_isdigit(arg1); + jresult = result; + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_switch_isgraph(int jarg1) { + int jresult ; + int arg1 ; + int result; + + arg1 = (int)jarg1; + result = (int)switch_isgraph(arg1); + jresult = result; + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_switch_islower(int jarg1) { + int jresult ; + int arg1 ; + int result; + + arg1 = (int)jarg1; + result = (int)switch_islower(arg1); + jresult = result; + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_switch_isprint(int jarg1) { + int jresult ; + int arg1 ; + int result; + + arg1 = (int)jarg1; + result = (int)switch_isprint(arg1); + jresult = result; + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_switch_ispunct(int jarg1) { + int jresult ; + int arg1 ; + int result; + + arg1 = (int)jarg1; + result = (int)switch_ispunct(arg1); + jresult = result; + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_switch_isspace(int jarg1) { + int jresult ; + int arg1 ; + int result; + + arg1 = (int)jarg1; + result = (int)switch_isspace(arg1); + jresult = result; + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_switch_isupper(int jarg1) { + int jresult ; + int arg1 ; + int result; + + arg1 = (int)jarg1; + result = (int)switch_isupper(arg1); + jresult = result; + return jresult; +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_switch_isxdigit(int jarg1) { + int jresult ; + int arg1 ; + int result; + + arg1 = (int)jarg1; + result = (int)switch_isxdigit(arg1); + jresult = result; + return jresult; +} + + SWIGEXPORT int SWIGSTDCALL CSharp_SWITCH_SMAX_get() { int jresult ; int result; @@ -10707,6 +10919,29 @@ } +SWIGEXPORT void SWIGSTDCALL CSharp_switch_endpoint_interface_reflock_set(void * jarg1, void * jarg2) { + switch_endpoint_interface *arg1 = (switch_endpoint_interface *) 0 ; + switch_mutex_t *arg2 = (switch_mutex_t *) 0 ; + + arg1 = (switch_endpoint_interface *)jarg1; + arg2 = (switch_mutex_t *)jarg2; + if (arg1) (arg1)->reflock = arg2; + +} + + +SWIGEXPORT void * SWIGSTDCALL CSharp_switch_endpoint_interface_reflock_get(void * jarg1) { + void * jresult ; + switch_endpoint_interface *arg1 = (switch_endpoint_interface *) 0 ; + switch_mutex_t *result = 0 ; + + arg1 = (switch_endpoint_interface *)jarg1; + result = (switch_mutex_t *) ((arg1)->reflock); + jresult = (void *)result; + return jresult; +} + + SWIGEXPORT void SWIGSTDCALL CSharp_switch_endpoint_interface_parent_set(void * jarg1, void * jarg2) { switch_endpoint_interface *arg1 = (switch_endpoint_interface *) 0 ; switch_loadable_module_interface_t *arg2 = (switch_loadable_module_interface_t *) 0 ; @@ -11223,6 +11458,29 @@ } +SWIGEXPORT void SWIGSTDCALL CSharp_switch_timer_interface_reflock_set(void * jarg1, void * jarg2) { + switch_timer_interface *arg1 = (switch_timer_interface *) 0 ; + switch_mutex_t *arg2 = (switch_mutex_t *) 0 ; + + arg1 = (switch_timer_interface *)jarg1; + arg2 = (switch_mutex_t *)jarg2; + if (arg1) (arg1)->reflock = arg2; + +} + + +SWIGEXPORT void * SWIGSTDCALL CSharp_switch_timer_interface_reflock_get(void * jarg1) { + void * jresult ; + switch_timer_interface *arg1 = (switch_timer_interface *) 0 ; + switch_mutex_t *result = 0 ; + + arg1 = (switch_timer_interface *)jarg1; + result = (switch_mutex_t *) ((arg1)->reflock); + jresult = (void *)result; + return jresult; +} + + SWIGEXPORT void SWIGSTDCALL CSharp_switch_timer_interface_parent_set(void * jarg1, void * jarg2) { switch_timer_interface *arg1 = (switch_timer_interface *) 0 ; switch_loadable_module_interface_t *arg2 = (switch_loadable_module_interface_t *) 0 ; @@ -11386,6 +11644,29 @@ } +SWIGEXPORT void SWIGSTDCALL CSharp_switch_dialplan_interface_reflock_set(void * jarg1, void * jarg2) { + switch_dialplan_interface *arg1 = (switch_dialplan_interface *) 0 ; + switch_mutex_t *arg2 = (switch_mutex_t *) 0 ; + + arg1 = (switch_dialplan_interface *)jarg1; + arg2 = (switch_mutex_t *)jarg2; + if (arg1) (arg1)->reflock = arg2; + +} + + +SWIGEXPORT void * SWIGSTDCALL CSharp_switch_dialplan_interface_reflock_get(void * jarg1) { + void * jresult ; + switch_dialplan_interface *arg1 = (switch_dialplan_interface *) 0 ; + switch_mutex_t *result = 0 ; + + arg1 = (switch_dialplan_interface *)jarg1; + result = (switch_mutex_t *) ((arg1)->reflock); + jresult = (void *)result; + return jresult; +} + + SWIGEXPORT void SWIGSTDCALL CSharp_switch_dialplan_interface_parent_set(void * jarg1, void * jarg2) { switch_dialplan_interface *arg1 = (switch_dialplan_interface *) 0 ; switch_loadable_module_interface_t *arg2 = (switch_loadable_module_interface_t *) 0 ; @@ -11710,6 +11991,29 @@ } +SWIGEXPORT void SWIGSTDCALL CSharp_switch_file_interface_reflock_set(void * jarg1, void * jarg2) { + switch_file_interface *arg1 = (switch_file_interface *) 0 ; + switch_mutex_t *arg2 = (switch_mutex_t *) 0 ; + + arg1 = (switch_file_interface *)jarg1; + arg2 = (switch_mutex_t *)jarg2; + if (arg1) (arg1)->reflock = arg2; + +} + + +SWIGEXPORT void * SWIGSTDCALL CSharp_switch_file_interface_reflock_get(void * jarg1) { + void * jresult ; + switch_file_interface *arg1 = (switch_file_interface *) 0 ; + switch_mutex_t *result = 0 ; + + arg1 = (switch_file_interface *)jarg1; + result = (switch_mutex_t *) ((arg1)->reflock); + jresult = (void *)result; + return jresult; +} + + SWIGEXPORT void SWIGSTDCALL CSharp_switch_file_interface_parent_set(void * jarg1, void * jarg2) { switch_file_interface *arg1 = (switch_file_interface *) 0 ; switch_loadable_module_interface_t *arg2 = (switch_loadable_module_interface_t *) 0 ; @@ -12843,6 +13147,29 @@ } +SWIGEXPORT void SWIGSTDCALL CSharp_switch_asr_interface_reflock_set(void * jarg1, void * jarg2) { + switch_asr_interface *arg1 = (switch_asr_interface *) 0 ; + switch_mutex_t *arg2 = (switch_mutex_t *) 0 ; + + arg1 = (switch_asr_interface *)jarg1; + arg2 = (switch_mutex_t *)jarg2; + if (arg1) (arg1)->reflock = arg2; + +} + + +SWIGEXPORT void * SWIGSTDCALL CSharp_switch_asr_interface_reflock_get(void * jarg1) { + void * jresult ; + switch_asr_interface *arg1 = (switch_asr_interface *) 0 ; + switch_mutex_t *result = 0 ; + + arg1 = (switch_asr_interface *)jarg1; + result = (switch_mutex_t *) ((arg1)->reflock); + jresult = (void *)result; + return jresult; +} + + SWIGEXPORT void SWIGSTDCALL CSharp_switch_asr_interface_parent_set(void * jarg1, void * jarg2) { switch_asr_interface *arg1 = (switch_asr_interface *) 0 ; switch_loadable_module_interface_t *arg2 = (switch_loadable_module_interface_t *) 0 ; @@ -13421,6 +13748,29 @@ } +SWIGEXPORT void SWIGSTDCALL CSharp_switch_speech_interface_reflock_set(void * jarg1, void * jarg2) { + switch_speech_interface *arg1 = (switch_speech_interface *) 0 ; + switch_mutex_t *arg2 = (switch_mutex_t *) 0 ; + + arg1 = (switch_speech_interface *)jarg1; + arg2 = (switch_mutex_t *)jarg2; + if (arg1) (arg1)->reflock = arg2; + +} + + +SWIGEXPORT void * SWIGSTDCALL CSharp_switch_speech_interface_reflock_get(void * jarg1) { + void * jresult ; + switch_speech_interface *arg1 = (switch_speech_interface *) 0 ; + switch_mutex_t *result = 0 ; + + arg1 = (switch_speech_interface *)jarg1; + result = (switch_mutex_t *) ((arg1)->reflock); + jresult = (void *)result; + return jresult; +} + + SWIGEXPORT void SWIGSTDCALL CSharp_switch_speech_interface_parent_set(void * jarg1, void * jarg2) { switch_speech_interface *arg1 = (switch_speech_interface *) 0 ; switch_loadable_module_interface_t *arg2 = (switch_loadable_module_interface_t *) 0 ; @@ -13879,6 +14229,29 @@ } +SWIGEXPORT void SWIGSTDCALL CSharp_switch_say_interface_reflock_set(void * jarg1, void * jarg2) { + switch_say_interface *arg1 = (switch_say_interface *) 0 ; + switch_mutex_t *arg2 = (switch_mutex_t *) 0 ; + + arg1 = (switch_say_interface *)jarg1; + arg2 = (switch_mutex_t *)jarg2; + if (arg1) (arg1)->reflock = arg2; + +} + + +SWIGEXPORT void * SWIGSTDCALL CSharp_switch_say_interface_reflock_get(void * jarg1) { + void * jresult ; + switch_say_interface *arg1 = (switch_say_interface *) 0 ; + switch_mutex_t *result = 0 ; + + arg1 = (switch_say_interface *)jarg1; + result = (switch_mutex_t *) ((arg1)->reflock); + jresult = (void *)result; + return jresult; +} + + SWIGEXPORT void SWIGSTDCALL CSharp_switch_say_interface_parent_set(void * jarg1, void * jarg2) { switch_say_interface *arg1 = (switch_say_interface *) 0 ; switch_loadable_module_interface_t *arg2 = (switch_loadable_module_interface_t *) 0 ; @@ -14042,6 +14415,29 @@ } +SWIGEXPORT void SWIGSTDCALL CSharp_switch_chat_interface_reflock_set(void * jarg1, void * jarg2) { + switch_chat_interface *arg1 = (switch_chat_interface *) 0 ; + switch_mutex_t *arg2 = (switch_mutex_t *) 0 ; + + arg1 = (switch_chat_interface *)jarg1; + arg2 = (switch_mutex_t *)jarg2; + if (arg1) (arg1)->reflock = arg2; + +} + + +SWIGEXPORT void * SWIGSTDCALL CSharp_switch_chat_interface_reflock_get(void * jarg1) { + void * jresult ; + switch_chat_interface *arg1 = (switch_chat_interface *) 0 ; + switch_mutex_t *result = 0 ; + + arg1 = (switch_chat_interface *)jarg1; + result = (switch_mutex_t *) ((arg1)->reflock); + jresult = (void *)result; + return jresult; +} + + SWIGEXPORT void SWIGSTDCALL CSharp_switch_chat_interface_parent_set(void * jarg1, void * jarg2) { switch_chat_interface *arg1 = (switch_chat_interface *) 0 ; switch_loadable_module_interface_t *arg2 = (switch_loadable_module_interface_t *) 0 ; @@ -14205,6 +14601,29 @@ } +SWIGEXPORT void SWIGSTDCALL CSharp_switch_management_interface_reflock_set(void * jarg1, void * jarg2) { + switch_management_interface *arg1 = (switch_management_interface *) 0 ; + switch_mutex_t *arg2 = (switch_mutex_t *) 0 ; + + arg1 = (switch_management_interface *)jarg1; + arg2 = (switch_mutex_t *)jarg2; + if (arg1) (arg1)->reflock = arg2; + +} + + +SWIGEXPORT void * SWIGSTDCALL CSharp_switch_management_interface_reflock_get(void * jarg1) { + void * jresult ; + switch_management_interface *arg1 = (switch_management_interface *) 0 ; + switch_mutex_t *result = 0 ; + + arg1 = (switch_management_interface *)jarg1; + result = (switch_mutex_t *) ((arg1)->reflock); + jresult = (void *)result; + return jresult; +} + + SWIGEXPORT void SWIGSTDCALL CSharp_switch_management_interface_parent_set(void * jarg1, void * jarg2) { switch_management_interface *arg1 = (switch_management_interface *) 0 ; switch_loadable_module_interface_t *arg2 = (switch_loadable_module_interface_t *) 0 ; @@ -14460,6 +14879,29 @@ } +SWIGEXPORT void SWIGSTDCALL CSharp_switch_directory_interface_reflock_set(void * jarg1, void * jarg2) { + switch_directory_interface *arg1 = (switch_directory_interface *) 0 ; + switch_mutex_t *arg2 = (switch_mutex_t *) 0 ; + + arg1 = (switch_directory_interface *)jarg1; + arg2 = (switch_mutex_t *)jarg2; + if (arg1) (arg1)->reflock = arg2; + +} + + +SWIGEXPORT void * SWIGSTDCALL CSharp_switch_directory_interface_reflock_get(void * jarg1) { + void * jresult ; + switch_directory_interface *arg1 = (switch_directory_interface *) 0 ; + switch_mutex_t *result = 0 ; + + arg1 = (switch_directory_interface *)jarg1; + result = (switch_mutex_t *) ((arg1)->reflock); + jresult = (void *)result; + return jresult; +} + + SWIGEXPORT void SWIGSTDCALL CSharp_switch_directory_interface_parent_set(void * jarg1, void * jarg2) { switch_directory_interface *arg1 = (switch_directory_interface *) 0 ; switch_loadable_module_interface_t *arg2 = (switch_loadable_module_interface_t *) 0 ; @@ -15877,6 +16319,29 @@ } +SWIGEXPORT void SWIGSTDCALL CSharp_switch_codec_interface_reflock_set(void * jarg1, void * jarg2) { + switch_codec_interface *arg1 = (switch_codec_interface *) 0 ; + switch_mutex_t *arg2 = (switch_mutex_t *) 0 ; + + arg1 = (switch_codec_interface *)jarg1; + arg2 = (switch_mutex_t *)jarg2; + if (arg1) (arg1)->reflock = arg2; + +} + + +SWIGEXPORT void * SWIGSTDCALL CSharp_switch_codec_interface_reflock_get(void * jarg1) { + void * jresult ; + switch_codec_interface *arg1 = (switch_codec_interface *) 0 ; + switch_mutex_t *result = 0 ; + + arg1 = (switch_codec_interface *)jarg1; + result = (switch_mutex_t *) ((arg1)->reflock); + jresult = (void *)result; + return jresult; +} + + SWIGEXPORT void SWIGSTDCALL CSharp_switch_codec_interface_parent_set(void * jarg1, void * jarg2) { switch_codec_interface *arg1 = (switch_codec_interface *) 0 ; switch_loadable_module_interface_t *arg2 = (switch_loadable_module_interface_t *) 0 ; @@ -16150,6 +16615,29 @@ } +SWIGEXPORT void SWIGSTDCALL CSharp_switch_application_interface_reflock_set(void * jarg1, void * jarg2) { + switch_application_interface *arg1 = (switch_application_interface *) 0 ; + switch_mutex_t *arg2 = (switch_mutex_t *) 0 ; + + arg1 = (switch_application_interface *)jarg1; + arg2 = (switch_mutex_t *)jarg2; + if (arg1) (arg1)->reflock = arg2; + +} + + +SWIGEXPORT void * SWIGSTDCALL CSharp_switch_application_interface_reflock_get(void * jarg1) { + void * jresult ; + switch_application_interface *arg1 = (switch_application_interface *) 0 ; + switch_mutex_t *result = 0 ; + + arg1 = (switch_application_interface *)jarg1; + result = (switch_mutex_t *) ((arg1)->reflock); + jresult = (void *)result; + return jresult; +} + + SWIGEXPORT void SWIGSTDCALL CSharp_switch_application_interface_parent_set(void * jarg1, void * jarg2) { switch_application_interface *arg1 = (switch_application_interface *) 0 ; switch_loadable_module_interface_t *arg2 = (switch_loadable_module_interface_t *) 0 ; @@ -16371,6 +16859,29 @@ } +SWIGEXPORT void SWIGSTDCALL CSharp_switch_api_interface_reflock_set(void * jarg1, void * jarg2) { + switch_api_interface *arg1 = (switch_api_interface *) 0 ; + switch_mutex_t *arg2 = (switch_mutex_t *) 0 ; + + arg1 = (switch_api_interface *)jarg1; + arg2 = (switch_mutex_t *)jarg2; + if (arg1) (arg1)->reflock = arg2; + +} + + +SWIGEXPORT void * SWIGSTDCALL CSharp_switch_api_interface_reflock_get(void * jarg1) { + void * jresult ; + switch_api_interface *arg1 = (switch_api_interface *) 0 ; + switch_mutex_t *result = 0 ; + + arg1 = (switch_api_interface *)jarg1; + result = (switch_mutex_t *) ((arg1)->reflock); + jresult = (void *)result; + return jresult; +} + + SWIGEXPORT void SWIGSTDCALL CSharp_switch_api_interface_parent_set(void * jarg1, void * jarg2) { switch_api_interface *arg1 = (switch_api_interface *) 0 ; switch_loadable_module_interface_t *arg2 = (switch_loadable_module_interface_t *) 0 ; @@ -16729,7 +17240,7 @@ } -SWIGEXPORT int SWIGSTDCALL CSharp_switch_channel_wait_for_flag(void * jarg1, unsigned long jarg2, int jarg3, unsigned long jarg4, void * jarg5) { +SWIGEXPORT int SWIGSTDCALL CSharp_switch_channel_wait_for_flag(void * jarg1, int jarg2, int jarg3, unsigned long jarg4, void * jarg5) { int jresult ; switch_channel_t *arg1 = (switch_channel_t *) 0 ; switch_channel_flag_t arg2 ; @@ -16875,18 +17386,18 @@ } -SWIGEXPORT int SWIGSTDCALL CSharp_switch_channel_init(void * jarg1, void * jarg2, int jarg3, unsigned long jarg4) { +SWIGEXPORT int SWIGSTDCALL CSharp_switch_channel_init(void * jarg1, void * jarg2, int jarg3, int jarg4) { int jresult ; switch_channel_t *arg1 = (switch_channel_t *) 0 ; switch_core_session_t *arg2 = (switch_core_session_t *) 0 ; switch_channel_state_t arg3 ; - uint32_t arg4 ; + switch_channel_flag_t arg4 ; switch_status_t result; arg1 = (switch_channel_t *)jarg1; arg2 = (switch_core_session_t *)jarg2; arg3 = (switch_channel_state_t)jarg3; - arg4 = (uint32_t)jarg4; + arg4 = (switch_channel_flag_t)jarg4; result = (switch_status_t)switch_channel_init(arg1,arg2,arg3,arg4); jresult = result; return jresult; @@ -17126,7 +17637,7 @@ } -SWIGEXPORT unsigned long SWIGSTDCALL CSharp_switch_channel_test_flag(void * jarg1, unsigned long jarg2) { +SWIGEXPORT unsigned long SWIGSTDCALL CSharp_switch_channel_test_flag(void * jarg1, int jarg2) { unsigned long jresult ; switch_channel_t *arg1 = (switch_channel_t *) 0 ; switch_channel_flag_t arg2 ; @@ -17140,7 +17651,7 @@ } -SWIGEXPORT void SWIGSTDCALL CSharp_switch_channel_set_flag(void * jarg1, unsigned long jarg2) { +SWIGEXPORT void SWIGSTDCALL CSharp_switch_channel_set_flag(void * jarg1, int jarg2) { switch_channel_t *arg1 = (switch_channel_t *) 0 ; switch_channel_flag_t arg2 ; @@ -17150,7 +17661,7 @@ } -SWIGEXPORT int SWIGSTDCALL CSharp_switch_channel_set_flag_partner(void * jarg1, unsigned long jarg2) { +SWIGEXPORT int SWIGSTDCALL CSharp_switch_channel_set_flag_partner(void * jarg1, int jarg2) { int jresult ; switch_channel_t *arg1 = (switch_channel_t *) 0 ; switch_channel_flag_t arg2 ; @@ -17164,7 +17675,7 @@ } -SWIGEXPORT int SWIGSTDCALL CSharp_switch_channel_clear_flag_partner(void * jarg1, unsigned long jarg2) { +SWIGEXPORT int SWIGSTDCALL CSharp_switch_channel_clear_flag_partner(void * jarg1, int jarg2) { int jresult ; switch_channel_t *arg1 = (switch_channel_t *) 0 ; switch_channel_flag_t arg2 ; @@ -17178,7 +17689,7 @@ } -SWIGEXPORT void SWIGSTDCALL CSharp_switch_channel_set_state_flag(void * jarg1, unsigned long jarg2) { +SWIGEXPORT void SWIGSTDCALL CSharp_switch_channel_set_state_flag(void * jarg1, int jarg2) { switch_channel_t *arg1 = (switch_channel_t *) 0 ; switch_channel_flag_t arg2 ; @@ -17188,7 +17699,7 @@ } -SWIGEXPORT void SWIGSTDCALL CSharp_switch_channel_clear_flag(void * jarg1, unsigned long jarg2) { +SWIGEXPORT void SWIGSTDCALL CSharp_switch_channel_clear_flag(void * jarg1, int jarg2) { switch_channel_t *arg1 = (switch_channel_t *) 0 ; switch_channel_flag_t arg2 ; @@ -17580,6 +18091,48 @@ } +SWIGEXPORT void SWIGSTDCALL CSharp_switch_channel_audio_sync(void * jarg1) { + switch_channel_t *arg1 = (switch_channel_t *) 0 ; + + arg1 = (switch_channel_t *)jarg1; + switch_channel_audio_sync(arg1); +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_switch_channel_set_private_flag(void * jarg1, unsigned long jarg2) { + switch_channel_t *arg1 = (switch_channel_t *) 0 ; + uint32_t arg2 ; + + arg1 = (switch_channel_t *)jarg1; + arg2 = (uint32_t)jarg2; + switch_channel_set_private_flag(arg1,arg2); +} + + +SWIGEXPORT void SWIGSTDCALL CSharp_switch_channel_clear_private_flag(void * jarg1, unsigned long jarg2) { + switch_channel_t *arg1 = (switch_channel_t *) 0 ; + uint32_t arg2 ; + + arg1 = (switch_channel_t *)jarg1; + arg2 = (uint32_t)jarg2; + switch_channel_clear_private_flag(arg1,arg2); +} + + +SWIGEXPORT int SWIGSTDCALL CSharp_switch_channel_test_private_flag(void * jarg1, unsigned long jarg2) { + int jresult ; + switch_channel_t *arg1 = (switch_channel_t *) 0 ; + uint32_t arg2 ; + int result; + + arg1 = (switch_channel_t *)jarg1; + arg2 = (uint32_t)jarg2; + result = (int)switch_channel_test_private_flag(arg1,arg2); + jresult = result; + return jresult; +} + + SWIGEXPORT int SWIGSTDCALL CSharp_switch_buffer_create(void * jarg1, void * jarg2, void * jarg3) { int jresult ; switch_memory_pool_t *arg1 = (switch_memory_pool_t *) 0 ; @@ -19622,17 +20175,19 @@ } -SWIGEXPORT int SWIGSTDCALL CSharp_switch_ivr_sleep(void * jarg1, unsigned long jarg2, void * jarg3) { +SWIGEXPORT int SWIGSTDCALL CSharp_switch_ivr_sleep(void * jarg1, unsigned long jarg2, int jarg3, void * jarg4) { int jresult ; switch_core_session_t *arg1 = (switch_core_session_t *) 0 ; uint32_t arg2 ; - switch_input_args_t *arg3 = (switch_input_args_t *) 0 ; + switch_bool_t arg3 ; + switch_input_args_t *arg4 = (switch_input_args_t *) 0 ; switch_status_t result; arg1 = (switch_core_session_t *)jarg1; arg2 = (uint32_t)jarg2; - arg3 = (switch_input_args_t *)jarg3; - result = (switch_status_t)switch_ivr_sleep(arg1,arg2,arg3); + arg3 = (switch_bool_t)jarg3; + arg4 = (switch_input_args_t *)jarg4; + result = (switch_status_t)switch_ivr_sleep(arg1,arg2,arg3,arg4); jresult = result; return jresult; } @@ -19950,15 +20505,16 @@ } -SWIGEXPORT int SWIGSTDCALL CSharp_switch_ivr_tone_detect_session(void * jarg1, char * jarg2, char * jarg3, char * jarg4, void * jarg5, char * jarg6, char * jarg7) { +SWIGEXPORT int SWIGSTDCALL CSharp_switch_ivr_tone_detect_session(void * jarg1, char * jarg2, char * jarg3, char * jarg4, void * jarg5, int jarg6, char * jarg7, char * jarg8) { int jresult ; switch_core_session_t *arg1 = (switch_core_session_t *) 0 ; char *arg2 = (char *) 0 ; char *arg3 = (char *) 0 ; char *arg4 = (char *) 0 ; time_t arg5 ; - char *arg6 = (char *) 0 ; + int arg6 ; char *arg7 = (char *) 0 ; + char *arg8 = (char *) 0 ; switch_status_t result; time_t *argp5 ; @@ -19972,9 +20528,10 @@ return 0; } arg5 = *argp5; - arg6 = (char *)jarg6; + arg6 = (int)jarg6; arg7 = (char *)jarg7; - result = (switch_status_t)switch_ivr_tone_detect_session(arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,arg5,(char const *)arg6,(char const *)arg7); + arg8 = (char *)jarg8; + result = (switch_status_t)switch_ivr_tone_detect_session(arg1,(char const *)arg2,(char const *)arg3,(char const *)arg4,arg5,arg6,(char const *)arg7,(char const *)arg8); jresult = result; return jresult; } @@ -20140,7 +20697,7 @@ } -SWIGEXPORT int SWIGSTDCALL CSharp_switch_ivr_originate(void * jarg1, void * jarg2, void * jarg3, char * jarg4, unsigned long jarg5, void * jarg6, char * jarg7, char * jarg8, void * jarg9, unsigned long jarg10) { +SWIGEXPORT int SWIGSTDCALL CSharp_switch_ivr_originate(void * jarg1, void * jarg2, void * jarg3, char * jarg4, unsigned long jarg5, void * jarg6, char * jarg7, char * jarg8, void * jarg9, void * jarg10, unsigned long jarg11) { int jresult ; switch_core_session_t *arg1 = (switch_core_session_t *) 0 ; switch_core_session_t **arg2 = (switch_core_session_t **) 0 ; @@ -20151,7 +20708,8 @@ char *arg7 = (char *) 0 ; char *arg8 = (char *) 0 ; switch_caller_profile_t *arg9 = (switch_caller_profile_t *) 0 ; - switch_originate_flag_t arg10 ; + switch_event_t *arg10 = (switch_event_t *) 0 ; + switch_originate_flag_t arg11 ; switch_status_t result; arg1 = (switch_core_session_t *)jarg1; @@ -20163,8 +20721,9 @@ arg7 = (char *)jarg7; arg8 = (char *)jarg8; arg9 = (switch_caller_profile_t *)jarg9; - arg10 = (switch_originate_flag_t)jarg10; - result = (switch_status_t)switch_ivr_originate(arg1,arg2,arg3,(char const *)arg4,arg5,(switch_state_handler_table const *)arg6,(char const *)arg7,(char const *)arg8,arg9,arg10); + arg10 = (switch_event_t *)jarg10; + arg11 = (switch_originate_flag_t)jarg11; + result = (switch_status_t)switch_ivr_originate(arg1,arg2,arg3,(char const *)arg4,arg5,(switch_state_handler_table const *)arg6,(char const *)arg7,(char const *)arg8,arg9,arg10,arg11); jresult = result; return jresult; } @@ -21243,15 +21802,19 @@ } -SWIGEXPORT void SWIGSTDCALL CSharp_switch_rtp_change_interval(void * jarg1, unsigned long jarg2, unsigned long jarg3) { +SWIGEXPORT int SWIGSTDCALL CSharp_switch_rtp_change_interval(void * jarg1, unsigned long jarg2, unsigned long jarg3) { + int jresult ; switch_rtp_t *arg1 = (switch_rtp_t *) 0 ; uint32_t arg2 ; uint32_t arg3 ; + switch_status_t result; arg1 = (switch_rtp_t *)jarg1; arg2 = (uint32_t)jarg2; arg3 = (uint32_t)jarg3; - switch_rtp_change_interval(arg1,arg2,arg3); + result = (switch_status_t)switch_rtp_change_interval(arg1,arg2,arg3); + jresult = result; + return jresult; } @@ -21665,6 +22228,14 @@ } +SWIGEXPORT void SWIGSTDCALL CSharp_rtp_flush_read_buffer(void * jarg1) { + switch_rtp_t *arg1 = (switch_rtp_t *) 0 ; + + arg1 = (switch_rtp_t *)jarg1; + rtp_flush_read_buffer(arg1); +} + + SWIGEXPORT int SWIGSTDCALL CSharp_switch_rtp_enable_vad(void * jarg1, void * jarg2, void * jarg3, unsigned long jarg4) { int jresult ; switch_rtp_t *arg1 = (switch_rtp_t *) 0 ; @@ -26292,15 +26863,17 @@ } -SWIGEXPORT int SWIGSTDCALL CSharp_CoreSession_sleep(void * jarg1, int jarg2) { +SWIGEXPORT int SWIGSTDCALL CSharp_CoreSession_sleep(void * jarg1, int jarg2, int jarg3) { int jresult ; CoreSession *arg1 = (CoreSession *) 0 ; int arg2 ; + int arg3 = (int) 0 ; int result; arg1 = (CoreSession *)jarg1; arg2 = (int)jarg2; - result = (int)(arg1)->sleep(arg2); + arg3 = (int)jarg3; + result = (int)(arg1)->sleep(arg2,arg3); jresult = result; return jresult; } @@ -26511,6 +27084,14 @@ } +SWIGEXPORT void SWIGSTDCALL CSharp_msleep(unsigned int jarg1) { + unsigned int arg1 ; + + arg1 = (unsigned int)jarg1; + msleep(arg1); +} + + SWIGEXPORT void SWIGSTDCALL CSharp_bridge(void * jarg1, void * jarg2) { CoreSession *arg1 = 0 ; CoreSession *arg2 = 0 ; Modified: freeswitch/branches/gmaruzz/src/mod/languages/mod_managed/managed/swig.cs ============================================================================== --- freeswitch/branches/gmaruzz/src/mod/languages/mod_managed/managed/swig.cs (original) +++ freeswitch/branches/gmaruzz/src/mod/languages/mod_managed/managed/swig.cs Mon Dec 15 12:56:36 2008 @@ -292,8 +292,8 @@ return ret; } - public int sleep(int ms) { - int ret = freeswitchPINVOKE.CoreSession_sleep(swigCPtr, ms); + public int sleep(int ms, int sync) { + int ret = freeswitchPINVOKE.CoreSession_sleep(swigCPtr, ms, sync); return ret; } @@ -984,6 +984,11 @@ return ret; } + public static switch_status_t switch_core_session_read_lock_hangup(SWIGTYPE_p_switch_core_session session) { + switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_core_session_read_lock_hangup(SWIGTYPE_p_switch_core_session.getCPtr(session)); + return ret; + } + public static void switch_core_session_write_lock(SWIGTYPE_p_switch_core_session session) { freeswitchPINVOKE.switch_core_session_write_lock(SWIGTYPE_p_switch_core_session.getCPtr(session)); } @@ -1932,6 +1937,71 @@ return ret; } + public static int switch_toupper(int c) { + int ret = freeswitchPINVOKE.switch_toupper(c); + return ret; + } + + public static int switch_tolower(int c) { + int ret = freeswitchPINVOKE.switch_tolower(c); + return ret; + } + + public static int switch_isalnum(int c) { + int ret = freeswitchPINVOKE.switch_isalnum(c); + return ret; + } + + public static int switch_isalpha(int c) { + int ret = freeswitchPINVOKE.switch_isalpha(c); + return ret; + } + + public static int switch_iscntrl(int c) { + int ret = freeswitchPINVOKE.switch_iscntrl(c); + return ret; + } + + public static int switch_isdigit(int c) { + int ret = freeswitchPINVOKE.switch_isdigit(c); + return ret; + } + + public static int switch_isgraph(int c) { + int ret = freeswitchPINVOKE.switch_isgraph(c); + return ret; + } + + public static int switch_islower(int c) { + int ret = freeswitchPINVOKE.switch_islower(c); + return ret; + } + + public static int switch_isprint(int c) { + int ret = freeswitchPINVOKE.switch_isprint(c); + return ret; + } + + public static int switch_ispunct(int c) { + int ret = freeswitchPINVOKE.switch_ispunct(c); + return ret; + } + + public static int switch_isspace(int c) { + int ret = freeswitchPINVOKE.switch_isspace(c); + return ret; + } + + public static int switch_isupper(int c) { + int ret = freeswitchPINVOKE.switch_isupper(c); + return ret; + } + + public static int switch_isxdigit(int c) { + int ret = freeswitchPINVOKE.switch_isxdigit(c); + return ret; + } + public static switch_bool_t switch_is_moh(string s) { switch_bool_t ret = (switch_bool_t)freeswitchPINVOKE.switch_is_moh(s); return ret; @@ -2204,8 +2274,8 @@ freeswitchPINVOKE.switch_channel_wait_for_state(SWIGTYPE_p_switch_channel.getCPtr(channel), SWIGTYPE_p_switch_channel.getCPtr(other_channel), (int)want_state); } - public static switch_status_t switch_channel_wait_for_flag(SWIGTYPE_p_switch_channel channel, uint want_flag, switch_bool_t pres, uint to, SWIGTYPE_p_switch_channel super_channel) { - switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_channel_wait_for_flag(SWIGTYPE_p_switch_channel.getCPtr(channel), want_flag, (int)pres, to, SWIGTYPE_p_switch_channel.getCPtr(super_channel)); + public static switch_status_t switch_channel_wait_for_flag(SWIGTYPE_p_switch_channel channel, switch_channel_flag_t want_flag, switch_bool_t pres, uint to, SWIGTYPE_p_switch_channel super_channel) { + switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_channel_wait_for_flag(SWIGTYPE_p_switch_channel.getCPtr(channel), (int)want_flag, (int)pres, to, SWIGTYPE_p_switch_channel.getCPtr(super_channel)); return ret; } @@ -2255,8 +2325,8 @@ return ret; } - public static switch_status_t switch_channel_init(SWIGTYPE_p_switch_channel channel, SWIGTYPE_p_switch_core_session session, switch_channel_state_t state, uint flags) { - switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_channel_init(SWIGTYPE_p_switch_channel.getCPtr(channel), SWIGTYPE_p_switch_core_session.getCPtr(session), (int)state, flags); + public static switch_status_t switch_channel_init(SWIGTYPE_p_switch_channel channel, SWIGTYPE_p_switch_core_session session, switch_channel_state_t state, switch_channel_flag_t flag) { + switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_channel_init(SWIGTYPE_p_switch_channel.getCPtr(channel), SWIGTYPE_p_switch_core_session.getCPtr(session), (int)state, (int)flag); return ret; } @@ -2353,31 +2423,31 @@ return ret; } - public static uint switch_channel_test_flag(SWIGTYPE_p_switch_channel channel, uint flags) { - uint ret = freeswitchPINVOKE.switch_channel_test_flag(SWIGTYPE_p_switch_channel.getCPtr(channel), flags); + public static uint switch_channel_test_flag(SWIGTYPE_p_switch_channel channel, switch_channel_flag_t flag) { + uint ret = freeswitchPINVOKE.switch_channel_test_flag(SWIGTYPE_p_switch_channel.getCPtr(channel), (int)flag); return ret; } - public static void switch_channel_set_flag(SWIGTYPE_p_switch_channel channel, uint flags) { - freeswitchPINVOKE.switch_channel_set_flag(SWIGTYPE_p_switch_channel.getCPtr(channel), flags); + public static void switch_channel_set_flag(SWIGTYPE_p_switch_channel channel, switch_channel_flag_t flag) { + freeswitchPINVOKE.switch_channel_set_flag(SWIGTYPE_p_switch_channel.getCPtr(channel), (int)flag); } - public static switch_bool_t switch_channel_set_flag_partner(SWIGTYPE_p_switch_channel channel, uint flags) { - switch_bool_t ret = (switch_bool_t)freeswitchPINVOKE.switch_channel_set_flag_partner(SWIGTYPE_p_switch_channel.getCPtr(channel), flags); + public static switch_bool_t switch_channel_set_flag_partner(SWIGTYPE_p_switch_channel channel, switch_channel_flag_t flag) { + switch_bool_t ret = (switch_bool_t)freeswitchPINVOKE.switch_channel_set_flag_partner(SWIGTYPE_p_switch_channel.getCPtr(channel), (int)flag); return ret; } - public static switch_bool_t switch_channel_clear_flag_partner(SWIGTYPE_p_switch_channel channel, uint flags) { - switch_bool_t ret = (switch_bool_t)freeswitchPINVOKE.switch_channel_clear_flag_partner(SWIGTYPE_p_switch_channel.getCPtr(channel), flags); + public static switch_bool_t switch_channel_clear_flag_partner(SWIGTYPE_p_switch_channel channel, switch_channel_flag_t flag) { + switch_bool_t ret = (switch_bool_t)freeswitchPINVOKE.switch_channel_clear_flag_partner(SWIGTYPE_p_switch_channel.getCPtr(channel), (int)flag); return ret; } - public static void switch_channel_set_state_flag(SWIGTYPE_p_switch_channel channel, uint flags) { - freeswitchPINVOKE.switch_channel_set_state_flag(SWIGTYPE_p_switch_channel.getCPtr(channel), flags); + public static void switch_channel_set_state_flag(SWIGTYPE_p_switch_channel channel, switch_channel_flag_t flag) { + freeswitchPINVOKE.switch_channel_set_state_flag(SWIGTYPE_p_switch_channel.getCPtr(channel), (int)flag); } - public static void switch_channel_clear_flag(SWIGTYPE_p_switch_channel channel, uint flags) { - freeswitchPINVOKE.switch_channel_clear_flag(SWIGTYPE_p_switch_channel.getCPtr(channel), flags); + public static void switch_channel_clear_flag(SWIGTYPE_p_switch_channel channel, switch_channel_flag_t flag) { + freeswitchPINVOKE.switch_channel_clear_flag(SWIGTYPE_p_switch_channel.getCPtr(channel), (int)flag); } public static switch_status_t switch_channel_perform_answer(SWIGTYPE_p_switch_channel channel, string file, string func, int line) { @@ -2510,6 +2580,23 @@ return ret; } + public static void switch_channel_audio_sync(SWIGTYPE_p_switch_channel channel) { + freeswitchPINVOKE.switch_channel_audio_sync(SWIGTYPE_p_switch_channel.getCPtr(channel)); + } + + public static void switch_channel_set_private_flag(SWIGTYPE_p_switch_channel channel, uint flags) { + freeswitchPINVOKE.switch_channel_set_private_flag(SWIGTYPE_p_switch_channel.getCPtr(channel), flags); + } + + public static void switch_channel_clear_private_flag(SWIGTYPE_p_switch_channel channel, uint flags) { + freeswitchPINVOKE.switch_channel_clear_private_flag(SWIGTYPE_p_switch_channel.getCPtr(channel), flags); + } + + public static int switch_channel_test_private_flag(SWIGTYPE_p_switch_channel channel, uint flags) { + int ret = freeswitchPINVOKE.switch_channel_test_private_flag(SWIGTYPE_p_switch_channel.getCPtr(channel), flags); + return ret; + } + public static switch_status_t switch_buffer_create(SWIGTYPE_p_apr_pool_t pool, SWIGTYPE_p_p_switch_buffer buffer, SWIGTYPE_p_switch_size_t max_len) { switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_buffer_create(SWIGTYPE_p_apr_pool_t.getCPtr(pool), SWIGTYPE_p_p_switch_buffer.getCPtr(buffer), SWIGTYPE_p_switch_size_t.getCPtr(max_len)); if (freeswitchPINVOKE.SWIGPendingException.Pending) throw freeswitchPINVOKE.SWIGPendingException.Retrieve(); @@ -2812,8 +2899,8 @@ return ret; } - public static switch_status_t switch_ivr_sleep(SWIGTYPE_p_switch_core_session session, uint ms, switch_input_args_t args) { - switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_ivr_sleep(SWIGTYPE_p_switch_core_session.getCPtr(session), ms, switch_input_args_t.getCPtr(args)); + public static switch_status_t switch_ivr_sleep(SWIGTYPE_p_switch_core_session session, uint ms, switch_bool_t sync, switch_input_args_t args) { + switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_ivr_sleep(SWIGTYPE_p_switch_core_session.getCPtr(session), ms, (int)sync, switch_input_args_t.getCPtr(args)); return ret; } @@ -2917,8 +3004,8 @@ return ret; } - public static switch_status_t switch_ivr_tone_detect_session(SWIGTYPE_p_switch_core_session session, string key, string tone_spec, string flags, SWIGTYPE_p_time_t timeout, string app, string data) { - switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_ivr_tone_detect_session(SWIGTYPE_p_switch_core_session.getCPtr(session), key, tone_spec, flags, SWIGTYPE_p_time_t.getCPtr(timeout), app, data); + public static switch_status_t switch_ivr_tone_detect_session(SWIGTYPE_p_switch_core_session session, string key, string tone_spec, string flags, SWIGTYPE_p_time_t timeout, int hits, string app, string data) { + switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_ivr_tone_detect_session(SWIGTYPE_p_switch_core_session.getCPtr(session), key, tone_spec, flags, SWIGTYPE_p_time_t.getCPtr(timeout), hits, app, data); if (freeswitchPINVOKE.SWIGPendingException.Pending) throw freeswitchPINVOKE.SWIGPendingException.Retrieve(); return ret; } @@ -2962,8 +3049,8 @@ return ret; } - public static switch_status_t switch_ivr_originate(SWIGTYPE_p_switch_core_session session, SWIGTYPE_p_p_switch_core_session bleg, SWIGTYPE_p_switch_call_cause_t cause, string bridgeto, uint timelimit_sec, switch_state_handler_table table, string cid_name_override, string cid_num_override, switch_caller_profile caller_profile_override, uint flags) { - switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_ivr_originate(SWIGTYPE_p_switch_core_session.getCPtr(session), SWIGTYPE_p_p_switch_core_session.getCPtr(bleg), SWIGTYPE_p_switch_call_cause_t.getCPtr(cause), bridgeto, timelimit_sec, switch_state_handler_table.getCPtr(table), cid_name_override, cid_num_override, switch_caller_profile.getCPtr(caller_profile_override), flags); + public static switch_status_t switch_ivr_originate(SWIGTYPE_p_switch_core_session session, SWIGTYPE_p_p_switch_core_session bleg, SWIGTYPE_p_switch_call_cause_t cause, string bridgeto, uint timelimit_sec, switch_state_handler_table table, string cid_name_override, string cid_num_override, switch_caller_profile caller_profile_override, switch_event ovars, uint flags) { + switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_ivr_originate(SWIGTYPE_p_switch_core_session.getCPtr(session), SWIGTYPE_p_p_switch_core_session.getCPtr(bleg), SWIGTYPE_p_switch_call_cause_t.getCPtr(cause), bridgeto, timelimit_sec, switch_state_handler_table.getCPtr(table), cid_name_override, cid_num_override, switch_caller_profile.getCPtr(caller_profile_override), switch_event.getCPtr(ovars), flags); return ret; } @@ -3242,8 +3329,9 @@ freeswitchPINVOKE.switch_rtp_release_port(ip, port); } - public static void switch_rtp_change_interval(SWIGTYPE_p_switch_rtp rtp_session, uint ms_per_packet, uint samples_per_interval) { - freeswitchPINVOKE.switch_rtp_change_interval(SWIGTYPE_p_switch_rtp.getCPtr(rtp_session), ms_per_packet, samples_per_interval); + public static switch_status_t switch_rtp_change_interval(SWIGTYPE_p_switch_rtp rtp_session, uint ms_per_packet, uint samples_per_interval) { + switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_rtp_change_interval(SWIGTYPE_p_switch_rtp.getCPtr(rtp_session), ms_per_packet, samples_per_interval); + return ret; } public static switch_status_t switch_rtp_create(SWIGTYPE_p_p_switch_rtp new_rtp_session, byte payload, uint samples_per_interval, uint ms_per_packet, uint flags, string timer_name, ref string err, SWIGTYPE_p_apr_pool_t pool) { @@ -3384,6 +3472,10 @@ return ret; } + public static void rtp_flush_read_buffer(SWIGTYPE_p_switch_rtp rtp_session) { + freeswitchPINVOKE.rtp_flush_read_buffer(SWIGTYPE_p_switch_rtp.getCPtr(rtp_session)); + } + public static switch_status_t switch_rtp_enable_vad(SWIGTYPE_p_switch_rtp rtp_session, SWIGTYPE_p_switch_core_session session, switch_codec codec, uint flags) { switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_rtp_enable_vad(SWIGTYPE_p_switch_rtp.getCPtr(rtp_session), SWIGTYPE_p_switch_core_session.getCPtr(session), switch_codec.getCPtr(codec), flags); return ret; @@ -3850,6 +3942,10 @@ freeswitchPINVOKE.console_clean_log(msg); } + public static void msleep(uint ms) { + freeswitchPINVOKE.msleep(ms); + } + public static void bridge(CoreSession session_a, CoreSession session_b) { freeswitchPINVOKE.bridge(CoreSession.getCPtr(session_a), CoreSession.getCPtr(session_b)); if (freeswitchPINVOKE.SWIGPendingException.Pending) throw freeswitchPINVOKE.SWIGPendingException.Retrieve(); @@ -3922,11 +4018,14 @@ public static readonly int SWITCH_MAX_DTMF_DURATION = freeswitchPINVOKE.SWITCH_MAX_DTMF_DURATION_get(); public static readonly string SWITCH_PATH_SEPARATOR = freeswitchPINVOKE.SWITCH_PATH_SEPARATOR_get(); public static readonly string SWITCH_URL_SEPARATOR = freeswitchPINVOKE.SWITCH_URL_SEPARATOR_get(); + public static readonly string SWITCH_SEND_SILENCE_WHEN_IDLE_VARIABLE = freeswitchPINVOKE.SWITCH_SEND_SILENCE_WHEN_IDLE_VARIABLE_get(); + public static readonly string SWITCH_CURRENT_APPLICATION_VARIABLE = freeswitchPINVOKE.SWITCH_CURRENT_APPLICATION_VARIABLE_get(); + public static readonly string SWITCH_CURRENT_APPLICATION_DATA_VARIABLE = freeswitchPINVOKE.SWITCH_CURRENT_APPLICATION_DATA_VARIABLE_get(); + public static readonly string SWITCH_CURRENT_APPLICATION_RESPONSE_VARIABLE = freeswitchPINVOKE.SWITCH_CURRENT_APPLICATION_RESPONSE_VARIABLE_get(); public static readonly string SWITCH_ENABLE_HEARTBEAT_EVENTS_VARIABLE = freeswitchPINVOKE.SWITCH_ENABLE_HEARTBEAT_EVENTS_VARIABLE_get(); public static readonly string SWITCH_BYPASS_MEDIA_AFTER_BRIDGE_VARIABLE = freeswitchPINVOKE.SWITCH_BYPASS_MEDIA_AFTER_BRIDGE_VARIABLE_get(); public static readonly string SWITCH_READ_RESULT_VARIABLE = freeswitchPINVOKE.SWITCH_READ_RESULT_VARIABLE_get(); public static readonly string SWITCH_COPY_XML_CDR_VARIABLE = freeswitchPINVOKE.SWITCH_COPY_XML_CDR_VARIABLE_get(); - public static readonly string SWITCH_CURRENT_APPLICATION_VARIABLE = freeswitchPINVOKE.SWITCH_CURRENT_APPLICATION_VARIABLE_get(); public static readonly string SWITCH_PROTO_SPECIFIC_HANGUP_CAUSE_VARIABLE = freeswitchPINVOKE.SWITCH_PROTO_SPECIFIC_HANGUP_CAUSE_VARIABLE_get(); public static readonly string SWITCH_CHANNEL_EXECUTE_ON_ANSWER_VARIABLE = freeswitchPINVOKE.SWITCH_CHANNEL_EXECUTE_ON_ANSWER_VARIABLE_get(); public static readonly string SWITCH_CHANNEL_EXECUTE_ON_RING_VARIABLE = freeswitchPINVOKE.SWITCH_CHANNEL_EXECUTE_ON_RING_VARIABLE_get(); @@ -3934,6 +4033,7 @@ public static readonly string SWITCH_HOLDING_UUID_VARIABLE = freeswitchPINVOKE.SWITCH_HOLDING_UUID_VARIABLE_get(); public static readonly string SWITCH_API_BRIDGE_END_VARIABLE = freeswitchPINVOKE.SWITCH_API_BRIDGE_END_VARIABLE_get(); public static readonly string SWITCH_API_HANGUP_HOOK_VARIABLE = freeswitchPINVOKE.SWITCH_API_HANGUP_HOOK_VARIABLE_get(); + public static readonly string SWITCH_SESSION_IN_HANGUP_HOOK_VARIABLE = freeswitchPINVOKE.SWITCH_SESSION_IN_HANGUP_HOOK_VARIABLE_get(); public static readonly string SWITCH_PROCESS_CDR_VARIABLE = freeswitchPINVOKE.SWITCH_PROCESS_CDR_VARIABLE_get(); public static readonly string SWITCH_BRIDGE_CHANNEL_VARIABLE = freeswitchPINVOKE.SWITCH_BRIDGE_CHANNEL_VARIABLE_get(); public static readonly string SWITCH_CHANNEL_NAME_VARIABLE = freeswitchPINVOKE.SWITCH_CHANNEL_NAME_VARIABLE_get(); @@ -4389,6 +4489,18 @@ [DllImport("mod_managed", EntryPoint="CSharp_SWITCH_URL_SEPARATOR_get")] public static extern string SWITCH_URL_SEPARATOR_get(); + [DllImport("mod_managed", EntryPoint="CSharp_SWITCH_SEND_SILENCE_WHEN_IDLE_VARIABLE_get")] + public static extern string SWITCH_SEND_SILENCE_WHEN_IDLE_VARIABLE_get(); + + [DllImport("mod_managed", EntryPoint="CSharp_SWITCH_CURRENT_APPLICATION_VARIABLE_get")] + public static extern string SWITCH_CURRENT_APPLICATION_VARIABLE_get(); + + [DllImport("mod_managed", EntryPoint="CSharp_SWITCH_CURRENT_APPLICATION_DATA_VARIABLE_get")] + public static extern string SWITCH_CURRENT_APPLICATION_DATA_VARIABLE_get(); + + [DllImport("mod_managed", EntryPoint="CSharp_SWITCH_CURRENT_APPLICATION_RESPONSE_VARIABLE_get")] + public static extern string SWITCH_CURRENT_APPLICATION_RESPONSE_VARIABLE_get(); + [DllImport("mod_managed", EntryPoint="CSharp_SWITCH_ENABLE_HEARTBEAT_EVENTS_VARIABLE_get")] public static extern string SWITCH_ENABLE_HEARTBEAT_EVENTS_VARIABLE_get(); @@ -4401,9 +4513,6 @@ [DllImport("mod_managed", EntryPoint="CSharp_SWITCH_COPY_XML_CDR_VARIABLE_get")] public static extern string SWITCH_COPY_XML_CDR_VARIABLE_get(); - [DllImport("mod_managed", EntryPoint="CSharp_SWITCH_CURRENT_APPLICATION_VARIABLE_get")] - public static extern string SWITCH_CURRENT_APPLICATION_VARIABLE_get(); - [DllImport("mod_managed", EntryPoint="CSharp_SWITCH_PROTO_SPECIFIC_HANGUP_CAUSE_VARIABLE_get")] public static extern string SWITCH_PROTO_SPECIFIC_HANGUP_CAUSE_VARIABLE_get(); @@ -4425,6 +4534,9 @@ [DllImport("mod_managed", EntryPoint="CSharp_SWITCH_API_HANGUP_HOOK_VARIABLE_get")] public static extern string SWITCH_API_HANGUP_HOOK_VARIABLE_get(); + [DllImport("mod_managed", EntryPoint="CSharp_SWITCH_SESSION_IN_HANGUP_HOOK_VARIABLE_get")] + public static extern string SWITCH_SESSION_IN_HANGUP_HOOK_VARIABLE_get(); + [DllImport("mod_managed", EntryPoint="CSharp_SWITCH_PROCESS_CDR_VARIABLE_get")] public static extern string SWITCH_PROCESS_CDR_VARIABLE_get(); @@ -5361,6 +5473,9 @@ [DllImport("mod_managed", EntryPoint="CSharp_switch_core_session_read_lock")] public static extern int switch_core_session_read_lock(HandleRef jarg1); + [DllImport("mod_managed", EntryPoint="CSharp_switch_core_session_read_lock_hangup")] + public static extern int switch_core_session_read_lock_hangup(HandleRef jarg1); + [DllImport("mod_managed", EntryPoint="CSharp_switch_core_session_write_lock")] public static extern void switch_core_session_write_lock(HandleRef jarg1); @@ -5937,6 +6052,45 @@ [DllImport("mod_managed", EntryPoint="CSharp_switch_console_stream_raw_write")] public static extern int switch_console_stream_raw_write(HandleRef jarg1, HandleRef jarg2, HandleRef jarg3); + [DllImport("mod_managed", EntryPoint="CSharp_switch_toupper")] + public static extern int switch_toupper(int jarg1); + + [DllImport("mod_managed", EntryPoint="CSharp_switch_tolower")] + public static extern int switch_tolower(int jarg1); + + [DllImport("mod_managed", EntryPoint="CSharp_switch_isalnum")] + public static extern int switch_isalnum(int jarg1); + + [DllImport("mod_managed", EntryPoint="CSharp_switch_isalpha")] + public static extern int switch_isalpha(int jarg1); + + [DllImport("mod_managed", EntryPoint="CSharp_switch_iscntrl")] + public static extern int switch_iscntrl(int jarg1); + + [DllImport("mod_managed", EntryPoint="CSharp_switch_isdigit")] + public static extern int switch_isdigit(int jarg1); + + [DllImport("mod_managed", EntryPoint="CSharp_switch_isgraph")] + public static extern int switch_isgraph(int jarg1); + + [DllImport("mod_managed", EntryPoint="CSharp_switch_islower")] + public static extern int switch_islower(int jarg1); + + [DllImport("mod_managed", EntryPoint="CSharp_switch_isprint")] + public static extern int switch_isprint(int jarg1); + + [DllImport("mod_managed", EntryPoint="CSharp_switch_ispunct")] + public static extern int switch_ispunct(int jarg1); + + [DllImport("mod_managed", EntryPoint="CSharp_switch_isspace")] + public static extern int switch_isspace(int jarg1); + + [DllImport("mod_managed", EntryPoint="CSharp_switch_isupper")] + public static extern int switch_isupper(int jarg1); + + [DllImport("mod_managed", EntryPoint="CSharp_switch_isxdigit")] + public static extern int switch_isxdigit(int jarg1); + [DllImport("mod_managed", EntryPoint="CSharp_SWITCH_SMAX_get")] public static extern int SWITCH_SMAX_get(); @@ -6690,6 +6844,12 @@ [DllImport("mod_managed", EntryPoint="CSharp_switch_endpoint_interface_refs_get")] public static extern int switch_endpoint_interface_refs_get(HandleRef jarg1); + [DllImport("mod_managed", EntryPoint="CSharp_switch_endpoint_interface_reflock_set")] + public static extern void switch_endpoint_interface_reflock_set(HandleRef jarg1, HandleRef jarg2); + + [DllImport("mod_managed", EntryPoint="CSharp_switch_endpoint_interface_reflock_get")] + public static extern IntPtr switch_endpoint_interface_reflock_get(HandleRef jarg1); + [DllImport("mod_managed", EntryPoint="CSharp_switch_endpoint_interface_parent_set")] public static extern void switch_endpoint_interface_parent_set(HandleRef jarg1, HandleRef jarg2); @@ -6822,6 +6982,12 @@ [DllImport("mod_managed", EntryPoint="CSharp_switch_timer_interface_refs_get")] public static extern int switch_timer_interface_refs_get(HandleRef jarg1); + [DllImport("mod_managed", EntryPoint="CSharp_switch_timer_interface_reflock_set")] + public static extern void switch_timer_interface_reflock_set(HandleRef jarg1, HandleRef jarg2); + + [DllImport("mod_managed", EntryPoint="CSharp_switch_timer_interface_reflock_get")] + public static extern IntPtr switch_timer_interface_reflock_get(HandleRef jarg1); + [DllImport("mod_managed", EntryPoint="CSharp_switch_timer_interface_parent_set")] public static extern void switch_timer_interface_parent_set(HandleRef jarg1, HandleRef jarg2); @@ -6864,6 +7030,12 @@ [DllImport("mod_managed", EntryPoint="CSharp_switch_dialplan_interface_refs_get")] public static extern int switch_dialplan_interface_refs_get(HandleRef jarg1); + [DllImport("mod_managed", EntryPoint="CSharp_switch_dialplan_interface_reflock_set")] + public static extern void switch_dialplan_interface_reflock_set(HandleRef jarg1, HandleRef jarg2); + + [DllImport("mod_managed", EntryPoint="CSharp_switch_dialplan_interface_reflock_get")] + public static extern IntPtr switch_dialplan_interface_reflock_get(HandleRef jarg1); + [DllImport("mod_managed", EntryPoint="CSharp_switch_dialplan_interface_parent_set")] public static extern void switch_dialplan_interface_parent_set(HandleRef jarg1, HandleRef jarg2); @@ -6948,6 +7120,12 @@ [DllImport("mod_managed", EntryPoint="CSharp_switch_file_interface_refs_get")] public static extern int switch_file_interface_refs_get(HandleRef jarg1); + [DllImport("mod_managed", EntryPoint="CSharp_switch_file_interface_reflock_set")] + public static extern void switch_file_interface_reflock_set(HandleRef jarg1, HandleRef jarg2); + + [DllImport("mod_managed", EntryPoint="CSharp_switch_file_interface_reflock_get")] + public static extern IntPtr switch_file_interface_reflock_get(HandleRef jarg1); + [DllImport("mod_managed", EntryPoint="CSharp_switch_file_interface_parent_set")] public static extern void switch_file_interface_parent_set(HandleRef jarg1, HandleRef jarg2); @@ -7236,6 +7414,12 @@ [DllImport("mod_managed", EntryPoint="CSharp_switch_asr_interface_refs_get")] public static extern int switch_asr_interface_refs_get(HandleRef jarg1); + [DllImport("mod_managed", EntryPoint="CSharp_switch_asr_interface_reflock_set")] + public static extern void switch_asr_interface_reflock_set(HandleRef jarg1, HandleRef jarg2); + + [DllImport("mod_managed", EntryPoint="CSharp_switch_asr_interface_reflock_get")] + public static extern IntPtr switch_asr_interface_reflock_get(HandleRef jarg1); + [DllImport("mod_managed", EntryPoint="CSharp_switch_asr_interface_parent_set")] public static extern void switch_asr_interface_parent_set(HandleRef jarg1, HandleRef jarg2); @@ -7380,6 +7564,12 @@ [DllImport("mod_managed", EntryPoint="CSharp_switch_speech_interface_refs_get")] public static extern int switch_speech_interface_refs_get(HandleRef jarg1); + [DllImport("mod_managed", EntryPoint="CSharp_switch_speech_interface_reflock_set")] + public static extern void switch_speech_interface_reflock_set(HandleRef jarg1, HandleRef jarg2); + + [DllImport("mod_managed", EntryPoint="CSharp_switch_speech_interface_reflock_get")] + public static extern IntPtr switch_speech_interface_reflock_get(HandleRef jarg1); + [DllImport("mod_managed", EntryPoint="CSharp_switch_speech_interface_parent_set")] public static extern void switch_speech_interface_parent_set(HandleRef jarg1, HandleRef jarg2); @@ -7494,6 +7684,12 @@ [DllImport("mod_managed", EntryPoint="CSharp_switch_say_interface_refs_get")] public static extern int switch_say_interface_refs_get(HandleRef jarg1); + [DllImport("mod_managed", EntryPoint="CSharp_switch_say_interface_reflock_set")] + public static extern void switch_say_interface_reflock_set(HandleRef jarg1, HandleRef jarg2); + + [DllImport("mod_managed", EntryPoint="CSharp_switch_say_interface_reflock_get")] + public static extern IntPtr switch_say_interface_reflock_get(HandleRef jarg1); + [DllImport("mod_managed", EntryPoint="CSharp_switch_say_interface_parent_set")] public static extern void switch_say_interface_parent_set(HandleRef jarg1, HandleRef jarg2); @@ -7536,6 +7732,12 @@ [DllImport("mod_managed", EntryPoint="CSharp_switch_chat_interface_refs_get")] public static extern int switch_chat_interface_refs_get(HandleRef jarg1); + [DllImport("mod_managed", EntryPoint="CSharp_switch_chat_interface_reflock_set")] + public static extern void switch_chat_interface_reflock_set(HandleRef jarg1, HandleRef jarg2); + + [DllImport("mod_managed", EntryPoint="CSharp_switch_chat_interface_reflock_get")] + public static extern IntPtr switch_chat_interface_reflock_get(HandleRef jarg1); + [DllImport("mod_managed", EntryPoint="CSharp_switch_chat_interface_parent_set")] public static extern void switch_chat_interface_parent_set(HandleRef jarg1, HandleRef jarg2); @@ -7578,6 +7780,12 @@ [DllImport("mod_managed", EntryPoint="CSharp_switch_management_interface_refs_get")] public static extern int switch_management_interface_refs_get(HandleRef jarg1); + [DllImport("mod_managed", EntryPoint="CSharp_switch_management_interface_reflock_set")] + public static extern void switch_management_interface_reflock_set(HandleRef jarg1, HandleRef jarg2); + + [DllImport("mod_managed", EntryPoint="CSharp_switch_management_interface_reflock_get")] + public static extern IntPtr switch_management_interface_reflock_get(HandleRef jarg1); + [DllImport("mod_managed", EntryPoint="CSharp_switch_management_interface_parent_set")] public static extern void switch_management_interface_parent_set(HandleRef jarg1, HandleRef jarg2); @@ -7644,6 +7852,12 @@ [DllImport("mod_managed", EntryPoint="CSharp_switch_directory_interface_refs_get")] public static extern int switch_directory_interface_refs_get(HandleRef jarg1); + [DllImport("mod_managed", EntryPoint="CSharp_switch_directory_interface_reflock_set")] + public static extern void switch_directory_interface_reflock_set(HandleRef jarg1, HandleRef jarg2); + + [DllImport("mod_managed", EntryPoint="CSharp_switch_directory_interface_reflock_get")] + public static extern IntPtr switch_directory_interface_reflock_get(HandleRef jarg1); + [DllImport("mod_managed", EntryPoint="CSharp_switch_directory_interface_parent_set")] public static extern void switch_directory_interface_parent_set(HandleRef jarg1, HandleRef jarg2); @@ -8010,6 +8224,12 @@ [DllImport("mod_managed", EntryPoint="CSharp_switch_codec_interface_refs_get")] public static extern int switch_codec_interface_refs_get(HandleRef jarg1); + [DllImport("mod_managed", EntryPoint="CSharp_switch_codec_interface_reflock_set")] + public static extern void switch_codec_interface_reflock_set(HandleRef jarg1, HandleRef jarg2); + + [DllImport("mod_managed", EntryPoint="CSharp_switch_codec_interface_reflock_get")] + public static extern IntPtr switch_codec_interface_reflock_get(HandleRef jarg1); + [DllImport("mod_managed", EntryPoint="CSharp_switch_codec_interface_parent_set")] public static extern void switch_codec_interface_parent_set(HandleRef jarg1, HandleRef jarg2); @@ -8076,6 +8296,12 @@ [DllImport("mod_managed", EntryPoint="CSharp_switch_application_interface_refs_get")] public static extern int switch_application_interface_refs_get(HandleRef jarg1); + [DllImport("mod_managed", EntryPoint="CSharp_switch_application_interface_reflock_set")] + public static extern void switch_application_interface_reflock_set(HandleRef jarg1, HandleRef jarg2); + + [DllImport("mod_managed", EntryPoint="CSharp_switch_application_interface_reflock_get")] + public static extern IntPtr switch_application_interface_reflock_get(HandleRef jarg1); + [DllImport("mod_managed", EntryPoint="CSharp_switch_application_interface_parent_set")] public static extern void switch_application_interface_parent_set(HandleRef jarg1, HandleRef jarg2); @@ -8130,6 +8356,12 @@ [DllImport("mod_managed", EntryPoint="CSharp_switch_api_interface_refs_get")] public static extern int switch_api_interface_refs_get(HandleRef jarg1); + [DllImport("mod_managed", EntryPoint="CSharp_switch_api_interface_reflock_set")] + public static extern void switch_api_interface_reflock_set(HandleRef jarg1, HandleRef jarg2); + + [DllImport("mod_managed", EntryPoint="CSharp_switch_api_interface_reflock_get")] + public static extern IntPtr switch_api_interface_reflock_get(HandleRef jarg1); + [DllImport("mod_managed", EntryPoint="CSharp_switch_api_interface_parent_set")] public static extern void switch_api_interface_parent_set(HandleRef jarg1, HandleRef jarg2); @@ -8215,7 +8447,7 @@ public static extern void switch_channel_wait_for_state(HandleRef jarg1, HandleRef jarg2, int jarg3); [DllImport("mod_managed", EntryPoint="CSharp_switch_channel_wait_for_flag")] - public static extern int switch_channel_wait_for_flag(HandleRef jarg1, uint jarg2, int jarg3, uint jarg4, HandleRef jarg5); + public static extern int switch_channel_wait_for_flag(HandleRef jarg1, int jarg2, int jarg3, uint jarg4, HandleRef jarg5); [DllImport("mod_managed", EntryPoint="CSharp_switch_channel_perform_set_state")] public static extern int switch_channel_perform_set_state(HandleRef jarg1, string jarg2, string jarg3, int jarg4, int jarg5); @@ -8245,7 +8477,7 @@ public static extern int switch_channel_alloc(HandleRef jarg1, HandleRef jarg2); [DllImport("mod_managed", EntryPoint="CSharp_switch_channel_init")] - public static extern int switch_channel_init(HandleRef jarg1, HandleRef jarg2, int jarg3, uint jarg4); + public static extern int switch_channel_init(HandleRef jarg1, HandleRef jarg2, int jarg3, int jarg4); [DllImport("mod_managed", EntryPoint="CSharp_switch_channel_presence")] public static extern void switch_channel_presence(HandleRef jarg1, string jarg2, string jarg3, string jarg4); @@ -8305,22 +8537,22 @@ public static extern IntPtr switch_channel_get_caller_extension(HandleRef jarg1); [DllImport("mod_managed", EntryPoint="CSharp_switch_channel_test_flag")] - public static extern uint switch_channel_test_flag(HandleRef jarg1, uint jarg2); + public static extern uint switch_channel_test_flag(HandleRef jarg1, int jarg2); [DllImport("mod_managed", EntryPoint="CSharp_switch_channel_set_flag")] - public static extern void switch_channel_set_flag(HandleRef jarg1, uint jarg2); + public static extern void switch_channel_set_flag(HandleRef jarg1, int jarg2); [DllImport("mod_managed", EntryPoint="CSharp_switch_channel_set_flag_partner")] - public static extern int switch_channel_set_flag_partner(HandleRef jarg1, uint jarg2); + public static extern int switch_channel_set_flag_partner(HandleRef jarg1, int jarg2); [DllImport("mod_managed", EntryPoint="CSharp_switch_channel_clear_flag_partner")] - public static extern int switch_channel_clear_flag_partner(HandleRef jarg1, uint jarg2); + public static extern int switch_channel_clear_flag_partner(HandleRef jarg1, int jarg2); [DllImport("mod_managed", EntryPoint="CSharp_switch_channel_set_state_flag")] - public static extern void switch_channel_set_state_flag(HandleRef jarg1, uint jarg2); + public static extern void switch_channel_set_state_flag(HandleRef jarg1, int jarg2); [DllImport("mod_managed", EntryPoint="CSharp_switch_channel_clear_flag")] - public static extern void switch_channel_clear_flag(HandleRef jarg1, uint jarg2); + public static extern void switch_channel_clear_flag(HandleRef jarg1, int jarg2); [DllImport("mod_managed", EntryPoint="CSharp_switch_channel_perform_answer")] public static extern int switch_channel_perform_answer(HandleRef jarg1, string jarg2, string jarg3, int jarg4); @@ -8400,6 +8632,18 @@ [DllImport("mod_managed", EntryPoint="CSharp_switch_channel_set_timestamps")] public static extern int switch_channel_set_timestamps(HandleRef jarg1); + [DllImport("mod_managed", EntryPoint="CSharp_switch_channel_audio_sync")] + public static extern void switch_channel_audio_sync(HandleRef jarg1); + + [DllImport("mod_managed", EntryPoint="CSharp_switch_channel_set_private_flag")] + public static extern void switch_channel_set_private_flag(HandleRef jarg1, uint jarg2); + + [DllImport("mod_managed", EntryPoint="CSharp_switch_channel_clear_private_flag")] + public static extern void switch_channel_clear_private_flag(HandleRef jarg1, uint jarg2); + + [DllImport("mod_managed", EntryPoint="CSharp_switch_channel_test_private_flag")] + public static extern int switch_channel_test_private_flag(HandleRef jarg1, uint jarg2); + [DllImport("mod_managed", EntryPoint="CSharp_switch_buffer_create")] public static extern int switch_buffer_create(HandleRef jarg1, HandleRef jarg2, HandleRef jarg3); @@ -8860,7 +9104,7 @@ public static extern int switch_ivr_parse_next_event(HandleRef jarg1); [DllImport("mod_managed", EntryPoint="CSharp_switch_ivr_sleep")] - public static extern int switch_ivr_sleep(HandleRef jarg1, uint jarg2, HandleRef jarg3); + public static extern int switch_ivr_sleep(HandleRef jarg1, uint jarg2, int jarg3, HandleRef jarg4); [DllImport("mod_managed", EntryPoint="CSharp_switch_ivr_park")] public static extern int switch_ivr_park(HandleRef jarg1, HandleRef jarg2); @@ -8923,7 +9167,7 @@ public static extern int switch_ivr_stop_tone_detect_session(HandleRef jarg1); [DllImport("mod_managed", EntryPoint="CSharp_switch_ivr_tone_detect_session")] - public static extern int switch_ivr_tone_detect_session(HandleRef jarg1, string jarg2, string jarg3, string jarg4, HandleRef jarg5, string jarg6, string jarg7); + public static extern int switch_ivr_tone_detect_session(HandleRef jarg1, string jarg2, string jarg3, string jarg4, HandleRef jarg5, int jarg6, string jarg7, string jarg8); [DllImport("mod_managed", EntryPoint="CSharp_switch_ivr_play_file")] public static extern int switch_ivr_play_file(HandleRef jarg1, HandleRef jarg2, string jarg3, HandleRef jarg4); @@ -8950,7 +9194,7 @@ public static extern int switch_ivr_speak_text(HandleRef jarg1, string jarg2, string jarg3, string jarg4, HandleRef jarg5); [DllImport("mod_managed", EntryPoint="CSharp_switch_ivr_originate")] - public static extern int switch_ivr_originate(HandleRef jarg1, HandleRef jarg2, HandleRef jarg3, string jarg4, uint jarg5, HandleRef jarg6, string jarg7, string jarg8, HandleRef jarg9, uint jarg10); + public static extern int switch_ivr_originate(HandleRef jarg1, HandleRef jarg2, HandleRef jarg3, string jarg4, uint jarg5, HandleRef jarg6, string jarg7, string jarg8, HandleRef jarg9, HandleRef jarg10, uint jarg11); [DllImport("mod_managed", EntryPoint="CSharp_switch_ivr_multi_threaded_bridge")] public static extern int switch_ivr_multi_threaded_bridge(HandleRef jarg1, HandleRef jarg2, HandleRef jarg3, HandleRef jarg4, HandleRef jarg5); @@ -9169,7 +9413,7 @@ public static extern void switch_rtp_release_port(string jarg1, ushort jarg2); [DllImport("mod_managed", EntryPoint="CSharp_switch_rtp_change_interval")] - public static extern void switch_rtp_change_interval(HandleRef jarg1, uint jarg2, uint jarg3); + public static extern int switch_rtp_change_interval(HandleRef jarg1, uint jarg2, uint jarg3); [DllImport("mod_managed", EntryPoint="CSharp_switch_rtp_create")] public static extern int switch_rtp_create(HandleRef jarg1, byte jarg2, uint jarg3, uint jarg4, uint jarg5, string jarg6, ref string jarg7, HandleRef jarg8); @@ -9258,6 +9502,9 @@ [DllImport("mod_managed", EntryPoint="CSharp_switch_rtp_zerocopy_read_frame")] public static extern int switch_rtp_zerocopy_read_frame(HandleRef jarg1, HandleRef jarg2, uint jarg3); + [DllImport("mod_managed", EntryPoint="CSharp_rtp_flush_read_buffer")] + public static extern void rtp_flush_read_buffer(HandleRef jarg1); + [DllImport("mod_managed", EntryPoint="CSharp_switch_rtp_enable_vad")] public static extern int switch_rtp_enable_vad(HandleRef jarg1, HandleRef jarg2, HandleRef jarg3, uint jarg4); @@ -10360,7 +10607,7 @@ public static extern int CoreSession_StreamFile(HandleRef jarg1, string jarg2, int jarg3); [DllImport("mod_managed", EntryPoint="CSharp_CoreSession_sleep")] - public static extern int CoreSession_sleep(HandleRef jarg1, int jarg2); + public static extern int CoreSession_sleep(HandleRef jarg1, int jarg2, int jarg3); [DllImport("mod_managed", EntryPoint="CSharp_CoreSession_flushEvents")] public static extern int CoreSession_flushEvents(HandleRef jarg1); @@ -10416,6 +10663,9 @@ [DllImport("mod_managed", EntryPoint="CSharp_console_clean_log")] public static extern void console_clean_log(string jarg1); + [DllImport("mod_managed", EntryPoint="CSharp_msleep")] + public static extern void msleep(uint jarg1); + [DllImport("mod_managed", EntryPoint="CSharp_bridge")] public static extern void bridge(HandleRef jarg1, HandleRef jarg2); @@ -14949,6 +15199,17 @@ } } + public SWIGTYPE_p_switch_mutex_t reflock { + set { + freeswitchPINVOKE.switch_api_interface_reflock_set(swigCPtr, SWIGTYPE_p_switch_mutex_t.getCPtr(value)); + } + get { + IntPtr cPtr = freeswitchPINVOKE.switch_api_interface_reflock_get(swigCPtr); + SWIGTYPE_p_switch_mutex_t ret = (cPtr == IntPtr.Zero) ? null : new SWIGTYPE_p_switch_mutex_t(cPtr, false); + return ret; + } + } + public SWIGTYPE_p_switch_loadable_module_interface parent { set { freeswitchPINVOKE.switch_api_interface_parent_set(swigCPtr, SWIGTYPE_p_switch_loadable_module_interface.getCPtr(value)); @@ -15116,6 +15377,17 @@ } } + public SWIGTYPE_p_switch_mutex_t reflock { + set { + freeswitchPINVOKE.switch_application_interface_reflock_set(swigCPtr, SWIGTYPE_p_switch_mutex_t.getCPtr(value)); + } + get { + IntPtr cPtr = freeswitchPINVOKE.switch_application_interface_reflock_get(swigCPtr); + SWIGTYPE_p_switch_mutex_t ret = (cPtr == IntPtr.Zero) ? null : new SWIGTYPE_p_switch_mutex_t(cPtr, false); + return ret; + } + } + public SWIGTYPE_p_switch_loadable_module_interface parent { set { freeswitchPINVOKE.switch_application_interface_parent_set(swigCPtr, SWIGTYPE_p_switch_loadable_module_interface.getCPtr(value)); @@ -15553,6 +15825,17 @@ } } + public SWIGTYPE_p_switch_mutex_t reflock { + set { + freeswitchPINVOKE.switch_asr_interface_reflock_set(swigCPtr, SWIGTYPE_p_switch_mutex_t.getCPtr(value)); + } + get { + IntPtr cPtr = freeswitchPINVOKE.switch_asr_interface_reflock_get(swigCPtr); + SWIGTYPE_p_switch_mutex_t ret = (cPtr == IntPtr.Zero) ? null : new SWIGTYPE_p_switch_mutex_t(cPtr, false); + return ret; + } + } + public SWIGTYPE_p_switch_loadable_module_interface parent { set { freeswitchPINVOKE.switch_asr_interface_parent_set(swigCPtr, SWIGTYPE_p_switch_loadable_module_interface.getCPtr(value)); @@ -16653,38 +16936,38 @@ namespace FreeSWITCH.Native { -[System.Flags] public enum switch_channel_flag_enum_t { - CF_ANSWERED = (1 << 0), - CF_OUTBOUND = (1 << 1), - CF_EARLY_MEDIA = (1 << 2), - CF_ORIGINATOR = (1 << 3), - CF_TRANSFER = (1 << 4), - CF_ACCEPT_CNG = (1 << 5), - CF_WAIT_FOR_ME = (1 << 6), - CF_BRIDGED = (1 << 7), - CF_HOLD = (1 << 8), - CF_SERVICE = (1 << 9), - CF_TAGGED = (1 << 10), - CF_WINNER = (1 << 11), - CF_CONTROLLED = (1 << 12), - CF_PROXY_MODE = (1 << 13), - CF_SUSPEND = (1 << 14), - CF_EVENT_PARSE = (1 << 15), - CF_REPEAT_STATE = (1 << 16), - CF_GEN_RINGBACK = (1 << 17), - CF_RING_READY = (1 << 18), - CF_BREAK = (1 << 19), - CF_BROADCAST = (1 << 20), - CF_UNICAST = (1 << 21), - CF_VIDEO = (1 << 22), - CF_EVENT_LOCK = (1 << 23), - CF_RESET = (1 << 24), - CF_ORIGINATING = (1 << 25), - CF_STOP_BROADCAST = (1 << 26), - CF_PROXY_MEDIA = (1 << 27), - CF_INNER_BRIDGE = (1 << 28), - CF_REQ_MEDIA = (1 << 29), - CF_VERBOSE_EVENTS = (1 << 30) +public enum switch_channel_flag_t { + CF_ANSWERED = 1, + CF_OUTBOUND, + CF_EARLY_MEDIA, + CF_ORIGINATOR, + CF_TRANSFER, + CF_ACCEPT_CNG, + CF_REDIRECT, + CF_BRIDGED, + CF_HOLD, + CF_SERVICE, + CF_TAGGED, + CF_WINNER, + CF_CONTROLLED, + CF_PROXY_MODE, + CF_SUSPEND, + CF_EVENT_PARSE, + CF_GEN_RINGBACK, + CF_RING_READY, + CF_BREAK, + CF_BROADCAST, + CF_UNICAST, + CF_VIDEO, + CF_EVENT_LOCK, + CF_RESET, + CF_ORIGINATING, + CF_STOP_BROADCAST, + CF_PROXY_MEDIA, + CF_INNER_BRIDGE, + CF_REQ_MEDIA, + CF_VERBOSE_EVENTS, + CF_FLAG_MAX } } @@ -16940,6 +17223,17 @@ } } + public SWIGTYPE_p_switch_mutex_t reflock { + set { + freeswitchPINVOKE.switch_chat_interface_reflock_set(swigCPtr, SWIGTYPE_p_switch_mutex_t.getCPtr(value)); + } + get { + IntPtr cPtr = freeswitchPINVOKE.switch_chat_interface_reflock_get(swigCPtr); + SWIGTYPE_p_switch_mutex_t ret = (cPtr == IntPtr.Zero) ? null : new SWIGTYPE_p_switch_mutex_t(cPtr, false); + return ret; + } + } + public SWIGTYPE_p_switch_loadable_module_interface parent { set { freeswitchPINVOKE.switch_chat_interface_parent_set(swigCPtr, SWIGTYPE_p_switch_loadable_module_interface.getCPtr(value)); @@ -17478,6 +17772,17 @@ } } + public SWIGTYPE_p_switch_mutex_t reflock { + set { + freeswitchPINVOKE.switch_codec_interface_reflock_set(swigCPtr, SWIGTYPE_p_switch_mutex_t.getCPtr(value)); + } + get { + IntPtr cPtr = freeswitchPINVOKE.switch_codec_interface_reflock_get(swigCPtr); + SWIGTYPE_p_switch_mutex_t ret = (cPtr == IntPtr.Zero) ? null : new SWIGTYPE_p_switch_mutex_t(cPtr, false); + return ret; + } + } + public SWIGTYPE_p_switch_loadable_module_interface parent { set { freeswitchPINVOKE.switch_codec_interface_parent_set(swigCPtr, SWIGTYPE_p_switch_loadable_module_interface.getCPtr(value)); @@ -18119,7 +18424,9 @@ namespace FreeSWITCH.Native { [System.Flags] public enum switch_core_session_message_flag_enum_t { - SCSMF_DYNAMIC = (1 << 0) + SCSMF_DYNAMIC = (1 << 0), + SCSMF_FREE_STRING_REPLY = (1 << 1), + SCSMF_FREE_POINTER_REPLY = (1 << 2) } } @@ -18154,6 +18461,7 @@ SWITCH_MESSAGE_INDICATE_VIDEO_REFRESH_REQ, SWITCH_MESSAGE_INDICATE_DISPLAY, SWITCH_MESSAGE_INDICATE_TRANSCODING_NECESSARY, + SWITCH_MESSAGE_INDICATE_AUDIO_SYNC, SWITCH_MESSAGE_INVALID } @@ -18459,6 +18767,17 @@ } } + public SWIGTYPE_p_switch_mutex_t reflock { + set { + freeswitchPINVOKE.switch_dialplan_interface_reflock_set(swigCPtr, SWIGTYPE_p_switch_mutex_t.getCPtr(value)); + } + get { + IntPtr cPtr = freeswitchPINVOKE.switch_dialplan_interface_reflock_get(swigCPtr); + SWIGTYPE_p_switch_mutex_t ret = (cPtr == IntPtr.Zero) ? null : new SWIGTYPE_p_switch_mutex_t(cPtr, false); + return ret; + } + } + public SWIGTYPE_p_switch_loadable_module_interface parent { set { freeswitchPINVOKE.switch_dialplan_interface_parent_set(swigCPtr, SWIGTYPE_p_switch_loadable_module_interface.getCPtr(value)); @@ -18866,6 +19185,17 @@ } } + public SWIGTYPE_p_switch_mutex_t reflock { + set { + freeswitchPINVOKE.switch_directory_interface_reflock_set(swigCPtr, SWIGTYPE_p_switch_mutex_t.getCPtr(value)); + } + get { + IntPtr cPtr = freeswitchPINVOKE.switch_directory_interface_reflock_get(swigCPtr); + SWIGTYPE_p_switch_mutex_t ret = (cPtr == IntPtr.Zero) ? null : new SWIGTYPE_p_switch_mutex_t(cPtr, false); + return ret; + } + } + public SWIGTYPE_p_switch_loadable_module_interface parent { set { freeswitchPINVOKE.switch_directory_interface_parent_set(swigCPtr, SWIGTYPE_p_switch_loadable_module_interface.getCPtr(value)); @@ -19099,6 +19429,17 @@ } } + public SWIGTYPE_p_switch_mutex_t reflock { + set { + freeswitchPINVOKE.switch_endpoint_interface_reflock_set(swigCPtr, SWIGTYPE_p_switch_mutex_t.getCPtr(value)); + } + get { + IntPtr cPtr = freeswitchPINVOKE.switch_endpoint_interface_reflock_get(swigCPtr); + SWIGTYPE_p_switch_mutex_t ret = (cPtr == IntPtr.Zero) ? null : new SWIGTYPE_p_switch_mutex_t(cPtr, false); + return ret; + } + } + public SWIGTYPE_p_switch_loadable_module_interface parent { set { freeswitchPINVOKE.switch_endpoint_interface_parent_set(swigCPtr, SWIGTYPE_p_switch_loadable_module_interface.getCPtr(value)); @@ -19422,6 +19763,7 @@ SWITCH_EVENT_DTMF, SWITCH_EVENT_MESSAGE, SWITCH_EVENT_PRESENCE_IN, + SWITCH_EVENT_NOTIFY_IN, SWITCH_EVENT_PRESENCE_OUT, SWITCH_EVENT_PRESENCE_PROBE, SWITCH_EVENT_MESSAGE_WAITING, @@ -20016,6 +20358,17 @@ } } + public SWIGTYPE_p_switch_mutex_t reflock { + set { + freeswitchPINVOKE.switch_file_interface_reflock_set(swigCPtr, SWIGTYPE_p_switch_mutex_t.getCPtr(value)); + } + get { + IntPtr cPtr = freeswitchPINVOKE.switch_file_interface_reflock_get(swigCPtr); + SWIGTYPE_p_switch_mutex_t ret = (cPtr == IntPtr.Zero) ? null : new SWIGTYPE_p_switch_mutex_t(cPtr, false); + return ret; + } + } + public SWIGTYPE_p_switch_loadable_module_interface parent { set { freeswitchPINVOKE.switch_file_interface_parent_set(swigCPtr, SWIGTYPE_p_switch_loadable_module_interface.getCPtr(value)); @@ -22018,6 +22371,17 @@ } } + public SWIGTYPE_p_switch_mutex_t reflock { + set { + freeswitchPINVOKE.switch_management_interface_reflock_set(swigCPtr, SWIGTYPE_p_switch_mutex_t.getCPtr(value)); + } + get { + IntPtr cPtr = freeswitchPINVOKE.switch_management_interface_reflock_get(swigCPtr); + SWIGTYPE_p_switch_mutex_t ret = (cPtr == IntPtr.Zero) ? null : new SWIGTYPE_p_switch_mutex_t(cPtr, false); + return ret; + } + } + public SWIGTYPE_p_switch_loadable_module_interface parent { set { freeswitchPINVOKE.switch_management_interface_parent_set(swigCPtr, SWIGTYPE_p_switch_loadable_module_interface.getCPtr(value)); @@ -22353,7 +22717,8 @@ SWITCH_RTP_FLAG_SECURE_SEND_RESET = (1 << 16), SWITCH_RTP_FLAG_SECURE_RECV_RESET = (1 << 17), SWITCH_RTP_FLAG_PROXY_MEDIA = (1 << 18), - SWITCH_RTP_FLAG_SHUTDOWN = (1 << 19) + SWITCH_RTP_FLAG_SHUTDOWN = (1 << 19), + SWITCH_RTP_FLAG_FLUSH = (1 << 20) } } @@ -22577,6 +22942,17 @@ } } + public SWIGTYPE_p_switch_mutex_t reflock { + set { + freeswitchPINVOKE.switch_say_interface_reflock_set(swigCPtr, SWIGTYPE_p_switch_mutex_t.getCPtr(value)); + } + get { + IntPtr cPtr = freeswitchPINVOKE.switch_say_interface_reflock_get(swigCPtr); + SWIGTYPE_p_switch_mutex_t ret = (cPtr == IntPtr.Zero) ? null : new SWIGTYPE_p_switch_mutex_t(cPtr, false); + return ret; + } + } + public SWIGTYPE_p_switch_loadable_module_interface parent { set { freeswitchPINVOKE.switch_say_interface_parent_set(swigCPtr, SWIGTYPE_p_switch_loadable_module_interface.getCPtr(value)); @@ -23169,6 +23545,17 @@ } } + public SWIGTYPE_p_switch_mutex_t reflock { + set { + freeswitchPINVOKE.switch_speech_interface_reflock_set(swigCPtr, SWIGTYPE_p_switch_mutex_t.getCPtr(value)); + } + get { + IntPtr cPtr = freeswitchPINVOKE.switch_speech_interface_reflock_get(swigCPtr); + SWIGTYPE_p_switch_mutex_t ret = (cPtr == IntPtr.Zero) ? null : new SWIGTYPE_p_switch_mutex_t(cPtr, false); + return ret; + } + } + public SWIGTYPE_p_switch_loadable_module_interface parent { set { freeswitchPINVOKE.switch_speech_interface_parent_set(swigCPtr, SWIGTYPE_p_switch_loadable_module_interface.getCPtr(value)); @@ -23923,6 +24310,17 @@ } } + public SWIGTYPE_p_switch_mutex_t reflock { + set { + freeswitchPINVOKE.switch_timer_interface_reflock_set(swigCPtr, SWIGTYPE_p_switch_mutex_t.getCPtr(value)); + } + get { + IntPtr cPtr = freeswitchPINVOKE.switch_timer_interface_reflock_get(swigCPtr); + SWIGTYPE_p_switch_mutex_t ret = (cPtr == IntPtr.Zero) ? null : new SWIGTYPE_p_switch_mutex_t(cPtr, false); + return ret; + } + } + public SWIGTYPE_p_switch_loadable_module_interface parent { set { freeswitchPINVOKE.switch_timer_interface_parent_set(swigCPtr, SWIGTYPE_p_switch_loadable_module_interface.getCPtr(value)); Modified: freeswitch/branches/gmaruzz/src/mod/languages/mod_perl/freeswitch.pm ============================================================================== --- freeswitch/branches/gmaruzz/src/mod/languages/mod_perl/freeswitch.pm (original) +++ freeswitch/branches/gmaruzz/src/mod/languages/mod_perl/freeswitch.pm Mon Dec 15 12:56:36 2008 @@ -52,6 +52,7 @@ *consoleCleanLog = *freeswitchc::consoleCleanLog; *console_log = *freeswitchc::console_log; *console_clean_log = *freeswitchc::console_clean_log; +*msleep = *freeswitchc::msleep; *bridge = *freeswitchc::bridge; *hanguphook = *freeswitchc::hanguphook; *dtmf_callback = *freeswitchc::dtmf_callback; Modified: freeswitch/branches/gmaruzz/src/mod/languages/mod_perl/mod_perl_wrap.cpp ============================================================================== --- freeswitch/branches/gmaruzz/src/mod/languages/mod_perl/mod_perl_wrap.cpp (original) +++ freeswitch/branches/gmaruzz/src/mod/languages/mod_perl/mod_perl_wrap.cpp Mon Dec 15 12:56:36 2008 @@ -8146,7 +8146,55 @@ } -XS(_wrap_CoreSession_sleep) { +XS(_wrap_CoreSession_sleep__SWIG_0) { + { + CoreSession *arg1 = (CoreSession *) 0 ; + int arg2 ; + int arg3 ; + int result; + void *argp1 = 0 ; + int res1 = 0 ; + int val2 ; + int ecode2 = 0 ; + int val3 ; + int ecode3 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 3) || (items > 3)) { + SWIG_croak("Usage: CoreSession_sleep(self,ms,sync);"); + } + res1 = SWIG_ConvertPtr(ST(0), &argp1,SWIGTYPE_p_CoreSession, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CoreSession_sleep" "', argument " "1"" of type '" "CoreSession *""'"); + } + arg1 = reinterpret_cast< CoreSession * >(argp1); + ecode2 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(1), &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "CoreSession_sleep" "', argument " "2"" of type '" "int""'"); + } + arg2 = static_cast< int >(val2); + ecode3 = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(2), &val3); + if (!SWIG_IsOK(ecode3)) { + SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "CoreSession_sleep" "', argument " "3"" of type '" "int""'"); + } + arg3 = static_cast< int >(val3); + result = (int)(arg1)->sleep(arg2,arg3); + ST(argvi) = SWIG_From_int SWIG_PERL_CALL_ARGS_1(static_cast< int >(result)); argvi++ ; + + + + XSRETURN(argvi); + fail: + + + + SWIG_croak_null(); + } +} + + +XS(_wrap_CoreSession_sleep__SWIG_1) { { CoreSession *arg1 = (CoreSession *) 0 ; int arg2 ; @@ -8184,6 +8232,98 @@ } +XS(_wrap_CoreSession_sleep) { + dXSARGS; + + { + unsigned long _index = 0; + SWIG_TypeRank _rank = 0; + if (items == 2) { + SWIG_TypeRank _ranki = 0; + SWIG_TypeRank _rankm = 0; + SWIG_TypeRank _pi = 1; + int _v = 0; + { + void *vptr = 0; + int res = SWIG_ConvertPtr(ST(0), &vptr, SWIGTYPE_p_CoreSession, 0); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_1; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + { + int res = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(1), NULL); + _v = SWIG_CheckState(res); + } + } + if (!_v) goto check_1; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + if (!_index || (_ranki < _rank)) { + _rank = _ranki; _index = 1; + if (_rank == _rankm) goto dispatch; + } + } + check_1: + + if (items == 3) { + SWIG_TypeRank _ranki = 0; + SWIG_TypeRank _rankm = 0; + SWIG_TypeRank _pi = 1; + int _v = 0; + { + void *vptr = 0; + int res = SWIG_ConvertPtr(ST(0), &vptr, SWIGTYPE_p_CoreSession, 0); + _v = SWIG_CheckState(res); + } + if (!_v) goto check_2; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + { + int res = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(1), NULL); + _v = SWIG_CheckState(res); + } + } + if (!_v) goto check_2; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + { + { + int res = SWIG_AsVal_int SWIG_PERL_CALL_ARGS_2(ST(2), NULL); + _v = SWIG_CheckState(res); + } + } + if (!_v) goto check_2; + _ranki += _v*_pi; + _rankm += _pi; + _pi *= SWIG_MAXCASTRANK; + if (!_index || (_ranki < _rank)) { + _rank = _ranki; _index = 2; + if (_rank == _rankm) goto dispatch; + } + } + check_2: + + dispatch: + switch(_index) { + case 1: + ++PL_markstack_ptr; SWIG_CALLXS(_wrap_CoreSession_sleep__SWIG_1); return; + case 2: + ++PL_markstack_ptr; SWIG_CALLXS(_wrap_CoreSession_sleep__SWIG_0); return; + } + } + + croak("No matching function for overloaded 'CoreSession_sleep'"); + XSRETURN(0); +} + + XS(_wrap_CoreSession_flushEvents) { { CoreSession *arg1 = (CoreSession *) 0 ; @@ -8968,6 +9108,33 @@ } +XS(_wrap_msleep) { + { + unsigned int arg1 ; + unsigned int val1 ; + int ecode1 = 0 ; + int argvi = 0; + dXSARGS; + + if ((items < 1) || (items > 1)) { + SWIG_croak("Usage: msleep(ms);"); + } + ecode1 = SWIG_AsVal_unsigned_SS_int SWIG_PERL_CALL_ARGS_2(ST(0), &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "msleep" "', argument " "1"" of type '" "unsigned int""'"); + } + arg1 = static_cast< unsigned int >(val1); + msleep(arg1); + + + XSRETURN(argvi); + fail: + + SWIG_croak_null(); + } +} + + XS(_wrap_bridge) { { CoreSession *arg1 = 0 ; @@ -10656,6 +10823,7 @@ {"freeswitchc::CoreSession_run_dtmf_callback", _wrap_CoreSession_run_dtmf_callback}, {"freeswitchc::console_log", _wrap_console_log}, {"freeswitchc::console_clean_log", _wrap_console_clean_log}, +{"freeswitchc::msleep", _wrap_msleep}, {"freeswitchc::bridge", _wrap_bridge}, {"freeswitchc::hanguphook", _wrap_hanguphook}, {"freeswitchc::dtmf_callback", _wrap_dtmf_callback}, Modified: freeswitch/branches/gmaruzz/src/mod/languages/mod_python/freeswitch.py ============================================================================== --- freeswitch/branches/gmaruzz/src/mod/languages/mod_python/freeswitch.py (original) +++ freeswitch/branches/gmaruzz/src/mod/languages/mod_python/freeswitch.py Mon Dec 15 12:56:36 2008 @@ -302,6 +302,7 @@ console_log = _freeswitch.console_log console_clean_log = _freeswitch.console_clean_log +msleep = _freeswitch.msleep bridge = _freeswitch.bridge hanguphook = _freeswitch.hanguphook dtmf_callback = _freeswitch.dtmf_callback Modified: freeswitch/branches/gmaruzz/src/mod/languages/mod_python/mod_python_wrap.cpp ============================================================================== --- freeswitch/branches/gmaruzz/src/mod/languages/mod_python/mod_python_wrap.cpp (original) +++ freeswitch/branches/gmaruzz/src/mod/languages/mod_python/mod_python_wrap.cpp Mon Dec 15 12:56:36 2008 @@ -8018,7 +8018,47 @@ } -SWIGINTERN PyObject *_wrap_CoreSession_sleep(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { +SWIGINTERN PyObject *_wrap_CoreSession_sleep__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + CoreSession *arg1 = (CoreSession *) 0 ; + int arg2 ; + int arg3 ; + int result; + void *argp1 = 0 ; + int res1 = 0 ; + int val2 ; + int ecode2 = 0 ; + int val3 ; + int ecode3 = 0 ; + PyObject * obj0 = 0 ; + PyObject * obj1 = 0 ; + PyObject * obj2 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"OOO:CoreSession_sleep",&obj0,&obj1,&obj2)) SWIG_fail; + res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_CoreSession, 0 | 0 ); + if (!SWIG_IsOK(res1)) { + SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CoreSession_sleep" "', argument " "1"" of type '" "CoreSession *""'"); + } + arg1 = reinterpret_cast< CoreSession * >(argp1); + ecode2 = SWIG_AsVal_int(obj1, &val2); + if (!SWIG_IsOK(ecode2)) { + SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "CoreSession_sleep" "', argument " "2"" of type '" "int""'"); + } + arg2 = static_cast< int >(val2); + ecode3 = SWIG_AsVal_int(obj2, &val3); + if (!SWIG_IsOK(ecode3)) { + SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "CoreSession_sleep" "', argument " "3"" of type '" "int""'"); + } + arg3 = static_cast< int >(val3); + result = (int)(arg1)->sleep(arg2,arg3); + resultobj = SWIG_From_int(static_cast< int >(result)); + return resultobj; +fail: + return NULL; +} + + +SWIGINTERN PyObject *_wrap_CoreSession_sleep__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; CoreSession *arg1 = (CoreSession *) 0 ; int arg2 ; @@ -8049,6 +8089,62 @@ } +SWIGINTERN PyObject *_wrap_CoreSession_sleep(PyObject *self, PyObject *args) { + int argc; + PyObject *argv[4]; + int ii; + + if (!PyTuple_Check(args)) SWIG_fail; + argc = (int)PyObject_Length(args); + for (ii = 0; (ii < argc) && (ii < 3); ii++) { + argv[ii] = PyTuple_GET_ITEM(args,ii); + } + if (argc == 2) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_CoreSession, 0); + _v = SWIG_CheckState(res); + if (_v) { + { + int res = SWIG_AsVal_int(argv[1], NULL); + _v = SWIG_CheckState(res); + } + if (_v) { + return _wrap_CoreSession_sleep__SWIG_1(self, args); + } + } + } + if (argc == 3) { + int _v; + void *vptr = 0; + int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_CoreSession, 0); + _v = SWIG_CheckState(res); + if (_v) { + { + int res = SWIG_AsVal_int(argv[1], NULL); + _v = SWIG_CheckState(res); + } + if (_v) { + { + int res = SWIG_AsVal_int(argv[2], NULL); + _v = SWIG_CheckState(res); + } + if (_v) { + return _wrap_CoreSession_sleep__SWIG_0(self, args); + } + } + } + } + +fail: + SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number of arguments for overloaded function 'CoreSession_sleep'.\n" + " Possible C/C++ prototypes are:\n" + " sleep(CoreSession *,int,int)\n" + " sleep(CoreSession *,int)\n"); + return NULL; +} + + SWIGINTERN PyObject *_wrap_CoreSession_flushEvents(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; CoreSession *arg1 = (CoreSession *) 0 ; @@ -8683,6 +8779,27 @@ } +SWIGINTERN PyObject *_wrap_msleep(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { + PyObject *resultobj = 0; + unsigned int arg1 ; + unsigned int val1 ; + int ecode1 = 0 ; + PyObject * obj0 = 0 ; + + if (!PyArg_ParseTuple(args,(char *)"O:msleep",&obj0)) SWIG_fail; + ecode1 = SWIG_AsVal_unsigned_SS_int(obj0, &val1); + if (!SWIG_IsOK(ecode1)) { + SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "msleep" "', argument " "1"" of type '" "unsigned int""'"); + } + arg1 = static_cast< unsigned int >(val1); + msleep(arg1); + resultobj = SWIG_Py_Void(); + return resultobj; +fail: + return NULL; +} + + SWIGINTERN PyObject *_wrap_bridge(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; CoreSession *arg1 = 0 ; @@ -9701,6 +9818,7 @@ { (char *)"CoreSession_swigregister", CoreSession_swigregister, METH_VARARGS, NULL}, { (char *)"console_log", _wrap_console_log, METH_VARARGS, NULL}, { (char *)"console_clean_log", _wrap_console_clean_log, METH_VARARGS, NULL}, + { (char *)"msleep", _wrap_msleep, METH_VARARGS, NULL}, { (char *)"bridge", _wrap_bridge, METH_VARARGS, NULL}, { (char *)"hanguphook", _wrap_hanguphook, METH_VARARGS, NULL}, { (char *)"dtmf_callback", _wrap_dtmf_callback, METH_VARARGS, NULL}, Modified: freeswitch/branches/gmaruzz/src/mod/languages/mod_spidermonkey/mod_spidermonkey.c ============================================================================== --- freeswitch/branches/gmaruzz/src/mod/languages/mod_spidermonkey/mod_spidermonkey.c (original) +++ freeswitch/branches/gmaruzz/src/mod/languages/mod_spidermonkey/mod_spidermonkey.c Mon Dec 15 12:56:36 2008 @@ -1723,7 +1723,8 @@ switch_input_args_t args = { 0 }; int32 ms = 0; jsval ret = JS_TRUE; - + int32 sync = 0; + METHOD_SANITY_CHECK(); channel = switch_core_session_get_channel(jss->session); CHANNEL_SANITY_CHECK(); @@ -1755,12 +1756,16 @@ } } + if (argc > 2) { + JS_ValueToInt32(cx, argv[2], &sync); + } + cb_state.ret = BOOLEAN_TO_JSVAL(JS_FALSE); cb_state.saveDepth = JS_SuspendRequest(cx); args.input_callback = dtmf_func; args.buf = bp; args.buflen = len; - switch_ivr_sleep(jss->session, ms, &args); + switch_ivr_sleep(jss->session, ms, sync, &args); JS_ResumeRequest(cx, cb_state.saveDepth); check_hangup_hook(jss, &ret); *rval = cb_state.ret; @@ -1773,7 +1778,6 @@ struct js_session *jss = JS_GetPrivate(cx, obj); switch_channel_t *channel; - METHOD_SANITY_CHECK(); channel = switch_core_session_get_channel(jss->session); if (argc > 1) { @@ -2056,8 +2060,6 @@ /*Always a pessimist... sheesh! */ *rval = BOOLEAN_TO_JSVAL(JS_FALSE); - METHOD_SANITY_CHECK(); - if (switch_ivr_generate_xml_cdr(jss->session, &cdr) == SWITCH_STATUS_SUCCESS) { char *xml_text; if ((xml_text = switch_xml_toxml(cdr, SWITCH_FALSE))) { @@ -2104,7 +2106,7 @@ switch_channel_t *channel; switch_time_t started; unsigned int elapsed; - int32 timeout = 60; + int32 timeout = 60000; jsrefcount saveDepth; jsval ret = JS_TRUE; @@ -2117,7 +2119,11 @@ if (argc > 0) { JS_ValueToInt32(cx, argv[0], &timeout); + if (timeout < 1000) { + timeout = 1000; + } } + if (check_hangup_hook(jss, NULL) != JS_TRUE) { return JS_FALSE; } @@ -2149,7 +2155,7 @@ switch_channel_t *channel; switch_time_t started; unsigned int elapsed; - int32 timeout = 60; + int32 timeout = 60000; jsrefcount saveDepth; jsval ret = JS_TRUE; @@ -2160,6 +2166,9 @@ if (argc > 0) { JS_ValueToInt32(cx, argv[0], &timeout); + if (timeout < 1000) { + timeout = 1000; + } } if (check_hangup_hook(jss, NULL) != JS_TRUE) { @@ -2730,7 +2739,7 @@ (*jss)->stack_depth = 0; if ((JS_SetPrivate(cx, session_obj, *jss) && JS_DefineProperties(cx, session_obj, session_props) && JS_DefineFunctions(cx, session_obj, session_methods))) { - if (switch_core_session_read_lock(session) != SWITCH_STATUS_SUCCESS) { + if (switch_core_session_read_lock_hangup(session) != SWITCH_STATUS_SUCCESS) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Read Lock Failure.\n"); free(*jss); return NULL; @@ -2777,7 +2786,7 @@ } } if (switch_ivr_originate(old_jss ? old_jss->session : NULL, - &jss->session, &jss->cause, uuid, 60, NULL, NULL, NULL, NULL, SOF_NONE) == SWITCH_STATUS_SUCCESS) { + &jss->session, &jss->cause, uuid, 60, NULL, NULL, NULL, NULL, NULL, SOF_NONE) == SWITCH_STATUS_SUCCESS) { switch_set_flag(jss, S_HUP); switch_channel_set_state(switch_core_session_get_channel(jss->session), CS_SOFT_EXECUTE); *rval = BOOLEAN_TO_JSVAL(JS_TRUE); @@ -2917,7 +2926,7 @@ caller_profile = switch_caller_profile_new(pool, username, dialplan, cid_name, cid_num, network_addr, ani, aniii, rdnis, modname, context, dest); saveDepth = JS_SuspendRequest(cx); - status = switch_ivr_originate(session, &peer_session, &jss->cause, dest, to ? atoi(to) : 60, NULL, NULL, NULL, caller_profile, SOF_NONE); + status = switch_ivr_originate(session, &peer_session, &jss->cause, dest, to ? atoi(to) : 60, NULL, NULL, NULL, caller_profile, NULL, SOF_NONE); JS_ResumeRequest(cx, saveDepth); if (status != SWITCH_STATUS_SUCCESS) { Modified: freeswitch/branches/gmaruzz/src/mod/xml_int/mod_xml_cdr/mod_xml_cdr.c ============================================================================== --- freeswitch/branches/gmaruzz/src/mod/xml_int/mod_xml_cdr/mod_xml_cdr.c (original) +++ freeswitch/branches/gmaruzz/src/mod/xml_int/mod_xml_cdr/mod_xml_cdr.c Mon Dec 15 12:56:36 2008 @@ -33,10 +33,13 @@ #include <sys/stat.h> #include <switch.h> #include <curl/curl.h> +#define MAX_URLS 20 static struct { char *cred; - char *url; + char *urls[MAX_URLS+1]; + int url_count; + int url_index; char *log_dir; char *err_log_dir; uint32_t delay; @@ -45,7 +48,9 @@ uint32_t ignore_cacert_check; int encode; int log_b; + int prefix_a; int disable100continue; + switch_memory_pool_t *pool; } globals; SWITCH_MODULE_LOAD_FUNCTION(mod_xml_cdr_load); @@ -77,14 +82,18 @@ struct curl_slist *slist = NULL; switch_channel_t *channel = switch_core_session_get_channel(session); switch_status_t status = SWITCH_STATUS_FALSE; + int is_b; + const char * a_prefix = ""; if (globals.shutdown) { return SWITCH_STATUS_SUCCESS; } - if (!globals.log_b && channel && switch_channel_get_originator_caller_profile(channel)) { + is_b = channel && switch_channel_get_originator_caller_profile(channel); + if (!globals.log_b && is_b) { return SWITCH_STATUS_SUCCESS; } + if (!is_b && globals.prefix_a) a_prefix = "a_"; if (switch_ivr_generate_xml_cdr(session, &cdr) != SWITCH_STATUS_SUCCESS) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error Generating Data!\n"); @@ -103,7 +112,7 @@ } if (!switch_strlen_zero(logdir)) { - if ((path = switch_mprintf("%s%s%s.cdr.xml", logdir, SWITCH_PATH_SEPARATOR, switch_core_session_get_uuid(session)))) { + if ((path = switch_mprintf("%s%s%s%s.cdr.xml", logdir, SWITCH_PATH_SEPARATOR, a_prefix, switch_core_session_get_uuid(session)))) { if ((fd = open(path, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR)) > -1) { int wrote; wrote = write(fd, xml_text, (unsigned) strlen(xml_text)); @@ -123,7 +132,7 @@ } /* try to post it to the web server */ - if (!switch_strlen_zero(globals.url)) { + if (globals.url_count) { curl_handle = curl_easy_init(); if (globals.encode) { @@ -145,11 +154,6 @@ headers = curl_slist_append(headers, "Content-Type: application/x-www-form-plaintext"); } - if (!strncasecmp(globals.url, "https", 5)) { - curl_easy_setopt(curl_handle, CURLOPT_SSL_VERIFYPEER, 0); - curl_easy_setopt(curl_handle, CURLOPT_SSL_VERIFYHOST, 0); - } - if (!(curl_xml_text = switch_mprintf("cdr=%s", xml_text))) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Memory Error!\n"); goto error; @@ -163,7 +167,6 @@ curl_easy_setopt(curl_handle, CURLOPT_HTTPHEADER, headers); curl_easy_setopt(curl_handle, CURLOPT_POST, 1); curl_easy_setopt(curl_handle, CURLOPT_POSTFIELDS, curl_xml_text); - curl_easy_setopt(curl_handle, CURLOPT_URL, globals.url); curl_easy_setopt(curl_handle, CURLOPT_USERAGENT, "freeswitch-xml/1.0"); curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, httpCallBack); @@ -185,12 +188,27 @@ if (cur_try > 0) { switch_yield(globals.delay * 1000000); } + + curl_easy_setopt(curl_handle, CURLOPT_URL, globals.urls[globals.url_index]); + + if (!strncasecmp(globals.urls[globals.url_index], "https", 5)) { + curl_easy_setopt(curl_handle, CURLOPT_SSL_VERIFYPEER, 0); + curl_easy_setopt(curl_handle, CURLOPT_SSL_VERIFYHOST, 0); + } + curl_easy_perform(curl_handle); curl_easy_getinfo(curl_handle, CURLINFO_RESPONSE_CODE, &httpRes); if (httpRes == 200) { goto success; } else { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Got error [%ld] posting to web server [%s]\n", httpRes, globals.url); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Got error [%ld] posting to web server [%s]\n", + httpRes, globals.urls[globals.url_index]); + globals.url_index++; + switch_assert(globals.url_count <= MAX_URLS); + if (globals.url_index >= globals.url_count) { + globals.url_index = 0; + } + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Retry will be with url [%s]\n", globals.urls[globals.url_index]); } } curl_easy_cleanup(curl_handle); @@ -203,7 +221,7 @@ /* if we are here the web post failed for some reason */ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Unable to post to web server, writing to file\n"); - if ((path = switch_mprintf("%s%s%s.cdr.xml", globals.err_log_dir, SWITCH_PATH_SEPARATOR, switch_core_session_get_uuid(session)))) { + if ((path = switch_mprintf("%s%s%s%s.cdr.xml", globals.err_log_dir, SWITCH_PATH_SEPARATOR, a_prefix, switch_core_session_get_uuid(session)))) { if ((fd = open(path, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR)) > -1) { int wrote; wrote = write(fd, xml_text, (unsigned) strlen(xml_text)); @@ -265,6 +283,7 @@ memset(&globals, 0, sizeof(globals)); globals.log_b = 1; globals.disable100continue = 0; + globals.pool = pool; /* parse the config */ if (!(xml = switch_xml_open_cfg(cf, &cfg, NULL))) { @@ -278,13 +297,19 @@ char *val = (char *) switch_xml_attr_soft(param, "value"); if (!strcasecmp(var, "cred") && !switch_strlen_zero(val)) { - globals.cred = strdup(val); + globals.cred = switch_core_strdup(globals.pool, val); } else if (!strcasecmp(var, "url") && !switch_strlen_zero(val)) { - globals.url = strdup(val); + if (globals.url_count >= MAX_URLS) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "maximum urls configured!\n"); + } else { + globals.urls[globals.url_count++] = switch_core_strdup(globals.pool, val); + } } else if (!strcasecmp(var, "delay") && !switch_strlen_zero(val)) { globals.delay = (uint32_t) atoi(val); } else if (!strcasecmp(var, "log-b-leg")) { globals.log_b = switch_true(val); + } else if (!strcasecmp(var, "prefix-a-leg")) { + globals.prefix_a = switch_true(val); } else if (!strcasecmp(var, "disable-100-continue") && switch_true(val)) { globals.disable100continue = 1; } else if (!strcasecmp(var, "encode") && !switch_strlen_zero(val)) { @@ -300,7 +325,7 @@ globals.log_dir = switch_mprintf("%s%sxml_cdr", SWITCH_GLOBAL_dirs.log_dir, SWITCH_PATH_SEPARATOR); } else { if (switch_is_file_path(val)) { - globals.log_dir = strdup(val); + globals.log_dir = switch_core_strdup(globals.pool, val); } else { globals.log_dir = switch_mprintf("%s%s%s", SWITCH_GLOBAL_dirs.log_dir, SWITCH_PATH_SEPARATOR, val); } @@ -310,7 +335,7 @@ globals.err_log_dir = switch_mprintf("%s%sxml_cdr", SWITCH_GLOBAL_dirs.log_dir, SWITCH_PATH_SEPARATOR); } else { if (switch_is_file_path(val)) { - globals.err_log_dir = strdup(val); + globals.err_log_dir = switch_core_strdup(globals.pool, val); } else { globals.err_log_dir = switch_mprintf("%s%s%s", SWITCH_GLOBAL_dirs.log_dir, SWITCH_PATH_SEPARATOR, val); } @@ -321,9 +346,9 @@ if (switch_strlen_zero(globals.err_log_dir)) { if (!switch_strlen_zero(globals.log_dir)) { - globals.err_log_dir = strdup(globals.log_dir); + globals.err_log_dir = switch_core_strdup(globals.pool, globals.log_dir); } else { - globals.err_log_dir = switch_mprintf("%s%sxml_cdr", SWITCH_GLOBAL_dirs.log_dir, SWITCH_PATH_SEPARATOR); + globals.err_log_dir = switch_core_sprintf(globals.pool, "%s%sxml_cdr", SWITCH_GLOBAL_dirs.log_dir, SWITCH_PATH_SEPARATOR); } } } Modified: freeswitch/branches/gmaruzz/src/mod/xml_int/mod_xml_curl/mod_xml_curl.c ============================================================================== --- freeswitch/branches/gmaruzz/src/mod/xml_int/mod_xml_curl/mod_xml_curl.c (original) +++ freeswitch/branches/gmaruzz/src/mod/xml_int/mod_xml_curl/mod_xml_curl.c Mon Dec 15 12:56:36 2008 @@ -37,13 +37,17 @@ SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_xml_curl_shutdown); SWITCH_MODULE_DEFINITION(mod_xml_curl, mod_xml_curl_load, mod_xml_curl_shutdown, NULL); + struct xml_binding { + char *method; char *url; char *bindings; char *cred; int disable100continue; + int use_get_style; uint32_t ignore_cacert_check; switch_hash_t *vars_map; + int use_dynamic_url; }; static int keep_files_around = 0; @@ -105,6 +109,9 @@ return x; } + + + static switch_xml_t xml_url_fetch(const char *section, const char *tag_name, const char *key_name, const char *key_value, switch_event_t *params, void *user_data) { @@ -122,7 +129,9 @@ struct curl_slist *headers = NULL; char hostname[256] = ""; char basic_data[512]; - + char *uri = NULL; + char *dynamic_url = NULL; + gethostname(hostname, sizeof(hostname)); if (!binding) { @@ -138,13 +147,31 @@ return xml; } - + switch_snprintf(basic_data, sizeof(basic_data), "hostname=%s§ion=%s&tag_name=%s&key_name=%s&key_value=%s", hostname, section, switch_str_nil(tag_name), switch_str_nil(key_name), switch_str_nil(key_value)); data = switch_event_build_param_string(params, basic_data, binding->vars_map); switch_assert(data); + if (binding->use_dynamic_url) { + switch_event_add_header_string(params, SWITCH_STACK_TOP, "hostname", hostname); + switch_event_add_header_string(params, SWITCH_STACK_TOP, "section", switch_str_nil(section)); + switch_event_add_header_string(params, SWITCH_STACK_TOP, "tag_name", switch_str_nil(tag_name)); + switch_event_add_header_string(params, SWITCH_STACK_TOP, "key_name", switch_str_nil(key_name)); + switch_event_add_header_string(params, SWITCH_STACK_TOP, "key_value", switch_str_nil(key_value)); + dynamic_url = switch_event_expand_headers(params, binding->url); + switch_assert(dynamic_url); + } else { + dynamic_url = binding->url; + } + + if (binding->use_get_style == 1) { + uri = malloc(strlen(data) + strlen(dynamic_url) + 16); + switch_assert(uri); + sprintf(uri, "%s%c%s", dynamic_url, strchr(dynamic_url, '?') != NULL ? '&' : '?', data); + } + switch_uuid_get(&uuid); switch_uuid_format(uuid_str, &uuid); @@ -164,11 +191,14 @@ curl_easy_setopt(curl_handle, CURLOPT_USERPWD, binding->cred); } curl_easy_setopt(curl_handle, CURLOPT_HTTPHEADER, headers); - curl_easy_setopt(curl_handle, CURLOPT_POST, 1); + if (binding->method != NULL) + curl_easy_setopt(curl_handle, CURLOPT_CUSTOMREQUEST, binding->method); + curl_easy_setopt(curl_handle, CURLOPT_POST, !binding->use_get_style); curl_easy_setopt(curl_handle, CURLOPT_FOLLOWLOCATION, 1); curl_easy_setopt(curl_handle, CURLOPT_MAXREDIRS, 10); - curl_easy_setopt(curl_handle, CURLOPT_POSTFIELDS, data); - curl_easy_setopt(curl_handle, CURLOPT_URL, binding->url); + if (!binding->use_get_style) + curl_easy_setopt(curl_handle, CURLOPT_POSTFIELDS, data); + curl_easy_setopt(curl_handle, CURLOPT_URL, binding->use_get_style ? uri : dynamic_url); curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, file_callback); curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, (void *) &config_data); curl_easy_setopt(curl_handle, CURLOPT_USERAGENT, "freeswitch-xml/1.0"); @@ -211,7 +241,10 @@ } switch_safe_free(data); - + if (binding->use_get_style == 1) + switch_safe_free(uri); + if (binding->use_dynamic_url && dynamic_url != binding->url) + switch_safe_free(dynamic_url); return xml; } @@ -240,7 +273,9 @@ char *url = NULL; char *bind_cred = NULL; char *bind_mask = NULL; + char *method = NULL; int disable100continue = 0; + int use_dynamic_url = 0; uint32_t ignore_cacert_check = 0; hash_node_t* hash_node; need_vars_map = 0; @@ -258,8 +293,12 @@ bind_cred = val; } else if (!strcasecmp(var, "disable-100-continue") && switch_true(val)) { disable100continue = 1; + } else if (!strcasecmp(var, "method")) { + method = val; } else if (!strcasecmp(var, "ignore-cacert-check") && switch_true(val)) { ignore_cacert_check = 1; + } else if (!strcasecmp(var, "use-dynamic-url") && switch_true(val)) { + use_dynamic_url = 1; } else if (!strcasecmp(var, "enable-post-var")) { if (!vars_map && need_vars_map == 0) { if (switch_core_hash_init(&vars_map, globals.pool) != SWITCH_STATUS_SUCCESS) { @@ -292,7 +331,13 @@ memset(binding, 0, sizeof(*binding)); binding->url = strdup(url); + switch_assert(binding->url); + if (method != NULL) { + binding->method = strdup(method); + } else { + binding->method = NULL; + } if (bind_mask) { binding->bindings = strdup(bind_mask); } @@ -302,6 +347,8 @@ } binding->disable100continue = disable100continue; + binding->use_get_style = method != NULL && strcasecmp(method,"post") != 0; + binding->use_dynamic_url = use_dynamic_url; binding->ignore_cacert_check = ignore_cacert_check; binding->vars_map = vars_map; Modified: freeswitch/branches/gmaruzz/src/mod/xml_int/mod_xml_ldap/Makefile ============================================================================== --- freeswitch/branches/gmaruzz/src/mod/xml_int/mod_xml_ldap/Makefile (original) +++ freeswitch/branches/gmaruzz/src/mod/xml_int/mod_xml_ldap/Makefile Mon Dec 15 12:56:36 2008 @@ -17,7 +17,7 @@ include $(switch_srcdir)/build/modmake.rules $(LDAP_DIR): - $(GETLIB) $(LDAP).tgz + $(GETLIB) $(LDAP).tar.gz cd $(LDAP_DIR) && CFLAGS="`echo $(CFLAGS) | sed -e 's:-std=c99::'`" ./configure $(DEFAULT_ARGS) $(LIBLUTILA) $(LDAPLA) $(LIBLBERLA): $(LDAP_DIR) Modified: freeswitch/branches/gmaruzz/src/switch.c ============================================================================== --- freeswitch/branches/gmaruzz/src/switch.c (original) +++ freeswitch/branches/gmaruzz/src/switch.c Mon Dec 15 12:56:36 2008 @@ -253,7 +253,8 @@ { char pid_path[256] = ""; /* full path to the pid file */ char pid_buffer[32] = ""; /* pid string */ - switch_size_t pid_len; + char old_pid_buffer[32] = ""; /* pid string */ + switch_size_t pid_len, old_pid_len; const char *err = NULL; /* error value for return from freeswitch initialization */ #ifndef WIN32 int nf = 0; /* TRUE if we are running in nofork mode */ @@ -603,17 +604,34 @@ pid_len = strlen(pid_buffer); apr_pool_create(&pool, NULL); + + if (switch_file_open(&fd, - pid_path, - SWITCH_FOPEN_WRITE | SWITCH_FOPEN_CREATE | SWITCH_FOPEN_TRUNCATE, - SWITCH_FPROT_UREAD | SWITCH_FPROT_UWRITE, - pool) != SWITCH_STATUS_SUCCESS) { - fprintf(stderr, "Cannot open pid file %s.\n", pid_path); - return 255; + pid_path, + SWITCH_FOPEN_READ, + SWITCH_FPROT_UREAD | SWITCH_FPROT_UWRITE, + pool) == SWITCH_STATUS_SUCCESS) { + + old_pid_len = sizeof(old_pid_buffer); + switch_file_read(fd, old_pid_buffer, &old_pid_len); + switch_file_close(fd); + } + + if (switch_file_open(&fd, + pid_path, + SWITCH_FOPEN_WRITE | SWITCH_FOPEN_CREATE | SWITCH_FOPEN_TRUNCATE, + SWITCH_FPROT_UREAD | SWITCH_FPROT_UWRITE, + pool) != SWITCH_STATUS_SUCCESS) { + fprintf(stderr, "Cannot open pid file %s.\n", pid_path); + return 255; } if (switch_file_lock(fd, SWITCH_FLOCK_EXCLUSIVE | SWITCH_FLOCK_NONBLOCK) != SWITCH_STATUS_SUCCESS) { fprintf(stderr, "Cannot lock pid file %s.\n", pid_path); + old_pid_len = strlen(old_pid_buffer); + if (strlen(old_pid_buffer)) { + switch_file_write(fd, old_pid_buffer, &old_pid_len); + } return 255; } Modified: freeswitch/branches/gmaruzz/src/switch_apr.c ============================================================================== --- freeswitch/branches/gmaruzz/src/switch_apr.c (original) +++ freeswitch/branches/gmaruzz/src/switch_apr.c Mon Dec 15 12:56:36 2008 @@ -754,6 +754,11 @@ return sa->family; } +SWITCH_DECLARE(switch_status_t) switch_socket_atmark(switch_socket_t *sock, int *atmark) +{ + return apr_socket_atmark(sock, atmark); +} + SWITCH_DECLARE(switch_status_t) switch_socket_recvfrom(switch_sockaddr_t *from, switch_socket_t *sock, int32_t flags, char *buf, size_t *len) { apr_status_t r; @@ -799,7 +804,7 @@ return SWITCH_STATUS_MEMERR; } - if (switch_pollset_create(&pollset, 1, pool, flags) != SWITCH_STATUS_SUCCESS) { + if (switch_pollset_create(&pollset, 1, pool, 0) != SWITCH_STATUS_SUCCESS) { return SWITCH_STATUS_GENERR; } Modified: freeswitch/branches/gmaruzz/src/switch_channel.c ============================================================================== --- freeswitch/branches/gmaruzz/src/switch_channel.c (original) +++ freeswitch/branches/gmaruzz/src/switch_channel.c Mon Dec 15 12:56:36 2008 @@ -115,8 +115,9 @@ switch_core_session_t *session; switch_channel_state_t state; switch_channel_state_t running_state; - switch_channel_flag_t flags; - switch_channel_flag_t state_flags; + uint8_t flags[CF_FLAG_MAX]; + uint8_t state_flags[CF_FLAG_MAX]; + uint32_t private_flags; switch_caller_profile_t *caller_profile; const switch_state_handler_table_t *state_handlers[SWITCH_MAX_STATE_HANDLERS]; int state_handler_index; @@ -166,6 +167,19 @@ return channel->hangup_cause; } + +SWITCH_DECLARE(void) switch_channel_audio_sync(switch_channel_t *channel) +{ + if (switch_channel_media_ready(channel)) { + switch_core_session_message_t msg; + msg.message_id = SWITCH_MESSAGE_INDICATE_AUDIO_SYNC; + msg.from = channel->name; + switch_core_session_receive_message(channel->session, &msg); + } +} + + + SWITCH_DECLARE(switch_call_cause_t) switch_channel_cause_q850(switch_call_cause_t cause) { if (cause <= SWITCH_CAUSE_INTERWORKING) { @@ -396,11 +410,11 @@ } SWITCH_DECLARE(switch_status_t) switch_channel_init(switch_channel_t *channel, switch_core_session_t *session, switch_channel_state_t state, - uint32_t flags) + switch_channel_flag_t flag) { switch_assert(channel != NULL); channel->state = state; - channel->flags = flags; + switch_channel_set_flag(channel, flag); channel->session = session; channel->running_state = CS_NONE; return SWITCH_STATUS_SUCCESS; @@ -629,13 +643,13 @@ return SWITCH_STATUS_FALSE; } -SWITCH_DECLARE(uint32_t) switch_channel_test_flag(switch_channel_t *channel, switch_channel_flag_t flags) +SWITCH_DECLARE(uint32_t) switch_channel_test_flag(switch_channel_t *channel, switch_channel_flag_t flag) { switch_assert(channel != NULL); - return switch_test_flag(channel, flags) ? 1 : 0; + return channel->flags[flag] ? 1 : 0; } -SWITCH_DECLARE(switch_bool_t) switch_channel_set_flag_partner(switch_channel_t *channel, switch_channel_flag_t flags) +SWITCH_DECLARE(switch_bool_t) switch_channel_set_flag_partner(switch_channel_t *channel, switch_channel_flag_t flag) { const char *uuid; @@ -644,7 +658,7 @@ if ((uuid = switch_channel_get_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE))) { switch_core_session_t *session; if ((session = switch_core_session_locate(uuid))) { - switch_channel_set_flag(switch_core_session_get_channel(session), flags); + switch_channel_set_flag(switch_core_session_get_channel(session), flag); switch_core_session_rwunlock(session); return SWITCH_TRUE; } @@ -653,7 +667,7 @@ return SWITCH_FALSE; } -SWITCH_DECLARE(switch_bool_t) switch_channel_clear_flag_partner(switch_channel_t *channel, switch_channel_flag_t flags) +SWITCH_DECLARE(switch_bool_t) switch_channel_clear_flag_partner(switch_channel_t *channel, switch_channel_flag_t flag) { const char *uuid; @@ -662,7 +676,7 @@ if ((uuid = switch_channel_get_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE))) { switch_core_session_t *session; if ((session = switch_core_session_locate(uuid))) { - switch_channel_clear_flag(switch_core_session_get_channel(session), flags); + switch_channel_clear_flag(switch_core_session_get_channel(session), flag); switch_core_session_rwunlock(session); return SWITCH_TRUE; } @@ -700,11 +714,11 @@ for (;;) { if (pres) { - if (switch_test_flag(channel, want_flag)) { + if (switch_channel_test_flag(channel, want_flag)) { break; } } else { - if (!switch_test_flag(channel, want_flag)) { + if (!switch_channel_test_flag(channel, want_flag)) { break; } } @@ -727,29 +741,62 @@ return SWITCH_STATUS_SUCCESS; } -SWITCH_DECLARE(void) switch_channel_set_flag(switch_channel_t *channel, switch_channel_flag_t flags) +SWITCH_DECLARE(void) switch_channel_set_flag(switch_channel_t *channel, switch_channel_flag_t flag) { - switch_assert(channel != NULL); - switch_set_flag_locked(channel, flags); - if (flags & CF_OUTBOUND) { + switch_assert(channel); + switch_assert(channel->flag_mutex); + + switch_mutex_lock(channel->flag_mutex); + channel->flags[flag] = 1; + switch_mutex_unlock(channel->flag_mutex); + + if (flag == CF_OUTBOUND) { switch_channel_set_variable(channel, "is_outbound", "true"); } } -SWITCH_DECLARE(void) switch_channel_set_state_flag(switch_channel_t *channel, switch_channel_flag_t flags) + +SWITCH_DECLARE(void) switch_channel_set_private_flag(switch_channel_t *channel, uint32_t flags) +{ + switch_assert(channel != NULL); + switch_mutex_lock(channel->flag_mutex); + channel->private_flags |= flags; + switch_mutex_unlock(channel->flag_mutex); +} + +SWITCH_DECLARE(void) switch_channel_clear_private_flag(switch_channel_t *channel, uint32_t flags) +{ + switch_assert(channel != NULL); + switch_mutex_lock(channel->flag_mutex); + channel->private_flags &= ~flags; + switch_mutex_unlock(channel->flag_mutex); +} + +SWITCH_DECLARE(int) switch_channel_test_private_flag(switch_channel_t *channel, uint32_t flags) +{ + switch_assert(channel != NULL); + return (channel->private_flags & flags); +} + +SWITCH_DECLARE(void) switch_channel_set_state_flag(switch_channel_t *channel, switch_channel_flag_t flag) { switch_assert(channel != NULL); switch_mutex_lock(channel->flag_mutex); - channel->state_flags |= flags; + channel->state_flags[0] = 1; + channel->state_flags[flag] = 1; switch_mutex_unlock(channel->flag_mutex); } -SWITCH_DECLARE(void) switch_channel_clear_flag(switch_channel_t *channel, switch_channel_flag_t flags) +SWITCH_DECLARE(void) switch_channel_clear_flag(switch_channel_t *channel, switch_channel_flag_t flag) { switch_assert(channel != NULL); - switch_clear_flag_locked(channel, flags); - if (flags & CF_OUTBOUND) { + switch_assert(channel->flag_mutex); + + switch_mutex_lock(channel->flag_mutex); + channel->flags[flag] = 0; + switch_mutex_unlock(channel->flag_mutex); + if (flag == CF_OUTBOUND) { switch_channel_set_variable(channel, "is_outbound", NULL); } } @@ -785,7 +832,7 @@ switch_assert(channel != NULL); if (!channel->hangup_cause && channel->state > CS_ROUTING && channel->state < CS_HANGUP && channel->state != CS_RESET && - !switch_test_flag(channel, CF_TRANSFER)) { + !switch_channel_test_flag(channel, CF_TRANSFER)) { ret++; } @@ -829,19 +876,24 @@ SWITCH_DECLARE(switch_channel_state_t) switch_channel_perform_set_running_state(switch_channel_t *channel, switch_channel_state_t state, const char *file, const char *func, int line) { + int x; switch_mutex_lock(channel->flag_mutex); switch_log_printf(SWITCH_CHANNEL_ID_LOG, file, func, line, NULL, SWITCH_LOG_DEBUG, "(%s) Running State Change %s\n", channel->name, state_names[state]); channel->running_state = state; - if (channel->state_flags) { - channel->flags |= channel->state_flags; - channel->state_flags = 0; + if (channel->state_flags[0]) { + for(x = 1; x < CF_FLAG_MAX ; x++ ) { + if (channel->state_flags[x]) { + channel->flags[x] = 1; + channel->state_flags[x] = 0; + } + } + channel->state_flags[0] = 0; } - switch_clear_flag(channel, CF_TAGGED); + switch_channel_clear_flag(channel, CF_TAGGED); if (channel->state >= CS_ROUTING) { - switch_clear_flag(channel, CF_TRANSFER); switch_channel_presence(channel, "unknown", (char *) state_names[state], NULL); } @@ -1148,7 +1200,7 @@ } - if (switch_test_flag(channel, CF_VERBOSE_EVENTS) || + if (switch_channel_test_flag(channel, CF_VERBOSE_EVENTS) || event->event_id == SWITCH_EVENT_CHANNEL_ORIGINATE || event->event_id == SWITCH_EVENT_CHANNEL_UUID || event->event_id == SWITCH_EVENT_CHANNEL_ANSWER || @@ -1157,6 +1209,7 @@ event->event_id == SWITCH_EVENT_CHANNEL_HANGUP || event->event_id == SWITCH_EVENT_REQUEST_PARAMS || event->event_id == SWITCH_EVENT_CHANNEL_DATA || + event->event_id == SWITCH_EVENT_CHANNEL_EXECUTE_COMPLETE || event->event_id == SWITCH_EVENT_SESSION_HEARTBEAT || event->event_id == SWITCH_EVENT_CUSTOM ) { @@ -1689,6 +1742,9 @@ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "%s execute on answer: %s(%s)", channel->name, app, switch_str_nil(arg)); switch_core_session_execute_application(channel->session, app, arg); } + + switch_channel_audio_sync(channel); + return SWITCH_STATUS_SUCCESS; } @@ -2267,7 +2323,7 @@ switch_snprintf(tmp, sizeof(tmp), "%d", progressmsec); switch_channel_set_variable(channel, "progressmsec", tmp); - switch_snprintf(tmp, sizeof(tmp), "%" SWITCH_TIME_T_FMT, progressusec); + switch_snprintf(tmp, sizeof(tmp), "%d" , progressmsec); switch_channel_set_variable(channel, "progress_mediamsec", tmp); switch_snprintf(tmp, sizeof(tmp), "%d", legbillmsec); Modified: freeswitch/branches/gmaruzz/src/switch_core.c ============================================================================== --- freeswitch/branches/gmaruzz/src/switch_core.c (original) +++ freeswitch/branches/gmaruzz/src/switch_core.c Mon Dec 15 12:56:36 2008 @@ -781,7 +781,7 @@ setrlimit(RLIMIT_CPU, &rlp); setrlimit(RLIMIT_DATA, &rlp); setrlimit(RLIMIT_FSIZE, &rlp); -#ifndef __OpenBSD__ +#if !defined(__OpenBSD__) && !defined(__NetBSD__) setrlimit(RLIMIT_AS, &rlp); #endif #endif @@ -973,7 +973,7 @@ runtime.dummy_cng_frame.data = runtime.dummy_data; runtime.dummy_cng_frame.datalen = sizeof(runtime.dummy_data); runtime.dummy_cng_frame.buflen = sizeof(runtime.dummy_data); - runtime.dummy_cng_frame.flags = SFF_CNG; + switch_set_flag((&runtime.dummy_cng_frame), SFF_CNG); switch_set_flag((&runtime), SCF_NO_NEW_SESSIONS); runtime.hard_log_level = SWITCH_LOG_DEBUG; Modified: freeswitch/branches/gmaruzz/src/switch_core_codec.c ============================================================================== --- freeswitch/branches/gmaruzz/src/switch_core_codec.c (original) +++ freeswitch/branches/gmaruzz/src/switch_core_codec.c Mon Dec 15 12:56:36 2008 @@ -44,16 +44,30 @@ SWITCH_DECLARE(void) switch_core_session_unset_read_codec(switch_core_session_t *session) { + switch_mutex_t *mutex = NULL; + + switch_mutex_lock(session->codec_read_mutex); + if (session->read_codec) mutex = session->read_codec->mutex; + if (mutex) switch_mutex_lock(mutex); session->real_read_codec = session->read_codec = NULL; session->raw_read_frame.codec = session->read_codec; session->raw_write_frame.codec = session->read_codec; session->enc_read_frame.codec = session->read_codec; session->enc_write_frame.codec = session->read_codec; + if (mutex) switch_mutex_unlock(mutex); + switch_mutex_unlock(session->codec_read_mutex); } SWITCH_DECLARE(void) switch_core_session_unset_write_codec(switch_core_session_t *session) { + switch_mutex_t *mutex = NULL; + + switch_mutex_lock(session->codec_write_mutex); + if (session->write_codec) mutex = session->write_codec->mutex; + if (mutex) switch_mutex_lock(mutex); session->real_write_codec = session->write_codec = NULL; + if (mutex) switch_mutex_unlock(mutex); + switch_mutex_unlock(session->codec_write_mutex); } @@ -64,6 +78,8 @@ char tmp[30]; switch_status_t status = SWITCH_STATUS_SUCCESS; + switch_mutex_lock(session->codec_read_mutex); + if (codec && !codec->implementation) { codec = NULL; } @@ -118,6 +134,7 @@ end: + switch_mutex_unlock(session->codec_read_mutex); return status; } @@ -182,6 +199,8 @@ char tmp[30]; switch_status_t status = SWITCH_STATUS_SUCCESS; + switch_mutex_lock(session->codec_write_mutex); + if (!codec || !codec->implementation) { if (session->real_write_codec) { session->write_codec = session->real_write_codec; @@ -231,6 +250,7 @@ } end: + switch_mutex_unlock(session->codec_write_mutex); return status; } Modified: freeswitch/branches/gmaruzz/src/switch_core_io.c ============================================================================== --- freeswitch/branches/gmaruzz/src/switch_core_io.c (original) +++ freeswitch/branches/gmaruzz/src/switch_core_io.c Mon Dec 15 12:56:36 2008 @@ -103,17 +103,29 @@ int stream_id) { switch_io_event_hook_read_frame_t *ptr; - switch_status_t status; + switch_status_t status = SWITCH_STATUS_FALSE; int need_codec, perfect, do_bugs = 0, do_resample = 0, is_cng = 0; unsigned int flag = 0; switch_assert(session != NULL); + if (!(session->read_codec && session->read_codec->implementation)) { + if (switch_channel_test_flag(session->channel, CF_PROXY_MODE) || switch_channel_get_state(session->channel) == CS_HIBERNATE) { + *frame = &runtime.dummy_cng_frame; + return SWITCH_STATUS_SUCCESS; + } + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "%s has no read codec.\n", switch_channel_get_name(session->channel)); + return SWITCH_STATUS_FALSE; + } + + switch_mutex_lock(session->codec_read_mutex); + switch_mutex_lock(session->read_codec->mutex); + top: if (switch_channel_get_state(session->channel) >= CS_HANGUP) { *frame = NULL; - return SWITCH_STATUS_FALSE; + status = SWITCH_STATUS_FALSE; goto even_more_done; } @@ -138,11 +150,14 @@ if (switch_channel_test_flag(session->channel, CF_HOLD)) { + switch_yield(session->read_codec->implementation->microseconds_per_packet); status = SWITCH_STATUS_BREAK; goto even_more_done; } if (session->endpoint_interface->io_routines->read_frame) { + switch_mutex_unlock(session->read_codec->mutex); + switch_mutex_unlock(session->codec_read_mutex); if ((status = session->endpoint_interface->io_routines->read_frame(session, frame, flags, stream_id)) == SWITCH_STATUS_SUCCESS) { for (ptr = session->event_hooks.read_frame; ptr; ptr = ptr->next) { if ((status = ptr->read_frame(session, frame, flags, stream_id)) != SWITCH_STATUS_SUCCESS) { @@ -150,6 +165,14 @@ } } } + + if (!SWITCH_READ_ACCEPTABLE(status) || !session->read_codec || !session->read_codec->mutex) { + *frame = NULL; + return SWITCH_STATUS_FALSE; + } + + switch_mutex_lock(session->codec_read_mutex); + switch_mutex_lock(session->read_codec->mutex); } if (status != SWITCH_STATUS_SUCCESS) { @@ -178,10 +201,6 @@ switch_assert((*frame)->codec != NULL); - if (!(session->read_codec && session->read_codec->implementation)) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "%s has no read codec.\n", switch_channel_get_name(session->channel)); - return SWITCH_STATUS_FALSE; - } if (((*frame)->codec && session->read_codec->implementation != (*frame)->codec->implementation)) { need_codec = TRUE; @@ -318,15 +337,12 @@ switch_mutex_lock(bp->read_mutex); switch_buffer_write(bp->raw_read_buffer, read_frame->data, read_frame->datalen); if (bp->callback) { - if (bp->callback(bp, bp->user_data, SWITCH_ABC_TYPE_READ) == SWITCH_FALSE - || (bp->stop_time && bp->stop_time <= switch_timestamp(NULL))) { - ok = SWITCH_FALSE; - } + ok = bp->callback(bp, bp->user_data, SWITCH_ABC_TYPE_READ); } switch_mutex_unlock(bp->read_mutex); } - - if (switch_test_flag(bp, SMBF_READ_REPLACE)) { + + if (ok && switch_test_flag(bp, SMBF_READ_REPLACE)) { do_bugs = 0; if (bp->callback) { bp->read_replace_frame_in = read_frame; @@ -336,6 +352,10 @@ } } } + + if (bp->stop_time && bp->stop_time <= switch_timestamp(NULL)) { + ok = SWITCH_FALSE; + } if (ok == SWITCH_FALSE) { bp->ready = 0; @@ -516,6 +536,9 @@ *frame = &runtime.dummy_cng_frame; } + switch_mutex_unlock(session->read_codec->mutex); + switch_mutex_unlock(session->codec_read_mutex); + return status; } @@ -577,21 +600,32 @@ switch_assert(frame->codec != NULL); switch_assert(frame->codec->implementation != NULL); + switch_mutex_lock(session->codec_write_mutex); + + if (!(session->write_codec && session->write_codec->mutex && frame->codec)) { + switch_mutex_unlock(session->codec_write_mutex); + return SWITCH_STATUS_FALSE; + } + + switch_mutex_lock(session->write_codec->mutex); + switch_mutex_lock(frame->codec->mutex); + + if ((session->write_codec && frame->codec && session->write_codec->implementation != frame->codec->implementation)) { - need_codec = TRUE; if (session->write_codec->implementation->codec_id == frame->codec->implementation->codec_id) { ptime_mismatch = TRUE; + if (switch_test_flag(frame->codec, SWITCH_CODEC_FLAG_PASSTHROUGH) || switch_test_flag(session->read_codec, SWITCH_CODEC_FLAG_PASSTHROUGH)) { + status = perform_write(session, frame, flags, stream_id); + goto error; + } } + need_codec = TRUE; } if (session->write_codec && !frame->codec) { need_codec = TRUE; } - if (!session->write_codec && frame->codec) { - return SWITCH_STATUS_FALSE; - } - if (session->bugs && !need_codec) { do_bugs = TRUE; need_codec = TRUE; @@ -654,7 +688,7 @@ write_frame = &session->raw_write_frame; break; case SWITCH_STATUS_BREAK: - return SWITCH_STATUS_SUCCESS; + status = SWITCH_STATUS_SUCCESS; goto error; case SWITCH_STATUS_NOOP: if (session->write_resampler) { switch_mutex_lock(session->resample_mutex); @@ -668,15 +702,15 @@ default: if (status == SWITCH_STATUS_NOT_INITALIZED) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Codec init error!\n"); - return status; + goto error; } if (ptime_mismatch) { status = perform_write(session, frame, flags, stream_id); - return SWITCH_STATUS_SUCCESS; + status = SWITCH_STATUS_SUCCESS; goto error; } switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Codec %s decoder error!\n", frame->codec->codec_interface->interface_name); - return status; + goto error; } } @@ -774,13 +808,13 @@ bytes * SWITCH_BUFFER_BLOCK_FRAMES, bytes * SWITCH_BUFFER_START_FRAMES, 0)) != SWITCH_STATUS_SUCCESS) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Write Buffer Failed!\n"); - return status; + goto error; } } if (!(switch_buffer_write(session->raw_write_buffer, write_frame->data, write_frame->datalen))) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Write Buffer %u bytes Failed!\n", write_frame->datalen); - return SWITCH_STATUS_MEMERR; + status = SWITCH_STATUS_MEMERR; goto error; } } @@ -826,18 +860,18 @@ case SWITCH_STATUS_NOT_INITALIZED: switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Codec init error!\n"); write_frame = NULL; - return status; + goto error; default: switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Codec %s encoder error!\n", session->read_codec->codec_interface->interface_name); write_frame = NULL; - return status; + goto error; } if (flag & SFF_CNG) { switch_set_flag(write_frame, SFF_CNG); } status = perform_write(session, write_frame, flags, stream_id); - return status; + goto error; } else { switch_size_t used = switch_buffer_inuse(session->raw_write_buffer); uint32_t bytes = session->write_codec->implementation->decoded_bytes_per_packet; @@ -845,7 +879,7 @@ status = SWITCH_STATUS_SUCCESS; if (!frames) { - return status; + goto error; } else { switch_size_t x; for (x = 0; x < frames; x++) { @@ -917,12 +951,12 @@ case SWITCH_STATUS_NOT_INITALIZED: switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Codec init error!\n"); write_frame = NULL; - return status; + goto error; default: switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Codec %s encoder error %d!\n", session->read_codec->codec_interface->interface_name, status); write_frame = NULL; - return status; + goto error; } if (session->read_resampler) { @@ -951,7 +985,7 @@ } } } - return status; + goto error; } } } @@ -959,11 +993,18 @@ do_write = TRUE; } - done: + done: if (do_write) { - return perform_write(session, frame, flags, stream_id); + status = perform_write(session, frame, flags, stream_id); } + + error: + + switch_mutex_unlock(session->write_codec->mutex); + switch_mutex_unlock(frame->codec->mutex); + switch_mutex_unlock(session->codec_write_mutex); + return status; } Modified: freeswitch/branches/gmaruzz/src/switch_core_rwlock.c ============================================================================== --- freeswitch/branches/gmaruzz/src/switch_core_rwlock.c (original) +++ freeswitch/branches/gmaruzz/src/switch_core_rwlock.c Mon Dec 15 12:56:36 2008 @@ -63,6 +63,34 @@ return status; } + +#ifdef SWITCH_DEBUG_RWLOCKS +SWITCH_DECLARE(switch_status_t) switch_core_session_perform_read_lock_hangup(switch_core_session_t *session, const char *file, const char *func, int line) +#else +SWITCH_DECLARE(switch_status_t) switch_core_session_read_lock_hangup(switch_core_session_t *session) +#endif +{ + switch_status_t status = SWITCH_STATUS_FALSE; + + if (session->rwlock) { + if (switch_test_flag(session, SSF_DESTROYED) || switch_channel_get_state(session->channel) >= CS_DONE) { + status = SWITCH_STATUS_FALSE; +#ifdef SWITCH_DEBUG_RWLOCKS + switch_log_printf(SWITCH_CHANNEL_ID_LOG, file, func, line, NULL, SWITCH_LOG_ERROR, "%s Read lock FAIL\n", + switch_channel_get_name(session->channel)); +#endif + } else { + status = (switch_status_t) switch_thread_rwlock_tryrdlock(session->rwlock); +#ifdef SWITCH_DEBUG_RWLOCKS + switch_log_printf(SWITCH_CHANNEL_ID_LOG, file, func, line, NULL, SWITCH_LOG_ERROR, "%s Read lock ACQUIRED\n", + switch_channel_get_name(session->channel)); +#endif + } + } + + return status; +} + #ifdef SWITCH_DEBUG_RWLOCKS SWITCH_DECLARE(void) switch_core_session_perform_write_lock(switch_core_session_t *session, const char *file, const char *func, int line) { Modified: freeswitch/branches/gmaruzz/src/switch_core_session.c ============================================================================== --- freeswitch/branches/gmaruzz/src/switch_core_session.c (original) +++ freeswitch/branches/gmaruzz/src/switch_core_session.c Mon Dec 15 12:56:36 2008 @@ -242,7 +242,7 @@ { switch_io_event_hook_outgoing_channel_t *ptr; switch_status_t status = SWITCH_STATUS_FALSE; - const switch_endpoint_interface_t *endpoint_interface; + switch_endpoint_interface_t *endpoint_interface; switch_channel_t *channel = NULL; switch_caller_profile_t *outgoing_profile = caller_profile; switch_call_cause_t cause = SWITCH_CAUSE_REQUESTED_CHAN_UNAVAIL; @@ -301,6 +301,7 @@ if ((cause = endpoint_interface->io_routines->outgoing_channel(session, var_event, outgoing_profile, new_session, pool, flags)) != SWITCH_CAUSE_SUCCESS) { + UNPROTECT_INTERFACE(endpoint_interface); return cause; } @@ -315,6 +316,7 @@ if (!*new_session) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Outgoing method for endpoint: [%s] returned: [%s] but there is no new session!\n", endpoint_name, switch_channel_cause2str(cause)); + UNPROTECT_INTERFACE(endpoint_interface); return SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER; } else { switch_caller_profile_t *profile = NULL, *peer_profile = NULL, *cloned_profile = NULL; @@ -344,7 +346,7 @@ profile = switch_channel_get_caller_profile(channel); - if (read_codec) { + if (read_codec && read_codec->implementation) { char tmp[80]; switch_codec2str(read_codec, tmp, sizeof(tmp)); switch_channel_set_variable(peer_channel, SWITCH_ORIGINATOR_CODEC_VARIABLE, tmp); @@ -414,6 +416,7 @@ } } + UNPROTECT_INTERFACE(endpoint_interface); return cause; } @@ -438,6 +441,7 @@ "SWITCH_MESSAGE_INDICATE_VIDEO_REFRESH_REQ", "SWITCH_MESSAGE_INDICATE_DISPLAY", "SWITCH_MESSAGE_INDICATE_TRANSCODING_NECESSARY", + "SWITCH_MESSAGE_INDICATE_AUDIO_SYNC", "SWITCH_MESSAGE_INVALID" }; @@ -486,7 +490,29 @@ message->_line = 0; - switch_core_session_kill_channel(session, SWITCH_SIG_BREAK); + switch (message->message_id) { + case SWITCH_MESSAGE_REDIRECT_AUDIO: + case SWITCH_MESSAGE_INDICATE_ANSWER: + case SWITCH_MESSAGE_INDICATE_PROGRESS: + case SWITCH_MESSAGE_INDICATE_BRIDGE: + case SWITCH_MESSAGE_INDICATE_UNBRIDGE: + case SWITCH_MESSAGE_INDICATE_TRANSFER: + case SWITCH_MESSAGE_INDICATE_RINGING: + case SWITCH_MESSAGE_INDICATE_MEDIA: + case SWITCH_MESSAGE_INDICATE_NOMEDIA: + case SWITCH_MESSAGE_INDICATE_HOLD: + case SWITCH_MESSAGE_INDICATE_UNHOLD: + case SWITCH_MESSAGE_INDICATE_REDIRECT: + case SWITCH_MESSAGE_INDICATE_RESPOND: + case SWITCH_MESSAGE_INDICATE_BROADCAST: + case SWITCH_MESSAGE_INDICATE_MEDIA_REDIRECT: + case SWITCH_MESSAGE_INDICATE_DEFLECT: + switch_core_session_kill_channel(session, SWITCH_SIG_BREAK); + break; + default: + break; + } + switch_core_session_rwunlock(session); return status; @@ -722,6 +748,7 @@ switch_channel_t *channel = switch_core_session_get_channel(session); switch_size_t has; + switch_core_session_set_read_codec(session, NULL); /* clear resamplers */ @@ -869,7 +896,7 @@ { switch_assert(session != NULL); - if (seconds < 10) { + if (!seconds) { seconds = 60; } @@ -1077,6 +1104,8 @@ switch_mutex_init(&session->mutex, SWITCH_MUTEX_NESTED, session->pool); switch_mutex_init(&session->resample_mutex, SWITCH_MUTEX_NESTED, session->pool); + switch_mutex_init(&session->codec_read_mutex, SWITCH_MUTEX_NESTED, session->pool); + switch_mutex_init(&session->codec_write_mutex, SWITCH_MUTEX_NESTED, session->pool); switch_thread_rwlock_create(&session->bug_rwlock, session->pool); switch_thread_cond_create(&session->cond, session->pool); switch_thread_rwlock_create(&session->rwlock, session->pool); @@ -1111,14 +1140,18 @@ SWITCH_DECLARE(switch_core_session_t *) switch_core_session_request_by_name(const char *endpoint_name, switch_memory_pool_t **pool) { switch_endpoint_interface_t *endpoint_interface; + switch_core_session_t *session; if ((endpoint_interface = switch_loadable_module_get_endpoint_interface(endpoint_name)) == 0) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Could not locate channel type %s\n", endpoint_name); return NULL; } - return switch_core_session_request(endpoint_interface, pool); + session = switch_core_session_request(endpoint_interface, pool); + + UNPROTECT_INTERFACE(endpoint_interface); + return session; } #ifndef SWITCH_PREFIX_DIR @@ -1273,9 +1306,10 @@ } } - switch_channel_set_variable(channel, "current_application", application_interface->interface_name); - switch_channel_set_variable(channel, "current_application_data", arg); - + switch_channel_set_variable(channel, SWITCH_CURRENT_APPLICATION_VARIABLE, application_interface->interface_name); + switch_channel_set_variable(channel, SWITCH_CURRENT_APPLICATION_DATA_VARIABLE, arg); + switch_channel_set_variable(channel, SWITCH_CURRENT_APPLICATION_RESPONSE_VARIABLE, NULL); + if (switch_event_create(&event, SWITCH_EVENT_CHANNEL_EXECUTE) == SWITCH_STATUS_SUCCESS) { switch_channel_event_set_data(session->channel, event); switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Application", application_interface->interface_name); @@ -1292,9 +1326,11 @@ application_interface->application_function(session, arg); if (switch_event_create(&event, SWITCH_EVENT_CHANNEL_EXECUTE_COMPLETE) == SWITCH_STATUS_SUCCESS) { + const char *resp = switch_channel_get_variable(session->channel, SWITCH_CURRENT_APPLICATION_RESPONSE_VARIABLE); switch_channel_event_set_data(session->channel, event); switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Application", application_interface->interface_name); switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Application-Data", arg); + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Application-Response", resp ? resp : "_none_"); switch_event_fire(&event); } Modified: freeswitch/branches/gmaruzz/src/switch_core_state_machine.c ============================================================================== --- freeswitch/branches/gmaruzz/src/switch_core_state_machine.c (original) +++ freeswitch/branches/gmaruzz/src/switch_core_state_machine.c Mon Dec 15 12:56:36 2008 @@ -165,7 +165,7 @@ } if (switch_channel_get_state(session->channel) == CS_EXECUTE) { - switch_channel_hangup(session->channel, SWITCH_CAUSE_NORMAL_CLEARING); + switch_channel_hangup(session->channel, SWITCH_CAUSE_NORMAL_CLEARING); } } @@ -185,7 +185,6 @@ { switch_assert(session != NULL); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "%s Standard PARK\n", switch_channel_get_name(session->channel)); - switch_channel_clear_flag(session->channel, CF_TRANSFER); switch_core_session_reset(session, SWITCH_TRUE); switch_ivr_park(session, NULL); } @@ -361,18 +360,15 @@ switch_mutex_lock(session->mutex); while ((state = switch_channel_get_state(session->channel)) != CS_DONE) { - uint8_t exception = 0; midstate = state; - if (switch_channel_test_flag(session->channel, CF_REPEAT_STATE)) { - switch_channel_clear_flag(session->channel, CF_REPEAT_STATE); - exception = 1; - } - if (state != switch_channel_get_running_state(session->channel) || state == CS_HANGUP || exception) { + if (state != switch_channel_get_running_state(session->channel) || state == CS_HANGUP) { int index = 0; int proceed = 1; int do_extra_handlers = 1; switch_channel_set_running_state(session->channel, state); + switch_channel_clear_flag(session->channel, CF_TRANSFER); + switch_channel_clear_flag(session->channel, CF_REDIRECT); switch (state) { case CS_NEW: /* Just created, Waiting for first instructions */ @@ -385,7 +381,8 @@ { const char *var = switch_channel_get_variable(session->channel, SWITCH_PROCESS_CDR_VARIABLE); const char *hook_var; - + switch_core_session_t *use_session = NULL; + if (!switch_strlen_zero(var)) { if (!strcasecmp(var, "a_only")) { if (switch_channel_get_originator_caller_profile(session->channel)) { @@ -401,20 +398,32 @@ } STATE_MACRO(hangup, "HANGUP"); - + hook_var = switch_channel_get_variable(session->channel, SWITCH_API_HANGUP_HOOK_VARIABLE); + if (switch_true(switch_channel_get_variable(session->channel, SWITCH_SESSION_IN_HANGUP_HOOK_VARIABLE))) { + use_session = session; + } if (!switch_strlen_zero(hook_var)) { switch_stream_handle_t stream = { 0 }; char *cmd = switch_core_session_strdup(session, hook_var); char *arg = NULL; + char *expanded = NULL; + if ((arg = strchr(cmd, ' '))) { *arg++ = '\0'; } SWITCH_STANDARD_STREAM(stream); - switch_api_execute(cmd, arg, NULL, &stream); - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Hangup Command %s(%s):\n%s\n", cmd, arg, + switch_channel_get_variables(session->channel, &stream.param_event); + expanded = switch_channel_expand_variables(session->channel, arg); + + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Hangup Command %s(%s):\n%s\n", cmd, expanded, switch_str_nil((char *) stream.data)); + switch_api_execute(cmd, expanded, use_session, &stream); + if (expanded != arg) { + switch_safe_free(expanded); + } switch_safe_free(stream.data); } } Modified: freeswitch/branches/gmaruzz/src/switch_cpp.cpp ============================================================================== --- freeswitch/branches/gmaruzz/src/switch_cpp.cpp (original) +++ freeswitch/branches/gmaruzz/src/switch_cpp.cpp Mon Dec 15 12:56:36 2008 @@ -467,7 +467,8 @@ allocated = 1; } else { switch_call_cause_t cause; - if (switch_ivr_originate(a_leg ? a_leg->session : NULL, &session, &cause, nuuid, 60, NULL, NULL, NULL, NULL, SOF_NONE) == SWITCH_STATUS_SUCCESS) { + if (switch_ivr_originate(a_leg ? a_leg->session : NULL, &session, &cause, nuuid, 60, NULL, NULL, NULL, NULL, NULL, SOF_NONE) + == SWITCH_STATUS_SUCCESS) { channel = switch_core_session_get_channel(session); allocated = 1; switch_set_flag(this, S_HUP); @@ -832,7 +833,7 @@ } -SWITCH_DECLARE(int) CoreSession::sleep(int ms) { +SWITCH_DECLARE(int) CoreSession::sleep(int ms, int sync) { switch_status_t status; @@ -840,7 +841,7 @@ sanity_check(-1); begin_allow_threads(); - status = switch_ivr_sleep(session, ms, ap); + status = switch_ivr_sleep(session, ms, (switch_bool_t) sync, ap); end_allow_threads(); return status == SWITCH_STATUS_SUCCESS ? 1 : 0; @@ -919,6 +920,7 @@ NULL, NULL, &caller_profile, + NULL, SOF_NONE) != SWITCH_STATUS_SUCCESS) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Error Creating Outgoing Channel! [%s]\n", dest); goto failed; @@ -1090,6 +1092,12 @@ } +SWITCH_DECLARE(void) msleep(unsigned ms) +{ + switch_sleep(ms * 1000); + return; +} + SWITCH_DECLARE(void) bridge(CoreSession &session_a, CoreSession &session_b) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "bridge called, session_a uuid: %s\n", session_a.get_uuid()); Modified: freeswitch/branches/gmaruzz/src/switch_event.c ============================================================================== --- freeswitch/branches/gmaruzz/src/switch_event.c (original) +++ freeswitch/branches/gmaruzz/src/switch_event.c Mon Dec 15 12:56:36 2008 @@ -142,6 +142,7 @@ "DTMF", "MESSAGE", "PRESENCE_IN", + "NOTIFY_IN", "PRESENCE_OUT", "PRESENCE_PROBE", "MESSAGE_WAITING", Modified: freeswitch/branches/gmaruzz/src/switch_ivr.c ============================================================================== --- freeswitch/branches/gmaruzz/src/switch_ivr.c (original) +++ freeswitch/branches/gmaruzz/src/switch_ivr.c Mon Dec 15 12:56:36 2008 @@ -38,7 +38,7 @@ #include <switch_ivr.h> #include "stfu.h" -SWITCH_DECLARE(switch_status_t) switch_ivr_sleep(switch_core_session_t *session, uint32_t ms, switch_input_args_t *args) +SWITCH_DECLARE(switch_status_t) switch_ivr_sleep(switch_core_session_t *session, uint32_t ms, switch_bool_t sync, switch_input_args_t *args) { switch_channel_t *channel = switch_core_session_get_channel(session); switch_status_t status = SWITCH_STATUS_SUCCESS; @@ -47,10 +47,60 @@ int32_t left, elapsed; char data[2] = ""; + switch_frame_t write_frame = { 0 }; + unsigned char *abuf = NULL; + switch_codec_implementation_t imp = {0}; + switch_codec_t codec = { 0 }; + int sval = 0; + const char *var; + + if ((var = switch_channel_get_variable(channel, SWITCH_SEND_SILENCE_WHEN_IDLE_VARIABLE)) && (sval = atoi(var))) { + switch_core_session_get_read_impl(session, &imp); + + if (switch_core_codec_init(&codec, + "L16", + NULL, + imp.samples_per_second, + imp.microseconds_per_packet / 1000, + imp.number_of_channels, + SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, NULL, + switch_core_session_get_pool(session)) != SWITCH_STATUS_SUCCESS) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Codec Error L16@%uhz %u channels %dms\n", + imp.samples_per_second, imp.number_of_channels, imp.microseconds_per_packet / 1000); + return SWITCH_STATUS_FALSE; + } + + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Codec Activated L16@%uhz %u channels %dms\n", + imp.samples_per_second, imp.number_of_channels, imp.microseconds_per_packet / 1000); + + write_frame.codec = &codec; + switch_zmalloc(abuf, SWITCH_RECOMMENDED_BUFFER_SIZE); + write_frame.data = abuf; + write_frame.buflen = SWITCH_RECOMMENDED_BUFFER_SIZE; + write_frame.datalen = imp.decoded_bytes_per_packet; + write_frame.samples = write_frame.datalen / sizeof(int16_t); + + if (!switch_channel_media_ready(channel)) { + if ((status = switch_channel_pre_answer(channel)) != SWITCH_STATUS_SUCCESS) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Cannot establish media.\n"); + return SWITCH_STATUS_FALSE; + } + } + } + cng_frame.data = data; cng_frame.datalen = 2; cng_frame.buflen = 2; - cng_frame.flags = SFF_CNG; + switch_set_flag((&cng_frame), SFF_CNG); + + if (sync && !switch_channel_test_flag(channel, CF_PROXY_MODE)) { + switch_channel_audio_sync(channel); + } + + if (!ms) { + return SWITCH_STATUS_SUCCESS; + } for (;;) { now = switch_timestamp_now(); @@ -126,10 +176,20 @@ } } - switch_core_session_write_frame(session, &cng_frame, SWITCH_IO_FLAG_NONE, 0); + if (sval) { + switch_generate_sln_silence((int16_t *) write_frame.data, write_frame.samples, sval); + switch_core_session_write_frame(session, &write_frame, SWITCH_IO_FLAG_NONE, 0); + } else { + switch_core_session_write_frame(session, &cng_frame, SWITCH_IO_FLAG_NONE, 0); + } + } + if (write_frame.codec) { + switch_core_codec_destroy(&codec); } + switch_safe_free(abuf); + return status; } @@ -741,9 +801,44 @@ switch_time_t started = 0, digit_started = 0; uint32_t abs_elapsed = 0, digit_elapsed = 0; uint32_t eff_timeout = 0; + switch_frame_t write_frame = { 0 }; + unsigned char *abuf = NULL; + switch_codec_implementation_t imp = {0}; + switch_codec_t codec = { 0 }; + int sval = 0; + const char *var; - if (terminator != NULL) + if ((var = switch_channel_get_variable(channel, SWITCH_SEND_SILENCE_WHEN_IDLE_VARIABLE)) && (sval = atoi(var))) { + switch_core_session_get_read_impl(session, &imp); + + if (switch_core_codec_init(&codec, + "L16", + NULL, + imp.samples_per_second, + imp.microseconds_per_packet / 1000, + imp.number_of_channels, + SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, NULL, + switch_core_session_get_pool(session)) != SWITCH_STATUS_SUCCESS) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Codec Error L16@%uhz %u channels %dms\n", + imp.samples_per_second, imp.number_of_channels, imp.microseconds_per_packet / 1000); + return SWITCH_STATUS_FALSE; + } + + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Codec Activated L16@%uhz %u channels %dms\n", + imp.samples_per_second, imp.number_of_channels, imp.microseconds_per_packet / 1000); + + write_frame.codec = &codec; + switch_zmalloc(abuf, SWITCH_RECOMMENDED_BUFFER_SIZE); + write_frame.data = abuf; + write_frame.buflen = SWITCH_RECOMMENDED_BUFFER_SIZE; + write_frame.datalen = imp.decoded_bytes_per_packet; + write_frame.samples = write_frame.datalen / sizeof(int16_t); + } + + if (terminator != NULL) { *terminator = '\0'; + } if (!switch_strlen_zero(terminators)) { for (i = 0; i < x; i++) { @@ -830,9 +925,21 @@ if (!SWITCH_READ_ACCEPTABLE(status)) { break; } + + if (write_frame.data) { + switch_generate_sln_silence((int16_t *) write_frame.data, write_frame.samples, sval); + switch_core_session_write_frame(session, &write_frame, SWITCH_IO_FLAG_NONE, 0); + } + } } + if (write_frame.codec) { + switch_core_codec_destroy(&codec); + } + + switch_safe_free(abuf); + return status; } @@ -1057,7 +1164,8 @@ switch_channel_clear_state_handler(channel, NULL); if ((profile = switch_channel_get_caller_profile(channel))) { - + const char *var; + if (switch_strlen_zero(dialplan)) { dialplan = profile->dialplan; } @@ -1078,6 +1186,14 @@ extension = "service"; } + if ((var = switch_channel_get_variable(channel, "force_transfer_dialplan"))) { + dialplan = var; + } + + if ((var = switch_channel_get_variable(channel, "force_transfer_context"))) { + context = var; + } + new_profile = switch_caller_profile_clone(session, profile); new_profile->dialplan = switch_core_strdup(new_profile->pool, dialplan); Modified: freeswitch/branches/gmaruzz/src/switch_ivr_async.c ============================================================================== --- freeswitch/branches/gmaruzz/src/switch_ivr_async.c (original) +++ freeswitch/branches/gmaruzz/src/switch_ivr_async.c Mon Dec 15 12:56:36 2008 @@ -1192,6 +1192,10 @@ char *key; teletone_tone_map_t map; int up; + int total_hits; + int hits; + int sleep; + int expires; } switch_tone_detect_t; typedef struct { @@ -1213,43 +1217,76 @@ case SWITCH_ABC_TYPE_CLOSE: break; case SWITCH_ABC_TYPE_READ_REPLACE: - frame = switch_core_media_bug_get_read_replace_frame(bug); case SWITCH_ABC_TYPE_WRITE_REPLACE: { + int skip = 0; - if (!frame) { + if (type == SWITCH_ABC_TYPE_READ_REPLACE) { + frame = switch_core_media_bug_get_read_replace_frame(bug); + } else { frame = switch_core_media_bug_get_write_replace_frame(bug); } - for (i = 0; i < cont->index; i++) { - if (cont->list[i].up && teletone_multi_tone_detect(&cont->list[i].mt, frame->data, frame->samples)) { - switch_event_t *event; - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "TONE %s DETECTED\n", cont->list[i].key); - cont->list[i].up = 0; - if (cont->list[i].app) { - if (switch_event_create(&event, SWITCH_EVENT_COMMAND) == SWITCH_STATUS_SUCCESS) { - switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "call-command", "execute"); - switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "execute-app-name", cont->list[i].app); - switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "execute-app-arg", cont->list[i].data); - switch_event_add_header(event, SWITCH_STACK_BOTTOM, "lead-frames", "%d", 5); - switch_core_session_queue_private_event(cont->session, &event); - } + for (i = 0; i < cont->index; i++) { + + if (cont->list[i].sleep) { + cont->list[i].sleep--; + if (cont->list[i].sleep) { + skip = 1; } + } - if (switch_event_create(&event, SWITCH_EVENT_DETECTED_TONE) == SWITCH_STATUS_SUCCESS) { - switch_event_t *dup; - switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Detected-Tone", cont->list[i].key); + if (cont->list[i].expires) { + cont->list[i].expires--; + if (!cont->list[i].expires) { + cont->list[i].hits = 0; + cont->list[i].sleep = 0; + cont->list[i].expires = 0; + } + } + + if (!cont->list[i].up) skip = 1; - if (switch_event_dup(&dup, event) == SWITCH_STATUS_SUCCESS) { - switch_event_fire(&dup); + if (skip) return SWITCH_TRUE; + + if (teletone_multi_tone_detect(&cont->list[i].mt, frame->data, frame->samples)) { + switch_event_t *event; + cont->list[i].hits++; + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "TONE %s HIT %d/%d\n", + cont->list[i].key, cont->list[i].hits, cont->list[i].total_hits); + cont->list[i].sleep = 50; + cont->list[i].expires = 250; + + if (cont->list[i].hits >= cont->list[i].total_hits) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "TONE %s DETECTED\n", cont->list[i].key); + cont->list[i].up = 0; + + if (cont->list[i].app) { + if (switch_event_create(&event, SWITCH_EVENT_COMMAND) == SWITCH_STATUS_SUCCESS) { + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "call-command", "execute"); + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "execute-app-name", cont->list[i].app); + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "execute-app-arg", cont->list[i].data); + switch_event_add_header(event, SWITCH_STACK_BOTTOM, "lead-frames", "%d", 5); + switch_core_session_queue_private_event(cont->session, &event); + } } - if (switch_core_session_queue_event(cont->session, &event) != SWITCH_STATUS_SUCCESS) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Event queue failed!\n"); - switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "delivery-failure", "true"); - switch_event_fire(&event); + if (switch_event_create(&event, SWITCH_EVENT_DETECTED_TONE) == SWITCH_STATUS_SUCCESS) { + switch_event_t *dup; + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Detected-Tone", cont->list[i].key); + + if (switch_event_dup(&dup, event) == SWITCH_STATUS_SUCCESS) { + switch_event_fire(&dup); + } + + if (switch_core_session_queue_event(cont->session, &event) != SWITCH_STATUS_SUCCESS) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Event queue failed!\n"); + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "delivery-failure", "true"); + switch_event_fire(&event); + } } } } @@ -1278,7 +1315,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_tone_detect_session(switch_core_session_t *session, const char *key, const char *tone_spec, - const char *flags, time_t timeout, const char *app, const char *data) + const char *flags, time_t timeout, int hits, const char *app, const char *data) { switch_channel_t *channel = switch_core_session_get_channel(session); switch_codec_t *read_codec = switch_core_session_get_read_codec(session); @@ -1305,7 +1342,9 @@ if (!switch_strlen_zero(cont->list[cont->index].key) && !strcasecmp(key, cont->list[cont->index].key)) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Re-enabling %s\n", key); cont->list[cont->index].up = 1; - teletone_multi_tone_init(&cont->list[i].mt, &cont->list[i].map); + cont->list[i].hits = 0; + cont->list[i].sleep = 0; + cont->list[i].expires = 0; return SWITCH_STATUS_SUCCESS; } } @@ -1320,7 +1359,7 @@ return SWITCH_STATUS_MEMERR; } - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Adding tone spec %s index %d\n", tone_spec, cont->index); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Adding tone spec %s index %d hits %d\n", tone_spec, cont->index, hits); i = 0; p = (char *) tone_spec; @@ -1339,7 +1378,7 @@ } } while (next); cont->list[cont->index].map.freqs[i++] = 0; - + if (!ok) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invalid tone spec!\n"); return SWITCH_STATUS_FALSE; @@ -1355,6 +1394,11 @@ cont->list[cont->index].data = switch_core_session_strdup(session, data); } + if (!hits) hits = 1; + + cont->list[cont->index].hits = 0; + cont->list[cont->index].total_hits = hits; + cont->list[cont->index].up = 1; cont->list[cont->index].mt.sample_rate = read_codec->implementation->actual_samples_per_second; teletone_multi_tone_init(&cont->list[cont->index].mt, &cont->list[cont->index].map); @@ -1371,7 +1415,7 @@ bflags |= SMBF_WRITE_REPLACE; } } - + if ((status = switch_core_media_bug_add(session, tone_detect_callback, cont, timeout, bflags, &cont->bug)) != SWITCH_STATUS_SUCCESS) { return status; } Modified: freeswitch/branches/gmaruzz/src/switch_ivr_bridge.c ============================================================================== --- freeswitch/branches/gmaruzz/src/switch_ivr_bridge.c (original) +++ freeswitch/branches/gmaruzz/src/switch_ivr_bridge.c Mon Dec 15 12:56:36 2008 @@ -140,7 +140,8 @@ switch_channel_wait_for_flag(chan_b, CF_BRIDGED, SWITCH_TRUE, 10000, chan_a); if (!switch_channel_test_flag(chan_b, CF_BRIDGED)) { - if (!(switch_channel_test_flag(chan_b, CF_TRANSFER) || switch_channel_get_state(chan_b) == CS_RESET)) { + if (!(switch_channel_test_flag(chan_b, CF_TRANSFER) || switch_channel_test_flag(chan_b, CF_REDIRECT) + || switch_channel_get_state(chan_b) == CS_RESET)) { switch_channel_hangup(chan_b, SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER); } goto end_of_bridge_loop; @@ -352,8 +353,6 @@ if (switch_core_session_write_frame(session_b, read_frame, SWITCH_IO_FLAG_NONE, stream_id) != SWITCH_STATUS_SUCCESS) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "%s ending bridge by request from write function\n", switch_channel_get_name(chan_b)); - - goto end_of_bridge_loop; } } @@ -462,15 +461,16 @@ switch_channel_clear_state_handler(channel, &audio_bridge_peer_state_handlers); state = switch_channel_get_state(channel); - + if (state < CS_HANGUP && switch_true(switch_channel_get_variable(channel, SWITCH_PARK_AFTER_BRIDGE_VARIABLE))) { switch_ivr_park_session(session); + } else { + if (!switch_channel_test_flag(channel, CF_TRANSFER) && !switch_channel_test_flag(channel, CF_REDIRECT) && bd && !bd->clean_exit + && state != CS_PARK && state != CS_ROUTING && !switch_channel_test_flag(channel, CF_INNER_BRIDGE)) { + switch_channel_hangup(channel, SWITCH_CAUSE_NORMAL_CLEARING); + } } - - if (!switch_channel_test_flag(channel, CF_TRANSFER) && bd && !bd->clean_exit && state != CS_PARK && - state != CS_ROUTING && !switch_channel_test_flag(channel, CF_INNER_BRIDGE)) { - switch_channel_hangup(channel, SWITCH_CAUSE_NORMAL_CLEARING); - } + if (switch_true(switch_channel_get_variable(channel, SWITCH_COPY_XML_CDR_VARIABLE))) { switch_xml_t cdr; @@ -485,6 +485,9 @@ } } + if (switch_channel_get_state(channel) == CS_EXCHANGE_MEDIA) { + switch_channel_set_state(channel, CS_RESET); + } return SWITCH_STATUS_FALSE; } @@ -526,7 +529,7 @@ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "%s CUSTOM RESET\n", switch_channel_get_name(channel)); - switch_channel_clear_flag(channel, CF_TRANSFER); + switch_channel_clear_flag(channel, CF_ORIGINATING); if (switch_channel_test_flag(channel, CF_ORIGINATOR)) { switch_channel_set_state(channel, CS_SOFT_EXECUTE); @@ -535,21 +538,27 @@ return SWITCH_STATUS_SUCCESS; } +static switch_status_t uuid_bridge_on_hibernate(switch_core_session_t *session) +{ + switch_channel_set_state(switch_core_session_get_channel(session), CS_RESET); + return SWITCH_STATUS_FALSE; +} + static switch_status_t uuid_bridge_on_soft_execute(switch_core_session_t *session) { switch_channel_t *channel = switch_core_session_get_channel(session); switch_core_session_t *other_session; const char *other_uuid = NULL; - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "%s CUSTOM TRANSMIT\n", switch_channel_get_name(channel)); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "%s CUSTOM SOFT_EXECUTE\n", switch_channel_get_name(channel)); switch_channel_clear_state_handler(channel, NULL); - switch_channel_clear_flag(channel, CF_TRANSFER); - if (!switch_channel_test_flag(channel, CF_ORIGINATOR)) { return SWITCH_STATUS_SUCCESS; } + switch_channel_clear_flag(channel, CF_ORIGINATOR); + if ((other_uuid = switch_channel_get_variable(channel, SWITCH_UUID_BRIDGE)) && (other_session = switch_core_session_locate(other_uuid))) { switch_channel_t *other_channel = switch_core_session_get_channel(other_session); switch_event_t *event; @@ -572,8 +581,6 @@ switch_channel_wait_for_state(channel, other_channel, CS_SOFT_EXECUTE); - switch_channel_clear_flag(channel, CF_TRANSFER); - switch_channel_clear_flag(other_channel, CF_TRANSFER); switch_core_session_reset(session, SWITCH_TRUE); @@ -613,9 +620,11 @@ } switch_ivr_multi_threaded_bridge(session, other_session, NULL, NULL, NULL); - + state = switch_channel_get_state(channel); - if (!switch_channel_test_flag(channel, CF_TRANSFER) && state < CS_HANGUP && state != CS_ROUTING && state != CS_PARK) { + if (!switch_channel_test_flag(channel, CF_TRANSFER) && + !switch_channel_test_flag(channel, CF_REDIRECT) && state < CS_HANGUP + && state != CS_ROUTING && state != CS_PARK) { switch_channel_set_state(channel, CS_EXECUTE); } switch_core_session_rwunlock(other_session); @@ -635,8 +644,8 @@ /*.on_hangup */ NULL, /*.on_exchange_media */ NULL, /*.on_soft_execute */ uuid_bridge_on_soft_execute, - /*.on_consume_media */ NULL, - /*.on_hibernate */ NULL, + /*.on_consume_media */ uuid_bridge_on_hibernate, + /*.on_hibernate */ uuid_bridge_on_hibernate, /*.on_reset */ uuid_bridge_on_reset }; @@ -646,7 +655,6 @@ channel = switch_core_session_get_channel(session); switch_assert(channel != NULL); - switch_channel_clear_flag(channel, CF_TRANSFER); switch_channel_set_variable(channel, SWITCH_BRIDGE_VARIABLE, switch_channel_get_variable(channel, SWITCH_SIGNAL_BRIDGE_VARIABLE)); @@ -782,8 +790,6 @@ int inner_bridge = switch_channel_test_flag(caller_channel, CF_INNER_BRIDGE); switch_channel_set_flag(caller_channel, CF_ORIGINATOR); - switch_channel_clear_flag(caller_channel, CF_TRANSFER); - switch_channel_clear_flag(peer_channel, CF_TRANSFER); b_leg->session = peer_session; switch_copy_string(b_leg->b_uuid, switch_core_session_get_uuid(session), sizeof(b_leg->b_uuid)); @@ -827,7 +833,8 @@ if ((status = switch_ivr_wait_for_answer(session, peer_session)) != SWITCH_STATUS_SUCCESS) { switch_channel_state_t w_state = switch_channel_get_state(caller_channel); switch_channel_hangup(peer_channel, SWITCH_CAUSE_ALLOTTED_TIMEOUT); - if (w_state < CS_HANGUP && w_state != CS_ROUTING && w_state != CS_PARK && !switch_channel_test_flag(caller_channel, CF_TRANSFER) && + if (w_state < CS_HANGUP && w_state != CS_ROUTING && w_state != CS_PARK && + !switch_channel_test_flag(caller_channel, CF_REDIRECT) && !switch_channel_test_flag(caller_channel, CF_TRANSFER) && w_state != CS_EXECUTE) { const char *ext = switch_channel_get_variable(peer_channel, "original_destination_number"); if (!ext) { @@ -908,10 +915,6 @@ switch_channel_clear_flag(caller_channel, CF_ORIGINATOR); - if (!switch_channel_test_flag(peer_channel, CF_TRANSFER) && switch_channel_get_state(peer_channel) == CS_EXCHANGE_MEDIA) { - switch_channel_set_state(peer_channel, CS_RESET); - } - while (switch_channel_get_state(peer_channel) == CS_EXCHANGE_MEDIA) { switch_cond_next(); } @@ -940,18 +943,26 @@ } state = switch_channel_get_state(caller_channel); - - if (!switch_channel_test_flag(caller_channel, CF_TRANSFER) && !a_leg->clean_exit && !inner_bridge) { + + if (!switch_channel_test_flag(caller_channel, CF_TRANSFER) && !switch_channel_test_flag(caller_channel, CF_REDIRECT) + && !a_leg->clean_exit && !inner_bridge) { if ((state != CS_EXECUTE && state != CS_SOFT_EXECUTE && state != CS_PARK && state != CS_ROUTING) || (switch_channel_test_flag(peer_channel, CF_ANSWERED) && state < CS_HANGUP)) { - if (switch_true(switch_channel_get_variable(caller_channel, SWITCH_HANGUP_AFTER_BRIDGE_VARIABLE))) { - switch_channel_hangup(caller_channel, switch_channel_get_cause(peer_channel)); - } else if (switch_true(switch_channel_get_variable(caller_channel, SWITCH_PARK_AFTER_BRIDGE_VARIABLE))) { + if (switch_true(switch_channel_get_variable(caller_channel, SWITCH_PARK_AFTER_BRIDGE_VARIABLE))) { switch_ivr_park_session(session); + } else if (switch_true(switch_channel_get_variable(caller_channel, SWITCH_HANGUP_AFTER_BRIDGE_VARIABLE))) { + switch_channel_hangup(caller_channel, switch_channel_get_cause(peer_channel)); } } } + if (switch_channel_test_flag(caller_channel, CF_REDIRECT)) { + state = switch_channel_get_state(caller_channel); + if (!(state == CS_RESET || state == CS_PARK || state == CS_ROUTING)) { + switch_channel_set_state(caller_channel, CS_RESET); + } + } + return status; } @@ -989,6 +1000,7 @@ switch_status_t status = SWITCH_STATUS_FALSE; switch_caller_profile_t *cp, *originator_cp, *originatee_cp; char *p; + switch_channel_state_t state; if ((originator_session = switch_core_session_locate(originator_uuid))) { if ((originatee_session = switch_core_session_locate(originatee_uuid))) { @@ -1030,14 +1042,11 @@ * originatee_session will fall asleep and originator_session will bridge to it */ - switch_channel_clear_state_handler(originator_channel, NULL); - switch_channel_clear_state_handler(originatee_channel, NULL); - switch_channel_set_state_flag(originator_channel, CF_ORIGINATOR); - switch_channel_clear_flag(originatee_channel, CF_ORIGINATOR); - switch_channel_add_state_handler(originator_channel, &uuid_bridge_state_handlers); - switch_channel_add_state_handler(originatee_channel, &uuid_bridge_state_handlers); - switch_channel_set_variable(originator_channel, SWITCH_UUID_BRIDGE, switch_core_session_get_uuid(originatee_session)); + switch_channel_set_flag(originator_channel, CF_REDIRECT); + switch_channel_set_flag(originatee_channel, CF_REDIRECT); + + switch_channel_set_variable(originator_channel, SWITCH_UUID_BRIDGE, switch_core_session_get_uuid(originatee_session)); switch_channel_set_variable(originator_channel, SWITCH_BRIDGE_CHANNEL_VARIABLE, switch_channel_get_name(originatee_channel)); switch_channel_set_variable(originator_channel, SWITCH_BRIDGE_UUID_VARIABLE, switch_core_session_get_uuid(originatee_session)); switch_channel_set_variable(originator_channel, SWITCH_SIGNAL_BOND_VARIABLE, switch_core_session_get_uuid(originatee_session)); @@ -1086,13 +1095,23 @@ switch_channel_set_flag(originator_channel, CF_TRANSFER); switch_channel_set_flag(originatee_channel, CF_TRANSFER); + switch_channel_clear_flag(originator_channel, CF_ORIGINATING); switch_channel_clear_flag(originatee_channel, CF_ORIGINATING); /* change the states and let the chips fall where they may */ - switch_channel_set_state(originator_channel, CS_RESET); - switch_channel_set_state(originatee_channel, CS_RESET); + switch_channel_clear_state_handler(originator_channel, NULL); + switch_channel_clear_state_handler(originatee_channel, NULL); + switch_channel_set_state_flag(originator_channel, CF_ORIGINATOR); + switch_channel_clear_flag(originatee_channel, CF_ORIGINATOR); + switch_channel_add_state_handler(originator_channel, &uuid_bridge_state_handlers); + switch_channel_add_state_handler(originatee_channel, &uuid_bridge_state_handlers); + state = switch_channel_get_state(originator_channel); + switch_channel_set_state(originator_channel, state == CS_HIBERNATE ? CS_CONSUME_MEDIA : CS_HIBERNATE); + state = switch_channel_get_state(originatee_channel); + switch_channel_set_state(originatee_channel, state == CS_HIBERNATE ? CS_CONSUME_MEDIA : CS_HIBERNATE); + status = SWITCH_STATUS_SUCCESS; /* release the read locks we have on the channels */ Modified: freeswitch/branches/gmaruzz/src/switch_ivr_menu.c ============================================================================== --- freeswitch/branches/gmaruzz/src/switch_ivr_menu.c (original) +++ freeswitch/branches/gmaruzz/src/switch_ivr_menu.c Mon Dec 15 12:56:36 2008 @@ -167,9 +167,17 @@ menu->inlen = digit_len; - menu->max_failures = max_failures; + if (max_failures > 0) { + menu->max_failures = max_failures; + } else { + menu->max_failures = 3; + } - menu->max_timeouts = max_timeouts; + if (max_timeouts > 0) { + menu->max_timeouts = max_timeouts; + } else { + menu->max_timeouts = 3; + } menu->timeout = timeout; @@ -178,7 +186,7 @@ menu->actions = NULL; if (newpool) { - menu->flags |= SWITCH_IVR_MENU_FLAG_FREEPOOL; + switch_set_flag(menu, SWITCH_IVR_MENU_FLAG_FREEPOOL); } if (menu->timeout <= 0) { @@ -188,7 +196,7 @@ if (main) { switch_ivr_menu_stack_add(&main, menu); } else { - menu->flags |= SWITCH_IVR_MENU_FLAG_STACK; + switch_set_flag(menu, SWITCH_IVR_MENU_FLAG_STACK); } *new_menu = menu; @@ -521,7 +529,7 @@ } errs++; if (status == SWITCH_STATUS_SUCCESS) { - status = switch_ivr_sleep(session, 1000, NULL); + status = switch_ivr_sleep(session, 1000, SWITCH_FALSE, NULL); } /* breaks are ok too */ if (SWITCH_STATUS_IS_BREAK(status)) { @@ -736,8 +744,8 @@ atoi(inter_timeout), atoi(digit_len), atoi(timeout), - strlen(max_failures)? atoi(max_failures): 1, - strlen(max_timeouts)? atoi(max_timeouts): 1, + strlen(max_failures)? atoi(max_failures): 0, + strlen(max_timeouts)? atoi(max_timeouts): 0, xml_menu_ctx->pool); /* set the menu_stack for the caller */ if (status == SWITCH_STATUS_SUCCESS && *menu_stack == NULL) { Modified: freeswitch/branches/gmaruzz/src/switch_ivr_originate.c ============================================================================== --- freeswitch/branches/gmaruzz/src/switch_ivr_originate.c (original) +++ freeswitch/branches/gmaruzz/src/switch_ivr_originate.c Mon Dec 15 12:56:36 2008 @@ -39,12 +39,6 @@ { switch_channel_t *channel = switch_core_session_get_channel(session); - if (!switch_channel_test_flag(channel, CF_PROXY_MODE)) { - while (switch_channel_get_state(channel) == CS_CONSUME_MEDIA && !switch_channel_test_flag(channel, CF_TAGGED)) { - switch_ivr_sleep(session, 10, NULL); - } - } - switch_channel_clear_state_handler(channel, &originate_state_handlers); return SWITCH_STATUS_FALSE; @@ -97,6 +91,8 @@ return NULL; } + switch_ivr_sleep(collect->session, 0, SWITCH_TRUE, NULL); + if (!strcasecmp(collect->key, "exec")) { char *data; switch_application_interface_t *application_interface; @@ -229,9 +225,15 @@ *progress = 1; } + if (switch_core_session_private_event_count(peer_sessions[i])) { + switch_ivr_parse_all_events(peer_sessions[i]); + } + state = switch_channel_get_state(peer_channels[i]); if (state >= CS_HANGUP || state == CS_RESET || switch_channel_test_flag(peer_channels[i], CF_TRANSFER) || - switch_channel_test_flag(peer_channels[i], CF_BRIDGED) || !switch_channel_test_flag(peer_channels[i], CF_ORIGINATING) + switch_channel_test_flag(peer_channels[i], CF_REDIRECT) || + switch_channel_test_flag(peer_channels[i], CF_BRIDGED) || + !switch_channel_test_flag(peer_channels[i], CF_ORIGINATING) ) { (*hups)++; } else if ((switch_channel_test_flag(peer_channels[i], CF_ANSWERED) || @@ -277,6 +279,7 @@ teletone_generation_session_t ts; switch_file_handle_t fhb; switch_file_handle_t *fh; + int silence; uint8_t asis; }; @@ -346,9 +349,16 @@ ringback_data = switch_channel_get_variable(caller_channel, "ringback"); } - if (switch_channel_test_flag(caller_channel, CF_PROXY_MODE) || switch_channel_test_flag(caller_channel, CF_PROXY_MEDIA)) { ringback_data = NULL; + } else if (switch_strlen_zero(ringback_data)) { + if ((var = switch_channel_get_variable(caller_channel, SWITCH_SEND_SILENCE_WHEN_IDLE_VARIABLE))) { + int sval = atoi(var); + + if (sval) { + ringback_data = switch_core_session_sprintf(session, "silence:%d", sval); + } + } } } @@ -376,9 +386,6 @@ if (ringback_data) { char *tmp_data = NULL; - switch_buffer_create_dynamic(&ringback.audio_buffer, 512, 1024, 0); - switch_buffer_set_loops(ringback.audio_buffer, -1); - if (switch_is_file_path(ringback_data)) { char *ext; @@ -407,14 +414,30 @@ } ringback.fh = &ringback.fhb; } else { - teletone_init_session(&ringback.ts, 0, teletone_handler, &ringback); - ringback.ts.rate = read_codec->implementation->actual_samples_per_second; - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Play Ringback Tone [%s]\n", ringback_data); - if (teletone_run(&ringback.ts, ringback_data)) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error Playing Tone\n"); - teletone_destroy_session(&ringback.ts); - switch_buffer_destroy(&ringback.audio_buffer); - ringback_data = NULL; + if (!strncasecmp(ringback_data, "silence", 7)) { + const char *p = ringback_data + 7; + if (*p == ':') { + p++; + if (p) { + ringback.silence = atoi(p); + } + } + if (ringback.silence <= 0) { + ringback.silence = 400; + } + } else { + switch_buffer_create_dynamic(&ringback.audio_buffer, 512, 1024, 0); + switch_buffer_set_loops(ringback.audio_buffer, -1); + + teletone_init_session(&ringback.ts, 0, teletone_handler, &ringback); + ringback.ts.rate = read_codec->implementation->actual_samples_per_second; + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Play Ringback Tone [%s]\n", ringback_data); + if (teletone_run(&ringback.ts, ringback_data)) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error Playing Tone\n"); + teletone_destroy_session(&ringback.ts); + switch_buffer_destroy(&ringback.audio_buffer); + ringback_data = NULL; + } } } switch_safe_free(tmp_data); @@ -489,9 +512,12 @@ write_frame.codec->implementation->decoded_bytes_per_packet)) <= 0) { break; } + } else if (ringback.silence) { + write_frame.datalen = write_frame.codec->implementation->decoded_bytes_per_packet; + switch_generate_sln_silence((int16_t *) write_frame.data, write_frame.datalen / 2, ringback.silence); } - if ((ringback.fh || ringback.audio_buffer) && write_frame.codec && write_frame.datalen) { + if ((ringback.fh || ringback.silence || ringback.audio_buffer) && write_frame.codec && write_frame.datalen) { if (switch_core_session_write_frame(session, &write_frame, SWITCH_IO_FLAG_NONE, 0) != SWITCH_STATUS_SUCCESS) { break; } @@ -554,7 +580,10 @@ const switch_state_handler_table_t *table, const char *cid_name_override, const char *cid_num_override, - switch_caller_profile_t *caller_profile_override, switch_originate_flag_t flags) + switch_caller_profile_t *caller_profile_override, + switch_event_t *ovars, + switch_originate_flag_t flags + ) { switch_originate_flag_t dftflags = SOF_NONE, myflags = dftflags; char *pipe_names[MAX_PEERS] = { 0 }; @@ -667,8 +696,13 @@ so we will normalize dialstring params and channel variables (when there is an originator) into an event that we will use as a pseudo hash to consult for params as needed. */ - if (switch_event_create(&var_event, SWITCH_EVENT_GENERAL) != SWITCH_STATUS_SUCCESS) { - abort(); + + if (ovars) { + var_event = ovars; + } else { + if (switch_event_create(&var_event, SWITCH_EVENT_GENERAL) != SWITCH_STATUS_SUCCESS) { + abort(); + } } if (session) { @@ -759,6 +793,17 @@ if (switch_channel_test_flag(caller_channel, CF_PROXY_MODE) || switch_channel_test_flag(caller_channel, CF_PROXY_MEDIA)) { ringback_data = NULL; + } else if (switch_strlen_zero(ringback_data)) { + const char *vvar; + + if ((vvar = switch_channel_get_variable(caller_channel, SWITCH_SEND_SILENCE_WHEN_IDLE_VARIABLE))) { + int sval = atoi(vvar); + + if (sval) { + ringback_data = switch_core_session_sprintf(session, "silence:%d", sval); + } + + } } } @@ -906,7 +951,7 @@ if (try > 0) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "Originate attempt %d/%d in %d ms\n", try + 1, retries, sleep_ms); if (caller_channel) { - switch_ivr_sleep(session, sleep_ms, NULL); + switch_ivr_sleep(session, sleep_ms, SWITCH_TRUE, NULL); } else { switch_yield(sleep_ms * 1000); } @@ -1251,9 +1296,7 @@ if (ringback_data) { char *tmp_data = NULL; - switch_buffer_create_dynamic(&ringback.audio_buffer, 512, 1024, 0); - switch_buffer_set_loops(ringback.audio_buffer, -1); - + if (switch_is_file_path(ringback_data)) { char *ext; @@ -1282,8 +1325,21 @@ } ringback.fh = &ringback.fhb; - + } else if (!strncasecmp(ringback_data, "silence", 7)) { + const char *c = ringback_data + 7; + if (*c == ':') { + c++; + if (c) { + ringback.silence = atoi(c); + } + } + if (ringback.silence <= 0) { + ringback.silence = 400; + } } else { + switch_buffer_create_dynamic(&ringback.audio_buffer, 512, 1024, 0); + switch_buffer_set_loops(ringback.audio_buffer, -1); + teletone_init_session(&ringback.ts, 0, teletone_handler, &ringback); ringback.ts.rate = read_codec->implementation->actual_samples_per_second; switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Play Ringback Tone [%s]\n", ringback_data); @@ -1322,6 +1378,10 @@ check_per_channel_timeouts(peer_channels, per_channel_timelimit_sec, per_channel_progress_timelimit_sec, and_argc, start); + if (session && switch_core_session_private_event_count(session)) { + switch_ivr_parse_all_events(session); + } + if (!sent_ring && !progress && (progress_timelimit_sec && elapsed > (time_t) progress_timelimit_sec)) { idx = IDX_TIMEOUT; goto notready; @@ -1377,6 +1437,7 @@ || (switch_channel_test_flag(caller_channel, CF_ANSWERED) || switch_channel_test_flag(caller_channel, CF_EARLY_MEDIA)))) { switch_status_t tstatus = SWITCH_STATUS_SUCCESS; + int silence = 0; if (switch_channel_media_ready(caller_channel)) { tstatus = switch_core_session_read_frame(session, &read_frame, SWITCH_IO_FLAG_NONE, 0); @@ -1422,15 +1483,24 @@ write_frame.codec->implementation->decoded_bytes_per_packet)) <= 0) { break; } + } else if (ringback.silence) { + silence = ringback.silence; } - - if ((ringback.fh || ringback.audio_buffer) && write_frame.codec && write_frame.datalen) { - if (switch_core_session_write_frame(session, &write_frame, SWITCH_IO_FLAG_NONE, 0) != SWITCH_STATUS_SUCCESS) { - break; - } + } else { + silence = 400; + } + + if ((ringback.fh || silence || ringback.audio_buffer) && write_frame.codec && write_frame.datalen) { + if (silence) { + write_frame.datalen = write_frame.codec->implementation->decoded_bytes_per_packet; + switch_generate_sln_silence((int16_t *) write_frame.data, write_frame.datalen / 2, silence); + } + + if (switch_core_session_write_frame(session, &write_frame, SWITCH_IO_FLAG_NONE, 0) != SWITCH_STATUS_SUCCESS) { + break; } } - + } else { switch_yield(100000); } @@ -1453,8 +1523,11 @@ continue; } - if (switch_channel_test_flag(peer_channels[i], CF_TRANSFER) || switch_channel_test_flag(peer_channels[i], CF_BRIDGED) || - switch_channel_get_state(peer_channels[i]) == CS_RESET || !switch_channel_test_flag(peer_channels[i], CF_ORIGINATING) + if (switch_channel_test_flag(peer_channels[i], CF_TRANSFER) + || switch_channel_test_flag(peer_channels[i], CF_REDIRECT) + || switch_channel_test_flag(peer_channels[i], CF_BRIDGED) || + switch_channel_get_state(peer_channels[i]) == CS_RESET || + !switch_channel_test_flag(peer_channels[i], CF_ORIGINATING) ) { continue; } @@ -1645,16 +1718,19 @@ continue; } - switch_channel_clear_flag(peer_channels[i], CF_ORIGINATING); if (status == SWITCH_STATUS_SUCCESS) { + switch_channel_clear_flag(peer_channels[i], CF_ORIGINATING); if (bleg && *bleg && *bleg == peer_sessions[i]) { continue; } - } else if ((state=switch_channel_get_state(peer_channels[i])) < CS_HANGUP) { - if (!(state == CS_RESET || switch_channel_test_flag(peer_channels[i], CF_TRANSFER))) { + } else if ((state=switch_channel_get_state(peer_channels[i])) < CS_HANGUP && switch_channel_test_flag(peer_channels[i], CF_ORIGINATING)) { + if (!(state == CS_RESET || switch_channel_test_flag(peer_channels[i], CF_TRANSFER) || + switch_channel_test_flag(peer_channels[i], CF_REDIRECT) || + switch_channel_test_flag(peer_channels[i], CF_BRIDGED))) { switch_channel_hangup(peer_channels[i], *cause); } } + switch_channel_clear_flag(peer_channels[i], CF_ORIGINATING); switch_core_session_rwunlock(peer_sessions[i]); } @@ -1672,8 +1748,15 @@ *bleg = NULL; } + if (*bleg) { + switch_ivr_sleep(*bleg, 0, SWITCH_TRUE, NULL); + } + + if (session) { + switch_ivr_sleep(session, 0, SWITCH_TRUE, NULL); + } - if (var_event) { + if (var_event && var_event != ovars) { switch_event_destroy(&var_event); } switch_safe_free(write_frame.data); Modified: freeswitch/branches/gmaruzz/src/switch_ivr_play_say.c ============================================================================== --- freeswitch/branches/gmaruzz/src/switch_ivr_play_say.c (original) +++ freeswitch/branches/gmaruzz/src/switch_ivr_play_say.c Mon Dec 15 12:56:36 2008 @@ -327,7 +327,7 @@ } } - switch_ivr_sleep(session, pause, NULL); + switch_ivr_sleep(session, pause, SWITCH_FALSE, NULL); } } Modified: freeswitch/branches/gmaruzz/src/switch_loadable_module.c ============================================================================== --- freeswitch/branches/gmaruzz/src/switch_loadable_module.c (original) +++ freeswitch/branches/gmaruzz/src/switch_loadable_module.c Mon Dec 15 12:56:36 2008 @@ -428,7 +428,7 @@ if (switch_thread_rwlock_trywrlock_timeout(ptr->rwlock, 10) == SWITCH_STATUS_SUCCESS) { switch_thread_rwlock_unlock(ptr->rwlock); } else { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Giving up waiting for existing references.\n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Giving up on '%s' waiting for existing references.\n", ptr->interface_name); } switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "Deleting Endpoint '%s'\n", ptr->interface_name); @@ -513,7 +513,7 @@ if (switch_thread_rwlock_trywrlock_timeout(ptr->rwlock, 10) == SWITCH_STATUS_SUCCESS) { switch_thread_rwlock_unlock(ptr->rwlock); } else { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Giving up waiting for existing references.\n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Giving up on '%s' waiting for existing references.\n", ptr->interface_name); } if (switch_event_create(&event, SWITCH_EVENT_MODULE_UNLOAD) == SWITCH_STATUS_SUCCESS) { @@ -540,7 +540,7 @@ if (switch_thread_rwlock_trywrlock_timeout(ptr->rwlock, 10) == SWITCH_STATUS_SUCCESS) { switch_thread_rwlock_unlock(ptr->rwlock); } else { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Giving up waiting for existing references.\n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Giving up on '%s' waiting for existing references.\n", ptr->interface_name); } @@ -568,7 +568,7 @@ if (switch_thread_rwlock_trywrlock_timeout(ptr->rwlock, 10) == SWITCH_STATUS_SUCCESS) { switch_thread_rwlock_unlock(ptr->rwlock); } else { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Giving up waiting for existing references.\n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Giving up on '%s' waiting for existing references.\n", ptr->interface_name); } for (i = 0; ptr->extens[i]; i++) { @@ -596,7 +596,7 @@ if (switch_thread_rwlock_trywrlock_timeout(ptr->rwlock, 10) == SWITCH_STATUS_SUCCESS) { switch_thread_rwlock_unlock(ptr->rwlock); } else { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Giving up waiting for existing references.\n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Giving up on '%s' waiting for existing references.\n", ptr->interface_name); } switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "Deleting Speech interface '%s'\n", ptr->interface_name); @@ -621,7 +621,7 @@ if (switch_thread_rwlock_trywrlock_timeout(ptr->rwlock, 10) == SWITCH_STATUS_SUCCESS) { switch_thread_rwlock_unlock(ptr->rwlock); } else { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Giving up waiting for existing references.\n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Giving up on '%s' waiting for existing references.\n", ptr->interface_name); } switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "Deleting Asr interface '%s'\n", ptr->interface_name); @@ -646,7 +646,7 @@ if (switch_thread_rwlock_trywrlock_timeout(ptr->rwlock, 10) == SWITCH_STATUS_SUCCESS) { switch_thread_rwlock_unlock(ptr->rwlock); } else { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Giving up waiting for existing references.\n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Giving up on '%s' waiting for existing references.\n", ptr->interface_name); } switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "Deleting Directory interface '%s'\n", ptr->interface_name); @@ -671,7 +671,7 @@ if (switch_thread_rwlock_trywrlock_timeout(ptr->rwlock, 10) == SWITCH_STATUS_SUCCESS) { switch_thread_rwlock_unlock(ptr->rwlock); } else { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Giving up waiting for existing references.\n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Giving up on '%s' waiting for existing references.\n", ptr->interface_name); } switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "Deleting Chat interface '%s'\n", ptr->interface_name); @@ -695,7 +695,7 @@ if (switch_thread_rwlock_trywrlock_timeout(ptr->rwlock, 10) == SWITCH_STATUS_SUCCESS) { switch_thread_rwlock_unlock(ptr->rwlock); } else { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Giving up waiting for existing references.\n"); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Giving up on '%s' waiting for existing references.\n", ptr->interface_name); } switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "Deleting Say interface '%s'\n", ptr->interface_name); if (switch_event_create(&event, SWITCH_EVENT_MODULE_UNLOAD) == SWITCH_STATUS_SUCCESS) { @@ -1567,6 +1567,7 @@ mod->_TYPE_##_interface = i; \ } \ switch_thread_rwlock_create(&i->rwlock, mod->pool); \ + switch_mutex_init(&i->reflock, SWITCH_MUTEX_NESTED, mod->pool); \ i->parent = mod; \ return i; } Modified: freeswitch/branches/gmaruzz/src/switch_odbc.c ============================================================================== --- freeswitch/branches/gmaruzz/src/switch_odbc.c (original) +++ freeswitch/branches/gmaruzz/src/switch_odbc.c Mon Dec 15 12:56:36 2008 @@ -301,7 +301,7 @@ result = SQLExecute(stmt); - if (result != SQL_SUCCESS && result != SQL_SUCCESS_WITH_INFO) { + if (result != SQL_SUCCESS && result != SQL_SUCCESS_WITH_INFO && result != SQL_NO_DATA) { goto error; } @@ -322,12 +322,14 @@ return SWITCH_ODBC_FAIL; } -SWITCH_DECLARE(switch_odbc_status_t) switch_odbc_handle_callback_exec(switch_odbc_handle_t *handle, - char *sql, switch_core_db_callback_func_t callback, void *pdata) +SWITCH_DECLARE(switch_odbc_status_t) switch_odbc_handle_callback_exec_detailed(const char *file, const char *func, int line, + switch_odbc_handle_t *handle, + char *sql, switch_core_db_callback_func_t callback, void *pdata) { SQLHSTMT stmt = NULL; SQLSMALLINT c = 0, x = 0; SQLLEN m = 0, t = 0; + char *err_str = NULL; int result; switch_assert(callback != NULL); @@ -337,10 +339,12 @@ } if (SQLAllocHandle(SQL_HANDLE_STMT, handle->con, &stmt) != SQL_SUCCESS) { + err_str = "Unable to SQL allocate handle."; goto error; } if (SQLPrepare(stmt, (unsigned char *) sql, SQL_NTS) != SQL_SUCCESS) { + err_str = "Unable to prepare SQL statement."; goto error; } @@ -407,7 +411,18 @@ error: + /* err_str is already defined for some error cases */ + if (err_str != NULL) { + switch_log_printf(SWITCH_CHANNEL_ID_LOG, file, func, line, NULL, SWITCH_LOG_ERROR, "ERR: [%s]\n[%s]\n", sql, switch_str_nil(err_str)); + err_str = NULL; + } + if (stmt) { + err_str = switch_odbc_handle_get_error(handle, stmt); + if (!switch_strlen_zero(err_str)) { + switch_log_printf(SWITCH_CHANNEL_ID_LOG, file, func, line, NULL, SWITCH_LOG_ERROR, "ERR: [%s]\n[%s]\n", sql, switch_str_nil(err_str)); + } + switch_safe_free(err_str); SQLFreeHandle(SQL_HANDLE_STMT, stmt); } Modified: freeswitch/branches/gmaruzz/src/switch_resample.c ============================================================================== --- freeswitch/branches/gmaruzz/src/switch_resample.c (original) +++ freeswitch/branches/gmaruzz/src/switch_resample.c Mon Dec 15 12:56:36 2008 @@ -203,16 +203,19 @@ SWITCH_DECLARE(void) switch_generate_sln_silence(int16_t *data, uint32_t samples, uint32_t divisor) { - int16_t rnd, x; + int16_t x; uint32_t i; int sum_rnd = 0; + int16_t rnd2 = (int16_t) switch_timestamp_now(); assert(divisor); + + for (i = 0; i < samples; i++, sum_rnd = 0) { - for (x = 0; x < 7; x++) { - rnd = (int16_t) (rand() * sizeof(int16_t)); - sum_rnd += rnd; + for (x = 0; x < 6; x++) { + rnd2 = rnd2 * 31821U + 13849U; + sum_rnd += rnd2; } switch_normalize_to_16bit(sum_rnd); *data = (int16_t) ((int16_t) sum_rnd / (int) divisor); Modified: freeswitch/branches/gmaruzz/src/switch_rtp.c ============================================================================== --- freeswitch/branches/gmaruzz/src/switch_rtp.c (original) +++ freeswitch/branches/gmaruzz/src/switch_rtp.c Mon Dec 15 12:56:36 2008 @@ -158,6 +158,7 @@ uint32_t last_write_ts; uint32_t last_write_samplecount; uint32_t next_write_samplecount; + switch_time_t last_write_timestamp; uint32_t flags; switch_memory_pool_t *pool; switch_sockaddr_t *from_addr; @@ -754,20 +755,29 @@ return SWITCH_STATUS_SUCCESS; } -SWITCH_DECLARE(void) switch_rtp_change_interval(switch_rtp_t *rtp_session, uint32_t ms_per_packet, uint32_t samples_per_interval) +SWITCH_DECLARE(switch_status_t) switch_rtp_change_interval(switch_rtp_t *rtp_session, uint32_t ms_per_packet, uint32_t samples_per_interval) { rtp_session->ms_per_packet = ms_per_packet; rtp_session->samples_per_interval = rtp_session->conf_samples_per_interval = samples_per_interval; - + rtp_session->missed_count = 0; + if (rtp_session->timer_name) { if (rtp_session->timer.timer_interface) { switch_core_timer_destroy(&rtp_session->timer); } - switch_core_timer_init(&rtp_session->timer, rtp_session->timer_name, ms_per_packet / 1000, samples_per_interval, rtp_session->pool); - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, - "RE-Starting timer [%s] %d bytes per %dms\n", rtp_session->timer_name, samples_per_interval, ms_per_packet); + if (switch_core_timer_init(&rtp_session->timer, + rtp_session->timer_name, ms_per_packet / 1000, samples_per_interval, rtp_session->pool) == SWITCH_STATUS_SUCCESS) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, + "RE-Starting timer [%s] %d bytes per %dms\n", rtp_session->timer_name, samples_per_interval, ms_per_packet); + } else { + memset(&rtp_session->timer, 0, sizeof(rtp_session->timer)); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, + "Problem RE-Starting timer [%s] %d bytes per %dms\n", rtp_session->timer_name, samples_per_interval, ms_per_packet / 1000); + return SWITCH_STATUS_FALSE; + } } + return SWITCH_STATUS_SUCCESS; } SWITCH_DECLARE(switch_status_t) switch_rtp_create(switch_rtp_t **new_rtp_session, @@ -983,7 +993,7 @@ if (rtp_session->ice_user) { if (ice_out(rtp_session) != SWITCH_STATUS_SUCCESS) { - return -1; + return SWITCH_STATUS_FALSE; } } @@ -992,15 +1002,22 @@ SWITCH_DECLARE(void) switch_rtp_break(switch_rtp_t *rtp_session) { - switch_assert(rtp_session != NULL); + if (!switch_rtp_ready(rtp_session)) { + return; + } + switch_mutex_lock(rtp_session->flag_mutex); switch_set_flag(rtp_session, SWITCH_RTP_FLAG_BREAK); + + if (switch_test_flag(rtp_session, SWITCH_RTP_FLAG_NOBLOCK)) { + switch_mutex_unlock(rtp_session->flag_mutex); + return; + } if (rtp_session->sock_input) { - char o[4] = "DOH"; + uint32_t o = UINT_MAX; switch_size_t len = sizeof(o); - - switch_socket_sendto(rtp_session->sock_input, rtp_session->local_addr, 0, (void *) o, &len); + switch_socket_sendto(rtp_session->sock_input, rtp_session->local_addr, 0, (void *) &o, &len); } switch_mutex_unlock(rtp_session->flag_mutex); } @@ -1187,6 +1204,9 @@ rtp_session->dtmf_data.timestamp_dtmf, rtp_session->dtmf_data.out_digit_sofar, rtp_session->dtmf_data.out_digit_sub_sofar, rtp_session->dtmf_data.out_digit_dur, rtp_session->seq); + if (switch_test_flag(rtp_session, SWITCH_RTP_FLAG_BUGGY_2833)) { + rtp_session->dtmf_data.timestamp_dtmf = rtp_session->last_write_ts + samples; + } } if (loops != 1) { @@ -1251,6 +1271,50 @@ } } +SWITCH_DECLARE(void) rtp_flush_read_buffer(switch_rtp_t *rtp_session) +{ + if (switch_rtp_ready(rtp_session) && !switch_test_flag(rtp_session, SWITCH_RTP_FLAG_PROXY_MEDIA)) { + switch_set_flag_locked(rtp_session, SWITCH_RTP_FLAG_FLUSH); + } +} + +static void do_flush(switch_rtp_t *rtp_session) +{ + int was_blocking = 0; + switch_size_t bytes; + switch_status_t status; + + if (!switch_rtp_ready(rtp_session) || switch_test_flag(rtp_session, SWITCH_RTP_FLAG_PROXY_MEDIA)) { + return; + } + + READ_INC(rtp_session); + + if (switch_rtp_ready(rtp_session)) { + if (!switch_test_flag(rtp_session, SWITCH_RTP_FLAG_NOBLOCK)) { + was_blocking = 1; + switch_set_flag_locked(rtp_session, SWITCH_RTP_FLAG_NOBLOCK); + switch_socket_opt_set(rtp_session->sock_input, SWITCH_SO_NONBLOCK, TRUE); + } + + do { + if (switch_rtp_ready(rtp_session)) { + bytes = sizeof(rtp_msg_t); + status = switch_socket_recvfrom(rtp_session->from_addr, rtp_session->sock_input, 0, (void *) &rtp_session->recv_msg, &bytes); + } else { + break; + } + } while(bytes > 0); + + if (was_blocking && switch_rtp_ready(rtp_session)) { + switch_clear_flag_locked(rtp_session, SWITCH_RTP_FLAG_NOBLOCK); + switch_socket_opt_set(rtp_session->sock_input, SWITCH_SO_NONBLOCK, FALSE); + } + } + + READ_DEC(rtp_session); +} + #define return_cng_frame() do_cng = 1; goto timer_check static int rtp_common_read(switch_rtp_t *rtp_session, switch_payload_t *payload_type, switch_frame_flag_t *flags, switch_io_flag_t io_flags) @@ -1289,11 +1353,27 @@ goto end; } - check = !bytes; + if (switch_test_flag(rtp_session, SWITCH_RTP_FLAG_FLUSH)) { + do_flush(rtp_session); + switch_clear_flag_locked(rtp_session, SWITCH_RTP_FLAG_FLUSH); + bytes = 0; + } - if (switch_test_flag(rtp_session, SWITCH_RTP_FLAG_BREAK)) { + if (rtp_session->max_missed_packets) { + if (bytes) { + rtp_session->missed_count = 0; + } else if (++rtp_session->missed_count >= rtp_session->max_missed_packets) { + ret = -2; + goto end; + } + } + + check = !bytes; + + if (switch_test_flag(rtp_session, SWITCH_RTP_FLAG_BREAK) || (bytes && bytes == 4 && *((int *)&rtp_session->recv_msg) == UINT_MAX)) { switch_clear_flag_locked(rtp_session, SWITCH_RTP_FLAG_BREAK); do_2833(rtp_session); + rtp_flush_read_buffer(rtp_session); bytes = 0; return_cng_frame(); } @@ -1302,6 +1382,10 @@ continue; } + if (bytes && rtp_session->recv_msg.header.m && rtp_session->recv_msg.header.pt != rtp_session->te) { + rtp_flush_read_buffer(rtp_session); + } + if (bytes && switch_test_flag(rtp_session, SWITCH_RTP_FLAG_AUTOADJ) && switch_sockaddr_get_port(rtp_session->from_addr)) { if (++rtp_session->autoadj_tally >= 10) { const char *tx_host; @@ -1521,13 +1605,6 @@ } if (check || (bytes && !rtp_session->timer.interval)) { - if (!bytes && rtp_session->max_missed_packets) { - if (++rtp_session->missed_count >= rtp_session->max_missed_packets) { - ret = -2; - goto end; - } - } - if (rtp_session->jb && (jb_frame = stfu_n_read_a_frame(rtp_session->jb))) { memcpy(rtp_session->recv_msg.body, jb_frame->data, jb_frame->dlen); if (jb_frame->plc) { @@ -1620,6 +1697,10 @@ } switch_mutex_unlock(rtp_session->dtmf_data.dtmf_mutex); + if (bytes) { + rtp_flush_read_buffer(rtp_session); + } + return bytes; } @@ -1716,9 +1797,9 @@ frame->packet = &rtp_session->recv_msg; frame->packetlen = bytes; frame->source = __FILE__; - frame->flags |= SFF_RAW_RTP; + switch_set_flag(frame, SFF_RAW_RTP); if (frame->payload == rtp_session->te) { - frame->flags |= SFF_RFC2833; + switch_set_flag(frame, SFF_RFC2833); } frame->timestamp = ntohl(rtp_session->recv_msg.header.ts); frame->seq = (uint16_t) ntohs((u_short) rtp_session->recv_msg.header.seq); @@ -1808,15 +1889,27 @@ rtp_session->send_msg.header.ts = htonl(rtp_session->ts); + if ((rtp_session->ts > (rtp_session->last_write_ts + (rtp_session->samples_per_interval * 10))) || rtp_session->ts == rtp_session->samples_per_interval) { m++; } + if (rtp_session->timer.interval && + (rtp_session->timer.samplecount - rtp_session->last_write_samplecount) > rtp_session->samples_per_interval * 2) { + m++; + } + + if (!rtp_session->timer.interval && + ((unsigned)((switch_timestamp_now() - rtp_session->last_write_timestamp))) > (rtp_session->ms_per_packet *2)) { + m++; + } + if (rtp_session->cn && payload != rtp_session->cng_pt) { rtp_session->cn = 0; m++; } + send_msg->header.m = m ? 1 : 0; memcpy(send_msg->body, data, datalen); @@ -1972,7 +2065,10 @@ if (rtp_session->timer.interval) { rtp_session->last_write_samplecount = rtp_session->timer.samplecount; + } else { + rtp_session->last_write_timestamp = (uint32_t) switch_timestamp_now(); } + rtp_session->last_write_ts = this_ts; } @@ -2105,7 +2201,7 @@ } else { data = frame->data; len = frame->datalen; - ts = (uint32_t) frame->timestamp; + ts = switch_test_flag(rtp_session, SWITCH_RTP_FLAG_RAW_WRITE) ? (uint32_t) frame->timestamp : 0; } return rtp_common_write(rtp_session, send_msg, data, len, payload, ts, &frame->flags); Modified: freeswitch/branches/gmaruzz/src/switch_stun.c ============================================================================== --- freeswitch/branches/gmaruzz/src/switch_stun.c (original) +++ freeswitch/branches/gmaruzz/src/switch_stun.c Mon Dec 15 12:56:36 2008 @@ -428,6 +428,16 @@ return 1; } +SWITCH_DECLARE(char *) switch_stun_host_lookup(const char *host, switch_memory_pool_t *pool) +{ + switch_sockaddr_t *addr = NULL; + char buf[30]; + + switch_sockaddr_info_get(&addr, host, SWITCH_UNSPEC, 0, 0, pool); + return switch_core_strdup(pool, switch_str_nil(switch_get_addr(buf, sizeof(buf), addr))); + +} + SWITCH_DECLARE(switch_status_t) switch_stun_lookup(char **ip, switch_port_t *port, char *stunip, switch_port_t stunport, char **err, switch_memory_pool_t *pool) { Modified: freeswitch/branches/gmaruzz/src/switch_utils.c ============================================================================== --- freeswitch/branches/gmaruzz/src/switch_utils.c (original) +++ freeswitch/branches/gmaruzz/src/switch_utils.c Mon Dec 15 12:56:36 2008 @@ -654,7 +654,7 @@ for (start = str; *start; start++) { /* find start of pattern in string */ - for (; ((*start) && (toupper(*start) != toupper(*instr))); start++); + for (; ((*start) && (switch_toupper(*start) != switch_toupper(*instr))); start++); if (!*start) return NULL; @@ -662,7 +662,7 @@ pptr = instr; sptr = start; - while (toupper(*sptr) == toupper(*pptr)) { + while (switch_toupper(*sptr) == switch_toupper(*pptr)) { sptr++; pptr++; @@ -1138,7 +1138,7 @@ char *c; unsigned char counter = 0; - key = (char) toupper(key); + key = (char) switch_toupper(key); for (c = RFC2833_CHARS; *c; c++) { if (*c == key) { return counter; @@ -1507,6 +1507,251 @@ return s; } + +/* Written by Marc Espie, public domain */ +#define SWITCH_CTYPE_NUM_CHARS 256 + +const short _switch_C_toupper_[1 + SWITCH_CTYPE_NUM_CHARS] = { + EOF, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, + 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, + 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, + 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, + 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, + 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, + 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, + 0x60, 'A', 'B', 'C', 'D', 'E', 'F', 'G', + 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', + 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', + 'X', 'Y', 'Z', 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, + 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, + 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, + 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, + 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, + 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, + 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, + 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, + 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, + 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, + 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, + 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, + 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, + 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, + 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, + 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, + 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff +}; + +const short *_switch_toupper_tab_ = _switch_C_toupper_; + +SWITCH_DECLARE(int) switch_toupper(int c) +{ + if ((unsigned int)c > 255) + return(c); + if (c < -1) + return EOF; + return((_switch_toupper_tab_ + 1)[c]); +} + +const short _switch_C_tolower_[1 + SWITCH_CTYPE_NUM_CHARS] = { + EOF, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, + 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, + 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, + 0x40, 'a', 'b', 'c', 'd', 'e', 'f', 'g', + 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', + 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', + 'x', 'y', 'z', 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, + 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, + 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, + 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, + 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, + 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, + 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, + 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, + 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, + 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, + 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, + 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, + 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, + 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, + 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, + 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, + 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, + 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, + 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, + 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, + 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff +}; + +const short *_switch_tolower_tab_ = _switch_C_tolower_; + +SWITCH_DECLARE(int) switch_tolower(int c) +{ + if ((unsigned int)c > 255) + return(c); + if (c < -1) + return EOF; + return((_switch_tolower_tab_ + 1)[c]); +} + +/* + * Copyright (c) 1989 The Regents of the University of California. + * All rights reserved. + * (c) UNIX System Laboratories, Inc. + * All or some portions of this file are derived from material licensed + * to the University of California by American Telephone and Telegraph + * Co. or Unix System Laboratories, Inc. and are reproduced herein with + * the permission of UNIX System Laboratories, Inc. + * + * 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. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS 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 REGENTS 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. + */ + +#undef _U +#undef _L +#undef _N +#undef _S +#undef _P +#undef _C +#undef _X +#undef _B + +#define _U 0x01 +#define _L 0x02 +#define _N 0x04 +#define _S 0x08 +#define _P 0x10 +#define _C 0x20 +#define _X 0x40 +#define _B 0x80 + +const int _switch_C_ctype_[1 + SWITCH_CTYPE_NUM_CHARS] = { + 0, + _C, _C, _C, _C, _C, _C, _C, _C, + _C, _C|_S, _C|_S, _C|_S, _C|_S, _C|_S, _C, _C, + _C, _C, _C, _C, _C, _C, _C, _C, + _C, _C, _C, _C, _C, _C, _C, _C, + _S|_B, _P, _P, _P, _P, _P, _P, _P, + _P, _P, _P, _P, _P, _P, _P, _P, + _N, _N, _N, _N, _N, _N, _N, _N, + _N, _N, _P, _P, _P, _P, _P, _P, + _P, _U|_X, _U|_X, _U|_X, _U|_X, _U|_X, _U|_X, _U, + _U, _U, _U, _U, _U, _U, _U, _U, + _U, _U, _U, _U, _U, _U, _U, _U, + _U, _U, _U, _P, _P, _P, _P, _P, + _P, _L|_X, _L|_X, _L|_X, _L|_X, _L|_X, _L|_X, _L, + _L, _L, _L, _L, _L, _L, _L, _L, + _L, _L, _L, _L, _L, _L, _L, _L, +/* determine printability based on the IS0 8859 8-bit standard */ + _L, _L, _L, _P, _P, _P, _P, _C, + + _C, _C, _C, _C, _C, _C, _C, _C, /* 80 */ + _C, _C, _C, _C, _C, _C, _C, _C, /* 88 */ + _C, _C, _C, _C, _C, _C, _C, _C, /* 90 */ + _C, _C, _C, _C, _C, _C, _C, _C, /* 98 */ + _P, _P, _P, _P, _P, _P, _P, _P, /* A0 */ + _P, _P, _P, _P, _P, _P, _P, _P, /* A8 */ + _P, _P, _P, _P, _P, _P, _P, _P, /* B0 */ + _P, _P, _P, _P, _P, _P, _P, _P, /* B8 */ + _P, _P, _P, _P, _P, _P, _P, _P, /* C0 */ + _P, _P, _P, _P, _P, _P, _P, _P, /* C8 */ + _P, _P, _P, _P, _P, _P, _P, _P, /* D0 */ + _P, _P, _P, _P, _P, _P, _P, _P, /* D8 */ + _P, _P, _P, _P, _P, _P, _P, _P, /* E0 */ + _P, _P, _P, _P, _P, _P, _P, _P, /* E8 */ + _P, _P, _P, _P, _P, _P, _P, _P, /* F0 */ + _P, _P, _P, _P, _P, _P, _P, _P /* F8 */ +}; + +const int *_switch_ctype_ = _switch_C_ctype_; + +SWITCH_DECLARE(int) switch_isalnum(int c) +{ + return (c < 0 ? 0 : c > 255 ? 0 : ((_switch_ctype_ + 1)[(unsigned char)c] & (_U|_L|_N))); +} + +SWITCH_DECLARE(int) switch_isalpha(int c) +{ + return (c < 0 ? 0 : c > 255 ? 0 : ((_switch_ctype_ + 1)[(unsigned char)c] & (_U|_L))); +} + +SWITCH_DECLARE(int) switch_iscntrl(int c) +{ + return (c < 0 ? 0 : c > 255 ? 0 : ((_switch_ctype_ + 1)[(unsigned char)c] & _C)); +} + +SWITCH_DECLARE(int) switch_isdigit(int c) +{ + return (c < 0 ? 0 : c > 255 ? 0 : ((_switch_ctype_ + 1)[(unsigned char)c] & _N)); +} + +SWITCH_DECLARE(int) switch_isgraph(int c) +{ + return (c < 0 ? 0 : c > 255 ? 0 : ((_switch_ctype_ + 1)[(unsigned char)c] & (_P|_U|_L|_N))); +} + +SWITCH_DECLARE(int) switch_islower(int c) +{ + return (c < 0 ? 0 : c > 255 ? 0 : ((_switch_ctype_ + 1)[(unsigned char)c] & _L)); +} + +SWITCH_DECLARE(int) switch_isprint(int c) +{ + return (c < 0 ? 0 : c > 255 ? 0 : ((_switch_ctype_ + 1)[(unsigned char)c] & (_P|_U|_L|_N|_B))); +} + +SWITCH_DECLARE(int) switch_ispunct(int c) +{ + return (c < 0 ? 0 : c > 255 ? 0 : ((_switch_ctype_ + 1)[(unsigned char)c] & _P)); +} + +SWITCH_DECLARE(int) switch_isspace(int c) +{ + return (c < 0 ? 0 : c > 255 ? 0 : ((_switch_ctype_ + 1)[(unsigned char)c] & _S)); +} + +SWITCH_DECLARE(int) switch_isupper(int c) +{ + return (c < 0 ? 0 : c > 255 ? 0 : ((_switch_ctype_ + 1)[(unsigned char)c] & _U)); +} + +SWITCH_DECLARE(int) switch_isxdigit(int c) +{ + return (c < 0 ? 0 : c > 255 ? 0 : ((_switch_ctype_ + 1)[(unsigned char)c] & (_N|_X))); +} + /* For Emacs: * Local Variables: * mode:c Modified: freeswitch/branches/gmaruzz/src/switch_xml.c ============================================================================== --- freeswitch/branches/gmaruzz/src/switch_xml.c (original) +++ freeswitch/branches/gmaruzz/src/switch_xml.c Mon Dec 15 12:56:36 2008 @@ -1131,7 +1131,7 @@ } else { /* child */ close(fds[0]); dup2(fds[1], STDOUT_FILENO); - system(command); + switch_system(command, SWITCH_TRUE); close(fds[1]); exit(0); }