[Freeswitch-branches] [commit] r10774 - in freeswitch/branches/gmaruzz: . build conf conf/autoload_configs conf/dialplan conf/directory/default conf/sip_profiles conf/sip_profiles/external conf/sip_profiles/internal debian docs docs/phrase libs/libdingaling/src libs/libg722_1 libs/libg722_1/config libs/libg722_1/debian libs/libg722_1/doc libs/libg722_1/src libs/libg722_1/src/g722_1 libs/libg722_1/src/msvc libs/libg722_1/src/msvc/sys libs/libg722_1/test-data libs/libg722_1/test-data/itu libs/libg722_1/test-data/local libs/libg722_1/tests libs/libteletone/src libs/spandsp/src libs/win32 libs/win32/libmp3lame libs/win32/libshout scripts scripts/contrib/intralanman/C scripts/contrib/intralanman/C/lcr scripts/contrib/intralanman/C/lcr/mod_lcr scripts/contrib/intralanman/C/lcr/sql scripts/contrib/intralanman/PHP/fs_curl scripts/contrib/intralanman/PHP/fs_curl/configuration scripts/contrib/mcollins scripts/contrib/mrene/mod_limit src src/include src/include/private src/mod/applications/mod_commands src/mod/applications/mod_conference src/mod/applications/mod_dptools src/mod/applications/mod_enum src/mod/applications/mod_expr src/mod/applications/mod_fax src/mod/applications/mod_fifo src/mod/applications/mod_fsv src/mod/applications/mod_http src/mod/applications/mod_limit src/mod/applications/mod_vmd src/mod/applications/mod_voicemail src/mod/asr_tts/mod_cepstral src/mod/asr_tts/mod_pocketsphinx src/mod/codecs/mod_siren src/mod/endpoints/mod_dingaling src/mod/endpoints/mod_iax src/mod/endpoints/mod_loopback src/mod/endpoints/mod_opal src/mod/endpoints/mod_sofia src/mod/endpoints/mod_woomera src/mod/event_handlers/mod_cdr_csv src/mod/event_handlers/mod_erlang_event src/mod/event_handlers/mod_event_socket src/mod/formats/mod_shout src/mod/formats/mod_sndfile src/mod/languages/mod_java src/mod/languages/mod_java/src/org/freeswitch/swig src/mod/languages/mod_lua src/mod/languages/mod_managed src/mod/languages/mod_managed/managed src/mod/languages/mod_perl src/mod/languages/mod_python src/mod/languages/mod_spidermonkey src/mod/xml_int/mod_xml_cdr src/mod/xml_int/mod_xml_curl src/mod/xml_int/mod_xml_ldap ssh_keys support support-d w32/Library
FreeSWITCH SVN
gmaruzz at freeswitch.org
Mon Dec 15 09:56:36 PST 2008
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 at 8000h@20i - Speex 8kHz using 20ms ptime.
speex at 16000h@20i - Speex 16kHz using 20ms ptime.
speex at 32000h@20i - Speex 32kHz using 20ms ptime.
+ G7221 at 16000h - G722.1 16kHz (aka Siren 7)
+ G7221 at 32000h - G722.1C 32kHz (aka Siren 14)
GSM at 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 at yahoo.com>
* Ken Rice <krice at suspicious dot org
- *
+ * Mathieu Rene <mathieu.rene at 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);
}
More information about the Freeswitch-branches
mailing list