Freeswitch-trunk
Threads by month
- ----- 2026 -----
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
October 2007
- 8 participants
- 342 discussions
Author: mikej
Date: Fri Oct 12 18:08:01 2007
New Revision: 5854
Modified:
freeswitch/trunk/src/switch_ivr_menu.c
Log:
fix build
Modified: freeswitch/trunk/src/switch_ivr_menu.c
==============================================================================
--- freeswitch/trunk/src/switch_ivr_menu.c (original)
+++ freeswitch/trunk/src/switch_ivr_menu.c Fri Oct 12 18:08:01 2007
@@ -279,7 +279,7 @@
if (need) {
menu->ptr += strlen(menu->buf);
if (strlen(menu->buf) < need) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "waiting for %u digits\n", need);
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "waiting for %u digits\n", (uint32_t)need);
status = switch_ivr_collect_digits_count(session, menu->ptr, menu->inlen - strlen(menu->buf), need, "#", &terminator, menu->timeout);
}
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "digits '%s'\n", menu->buf);
1
0
[commit] r5853 - in freeswitch/trunk: . src src/include src/mod/applications/mod_conference src/mod/applications/mod_rss src/mod/applications/mod_voicemail
by Freeswitch SVN 12 Oct '07
by Freeswitch SVN 12 Oct '07
12 Oct '07
Author: mikej
Date: Fri Oct 12 16:14:41 2007
New Revision: 5853
Modified:
freeswitch/trunk/Freeswitch.sln
freeswitch/trunk/src/include/switch_cpp.h
freeswitch/trunk/src/include/switch_ivr.h
freeswitch/trunk/src/mod/applications/mod_conference/mod_conference.c
freeswitch/trunk/src/mod/applications/mod_rss/mod_rss.c
freeswitch/trunk/src/mod/applications/mod_voicemail/mod_voicemail.c
freeswitch/trunk/src/mod/applications/mod_voicemail/mod_voicemail.vcproj
freeswitch/trunk/src/switch_cpp.cpp
freeswitch/trunk/src/switch_ivr.c
freeswitch/trunk/src/switch_ivr_menu.c
Log:
fix windows build.. break other things.
Modified: freeswitch/trunk/Freeswitch.sln
==============================================================================
--- freeswitch/trunk/Freeswitch.sln (original)
+++ freeswitch/trunk/Freeswitch.sln Fri Oct 12 16:14:41 2007
@@ -3,20 +3,20 @@
# Visual Studio 2005
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FreeSwitchConsole", "w32\Console\FreeSwitchConsole.vcproj", "{1AF3A893-F7BE-43DD-B697-8AB2397C0D67}"
ProjectSection(ProjectDependencies) = postProject
- {F6C55D93-B927-4483-BB69-15AEF3DD2DFF} = {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}
{202D7A4E-760D-4D0E-AFA1-D7459CED30FF} = {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}
+ {F6C55D93-B927-4483-BB69-15AEF3DD2DFF} = {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FreeSwitchCoreLib", "w32\Library\FreeSwitchCore.vcproj", "{202D7A4E-760D-4D0E-AFA1-D7459CED30FF}"
ProjectSection(ProjectDependencies) = postProject
- {6EDFEFD5-3596-4FA9-8EBA-B331547B35A3} = {6EDFEFD5-3596-4FA9-8EBA-B331547B35A3}
- {101130D1-3EA6-4ED2-B65D-CEB5243A20ED} = {101130D1-3EA6-4ED2-B65D-CEB5243A20ED}
- {EEF031CB-FED8-451E-A471-91EC8D4F6750} = {EEF031CB-FED8-451E-A471-91EC8D4F6750}
- {F6C55D93-B927-4483-BB69-15AEF3DD2DFF} = {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}
- {F057DA7F-79E5-4B00-845C-EF446EF055E3} = {F057DA7F-79E5-4B00-845C-EF446EF055E3}
- {89385C74-5860-4174-9CAF-A39E7C48909C} = {89385C74-5860-4174-9CAF-A39E7C48909C}
- {8D04B550-D240-4A44-8A18-35DA3F7038D9} = {8D04B550-D240-4A44-8A18-35DA3F7038D9}
{50AD0E28-B8D7-4FCC-8FC3-599F6AC69761} = {50AD0E28-B8D7-4FCC-8FC3-599F6AC69761}
+ {8D04B550-D240-4A44-8A18-35DA3F7038D9} = {8D04B550-D240-4A44-8A18-35DA3F7038D9}
+ {89385C74-5860-4174-9CAF-A39E7C48909C} = {89385C74-5860-4174-9CAF-A39E7C48909C}
+ {F057DA7F-79E5-4B00-845C-EF446EF055E3} = {F057DA7F-79E5-4B00-845C-EF446EF055E3}
+ {F6C55D93-B927-4483-BB69-15AEF3DD2DFF} = {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}
+ {EEF031CB-FED8-451E-A471-91EC8D4F6750} = {EEF031CB-FED8-451E-A471-91EC8D4F6750}
+ {101130D1-3EA6-4ED2-B65D-CEB5243A20ED} = {101130D1-3EA6-4ED2-B65D-CEB5243A20ED}
+ {6EDFEFD5-3596-4FA9-8EBA-B331547B35A3} = {6EDFEFD5-3596-4FA9-8EBA-B331547B35A3}
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_g729", "src\mod\codecs\mod_g729\mod_g729.vcproj", "{1D95CD95-0DE2-48C3-AC23-D5C7D1C9C0F0}"
@@ -26,28 +26,28 @@
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_gsm", "src\mod\codecs\mod_gsm\mod_gsm.vcproj", "{4926323F-4EA8-4B7D-A3D3-65488725988F}"
ProjectSection(ProjectDependencies) = postProject
- {8FD2E297-4096-47E5-9258-C48FF1841523} = {8FD2E297-4096-47E5-9258-C48FF1841523}
{202D7A4E-760D-4D0E-AFA1-D7459CED30FF} = {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}
+ {8FD2E297-4096-47E5-9258-C48FF1841523} = {8FD2E297-4096-47E5-9258-C48FF1841523}
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_xmpp_event", "src\mod\event_handlers\mod_xmpp_event\mod_xmpp_event.vcproj", "{F10BE67C-A8FF-4CB2-AF29-D46D2590DC59}"
ProjectSection(ProjectDependencies) = postProject
- {E727E8F6-935D-46FE-8B0E-37834748A0E3} = {E727E8F6-935D-46FE-8B0E-37834748A0E3}
- {F6C55D93-B927-4483-BB69-15AEF3DD2DFF} = {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}
{202D7A4E-760D-4D0E-AFA1-D7459CED30FF} = {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}
+ {F6C55D93-B927-4483-BB69-15AEF3DD2DFF} = {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}
+ {E727E8F6-935D-46FE-8B0E-37834748A0E3} = {E727E8F6-935D-46FE-8B0E-37834748A0E3}
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_sndfile", "src\mod\formats\mod_sndfile\mod_sndfile.vcproj", "{AFAC0568-7548-42D5-9F6A-8D3400A1E4F6}"
ProjectSection(ProjectDependencies) = postProject
- {3D0370CA-BED2-4657-A475-32375CBCB6E4} = {3D0370CA-BED2-4657-A475-32375CBCB6E4}
- {F6C55D93-B927-4483-BB69-15AEF3DD2DFF} = {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}
{202D7A4E-760D-4D0E-AFA1-D7459CED30FF} = {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}
+ {F6C55D93-B927-4483-BB69-15AEF3DD2DFF} = {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}
+ {3D0370CA-BED2-4657-A475-32375CBCB6E4} = {3D0370CA-BED2-4657-A475-32375CBCB6E4}
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_event_test", "src\mod\event_handlers\mod_event_test\mod_event_test.vcproj", "{3A2A7795-C216-4FFF-B8EF-4D17A84BACCC}"
ProjectSection(ProjectDependencies) = postProject
- {F6C55D93-B927-4483-BB69-15AEF3DD2DFF} = {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}
{202D7A4E-760D-4D0E-AFA1-D7459CED30FF} = {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}
+ {F6C55D93-B927-4483-BB69-15AEF3DD2DFF} = {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_g711", "src\mod\codecs\mod_g711\mod_g711.vcproj", "{B1FE4613-3F4B-4DAF-9714-2472BF8F56AE}"
@@ -57,16 +57,16 @@
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_iax", "src\mod\endpoints\mod_iax\mod_iax.vcproj", "{3A5B9131-F20C-4A85-9447-6C1610941CEE}"
ProjectSection(ProjectDependencies) = postProject
- {5CC054B7-6DAA-46BF-9A08-3B33B83E8D3E} = {5CC054B7-6DAA-46BF-9A08-3B33B83E8D3E}
- {F6C55D93-B927-4483-BB69-15AEF3DD2DFF} = {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}
{202D7A4E-760D-4D0E-AFA1-D7459CED30FF} = {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}
+ {F6C55D93-B927-4483-BB69-15AEF3DD2DFF} = {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}
+ {5CC054B7-6DAA-46BF-9A08-3B33B83E8D3E} = {5CC054B7-6DAA-46BF-9A08-3B33B83E8D3E}
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_PortAudio", "src\mod\endpoints\mod_portaudio\mod_PortAudio.vcproj", "{5FD31A25-5D83-4794-8BEE-904DAD84CE71}"
ProjectSection(ProjectDependencies) = postProject
- {F6C55D93-B927-4483-BB69-15AEF3DD2DFF} = {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}
- {0A18A071-125E-442F-AFF7-A3F68ABECF99} = {0A18A071-125E-442F-AFF7-A3F68ABECF99}
{202D7A4E-760D-4D0E-AFA1-D7459CED30FF} = {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}
+ {0A18A071-125E-442F-AFF7-A3F68ABECF99} = {0A18A071-125E-442F-AFF7-A3F68ABECF99}
+ {F6C55D93-B927-4483-BB69-15AEF3DD2DFF} = {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_l16", "src\mod\codecs\mod_l16\mod_l16.vcproj", "{5844AFE1-AA3E-4BDB-A9EF-119AEF19DF88}"
@@ -76,14 +76,14 @@
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_speex", "src\mod\codecs\mod_speex\mod_speex.vcproj", "{5580D60E-0F77-4716-9CD4-B8E5986FA375}"
ProjectSection(ProjectDependencies) = postProject
- {1C469CDD-A3AF-4A94-A592-B2CF12F2D918} = {1C469CDD-A3AF-4A94-A592-B2CF12F2D918}
{202D7A4E-760D-4D0E-AFA1-D7459CED30FF} = {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}
+ {1C469CDD-A3AF-4A94-A592-B2CF12F2D918} = {1C469CDD-A3AF-4A94-A592-B2CF12F2D918}
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_woomera", "src\mod\endpoints\mod_woomera\mod_woomera.vcproj", "{FE3540C5-3303-46E0-A69E-D92F775687F1}"
ProjectSection(ProjectDependencies) = postProject
- {F6C55D93-B927-4483-BB69-15AEF3DD2DFF} = {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}
{202D7A4E-760D-4D0E-AFA1-D7459CED30FF} = {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}
+ {F6C55D93-B927-4483-BB69-15AEF3DD2DFF} = {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Codecs", "Codecs", "{F881ADA2-2F1A-4046-9FEB-191D9422D781}"
@@ -104,8 +104,8 @@
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_dialplan_xml", "src\mod\dialplans\mod_dialplan_xml\mod_dialplan_xml.vcproj", "{07113B25-D3AF-4E04-BA77-4CD1171F022C}"
ProjectSection(ProjectDependencies) = postProject
- {F6C55D93-B927-4483-BB69-15AEF3DD2DFF} = {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}
{202D7A4E-760D-4D0E-AFA1-D7459CED30FF} = {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}
+ {F6C55D93-B927-4483-BB69-15AEF3DD2DFF} = {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}
EndProjectSection
EndProject
Project("{54435603-DBB4-11D2-8724-00A0C9A8B90C}") = "FreeSwitchSetup", "w32\Setup\Setup.vdproj", "{B17FFBE6-A942-4056-8346-B624FB5D995B}"
@@ -119,22 +119,22 @@
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_dialplan_directory", "src\mod\dialplans\mod_dialplan_directory\mod_dialplan_directory.vcproj", "{A27CCA23-1541-4337-81A4-F0A6413078A0}"
ProjectSection(ProjectDependencies) = postProject
- {F6C55D93-B927-4483-BB69-15AEF3DD2DFF} = {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}
{202D7A4E-760D-4D0E-AFA1-D7459CED30FF} = {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}
+ {F6C55D93-B927-4483-BB69-15AEF3DD2DFF} = {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_zeroconf", "src\mod\event_handlers\mod_zeroconf\mod_zeroconf.vcproj", "{C7705DC4-2088-493E-AF8D-65BC6D65C125}"
ProjectSection(ProjectDependencies) = postProject
- {0D826AF5-0506-4C50-BB8B-7DB019AC21AE} = {0D826AF5-0506-4C50-BB8B-7DB019AC21AE}
- {F6C55D93-B927-4483-BB69-15AEF3DD2DFF} = {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}
- {49C34584-B6DA-448F-83CF-27584DC9FC90} = {49C34584-B6DA-448F-83CF-27584DC9FC90}
{202D7A4E-760D-4D0E-AFA1-D7459CED30FF} = {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}
+ {49C34584-B6DA-448F-83CF-27584DC9FC90} = {49C34584-B6DA-448F-83CF-27584DC9FC90}
+ {F6C55D93-B927-4483-BB69-15AEF3DD2DFF} = {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}
+ {0D826AF5-0506-4C50-BB8B-7DB019AC21AE} = {0D826AF5-0506-4C50-BB8B-7DB019AC21AE}
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_event_multicast", "src\mod\event_handlers\mod_event_multicast\mod_event_multicast.vcproj", "{784113EF-44D9-4949-835D-7065D3C7AD08}"
ProjectSection(ProjectDependencies) = postProject
- {F6C55D93-B927-4483-BB69-15AEF3DD2DFF} = {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}
{202D7A4E-760D-4D0E-AFA1-D7459CED30FF} = {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}
+ {F6C55D93-B927-4483-BB69-15AEF3DD2DFF} = {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libteletone", "libs\libteletone\libteletone.vcproj", "{89385C74-5860-4174-9CAF-A39E7C48909C}"
@@ -143,10 +143,10 @@
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_spidermonkey", "src\mod\languages\mod_spidermonkey\mod_spidermonkey.vcproj", "{1AD3F51E-BBB6-4090-BA39-9DFAB1EF1F5F}"
ProjectSection(ProjectDependencies) = postProject
- {204FA0DE-305D-4414-AE2E-F195A23F390D} = {204FA0DE-305D-4414-AE2E-F195A23F390D}
- {87EE9DA4-DE1E-4448-8324-183C98DCA588} = {87EE9DA4-DE1E-4448-8324-183C98DCA588}
- {F6C55D93-B927-4483-BB69-15AEF3DD2DFF} = {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}
{202D7A4E-760D-4D0E-AFA1-D7459CED30FF} = {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}
+ {F6C55D93-B927-4483-BB69-15AEF3DD2DFF} = {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}
+ {87EE9DA4-DE1E-4448-8324-183C98DCA588} = {87EE9DA4-DE1E-4448-8324-183C98DCA588}
+ {204FA0DE-305D-4414-AE2E-F195A23F390D} = {204FA0DE-305D-4414-AE2E-F195A23F390D}
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ASR-TTS", "ASR-TTS", "{4CF6A6AC-07DE-4B9E-ABE1-7F98B64E0BB0}"
@@ -168,22 +168,22 @@
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_ilbc", "src\mod\codecs\mod_ilbc\mod_ilbc.vcproj", "{D3EC0AFF-76FC-4210-A825-9A17410660A3}"
ProjectSection(ProjectDependencies) = postProject
- {989BB874-7AF1-44CB-8E5C-CC8113D267E8} = {989BB874-7AF1-44CB-8E5C-CC8113D267E8}
{202D7A4E-760D-4D0E-AFA1-D7459CED30FF} = {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}
+ {989BB874-7AF1-44CB-8E5C-CC8113D267E8} = {989BB874-7AF1-44CB-8E5C-CC8113D267E8}
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_dingaling", "src\mod\endpoints\mod_dingaling\mod_dingaling.vcproj", "{FFAA4C52-3A53-4F99-90C1-D59D1F0427F3}"
ProjectSection(ProjectDependencies) = postProject
- {E727E8F6-935D-46FE-8B0E-37834748A0E3} = {E727E8F6-935D-46FE-8B0E-37834748A0E3}
- {F6C55D93-B927-4483-BB69-15AEF3DD2DFF} = {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}
- {202D7A4E-760D-4D0E-AFA1-D7459CED30FF} = {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}
{1906D736-08BD-4EE1-924F-B536249B9A54} = {1906D736-08BD-4EE1-924F-B536249B9A54}
+ {202D7A4E-760D-4D0E-AFA1-D7459CED30FF} = {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}
+ {F6C55D93-B927-4483-BB69-15AEF3DD2DFF} = {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}
+ {E727E8F6-935D-46FE-8B0E-37834748A0E3} = {E727E8F6-935D-46FE-8B0E-37834748A0E3}
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_commands", "src\mod\applications\mod_commands\mod_commands.vcproj", "{30A5B29C-983E-4580-9FD0-D647CCDCC7EB}"
ProjectSection(ProjectDependencies) = postProject
- {F6C55D93-B927-4483-BB69-15AEF3DD2DFF} = {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}
{202D7A4E-760D-4D0E-AFA1-D7459CED30FF} = {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}
+ {F6C55D93-B927-4483-BB69-15AEF3DD2DFF} = {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Loggers", "Loggers", "{A7AB4405-FDB7-4853-9FBB-1516B1C3D80A}"
@@ -197,42 +197,42 @@
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_xml_rpc", "src\mod\xml_int\mod_xml_rpc\mod_xml_rpc.vcproj", "{CBEC7225-0C21-4DA8-978E-1F158F8AD950}"
ProjectSection(ProjectDependencies) = postProject
- {155844C3-EC5F-407F-97A4-A2DDADED9B2F} = {155844C3-EC5F-407F-97A4-A2DDADED9B2F}
- {87EE9DA4-DE1E-4448-8324-183C98DCA588} = {87EE9DA4-DE1E-4448-8324-183C98DCA588}
- {F6C55D93-B927-4483-BB69-15AEF3DD2DFF} = {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}
- {A3FE0076-B366-429D-A238-D7304DA7D3C1} = {A3FE0076-B366-429D-A238-D7304DA7D3C1}
- {356EC96D-4C9F-47B5-9083-FC328B87BA94} = {356EC96D-4C9F-47B5-9083-FC328B87BA94}
{202D7A4E-760D-4D0E-AFA1-D7459CED30FF} = {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}
+ {356EC96D-4C9F-47B5-9083-FC328B87BA94} = {356EC96D-4C9F-47B5-9083-FC328B87BA94}
+ {A3FE0076-B366-429D-A238-D7304DA7D3C1} = {A3FE0076-B366-429D-A238-D7304DA7D3C1}
+ {F6C55D93-B927-4483-BB69-15AEF3DD2DFF} = {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}
+ {87EE9DA4-DE1E-4448-8324-183C98DCA588} = {87EE9DA4-DE1E-4448-8324-183C98DCA588}
+ {155844C3-EC5F-407F-97A4-A2DDADED9B2F} = {155844C3-EC5F-407F-97A4-A2DDADED9B2F}
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_rss", "src\mod\applications\mod_rss\mod_rss.vcproj", "{B69247FA-ECD6-40ED-8E44-5CA6C3BAF9A4}"
ProjectSection(ProjectDependencies) = postProject
- {F6C55D93-B927-4483-BB69-15AEF3DD2DFF} = {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}
{202D7A4E-760D-4D0E-AFA1-D7459CED30FF} = {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}
+ {F6C55D93-B927-4483-BB69-15AEF3DD2DFF} = {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_conference", "src\mod\applications\mod_conference\mod_conference.vcproj", "{C24FB505-05D7-4319-8485-7540B44C8603}"
ProjectSection(ProjectDependencies) = postProject
- {F6C55D93-B927-4483-BB69-15AEF3DD2DFF} = {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}
{202D7A4E-760D-4D0E-AFA1-D7459CED30FF} = {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}
+ {F6C55D93-B927-4483-BB69-15AEF3DD2DFF} = {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_dptools", "src\mod\applications\mod_dptools\mod_dptools.vcproj", "{B5881A85-FE70-4F64-8607-2CAAE52669C6}"
ProjectSection(ProjectDependencies) = postProject
- {F6C55D93-B927-4483-BB69-15AEF3DD2DFF} = {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}
{202D7A4E-760D-4D0E-AFA1-D7459CED30FF} = {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}
+ {F6C55D93-B927-4483-BB69-15AEF3DD2DFF} = {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_event_socket", "src\mod\event_handlers\mod_event_socket\mod_event_socket.vcproj", "{05515420-16DE-4E63-BE73-85BE85BA5142}"
ProjectSection(ProjectDependencies) = postProject
- {202D7A4E-760D-4D0E-AFA1-D7459CED30FF} = {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}
{F6C55D93-B927-4483-BB69-15AEF3DD2DFF} = {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}
+ {202D7A4E-760D-4D0E-AFA1-D7459CED30FF} = {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_cdr", "src\mod\event_handlers\mod_cdr\mod_cdr.vcproj", "{3D1EED36-A510-4EDB-B4D9-4E0F4A5EC2A8}"
ProjectSection(ProjectDependencies) = postProject
- {F6C55D93-B927-4483-BB69-15AEF3DD2DFF} = {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}
{202D7A4E-760D-4D0E-AFA1-D7459CED30FF} = {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}
+ {F6C55D93-B927-4483-BB69-15AEF3DD2DFF} = {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "_Libraries", "_Libraries", "{EB910B0D-F27D-4B62-B67B-DE834C99AC5B}"
@@ -245,8 +245,8 @@
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libdingaling", "libs\libdingaling\libdingaling.vcproj", "{1906D736-08BD-4EE1-924F-B536249B9A54}"
ProjectSection(ProjectDependencies) = postProject
- {E727E8F6-935D-46FE-8B0E-37834748A0E3} = {E727E8F6-935D-46FE-8B0E-37834748A0E3}
{F057DA7F-79E5-4B00-845C-EF446EF055E3} = {F057DA7F-79E5-4B00-845C-EF446EF055E3}
+ {E727E8F6-935D-46FE-8B0E-37834748A0E3} = {E727E8F6-935D-46FE-8B0E-37834748A0E3}
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libsrtp", "libs\srtp\libsrtp.vcproj", "{EEF031CB-FED8-451E-A471-91EC8D4F6750}"
@@ -271,8 +271,8 @@
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libaprutil", "libs\win32\apr-util\libaprutil.vcproj", "{F057DA7F-79E5-4B00-845C-EF446EF055E3}"
ProjectSection(ProjectDependencies) = postProject
- {101130D1-3EA6-4ED2-B65D-CEB5243A20ED} = {101130D1-3EA6-4ED2-B65D-CEB5243A20ED}
{F6C55D93-B927-4483-BB69-15AEF3DD2DFF} = {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}
+ {101130D1-3EA6-4ED2-B65D-CEB5243A20ED} = {101130D1-3EA6-4ED2-B65D-CEB5243A20ED}
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "_Downloads", "_Downloads", "{C120A020-773F-4EA3-923F-B67AF28B750D}"
@@ -290,8 +290,8 @@
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mDNSResponder static library", "libs\win32\howl\libmDNSResponder.vcproj", "{49C34584-B6DA-448F-83CF-27584DC9FC90}"
ProjectSection(ProjectDependencies) = postProject
- {0D826AF5-0506-4C50-BB8B-7DB019AC21AE} = {0D826AF5-0506-4C50-BB8B-7DB019AC21AE}
{5927104D-C14C-4AC8-925C-4AB681762E75} = {5927104D-C14C-4AC8-925C-4AB681762E75}
+ {0D826AF5-0506-4C50-BB8B-7DB019AC21AE} = {0D826AF5-0506-4C50-BB8B-7DB019AC21AE}
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libsndfile", "libs\win32\libsndfile\libsndfile.vcproj", "{3D0370CA-BED2-4657-A475-32375CBCB6E4}"
@@ -311,34 +311,34 @@
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_sofia", "src\mod\endpoints\mod_sofia\mod_sofia.vcproj", "{0DF3ABD0-DDC0-4265-B778-07C66780979B}"
ProjectSection(ProjectDependencies) = postProject
- {70A49BC2-7500-41D0-B75D-EDCC5BE987A0} = {70A49BC2-7500-41D0-B75D-EDCC5BE987A0}
- {F6C55D93-B927-4483-BB69-15AEF3DD2DFF} = {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}
- {202D7A4E-760D-4D0E-AFA1-D7459CED30FF} = {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}
{DF018947-0FFF-4EB3-BDEE-441DC81DA7A4} = {DF018947-0FFF-4EB3-BDEE-441DC81DA7A4}
+ {202D7A4E-760D-4D0E-AFA1-D7459CED30FF} = {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}
+ {F6C55D93-B927-4483-BB69-15AEF3DD2DFF} = {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}
+ {70A49BC2-7500-41D0-B75D-EDCC5BE987A0} = {70A49BC2-7500-41D0-B75D-EDCC5BE987A0}
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libg726", "libs\codec\g726\libg726.vcproj", "{5A6A281A-AA50-470A-8305-202BDA1CD1BF}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_g726", "src\mod\codecs\mod_g726\mod_g726.vcproj", "{486369EB-F150-4B56-BCC8-77B9E18FF5F5}"
ProjectSection(ProjectDependencies) = postProject
- {F6C55D93-B927-4483-BB69-15AEF3DD2DFF} = {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}
- {202D7A4E-760D-4D0E-AFA1-D7459CED30FF} = {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}
{5A6A281A-AA50-470A-8305-202BDA1CD1BF} = {5A6A281A-AA50-470A-8305-202BDA1CD1BF}
+ {202D7A4E-760D-4D0E-AFA1-D7459CED30FF} = {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}
+ {F6C55D93-B927-4483-BB69-15AEF3DD2DFF} = {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libg7xx", "libs\codec\g7xx\libg7xx.vcproj", "{D71E7338-8D9C-4FE4-A15F-D5CC60202C7C}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_g722", "src\mod\codecs\mod_g722\mod_g722.vcproj", "{D42518CC-7475-454D-B392-0E132C07D761}"
ProjectSection(ProjectDependencies) = postProject
- {F6C55D93-B927-4483-BB69-15AEF3DD2DFF} = {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}
- {202D7A4E-760D-4D0E-AFA1-D7459CED30FF} = {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}
{D71E7338-8D9C-4FE4-A15F-D5CC60202C7C} = {D71E7338-8D9C-4FE4-A15F-D5CC60202C7C}
+ {202D7A4E-760D-4D0E-AFA1-D7459CED30FF} = {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}
+ {F6C55D93-B927-4483-BB69-15AEF3DD2DFF} = {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libsofia_sip_ua_static", "libs\win32\sofia\libsofia_sip_ua_static.vcproj", "{70A49BC2-7500-41D0-B75D-EDCC5BE987A0}"
ProjectSection(ProjectDependencies) = postProject
- {8B3B4C4C-13C2-446C-BEB0-F412CC2CFB9A} = {8B3B4C4C-13C2-446C-BEB0-F412CC2CFB9A}
{DF018947-0FFF-4EB3-BDEE-441DC81DA7A4} = {DF018947-0FFF-4EB3-BDEE-441DC81DA7A4}
+ {8B3B4C4C-13C2-446C-BEB0-F412CC2CFB9A} = {8B3B4C4C-13C2-446C-BEB0-F412CC2CFB9A}
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Download PTHREAD", "libs\win32\Download PTHREAD.vcproj", "{8B3B4C4C-13C2-446C-BEB0-F412CC2CFB9A}"
@@ -350,85 +350,85 @@
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_g723_1", "src\mod\codecs\mod_g723_1\mod_g723_1.vcproj", "{FEA1EEF7-876F-48DE-88BF-C0E3E606D758}"
ProjectSection(ProjectDependencies) = postProject
- {F6C55D93-B927-4483-BB69-15AEF3DD2DFF} = {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}
{202D7A4E-760D-4D0E-AFA1-D7459CED30FF} = {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}
+ {F6C55D93-B927-4483-BB69-15AEF3DD2DFF} = {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_native_file", "src\mod\formats\mod_native_file\mod_native_file.vcproj", "{9254C4B0-6F60-42B6-BB3A-36D63FC001C7}"
ProjectSection(ProjectDependencies) = postProject
- {F6C55D93-B927-4483-BB69-15AEF3DD2DFF} = {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}
{202D7A4E-760D-4D0E-AFA1-D7459CED30FF} = {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}
+ {F6C55D93-B927-4483-BB69-15AEF3DD2DFF} = {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FreeSwitch.NET", "src\dotnet\FreeSwitch.NET.csproj", "{251CAABC-16C3-4593-A491-603B908094E0}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_spidermonkey_core_db", "src\mod\languages\mod_spidermonkey_core_db\mod_spidermonkey_core_db.vcproj", "{ACFFF684-4D19-4D48-AF12-88EA1D778BDF}"
ProjectSection(ProjectDependencies) = postProject
- {204FA0DE-305D-4414-AE2E-F195A23F390D} = {204FA0DE-305D-4414-AE2E-F195A23F390D}
- {F6C55D93-B927-4483-BB69-15AEF3DD2DFF} = {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}
- {202D7A4E-760D-4D0E-AFA1-D7459CED30FF} = {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}
{1AD3F51E-BBB6-4090-BA39-9DFAB1EF1F5F} = {1AD3F51E-BBB6-4090-BA39-9DFAB1EF1F5F}
+ {202D7A4E-760D-4D0E-AFA1-D7459CED30FF} = {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}
+ {F6C55D93-B927-4483-BB69-15AEF3DD2DFF} = {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}
+ {204FA0DE-305D-4414-AE2E-F195A23F390D} = {204FA0DE-305D-4414-AE2E-F195A23F390D}
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_spidermonkey_teletone", "src\mod\languages\mod_spidermonkey_teletone\mod_spidermonkey_teletone.vcproj", "{8F992C49-6C51-412F-B2A3-34EAB708EB65}"
ProjectSection(ProjectDependencies) = postProject
- {204FA0DE-305D-4414-AE2E-F195A23F390D} = {204FA0DE-305D-4414-AE2E-F195A23F390D}
- {F6C55D93-B927-4483-BB69-15AEF3DD2DFF} = {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}
- {89385C74-5860-4174-9CAF-A39E7C48909C} = {89385C74-5860-4174-9CAF-A39E7C48909C}
- {202D7A4E-760D-4D0E-AFA1-D7459CED30FF} = {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}
{1AD3F51E-BBB6-4090-BA39-9DFAB1EF1F5F} = {1AD3F51E-BBB6-4090-BA39-9DFAB1EF1F5F}
+ {202D7A4E-760D-4D0E-AFA1-D7459CED30FF} = {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}
+ {89385C74-5860-4174-9CAF-A39E7C48909C} = {89385C74-5860-4174-9CAF-A39E7C48909C}
+ {F6C55D93-B927-4483-BB69-15AEF3DD2DFF} = {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}
+ {204FA0DE-305D-4414-AE2E-F195A23F390D} = {204FA0DE-305D-4414-AE2E-F195A23F390D}
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libudns", "libs\win32\udns\libudns.vcproj", "{4043FC6A-9A30-4577-8AD5-9B233C9575D8}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_enum", "src\mod\applications\mod_enum\mod_enum.vcproj", "{71A967D5-0E99-4CEF-A587-98836EE6F2EF}"
ProjectSection(ProjectDependencies) = postProject
- {F6C55D93-B927-4483-BB69-15AEF3DD2DFF} = {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}
- {4043FC6A-9A30-4577-8AD5-9B233C9575D8} = {4043FC6A-9A30-4577-8AD5-9B233C9575D8}
{202D7A4E-760D-4D0E-AFA1-D7459CED30FF} = {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}
+ {4043FC6A-9A30-4577-8AD5-9B233C9575D8} = {4043FC6A-9A30-4577-8AD5-9B233C9575D8}
+ {F6C55D93-B927-4483-BB69-15AEF3DD2DFF} = {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_spidermonkey_etpan", "src\mod\languages\mod_spidermonkey_etpan\mod_spidermonkey_etpan.vcproj", "{D6C82F86-2B05-4A7F-8CC6-D2592E66FBB9}"
ProjectSection(ProjectDependencies) = postProject
- {204FA0DE-305D-4414-AE2E-F195A23F390D} = {204FA0DE-305D-4414-AE2E-F195A23F390D}
- {F6C55D93-B927-4483-BB69-15AEF3DD2DFF} = {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}
- {202D7A4E-760D-4D0E-AFA1-D7459CED30FF} = {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}
- {BA4DED3C-E56F-4484-BFC3-9C13E461A1BE} = {BA4DED3C-E56F-4484-BFC3-9C13E461A1BE}
{1AD3F51E-BBB6-4090-BA39-9DFAB1EF1F5F} = {1AD3F51E-BBB6-4090-BA39-9DFAB1EF1F5F}
+ {BA4DED3C-E56F-4484-BFC3-9C13E461A1BE} = {BA4DED3C-E56F-4484-BFC3-9C13E461A1BE}
+ {202D7A4E-760D-4D0E-AFA1-D7459CED30FF} = {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}
+ {F6C55D93-B927-4483-BB69-15AEF3DD2DFF} = {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}
+ {204FA0DE-305D-4414-AE2E-F195A23F390D} = {204FA0DE-305D-4414-AE2E-F195A23F390D}
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_spidermonkey_odbc", "src\mod\languages\mod_spidermonkey_odbc\mod_spidermonkey_odbc.vcproj", "{0A6B5EA5-6E9B-4A51-931F-ED25AA87B4DF}"
ProjectSection(ProjectDependencies) = postProject
- {204FA0DE-305D-4414-AE2E-F195A23F390D} = {204FA0DE-305D-4414-AE2E-F195A23F390D}
- {F6C55D93-B927-4483-BB69-15AEF3DD2DFF} = {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}
- {202D7A4E-760D-4D0E-AFA1-D7459CED30FF} = {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}
{1AD3F51E-BBB6-4090-BA39-9DFAB1EF1F5F} = {1AD3F51E-BBB6-4090-BA39-9DFAB1EF1F5F}
+ {202D7A4E-760D-4D0E-AFA1-D7459CED30FF} = {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}
+ {F6C55D93-B927-4483-BB69-15AEF3DD2DFF} = {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}
+ {204FA0DE-305D-4414-AE2E-F195A23F390D} = {204FA0DE-305D-4414-AE2E-F195A23F390D}
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libetpan", "libs\win32\etpan\libetpan.vcproj", "{BA4DED3C-E56F-4484-BFC3-9C13E461A1BE}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_xml_curl", "src\mod\xml_int\mod_xml_curl\mod_xml_curl.vcproj", "{AB91A099-7690-4ECF-8994-E458F4EA1ED4}"
ProjectSection(ProjectDependencies) = postProject
- {202D7A4E-760D-4D0E-AFA1-D7459CED30FF} = {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}
- {F6C55D93-B927-4483-BB69-15AEF3DD2DFF} = {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}
{87EE9DA4-DE1E-4448-8324-183C98DCA588} = {87EE9DA4-DE1E-4448-8324-183C98DCA588}
+ {F6C55D93-B927-4483-BB69-15AEF3DD2DFF} = {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}
+ {202D7A4E-760D-4D0E-AFA1-D7459CED30FF} = {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "say", "say", "{6CD61A1D-797C-470A-BE08-8C31B68BB336}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_say_en", "src\mod\say\mod_say_en\mod_say_en.vcproj", "{988CACF7-3FCB-4992-BE69-77872AE67DC8}"
ProjectSection(ProjectDependencies) = postProject
- {F6C55D93-B927-4483-BB69-15AEF3DD2DFF} = {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}
{202D7A4E-760D-4D0E-AFA1-D7459CED30FF} = {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}
+ {F6C55D93-B927-4483-BB69-15AEF3DD2DFF} = {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "portaudio", "libs\portaudio\build\msvc\portaudio.vcproj", "{0A18A071-125E-442F-AFF7-A3F68ABECF99}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_xml_cdr", "src\mod\xml_int\mod_xml_cdr\mod_xml_cdr.vcproj", "{08DAD348-9E0A-4A2E-97F1-F1E7E24A7836}"
ProjectSection(ProjectDependencies) = postProject
- {202D7A4E-760D-4D0E-AFA1-D7459CED30FF} = {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}
- {87EE9DA4-DE1E-4448-8324-183C98DCA588} = {87EE9DA4-DE1E-4448-8324-183C98DCA588}
{F6C55D93-B927-4483-BB69-15AEF3DD2DFF} = {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}
+ {87EE9DA4-DE1E-4448-8324-183C98DCA588} = {87EE9DA4-DE1E-4448-8324-183C98DCA588}
+ {202D7A4E-760D-4D0E-AFA1-D7459CED30FF} = {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_amr", "src\mod\codecs\mod_amr\mod_amr.vcproj", "{8DEB383C-4091-4F42-A56F-C9E46D552D79}"
@@ -582,16 +582,16 @@
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mrcpcore", "libs\openmrcp\mrcpcore\mrcpcore.vcproj", "{829A9309-3B94-43C0-846B-7EC9D6D35F8B}"
ProjectSection(ProjectDependencies) = postProject
- {AA91F0AC-6562-435E-814C-5C94689FEFA2} = {AA91F0AC-6562-435E-814C-5C94689FEFA2}
- {F6C55D93-B927-4483-BB69-15AEF3DD2DFF} = {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}
{F057DA7F-79E5-4B00-845C-EF446EF055E3} = {F057DA7F-79E5-4B00-845C-EF446EF055E3}
+ {F6C55D93-B927-4483-BB69-15AEF3DD2DFF} = {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}
+ {AA91F0AC-6562-435E-814C-5C94689FEFA2} = {AA91F0AC-6562-435E-814C-5C94689FEFA2}
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "rtspcore", "libs\openmrcp\rtspcore\rtspcore.vcproj", "{EB751DC4-87BD-4766-B78D-DFB64BA9F988}"
ProjectSection(ProjectDependencies) = postProject
- {829A9309-3B94-43C0-846B-7EC9D6D35F8B} = {829A9309-3B94-43C0-846B-7EC9D6D35F8B}
- {F057DA7F-79E5-4B00-845C-EF446EF055E3} = {F057DA7F-79E5-4B00-845C-EF446EF055E3}
{F6C55D93-B927-4483-BB69-15AEF3DD2DFF} = {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}
+ {F057DA7F-79E5-4B00-845C-EF446EF055E3} = {F057DA7F-79E5-4B00-845C-EF446EF055E3}
+ {829A9309-3B94-43C0-846B-7EC9D6D35F8B} = {829A9309-3B94-43C0-846B-7EC9D6D35F8B}
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mrcpmediaframe", "libs\openmrcp\module\mrcpmediaframe\mrcpmediaframe.vcproj", "{9EA22C31-BB7E-4C40-A698-2C6792D1E0C6}"
@@ -608,8 +608,8 @@
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mrcpsofiasip", "libs\openmrcp\module\mrcpsofiasip\mrcpsofiasip.vcproj", "{819C7242-6184-46FE-BC7B-C7E25C0581EE}"
ProjectSection(ProjectDependencies) = postProject
- {829A9309-3B94-43C0-846B-7EC9D6D35F8B} = {829A9309-3B94-43C0-846B-7EC9D6D35F8B}
{70A49BC2-7500-41D0-B75D-EDCC5BE987A0} = {70A49BC2-7500-41D0-B75D-EDCC5BE987A0}
+ {829A9309-3B94-43C0-846B-7EC9D6D35F8B} = {829A9309-3B94-43C0-846B-7EC9D6D35F8B}
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mrcpv2agent", "libs\openmrcp\module\mrcpv2agent\mrcpv2agent.vcproj", "{FB64EA08-3BC0-48AE-BE4B-74F1024B756E}"
@@ -619,27 +619,32 @@
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libopenmrcpclient", "libs\openmrcp\platform\openmrcpclient\libopenmrcpclient.vcproj", "{A407B661-D7DC-4E30-B268-FFF3296C35E6}"
ProjectSection(ProjectDependencies) = postProject
- {FB64EA08-3BC0-48AE-BE4B-74F1024B756E} = {FB64EA08-3BC0-48AE-BE4B-74F1024B756E}
- {9EA22C31-BB7E-4C40-A698-2C6792D1E0C6} = {9EA22C31-BB7E-4C40-A698-2C6792D1E0C6}
- {819C7242-6184-46FE-BC7B-C7E25C0581EE} = {819C7242-6184-46FE-BC7B-C7E25C0581EE}
{CF78E84D-8456-44F2-8197-0E0E88D30A3C} = {CF78E84D-8456-44F2-8197-0E0E88D30A3C}
+ {819C7242-6184-46FE-BC7B-C7E25C0581EE} = {819C7242-6184-46FE-BC7B-C7E25C0581EE}
+ {9EA22C31-BB7E-4C40-A698-2C6792D1E0C6} = {9EA22C31-BB7E-4C40-A698-2C6792D1E0C6}
+ {FB64EA08-3BC0-48AE-BE4B-74F1024B756E} = {FB64EA08-3BC0-48AE-BE4B-74F1024B756E}
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_openmrcp", "src\mod\asr_tts\mod_openmrcp\mod_openmrcp.vcproj", "{E7116F50-2B10-472F-92BD-C8667AA9C1AE}"
ProjectSection(ProjectDependencies) = postProject
- {202D7A4E-760D-4D0E-AFA1-D7459CED30FF} = {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}
- {A407B661-D7DC-4E30-B268-FFF3296C35E6} = {A407B661-D7DC-4E30-B268-FFF3296C35E6}
- {F057DA7F-79E5-4B00-845C-EF446EF055E3} = {F057DA7F-79E5-4B00-845C-EF446EF055E3}
- {F6C55D93-B927-4483-BB69-15AEF3DD2DFF} = {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}
{70A49BC2-7500-41D0-B75D-EDCC5BE987A0} = {70A49BC2-7500-41D0-B75D-EDCC5BE987A0}
+ {F6C55D93-B927-4483-BB69-15AEF3DD2DFF} = {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}
+ {F057DA7F-79E5-4B00-845C-EF446EF055E3} = {F057DA7F-79E5-4B00-845C-EF446EF055E3}
+ {A407B661-D7DC-4E30-B268-FFF3296C35E6} = {A407B661-D7DC-4E30-B268-FFF3296C35E6}
+ {202D7A4E-760D-4D0E-AFA1-D7459CED30FF} = {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_spidermonkey_socket", "src\mod\languages\mod_spidermonkey_socket\mod_spidermonkey_socket.vcproj", "{028C7278-05D7-4E18-82FE-BE231B844F41}"
ProjectSection(ProjectDependencies) = postProject
+ {204FA0DE-305D-4414-AE2E-F195A23F390D} = {204FA0DE-305D-4414-AE2E-F195A23F390D}
+ {F6C55D93-B927-4483-BB69-15AEF3DD2DFF} = {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}
+ {202D7A4E-760D-4D0E-AFA1-D7459CED30FF} = {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}
{1AD3F51E-BBB6-4090-BA39-9DFAB1EF1F5F} = {1AD3F51E-BBB6-4090-BA39-9DFAB1EF1F5F}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_voicemail", "src\mod\applications\mod_voicemail\mod_voicemail.vcproj", "{D7F1E3F2-A3F4-474C-8555-15122571AF52}"
+ ProjectSection(ProjectDependencies) = postProject
{202D7A4E-760D-4D0E-AFA1-D7459CED30FF} = {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}
- {F6C55D93-B927-4483-BB69-15AEF3DD2DFF} = {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}
- {204FA0DE-305D-4414-AE2E-F195A23F390D} = {204FA0DE-305D-4414-AE2E-F195A23F390D}
EndProjectSection
EndProject
Global
@@ -1204,6 +1209,12 @@
{028C7278-05D7-4E18-82FE-BE231B844F41}.Release|Win32.ActiveCfg = Release|Win32
{028C7278-05D7-4E18-82FE-BE231B844F41}.Release|Win32.Build.0 = Release|Win32
{028C7278-05D7-4E18-82FE-BE231B844F41}.Release|x64.ActiveCfg = Release|Win32
+ {D7F1E3F2-A3F4-474C-8555-15122571AF52}.Debug|Win32.ActiveCfg = Debug|Win32
+ {D7F1E3F2-A3F4-474C-8555-15122571AF52}.Debug|Win32.Build.0 = Debug|Win32
+ {D7F1E3F2-A3F4-474C-8555-15122571AF52}.Debug|x64.ActiveCfg = Debug|Win32
+ {D7F1E3F2-A3F4-474C-8555-15122571AF52}.Release|Win32.ActiveCfg = Release|Win32
+ {D7F1E3F2-A3F4-474C-8555-15122571AF52}.Release|Win32.Build.0 = Release|Win32
+ {D7F1E3F2-A3F4-474C-8555-15122571AF52}.Release|x64.ActiveCfg = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -1240,6 +1251,7 @@
{B5881A85-FE70-4F64-8607-2CAAE52669C6} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78}
{71A967D5-0E99-4CEF-A587-98836EE6F2EF} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78}
{3850D93A-5F24-4922-BC1C-74D08C37C256} = {E72B5BCB-6462-4D23-B419-3AF1A4AC3D78}
+ {D7F1E3F2-A3F4-474C-8555-15122571AF52} = {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}
{1A1FF289-4FD6-4285-A422-D31DD67A4723} = {CBD81696-EFB4-4D2F-8451-1B8DAA86155A}
Modified: freeswitch/trunk/src/include/switch_cpp.h
==============================================================================
--- freeswitch/trunk/src/include/switch_cpp.h (original)
+++ freeswitch/trunk/src/include/switch_cpp.h Fri Oct 12 16:14:41 2007
@@ -182,8 +182,8 @@
* receiving dtmf digits. For that, use collectDigits.
*/
int getDigits(char *dtmf_buf,
- int buflen,
- int maxdigits,
+ switch_size_t buflen,
+ switch_size_t maxdigits,
char *terminators,
char *terminator,
int timeout);
Modified: freeswitch/trunk/src/include/switch_ivr.h
==============================================================================
--- freeswitch/trunk/src/include/switch_ivr.h (original)
+++ freeswitch/trunk/src/include/switch_ivr.h Fri Oct 12 16:14:41 2007
@@ -139,8 +139,8 @@
*/
SWITCH_DECLARE(switch_status_t) switch_ivr_collect_digits_count(switch_core_session_t *session,
char *buf,
- uint32_t buflen,
- uint32_t maxdigits, const char *terminators, char *terminator, uint32_t timeout);
+ switch_size_t buflen,
+ switch_size_t maxdigits, const char *terminators, char *terminator, uint32_t timeout);
/*!
\brief Engage background Speech detection on a session
Modified: freeswitch/trunk/src/mod/applications/mod_conference/mod_conference.c
==============================================================================
--- freeswitch/trunk/src/mod/applications/mod_conference/mod_conference.c (original)
+++ freeswitch/trunk/src/mod/applications/mod_conference/mod_conference.c Fri Oct 12 16:14:41 2007
@@ -4124,8 +4124,8 @@
status = switch_ivr_collect_digits_count(session,
buf,
- sizeof(pin_buf) - (unsigned int) strlen(pin_buf),
- (unsigned int) strlen(conference->pin) - (unsigned int) strlen(pin_buf), "#", &term, 10000);
+ sizeof(pin_buf) - strlen(pin_buf),
+ strlen(conference->pin) - strlen(pin_buf), "#", &term, 10000);
}
pin_valid = (status == SWITCH_STATUS_SUCCESS && strcmp(pin_buf, conference->pin) == 0);
Modified: freeswitch/trunk/src/mod/applications/mod_rss/mod_rss.c
==============================================================================
--- freeswitch/trunk/src/mod/applications/mod_rss/mod_rss.c (original)
+++ freeswitch/trunk/src/mod/applications/mod_rss/mod_rss.c Fri Oct 12 16:14:41 2007
@@ -344,7 +344,7 @@
#endif
char term;
char *cp;
- int blen = sizeof(cmd) - (int) strlen(cmd);
+ switch_size_t blen = sizeof(cmd) - strlen(cmd);
cp = cmd + blen;
switch_ivr_collect_digits_count(session, cp, blen, blen, "#", &term, 5000);
Modified: freeswitch/trunk/src/mod/applications/mod_voicemail/mod_voicemail.c
==============================================================================
--- freeswitch/trunk/src/mod/applications/mod_voicemail/mod_voicemail.c (original)
+++ freeswitch/trunk/src/mod/applications/mod_voicemail/mod_voicemail.c Fri Oct 12 16:14:41 2007
@@ -35,8 +35,11 @@
#include <switch_odbc.h>
#endif
-
+#ifdef _MSC_VER /* compilers are stupid sometimes */
+#define TRY_CODE(code) for(;;) {status = code; if (status != SWITCH_STATUS_SUCCESS && status != SWITCH_STATUS_BREAK) { goto end; } break;}
+#else
#define TRY_CODE(code) do {status = code; if (status != SWITCH_STATUS_SUCCESS && status != SWITCH_STATUS_BREAK) { goto end; } break;} while(status)
+#endif
SWITCH_MODULE_LOAD_FUNCTION(mod_voicemail_load);
SWITCH_MODULE_DEFINITION(mod_voicemail, mod_voicemail_load, NULL, NULL);
Modified: freeswitch/trunk/src/mod/applications/mod_voicemail/mod_voicemail.vcproj
==============================================================================
--- freeswitch/trunk/src/mod/applications/mod_voicemail/mod_voicemail.vcproj (original)
+++ freeswitch/trunk/src/mod/applications/mod_voicemail/mod_voicemail.vcproj Fri Oct 12 16:14:41 2007
@@ -3,7 +3,7 @@
ProjectType="Visual C++"
Version="8.00"
Name="mod_voicemail"
- ProjectGUID="{C24FB505-05D7-4319-8485-7540B44C8603}"
+ ProjectGUID="{D7F1E3F2-A3F4-474C-8555-15122571AF52}"
RootNamespace="mod_voicemail"
Keyword="Win32Proj"
>
Modified: freeswitch/trunk/src/switch_cpp.cpp
==============================================================================
--- freeswitch/trunk/src/switch_cpp.cpp (original)
+++ freeswitch/trunk/src/switch_cpp.cpp Fri Oct 12 16:14:41 2007
@@ -168,8 +168,8 @@
}
int CoreSession::getDigits(char *dtmf_buf,
- int buflen,
- int maxdigits,
+ switch_size_t buflen,
+ switch_size_t maxdigits,
char *terminators,
char *terminator,
int timeout)
@@ -180,8 +180,8 @@
status = switch_ivr_collect_digits_count(session,
dtmf_buf,
- (uint32_t) buflen,
- (uint32_t) maxdigits,
+ buflen,
+ maxdigits,
terminators,
terminator,
(uint32_t) timeout);
Modified: freeswitch/trunk/src/switch_ivr.c
==============================================================================
--- freeswitch/trunk/src/switch_ivr.c (original)
+++ freeswitch/trunk/src/switch_ivr.c Fri Oct 12 16:14:41 2007
@@ -602,10 +602,10 @@
SWITCH_DECLARE(switch_status_t) switch_ivr_collect_digits_count(switch_core_session_t *session,
char *buf,
- uint32_t buflen,
- uint32_t maxdigits, const char *terminators, char *terminator, uint32_t timeout)
+ switch_size_t buflen,
+ switch_size_t maxdigits, const char *terminators, char *terminator, uint32_t timeout)
{
- uint32_t i = 0, x = (uint32_t) strlen(buf);
+ switch_size_t i = 0, x = strlen(buf);
switch_channel_t *channel;
switch_status_t status = SWITCH_STATUS_FALSE;
switch_time_t started = 0;
@@ -648,7 +648,7 @@
char dtmf[128];
switch_channel_dequeue_dtmf(channel, dtmf, maxdigits);
- for (i = 0; i < (uint32_t) strlen(dtmf); i++) {
+ for (i = 0; i < strlen(dtmf); i++) {
if (!switch_strlen_zero(terminators) && strchr(terminators, dtmf[i]) && terminator != NULL) {
*terminator = dtmf[i];
Modified: freeswitch/trunk/src/switch_ivr_menu.c
==============================================================================
--- freeswitch/trunk/src/switch_ivr_menu.c (original)
+++ freeswitch/trunk/src/switch_ivr_menu.c Fri Oct 12 16:14:41 2007
@@ -46,7 +46,7 @@
char *ptr;
int max_failures;
int timeout;
- uint32_t inlen;
+ switch_size_t inlen;
uint32_t flags;
struct switch_ivr_menu_action *actions;
struct switch_ivr_menu *next;
@@ -234,7 +234,7 @@
return status;
}
-static switch_status_t play_or_say(switch_core_session_t *session, switch_ivr_menu_t * menu, char *sound, uint32_t need)
+static switch_status_t play_or_say(switch_core_session_t *session, switch_ivr_menu_t * menu, char *sound, switch_size_t need)
{
char terminator;
uint32_t len;
@@ -252,7 +252,7 @@
len = 1;
ptr = NULL;
} else {
- len = menu->inlen;
+ len = (uint32_t) menu->inlen;
ptr = menu->ptr;
}
args.buf = ptr;
1
0
12 Oct '07
Author: anthm
Date: Fri Oct 12 15:22:50 2007
New Revision: 5852
Modified:
freeswitch/trunk/src/mod/applications/mod_enum/mod_enum.c
Log:
doh
Modified: freeswitch/trunk/src/mod/applications/mod_enum/mod_enum.c
==============================================================================
--- freeswitch/trunk/src/mod/applications/mod_enum/mod_enum.c (original)
+++ freeswitch/trunk/src/mod/applications/mod_enum/mod_enum.c Fri Oct 12 15:22:50 2007
@@ -582,7 +582,7 @@
if ((argc = switch_separate_string(mydata, ' ', argv, (sizeof(argv) / sizeof(argv[0]))))) {
dest = argv[0];
root = argv[1] ? argv[1] : globals.root;
- if (enum_lookup(root, data, &results) == SWITCH_STATUS_SUCCESS) {
+ if (enum_lookup(root, dest, &results) == SWITCH_STATUS_SUCCESS) {
switch_event_header_t *hi;
if ((hi = switch_channel_variable_first(channel))) {
for (; hi; hi = hi->next) {
1
0
[commit] r5851 - in freeswitch/trunk: conf src src/include src/mod/applications/mod_voicemail src/mod/endpoints/mod_sofia
by Freeswitch SVN 12 Oct '07
by Freeswitch SVN 12 Oct '07
12 Oct '07
Author: anthm
Date: Fri Oct 12 13:12:31 2007
New Revision: 5851
Modified:
freeswitch/trunk/conf/default_context.xml
freeswitch/trunk/src/include/switch_utils.h
freeswitch/trunk/src/mod/applications/mod_voicemail/mod_voicemail.c
freeswitch/trunk/src/mod/endpoints/mod_sofia/sofia.c
freeswitch/trunk/src/mod/endpoints/mod_sofia/sofia_reg.c
freeswitch/trunk/src/switch_utils.c
Log:
minor adj
Modified: freeswitch/trunk/conf/default_context.xml
==============================================================================
--- freeswitch/trunk/conf/default_context.xml (original)
+++ freeswitch/trunk/conf/default_context.xml Fri Oct 12 13:12:31 2007
@@ -23,14 +23,14 @@
<condition field="destination_number" expression="^7771$">
<action application="answer"/>
<action application="set" data="voicemail_authorized=${sip_authorized}"/>
- <action application="voicemail" data="check demo $${domain} ${sip_from_user}"/>
+ <action application="voicemail" data="check demo $${domain} ${sip_mailbox}"/>
</condition>
</extension>
<extension name="7772">
<condition field="destination_number" expression="^7772$">
<action application="answer"/>
- <action application="voicemail" data="demo $${domain} ${sip_from_user}"/>
+ <action application="voicemail" data="demo $${domain} ${sip_mailbox}"/>
</condition>
</extension>
Modified: freeswitch/trunk/src/include/switch_utils.h
==============================================================================
--- freeswitch/trunk/src/include/switch_utils.h (original)
+++ freeswitch/trunk/src/include/switch_utils.h Fri Oct 12 13:12:31 2007
@@ -328,6 +328,7 @@
#define SWITCH_READ_ACCEPTABLE(status) (status == SWITCH_STATUS_SUCCESS || status == SWITCH_STATUS_BREAK)
SWITCH_DECLARE(size_t) switch_url_encode(char *url, char *buf, size_t len);
SWITCH_DECLARE(char *) switch_url_decode(char *s);
+SWITCH_DECLARE(switch_bool_t) switch_simple_email(char *to, char *from, char *headers, char *body, char *file);
/* malloc or DIE macros */
#ifdef NDEBUG
Modified: freeswitch/trunk/src/mod/applications/mod_voicemail/mod_voicemail.c
==============================================================================
--- freeswitch/trunk/src/mod/applications/mod_voicemail/mod_voicemail.c (original)
+++ freeswitch/trunk/src/mod/applications/mod_voicemail/mod_voicemail.c Fri Oct 12 13:12:31 2007
@@ -83,136 +83,6 @@
};
typedef struct vm_profile vm_profile_t;
-
-#define B64BUFFLEN 1024
-static const char c64[65] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
-
-static int write_buf(int fd, char *buf)
-{
-
- int len = (int) strlen(buf);
- if (fd && write(fd, buf, len) != len) {
- close(fd);
- return 0;
- }
-
- return 1;
-}
-static switch_bool_t vm_email(char *to, char *from, char *headers, char *body, char *file)
-{
- char *bound = "XXXX_boundary_XXXX";
- char filename[80], buf[B64BUFFLEN];
- int fd = 0, ifd = 0;
- int x = 0, y = 0, bytes = 0, ilen = 0;
- unsigned int b = 0, l = 0;
- unsigned char in[B64BUFFLEN];
- unsigned char out[B64BUFFLEN + 512];
- char *path = NULL;
-
- snprintf(filename, 80, "%smail.%ld%04x", SWITCH_GLOBAL_dirs.temp_dir, time(NULL), rand() & 0xffff);
-
- if ((fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0644))) {
- if (file) {
- path = file;
- if ((ifd = open(path, O_RDONLY)) < 1) {
- return SWITCH_FALSE;
- }
-
- snprintf(buf, B64BUFFLEN, "MIME-Version: 1.0\nContent-Type: multipart/mixed; boundary=\"%s\"\n", bound);
- if (!write_buf(fd, buf)) {
- return SWITCH_FALSE;
- }
- }
-
- if (headers && !write_buf(fd, headers))
- return SWITCH_FALSE;
-
- if (!write_buf(fd, "\n\n"))
- return SWITCH_FALSE;
-
- if (file) {
- snprintf(buf, B64BUFFLEN, "--%s\nContent-Type: text/plain\n\n", bound);
- if (!write_buf(fd, buf))
- return SWITCH_FALSE;
- }
-
- if (body) {
- if (!write_buf(fd, body)) {
- return SWITCH_FALSE;
- }
- }
-
- if (file) {
- snprintf(buf, B64BUFFLEN, "\n\n--%s\nContent-Type: application/octet-stream\n"
- "Content-Transfer-Encoding: base64\n"
- "Content-Description: Sound attachment.\n" "Content-Disposition: attachment; filename=\"%s\"\n\n", bound, switch_cut_path(file));
- if (!write_buf(fd, buf))
- return SWITCH_FALSE;
-
- while ((ilen = read(ifd, in, B64BUFFLEN))) {
- for (x = 0; x < ilen; x++) {
- b = (b << 8) + in[x];
- l += 8;
- while (l >= 6) {
- out[bytes++] = c64[(b >> (l -= 6)) % 64];
- if (++y != 72)
- continue;
- out[bytes++] = '\n';
- y = 0;
- }
- }
- if (write(fd, &out, bytes) != bytes) {
- return -1;
- } else
- bytes = 0;
-
- }
-
- if (l > 0) {
- out[bytes++] = c64[((b % 16) << (6 - l)) % 64];
- }
- if (l != 0)
- while (l < 6) {
- out[bytes++] = '=', l += 2;
- }
- if (write(fd, &out, bytes) != bytes) {
- return -1;
- }
-
- }
-
-
-
- if (file) {
- snprintf(buf, B64BUFFLEN, "\n\n--%s--\n.\n", bound);
- if (!write_buf(fd, buf))
- return SWITCH_FALSE;
- }
- }
-
- if (fd) {
- close(fd);
- }
- if (ifd) {
- close(ifd);
- }
- snprintf(buf, B64BUFFLEN, "/bin/cat %s | /usr/sbin/sendmail -tf \"%s\" %s", filename, from, to);
- if(system(buf)) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Unable to execute command: %s\n", buf);
- }
-
- unlink(filename);
-
-
- if (file) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Emailed file [%s] to [%s]\n", filename, to);
- } else {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Emailed data to [%s]\n", to);
- }
-
- return SWITCH_TRUE;
-}
-
static switch_status_t vm_execute_sql(vm_profile_t *profile, char *sql, switch_mutex_t *mutex)
{
switch_core_db_t *db;
@@ -953,7 +823,7 @@
}
//TBD add better formatting to the body
- vm_email(cbt->email, from, headers, body, cbt->file_path);
+ switch_simple_email(cbt->email, from, headers, body, cbt->file_path);
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Sending message to %s\n", cbt->email);
switch_safe_free(body);
TRY_CODE(switch_ivr_phrase_macro(session, VM_ACK_MACRO, "emailed", NULL, NULL));
@@ -1532,7 +1402,7 @@
}
//TBD add better formatting to the body
- vm_email(email_vm, from, headers, body, file_path);
+ switch_simple_email(email_vm, from, headers, body, file_path);
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Sending message to %s\n", email_vm);
switch_safe_free(body);
unlink(file_path);
Modified: freeswitch/trunk/src/mod/endpoints/mod_sofia/sofia.c
==============================================================================
--- freeswitch/trunk/src/mod/endpoints/mod_sofia/sofia.c (original)
+++ freeswitch/trunk/src/mod/endpoints/mod_sofia/sofia.c Fri Oct 12 13:12:31 2007
@@ -1924,6 +1924,8 @@
from_host = sip->sip_from->a_url->url_host;
channel_name = url_set_chanvars(session, sip->sip_from->a_url, sip_from);
+ switch_channel_set_variable(channel, "sip_mailbox", from_user);
+
if (!switch_strlen_zero(from_user)) {
if (*from_user == '+') {
switch_channel_set_variable(channel, "sip_from_user_stripped", (const char *) (from_user + 1));
Modified: freeswitch/trunk/src/mod/endpoints/mod_sofia/sofia_reg.c
==============================================================================
--- freeswitch/trunk/src/mod/endpoints/mod_sofia/sofia_reg.c (original)
+++ freeswitch/trunk/src/mod/endpoints/mod_sofia/sofia_reg.c Fri Oct 12 13:12:31 2007
@@ -747,6 +747,7 @@
const char *passwd = NULL;
const char *a1_hash = NULL;
char *sql;
+ char *mailbox = NULL;
switch_xml_t domain, xml = NULL, user, param, xparams;
char hexdigest[2 * SU_MD5_DIGEST_SIZE + 1] = "";
char *pbuf = NULL;
@@ -829,7 +830,11 @@
ret = AUTH_FORBIDDEN;
goto end;
}
-
+
+ if (!(mailbox = (char *)switch_xml_attr(user, "mailbox"))) {
+ mailbox = username;
+ }
+
for (param = switch_xml_child(xparams, "param"); param; param = param->next) {
const char *var = switch_xml_attr_soft(param, "name");
const char *val = switch_xml_attr_soft(param, "value");
@@ -899,6 +904,7 @@
if (first && ret == AUTH_OK) {
if (v_event && (xparams = switch_xml_child(user, "variables"))) {
if (switch_event_create(v_event, SWITCH_EVENT_MESSAGE) == SWITCH_STATUS_SUCCESS) {
+ switch_event_add_header(*v_event, SWITCH_STACK_BOTTOM, "sip_mailbox", "%s", mailbox);
for (param = switch_xml_child(xparams, "variable"); param; param = param->next) {
const char *var = switch_xml_attr_soft(param, "name");
const char *val = switch_xml_attr_soft(param, "value");
Modified: freeswitch/trunk/src/switch_utils.c
==============================================================================
--- freeswitch/trunk/src/switch_utils.c (original)
+++ freeswitch/trunk/src/switch_utils.c Fri Oct 12 13:12:31 2007
@@ -68,6 +68,135 @@
}
+
+static int write_buf(int fd, char *buf)
+{
+
+ int len = (int) strlen(buf);
+ if (fd && write(fd, buf, len) != len) {
+ close(fd);
+ return 0;
+ }
+
+ return 1;
+}
+
+SWITCH_DECLARE(switch_bool_t) switch_simple_email(char *to, char *from, char *headers, char *body, char *file)
+{
+ char *bound = "XXXX_boundary_XXXX";
+ char filename[80], buf[B64BUFFLEN];
+ int fd = 0, ifd = 0;
+ int x = 0, y = 0, bytes = 0, ilen = 0;
+ unsigned int b = 0, l = 0;
+ unsigned char in[B64BUFFLEN];
+ unsigned char out[B64BUFFLEN + 512];
+ char *path = NULL;
+
+ snprintf(filename, 80, "%smail.%ld%04x", SWITCH_GLOBAL_dirs.temp_dir, time(NULL), rand() & 0xffff);
+
+ if ((fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0644))) {
+ if (file) {
+ path = file;
+ if ((ifd = open(path, O_RDONLY)) < 1) {
+ return SWITCH_FALSE;
+ }
+
+ snprintf(buf, B64BUFFLEN, "MIME-Version: 1.0\nContent-Type: multipart/mixed; boundary=\"%s\"\n", bound);
+ if (!write_buf(fd, buf)) {
+ return SWITCH_FALSE;
+ }
+ }
+
+ if (headers && !write_buf(fd, headers))
+ return SWITCH_FALSE;
+
+ if (!write_buf(fd, "\n\n"))
+ return SWITCH_FALSE;
+
+ if (file) {
+ snprintf(buf, B64BUFFLEN, "--%s\nContent-Type: text/plain\n\n", bound);
+ if (!write_buf(fd, buf))
+ return SWITCH_FALSE;
+ }
+
+ if (body) {
+ if (!write_buf(fd, body)) {
+ return SWITCH_FALSE;
+ }
+ }
+
+ if (file) {
+ snprintf(buf, B64BUFFLEN, "\n\n--%s\nContent-Type: application/octet-stream\n"
+ "Content-Transfer-Encoding: base64\n"
+ "Content-Description: Sound attachment.\n" "Content-Disposition: attachment; filename=\"%s\"\n\n", bound, switch_cut_path(file));
+ if (!write_buf(fd, buf))
+ return SWITCH_FALSE;
+
+ while ((ilen = read(ifd, in, B64BUFFLEN))) {
+ for (x = 0; x < ilen; x++) {
+ b = (b << 8) + in[x];
+ l += 8;
+ while (l >= 6) {
+ out[bytes++] = switch_b64_table[(b >> (l -= 6)) % 64];
+ if (++y != 72)
+ continue;
+ out[bytes++] = '\n';
+ y = 0;
+ }
+ }
+ if (write(fd, &out, bytes) != bytes) {
+ return -1;
+ } else
+ bytes = 0;
+
+ }
+
+ if (l > 0) {
+ out[bytes++] = switch_b64_table[((b % 16) << (6 - l)) % 64];
+ }
+ if (l != 0)
+ while (l < 6) {
+ out[bytes++] = '=', l += 2;
+ }
+ if (write(fd, &out, bytes) != bytes) {
+ return -1;
+ }
+
+ }
+
+
+
+ if (file) {
+ snprintf(buf, B64BUFFLEN, "\n\n--%s--\n.\n", bound);
+ if (!write_buf(fd, buf))
+ return SWITCH_FALSE;
+ }
+ }
+
+ if (fd) {
+ close(fd);
+ }
+ if (ifd) {
+ close(ifd);
+ }
+ snprintf(buf, B64BUFFLEN, "/bin/cat %s | /usr/sbin/sendmail -tf \"%s\" %s", filename, from, to);
+ if(system(buf)) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Unable to execute command: %s\n", buf);
+ }
+
+ unlink(filename);
+
+
+ if (file) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Emailed file [%s] to [%s]\n", filename, to);
+ } else {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Emailed data to [%s]\n", to);
+ }
+
+ return SWITCH_TRUE;
+}
+
+
SWITCH_DECLARE(switch_status_t) switch_find_local_ip(char *buf, int len, int family)
{
switch_status_t status = SWITCH_STATUS_FALSE;
1
0
[commit] r5850 - in freeswitch/trunk: conf src/mod/applications/mod_voicemail
by Freeswitch SVN 12 Oct '07
by Freeswitch SVN 12 Oct '07
12 Oct '07
Author: anthm
Date: Fri Oct 12 12:49:14 2007
New Revision: 5850
Modified:
freeswitch/trunk/conf/voicemail.conf.xml
freeswitch/trunk/conf/voicemail_en_tts.xml
freeswitch/trunk/src/mod/applications/mod_voicemail/Makefile
freeswitch/trunk/src/mod/applications/mod_voicemail/mod_voicemail.c
Log:
update and test for odbc support
Modified: freeswitch/trunk/conf/voicemail.conf.xml
==============================================================================
--- freeswitch/trunk/conf/voicemail.conf.xml (original)
+++ freeswitch/trunk/conf/voicemail.conf.xml Fri Oct 12 12:49:14 2007
@@ -12,9 +12,6 @@
<param name="terminator-key" value="#"/>
<param name="play-new-messages-key" value="1"/>
<param name="play-saved-messages-key" value="2"/>
- <param name="save-message-key" value="8"/>
- <param name="delete-message-key" value="7"/>
- <param name="replay-message-key" value="1"/>
<param name="main-menu-key" value="0"/>
<param name="config-menu-key" value="5"/>
<param name="record-greeting-key" value="1"/>
Modified: freeswitch/trunk/conf/voicemail_en_tts.xml
==============================================================================
--- freeswitch/trunk/conf/voicemail_en_tts.xml (original)
+++ freeswitch/trunk/conf/voicemail_en_tts.xml Fri Oct 12 12:49:14 2007
@@ -65,9 +65,10 @@
<macro name="voicemail_menu">
- <input pattern="^([0-9#*]):([0-9#*]):([0-9#*])$">
+ <input pattern="^([0-9#*]):([0-9#*]):([0-9#*]):([0-9#*])$">
<match>
- <action function="speak-text" data="press $1 to listen to new messages. press $2 to listen to saved messages. press $3 for advanced options"/>
+ <action function="speak-text"
+ data="press $1 to listen to new messages. press $2 to listen to saved messages. press $3 for advanced options, press $4 to exit"/>
</match>
</input>
</macro>
@@ -105,7 +106,7 @@
<input pattern="^([0-9#*]):([0-9#*]):([0-9#*]):([0-9#*])$">
<match>
<action function="speak-text"
- data="press $1 to listen to the recording again, press $2 to save the recording, press $3 to delete the recording"/>
+ data="press $1 to listen to the recording again, press $2 to save the recording, press $3 to delete the recording, press $4 to forward the recording to your email"/>
</match>
</input>
</macro>
Modified: freeswitch/trunk/src/mod/applications/mod_voicemail/Makefile
==============================================================================
--- freeswitch/trunk/src/mod/applications/mod_voicemail/Makefile (original)
+++ freeswitch/trunk/src/mod/applications/mod_voicemail/Makefile Fri Oct 12 12:49:14 2007
@@ -1,2 +1,3 @@
BASE=../../../..
include /usr/src/freeswitch.trunk/build/modmake.rules
+LOCAL_CFLAGS += `if test -f $(BASE)/.libs/libfreeswitch_la-switch_odbc.o ; then echo -DSWITCH_HAVE_ODBC; fi ;`
Modified: freeswitch/trunk/src/mod/applications/mod_voicemail/mod_voicemail.c
==============================================================================
--- freeswitch/trunk/src/mod/applications/mod_voicemail/mod_voicemail.c (original)
+++ freeswitch/trunk/src/mod/applications/mod_voicemail/mod_voicemail.c Fri Oct 12 12:49:14 2007
@@ -56,9 +56,6 @@
char terminator_key[2];
char play_new_messages_key[2];
char play_saved_messages_key[2];
- char save_message_key[2];
- char delete_message_key[2];
- char replay_message_key[2];
char main_menu_key[2];
char config_menu_key[2];
@@ -377,13 +374,10 @@
for (x_profile = switch_xml_child(x_profiles, "profile"); x_profile; x_profile = x_profile->next) {
char *name = (char *) switch_xml_attr_soft(x_profile, "name");
- char *odbc_dsn = NULL, *odbc_dsn_tmp = NULL, *odbc_user = NULL, *odbc_pass = NULL, *dbname = NULL;
+ char *odbc_dsn = NULL, *odbc_user = NULL, *odbc_pass = NULL;
char *terminator_key = "#";
char *play_new_messages_key = "1";
char *play_saved_messages_key = "2";
- char *save_message_key = "8";
- char *delete_message_key = "7";
- char *replay_message_key = "1";
char *main_menu_key = "0";
char *config_menu_key = "5";
@@ -416,12 +410,6 @@
play_new_messages_key = val;
} else if (!strcasecmp(var, "play-saved-messages-key") && !switch_strlen_zero(val)) {
play_saved_messages_key = val;
- } else if (!strcasecmp(var, "save-message-key") && !switch_strlen_zero(val)) {
- save_message_key = val;
- } else if (!strcasecmp(var, "delete-message-key") && !switch_strlen_zero(val)) {
- delete_message_key = val;
- } else if (!strcasecmp(var, "replay-message-key") && !switch_strlen_zero(val)) {
- replay_message_key = val;
} else if (!strcasecmp(var, "main-menu-key") && !switch_strlen_zero(val)) {
main_menu_key = val;
} else if (!strcasecmp(var, "config-menu-key") && !switch_strlen_zero(val)) {
@@ -478,13 +466,10 @@
}
} else if (!strcasecmp(var, "odbc-dsn")) {
#ifdef SWITCH_HAVE_ODBC
- odbc_dsn_tmp = val;
- odbc_dsn = strdup(val);
-
+ odbc_dsn = switch_core_strdup(globals.pool, val);
if ((odbc_user = strchr(odbc_dsn, ':'))) {
*odbc_user++ = '\0';
}
-
if ((odbc_pass = strchr(odbc_user, ':'))) {
*odbc_pass++ = '\0';
}
@@ -501,9 +486,9 @@
profile->name = switch_core_strdup(globals.pool, name);
if (!switch_strlen_zero(odbc_dsn) && !switch_strlen_zero(odbc_user) && !switch_strlen_zero(odbc_pass)) {
- profile->odbc_dsn = switch_core_strdup(globals.pool, odbc_dsn_tmp);
- profile->odbc_user = switch_core_strdup(globals.pool, odbc_user);
- profile->odbc_pass = switch_core_strdup(globals.pool, odbc_pass);
+ profile->odbc_dsn = odbc_dsn;
+ profile->odbc_user = odbc_user;
+ profile->odbc_pass = odbc_pass;
} else {
profile->dbname = switch_core_sprintf(globals.pool, "voicemail_%s", name);
}
@@ -533,7 +518,7 @@
}
switch_core_db_close(db);
#ifdef SWITCH_HAVE_ODBC
- }
+ }
#endif
profile->digit_timeout = timeout;
profile->max_login_attempts = max_login_attempts;
@@ -541,9 +526,6 @@
*profile->terminator_key = *terminator_key;
*profile->play_new_messages_key = *play_new_messages_key;
*profile->play_saved_messages_key = *play_saved_messages_key;
- *profile->save_message_key = *save_message_key;
- *profile->delete_message_key = *delete_message_key;
- *profile->replay_message_key = *replay_message_key;
*profile->main_menu_key = *main_menu_key;
*profile->config_menu_key = *config_menu_key;
*profile->record_greeting_key = *record_greeting_key;
@@ -564,11 +546,6 @@
}
-
-
- switch_safe_free(odbc_dsn);
- switch_safe_free(dbname);
-
}
end:
@@ -946,7 +923,7 @@
args.input_callback = control_playback;
args.buf = &fh;
TRY_CODE(switch_ivr_play_file(session, NULL, cbt->file_path, &args));
- printf("XXXX wtf[%s]\n", cbt->email);
+
if (switch_channel_ready(channel)) {
status = vm_macro_get(session, VM_LISTEN_FILE_CHECK_MACRO,
key_buf, input, sizeof(input), 1, profile->terminator_key, &term, profile->digit_timeout);
@@ -1001,7 +978,7 @@
{
char msg_count[80] = "";
callback_t cbt = { 0 };
- char sql[128];
+ char sql[256];
cbt.buf = msg_count;
cbt.len = sizeof(msg_count);
@@ -1014,7 +991,7 @@
myfolder);
vm_execute_sql_callback(profile, profile->mutex, sql, sql2str_callback, &cbt);
*total_new_messages = atoi(msg_count);
-
+
snprintf(sql, sizeof(sql),
"select count(*) from voicemail_data where user='%s' and domain='%s' and in_folder='%s' and read_epoch!=0",
myid,
@@ -1117,7 +1094,7 @@
case VM_CHECK_PLAY_MESSAGES:
{
listen_callback_t cbt;
- char sql[128];
+ char sql[256];
int cur_message, total_messages;
message_count(profile, myid, domain_name, myfolder, &total_new_messages, &total_saved_messages);
memset(&cbt, 0, sizeof(cbt));
@@ -1257,10 +1234,11 @@
char key_buf[80] = "";
play_msg_type = MSG_NONE;
- snprintf(key_buf, sizeof(key_buf), "%s:%s:%s",
+ snprintf(key_buf, sizeof(key_buf), "%s:%s:%s:%s",
profile->play_new_messages_key,
profile->play_saved_messages_key,
- profile->config_menu_key);
+ profile->config_menu_key,
+ profile->terminator_key);
status = vm_macro_get(session, VM_MENU_MACRO, key_buf, input, sizeof(input), 1,
profile->terminator_key, &term, timeout);
@@ -1272,6 +1250,8 @@
play_msg_type = MSG_NEW;
} else if (!strcmp(input, profile->play_saved_messages_key)) {
play_msg_type = MSG_SAVED;
+ } else if (!strcmp(input, profile->terminator_key)) {
+ goto end;
} else if (!strcmp(input, profile->config_menu_key)) {
vm_check_state = VM_CHECK_CONFIG;
}
@@ -1423,7 +1403,7 @@
{
switch_channel_t *channel;
char *myfolder = "inbox";
- char sql[128];
+ char sql[256];
prefs_callback_t cbt;
vm_profile_t *profile;
char *uuid = switch_core_session_get_uuid(session);
1
0
Author: anthm
Date: Fri Oct 12 10:53:52 2007
New Revision: 5849
Modified:
freeswitch/trunk/conf/voicemail.conf.xml
Log:
add undocumented param
Modified: freeswitch/trunk/conf/voicemail.conf.xml
==============================================================================
--- freeswitch/trunk/conf/voicemail.conf.xml (original)
+++ freeswitch/trunk/conf/voicemail.conf.xml Fri Oct 12 10:53:52 2007
@@ -25,6 +25,7 @@
<param name="save-file-key" value="2"/>
<param name="delete-file-key" value="7"/>
<param name="undelete-file-key" value="8"/>
+ <param name="email-key" value="4"/>
<!--<param name="odbc-dsn" value="dsn:user:pass"/>-->
</profile>
</profiles>
1
0
[commit] r5848 - freeswitch/trunk/src/mod/languages/mod_spidermonkey_etpan
by Freeswitch SVN 12 Oct '07
by Freeswitch SVN 12 Oct '07
12 Oct '07
Author: anthm
Date: Fri Oct 12 09:34:26 2007
New Revision: 5848
Modified:
freeswitch/trunk/src/mod/languages/mod_spidermonkey_etpan/mod_spidermonkey_etpan.c
Log:
doh
Modified: freeswitch/trunk/src/mod/languages/mod_spidermonkey_etpan/mod_spidermonkey_etpan.c
==============================================================================
--- freeswitch/trunk/src/mod/languages/mod_spidermonkey_etpan/mod_spidermonkey_etpan.c (original)
+++ freeswitch/trunk/src/mod/languages/mod_spidermonkey_etpan/mod_spidermonkey_etpan.c Fri Oct 12 09:34:26 2007
@@ -37,7 +37,20 @@
static const char modname[] = "etpan";
+#define B64BUFFLEN 1024
+static const char c64[65] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+static int write_buf(int fd, char *buf)
+{
+
+ int len = (int) strlen(buf);
+ if (fd && write(fd, buf, len) != len) {
+ close(fd);
+ return 0;
+ }
+
+ return 1;
+}
/* etpan Object */
/*********************************************************************************/
@@ -61,7 +74,130 @@
etpan_NAME
};
+static JSBool js_email(JSContext * cx, JSObject * obj, uintN argc, jsval * argv, jsval * rval)
+{
+ char *to = NULL, *from = NULL, *headers, *body = NULL, *file = NULL;
+ char *bound = "XXXX_boundary_XXXX";
+ char filename[80], buf[B64BUFFLEN];
+ int fd = 0, ifd = 0;
+ int x = 0, y = 0, bytes = 0, ilen = 0;
+ unsigned int b = 0, l = 0;
+ unsigned char in[B64BUFFLEN];
+ unsigned char out[B64BUFFLEN + 512];
+ char *path = NULL;
+
+
+ if (argc > 3 &&
+ (from = JS_GetStringBytes(JS_ValueToString(cx, argv[0]))) &&
+ (to = JS_GetStringBytes(JS_ValueToString(cx, argv[1]))) &&
+ (headers = JS_GetStringBytes(JS_ValueToString(cx, argv[2]))) && (body = JS_GetStringBytes(JS_ValueToString(cx, argv[3])))
+ ) {
+ if (argc > 4) {
+ file = JS_GetStringBytes(JS_ValueToString(cx, argv[4]));
+ }
+ snprintf(filename, 80, "%smail.%ld%04x", SWITCH_GLOBAL_dirs.temp_dir, time(NULL), rand() & 0xffff);
+
+ if ((fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0644))) {
+ if (file) {
+ path = file;
+ if ((ifd = open(path, O_RDONLY)) < 1) {
+ return JS_FALSE;
+ }
+
+ snprintf(buf, B64BUFFLEN, "MIME-Version: 1.0\nContent-Type: multipart/mixed; boundary=\"%s\"\n", bound);
+ if (!write_buf(fd, buf)) {
+ return JS_FALSE;
+ }
+ }
+
+ if (!write_buf(fd, headers))
+ return JS_FALSE;
+
+ if (!write_buf(fd, "\n\n"))
+ return JS_FALSE;
+
+ if (file) {
+ snprintf(buf, B64BUFFLEN, "--%s\nContent-Type: text/plain\n\n", bound);
+ if (!write_buf(fd, buf))
+ return JS_FALSE;
+ }
+
+ if (!write_buf(fd, body))
+ return JS_FALSE;
+
+ if (file) {
+ snprintf(buf, B64BUFFLEN, "\n\n--%s\nContent-Type: application/octet-stream\n"
+ "Content-Transfer-Encoding: base64\n"
+ "Content-Description: Sound attachment.\n" "Content-Disposition: attachment; filename=\"%s\"\n\n", bound, (argc > 5) ? JS_GetStringBytes(JS_ValueToString(cx,argv[5])) : switch_cut_path(file));
+ if (!write_buf(fd, buf))
+ return JS_FALSE;
+
+ while ((ilen = read(ifd, in, B64BUFFLEN))) {
+ for (x = 0; x < ilen; x++) {
+ b = (b << 8) + in[x];
+ l += 8;
+ while (l >= 6) {
+ out[bytes++] = c64[(b >> (l -= 6)) % 64];
+ if (++y != 72)
+ continue;
+ out[bytes++] = '\n';
+ y = 0;
+ }
+ }
+ if (write(fd, &out, bytes) != bytes) {
+ return -1;
+ } else
+ bytes = 0;
+
+ }
+
+ if (l > 0) {
+ out[bytes++] = c64[((b % 16) << (6 - l)) % 64];
+ }
+ if (l != 0)
+ while (l < 6) {
+ out[bytes++] = '=', l += 2;
+ }
+ if (write(fd, &out, bytes) != bytes) {
+ return -1;
+ }
+
+ }
+
+
+
+ if (file) {
+ snprintf(buf, B64BUFFLEN, "\n\n--%s--\n.\n", bound);
+ if (!write_buf(fd, buf))
+ return JS_FALSE;
+ }
+ }
+ if (fd) {
+ close(fd);
+ }
+ if (ifd) {
+ close(ifd);
+ }
+ snprintf(buf, B64BUFFLEN, "/bin/cat %s | /usr/sbin/sendmail -tf \"%s\" %s", filename, from, to);
+ if(!system(buf)) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Unable to execute command: %s\n",buf);
+ }
+
+ unlink(filename);
+
+
+ if (file) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Emailed file [%s] to [%s]\n", filename, to);
+ } else {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Emailed data to [%s]\n", to);
+ }
+ return JS_TRUE;
+ }
+
+
+ return JS_FALSE;
+}
static JSFunctionSpec etpan_methods[] = {
// {"myMethod", odbc_my_method, 1},
1
0
[commit] r5847 - in freeswitch/trunk: conf src/mod/applications/mod_voicemail src/mod/languages/mod_spidermonkey_etpan
by Freeswitch SVN 12 Oct '07
by Freeswitch SVN 12 Oct '07
12 Oct '07
Author: anthm
Date: Fri Oct 12 09:31:12 2007
New Revision: 5847
Modified:
freeswitch/trunk/conf/directory.xml
freeswitch/trunk/conf/voicemail.conf.xml
freeswitch/trunk/src/mod/applications/mod_voicemail/mod_voicemail.c
freeswitch/trunk/src/mod/languages/mod_spidermonkey_etpan/mod_spidermonkey_etpan.c
Log:
small adjustments
Modified: freeswitch/trunk/conf/directory.xml
==============================================================================
--- freeswitch/trunk/conf/directory.xml (original)
+++ freeswitch/trunk/conf/directory.xml Fri Oct 12 09:31:12 2007
@@ -36,6 +36,7 @@
<param name="password" value="mypass"/>
<param name="vm-password" value="1234"/><!--if vm-password is omitted password param is used-->
<!--<param name="vm-mailto" value="me(a)mydomain.com"/>-->
+ <!--<param name="vm-email-all-messages" value="true"/>-->
<!-- optionally use this instead if you want to store the hash of user:domain:pass-->
<!--<param name="a1-hash" value="c6440e5de50b403206989679159de89a"/>-->
</params>
Modified: freeswitch/trunk/conf/voicemail.conf.xml
==============================================================================
--- freeswitch/trunk/conf/voicemail.conf.xml (original)
+++ freeswitch/trunk/conf/voicemail.conf.xml Fri Oct 12 09:31:12 2007
@@ -3,6 +3,7 @@
</settings>
<profiles>
<profile name="demo">
+ <param name="file-extension" value="wav"/>
<param name="terminator-key" value="#"/>
<param name="max-login-attempts" value="3"/>
<param name="digit-timeout" value="10000"/>
Modified: freeswitch/trunk/src/mod/applications/mod_voicemail/mod_voicemail.c
==============================================================================
--- freeswitch/trunk/src/mod/applications/mod_voicemail/mod_voicemail.c (original)
+++ freeswitch/trunk/src/mod/applications/mod_voicemail/mod_voicemail.c Fri Oct 12 09:31:12 2007
@@ -71,6 +71,8 @@
char save_file_key[2];
char delete_file_key[2];
char undelete_file_key[2];
+ char email_key[2];
+ char file_ext[10];
char *tone_spec;
uint32_t digit_timeout;
uint32_t max_login_attempts;
@@ -197,7 +199,7 @@
if (ifd) {
close(ifd);
}
- snprintf(buf, B64BUFFLEN, "/bin/cat %s | /usr/sbin/sendmail -tvf \"%s\" %s", filename, from, to);
+ snprintf(buf, B64BUFFLEN, "/bin/cat %s | /usr/sbin/sendmail -tf \"%s\" %s", filename, from, to);
if(system(buf)) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Unable to execute command: %s\n", buf);
}
@@ -394,7 +396,9 @@
char *save_file_key = "2";
char *delete_file_key = "7";
char *undelete_file_key = "8";
+ char *email_key = "4";
char *tone_spec = "%(1000, 0, 640)";
+ char *file_ext = "wav";
switch_core_db_t *db;
uint32_t timeout = 10000, max_login_attempts = 3, max_record_len = 300;
@@ -436,6 +440,10 @@
delete_file_key = val;
} else if (!strcasecmp(var, "undelete-file-key") && !switch_strlen_zero(val)) {
undelete_file_key = val;
+ } else if (!strcasecmp(var, "email-key") && !switch_strlen_zero(val)) {
+ email_key = val;
+ } else if (!strcasecmp(var, "file-extension")) {
+ file_ext = val;
} else if (!strcasecmp(var, "tone-spec")) {
tone_spec = val;
} else if (!strcasecmp(var, "digit-timeout")) {
@@ -546,8 +554,9 @@
*profile->save_file_key = *save_file_key;
*profile->delete_file_key = *delete_file_key;
*profile->undelete_file_key = *undelete_file_key;
+ *profile->email_key = *email_key;
profile->tone_spec = switch_core_strdup(globals.pool, tone_spec);
-
+ switch_copy_string(profile->file_ext, file_ext, sizeof(profile->file_ext));
switch_mutex_init(&profile->mutex, SWITCH_MUTEX_NESTED, globals.pool);
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Added Profile %s\n", profile->name);
@@ -873,6 +882,7 @@
char in_folder[255];
char file_path[255];
char flags[255];
+ char *email;
int index;
int want;
msg_type_t type;
@@ -924,7 +934,7 @@
profile->listen_file_key,
profile->save_file_key,
profile->delete_file_key,
- profile->undelete_file_key);
+ profile->email_key);
snprintf(input, sizeof(input), "%s:%d", cbt->type == MSG_NEW ? "new" : "saved", cbt->index);
@@ -936,18 +946,43 @@
args.input_callback = control_playback;
args.buf = &fh;
TRY_CODE(switch_ivr_play_file(session, NULL, cbt->file_path, &args));
-
+ printf("XXXX wtf[%s]\n", cbt->email);
if (switch_channel_ready(channel)) {
status = vm_macro_get(session, VM_LISTEN_FILE_CHECK_MACRO,
key_buf, input, sizeof(input), 1, profile->terminator_key, &term, profile->digit_timeout);
if (!strcmp(input, profile->listen_file_key)) {
goto play_file;
- } else if (!strcmp(input, profile->delete_file_key)) {
+ } else if (!strcmp(input, profile->delete_file_key) || !strcmp(input, profile->email_key)) {
char *sql = switch_mprintf("update voicemail_data set flags='delete' where uuid='%s'", cbt->uuid);
vm_execute_sql(profile, sql, profile->mutex);
switch_safe_free(sql);
- TRY_CODE(switch_ivr_phrase_macro(session, VM_ACK_MACRO, "deleted", NULL, NULL));
+ if (!strcmp(input, profile->email_key) && !switch_strlen_zero(cbt->email)) {
+ switch_event_t *event;
+ char *from = switch_core_session_sprintf(session, "%s@%s", cbt->user, cbt->domain);
+ char *headers = switch_core_session_sprintf(session, "From: FreeSWITCH mod_voicemail <%s@%s>\nSubject: Voicemail from %s %s",
+ cbt->user, cbt->domain, cbt->cid_name, cbt->cid_number);
+
+ char *body;
+
+
+ if (switch_event_create(&event, SWITCH_EVENT_MESSAGE) == SWITCH_STATUS_SUCCESS) {
+ switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Message-Type", "forwarded-voicemail");
+ switch_event_serialize(event, &body);
+ switch_event_fire(&event);
+ } else {
+ body = switch_mprintf("Voicemail from %s %s",
+ cbt->cid_name, cbt->cid_number);
+ }
+
+ //TBD add better formatting to the body
+ vm_email(cbt->email, from, headers, body, cbt->file_path);
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Sending message to %s\n", cbt->email);
+ switch_safe_free(body);
+ TRY_CODE(switch_ivr_phrase_macro(session, VM_ACK_MACRO, "emailed", NULL, NULL));
+ } else {
+ TRY_CODE(switch_ivr_phrase_macro(session, VM_ACK_MACRO, "deleted", NULL, NULL));
+ }
} else {
char *sql = switch_mprintf("update voicemail_data set flags='save' where uuid='%s'", cbt->uuid);
vm_execute_sql(profile, sql, profile->mutex);
@@ -1007,7 +1042,7 @@
int total_new_messages = 0;
int total_saved_messages = 0;
int heard_auto_saved = 0, heard_auto_new = 0;
-
+ char *email_vm = NULL;
channel = switch_core_session_get_channel(session);
assert(channel != NULL);
@@ -1086,6 +1121,7 @@
int cur_message, total_messages;
message_count(profile, myid, domain_name, myfolder, &total_new_messages, &total_saved_messages);
memset(&cbt, 0, sizeof(cbt));
+ cbt.email = email_vm;
switch(play_msg_type) {
case MSG_NEW:
{
@@ -1167,7 +1203,7 @@
profile->terminator_key, &term, timeout));
num = atoi(input);
- file_path = switch_mprintf("%s%sgreeting_%d.wav", dir_path, SWITCH_PATH_SEPARATOR, num);
+ file_path = switch_mprintf("%s%sgreeting_%d.%s", dir_path, SWITCH_PATH_SEPARATOR, num, profile->file_ext);
if (num < 1 || num > 3) {
status = SWITCH_STATUS_FALSE;
} else {
@@ -1195,7 +1231,7 @@
if (num < 1 || num > 3) {
TRY_CODE(switch_ivr_phrase_macro(session, VM_CHOOSE_GREETING_FAIL_MACRO, NULL, NULL, NULL));
} else {
- file_path = switch_mprintf("%s%sgreeting_%d.wav", dir_path, SWITCH_PATH_SEPARATOR, num);
+ 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));
sql = switch_mprintf("update voicemail_prefs set greeting_path='%s' where user='%s' and domain='%s'", file_path, myid, domain_name);
vm_execute_sql(profile, sql, profile->mutex);
@@ -1204,7 +1240,7 @@
}
} else if (!strcmp(input, profile->record_name_key)) {
- file_path = switch_mprintf("%s%srecorded_name.wav", dir_path, SWITCH_PATH_SEPARATOR);
+ 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));
sql = switch_mprintf("update voicemail_prefs set name_path='%s' where user='%s' and domain='%s'", file_path, myid, domain_name);
vm_execute_sql(profile, sql, profile->mutex);
@@ -1321,6 +1357,8 @@
thepass = val;
} else if (!strcasecmp(var, "vm-password")) {
thepass = val;
+ } else if (!strcasecmp(var, "vm-mailto")) {
+ email_vm = switch_core_session_strdup(session, val);
}
}
switch_xml_free(x_domain_root);
@@ -1352,6 +1390,7 @@
}
continue;
+
failed:
status = switch_ivr_phrase_macro(session, VM_FAIL_AUTH_MACRO, NULL, NULL, NULL);
myid = id;
@@ -1378,7 +1417,7 @@
}
}
-
+
static switch_status_t voicemail_leave_main(switch_core_session_t *session, char *profile_name, char *domain_name, char *id)
{
@@ -1395,6 +1434,7 @@
switch_file_handle_t fh = { 0 };
switch_input_args_t args = { 0 };
char *email_vm = NULL;
+ int send_mail = 0;
memset(&cbt, 0, sizeof(cbt));
if (!(profile = switch_core_hash_find(globals.profile_hash, profile_name))) {
@@ -1428,21 +1468,25 @@
assert(xtra);
x_user = x_domain = x_domain_root = NULL;
if (switch_xml_locate_user(id, domain_name, switch_channel_get_variable(channel, "network_addr"),
- &x_domain_root, &x_domain, &x_user, xtra) != SWITCH_STATUS_SUCCESS) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "can't find user [%s@%s]\n", id, domain_name);
- ok = 0;
- }
-
- if ((x_params = switch_xml_child(x_user, "params"))) {
- for (x_param = switch_xml_child(x_params, "param"); x_param; x_param = x_param->next) {
- const char *var = switch_xml_attr_soft(x_param, "name");
- const char *val = switch_xml_attr_soft(x_param, "value");
-
- if (!strcasecmp(var, "vm-mailto")) {
- email_vm = switch_core_session_strdup(session, val);
+ &x_domain_root, &x_domain, &x_user, xtra) == SWITCH_STATUS_SUCCESS) {
+ if ((x_params = switch_xml_child(x_user, "params"))) {
+ for (x_param = switch_xml_child(x_params, "param"); x_param; x_param = x_param->next) {
+ const char *var = switch_xml_attr_soft(x_param, "name");
+ const char *val = switch_xml_attr_soft(x_param, "value");
+
+ if (!strcasecmp(var, "vm-mailto")) {
+ email_vm = switch_core_session_strdup(session, val);
+ } else if (!strcasecmp(var, "vm-email-all-messages")) {
+ send_mail = switch_true(var);
+ }
}
}
+
+ } else {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "can't find user [%s@%s]\n", id, domain_name);
+ ok = 0;
}
+
switch_safe_free(xtra);
switch_xml_free(x_domain_root);
@@ -1457,7 +1501,7 @@
domain_name);
vm_execute_sql_callback(profile, profile->mutex, sql, prefs_callback, &cbt);
- file_path = switch_mprintf("%s%smsg_%s.wav", dir_path, SWITCH_PATH_SEPARATOR, uuid);
+ file_path = switch_mprintf("%s%smsg_%s.%s", dir_path, SWITCH_PATH_SEPARATOR, uuid, profile->file_ext);
memset(&fh, 0, sizeof(fh));
args.input_callback = control_playback;
@@ -1472,7 +1516,7 @@
TRY_CODE(switch_ivr_phrase_macro(session, VM_PLAY_GREETING_MACRO, id, NULL, NULL));
}
- if(switch_channel_ready(channel)) {
+ if(!send_mail && switch_channel_ready(channel)) {
char *usql;
status = create_file(session, profile, VM_RECORD_MESSAGE_MACRO, file_path);
if (status == SWITCH_STATUS_SUCCESS || status == SWITCH_STATUS_BREAK) {
@@ -1489,11 +1533,10 @@
end:
- if (!switch_strlen_zero(email_vm)) {
-
+ if (send_mail && !switch_strlen_zero(email_vm)) {
switch_event_t *event;
- char *from = switch_core_session_sprintf(session, "FreeSWITCH mod_voicemail <%s@%s>", id, domain_name);
- char *headers = switch_core_session_sprintf(session, "Subject: Voicemail from %s %s",
+ char *from = switch_core_session_sprintf(session, "%s@%s", id, domain_name);
+ char *headers = switch_core_session_sprintf(session, "From: FreeSWITCH mod_voicemail <%s@%s>\nSubject: Voicemail from %s %s", id, domain_name,
caller_profile->caller_id_name, caller_profile->caller_id_number);
char *body;
@@ -1510,8 +1553,9 @@
//TBD add better formatting to the body
vm_email(email_vm, from, headers, body, file_path);
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Sending message to %s", email_vm);
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Sending message to %s\n", email_vm);
switch_safe_free(body);
+ unlink(file_path);
}
switch_safe_free(file_path);
Modified: freeswitch/trunk/src/mod/languages/mod_spidermonkey_etpan/mod_spidermonkey_etpan.c
==============================================================================
--- freeswitch/trunk/src/mod/languages/mod_spidermonkey_etpan/mod_spidermonkey_etpan.c (original)
+++ freeswitch/trunk/src/mod/languages/mod_spidermonkey_etpan/mod_spidermonkey_etpan.c Fri Oct 12 09:31:12 2007
@@ -37,20 +37,7 @@
static const char modname[] = "etpan";
-#define B64BUFFLEN 1024
-static const char c64[65] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
-static int write_buf(int fd, char *buf)
-{
-
- int len = (int) strlen(buf);
- if (fd && write(fd, buf, len) != len) {
- close(fd);
- return 0;
- }
-
- return 1;
-}
/* etpan Object */
/*********************************************************************************/
@@ -74,130 +61,7 @@
etpan_NAME
};
-static JSBool js_email(JSContext * cx, JSObject * obj, uintN argc, jsval * argv, jsval * rval)
-{
- char *to = NULL, *from = NULL, *headers, *body = NULL, *file = NULL;
- char *bound = "XXXX_boundary_XXXX";
- char filename[80], buf[B64BUFFLEN];
- int fd = 0, ifd = 0;
- int x = 0, y = 0, bytes = 0, ilen = 0;
- unsigned int b = 0, l = 0;
- unsigned char in[B64BUFFLEN];
- unsigned char out[B64BUFFLEN + 512];
- char *path = NULL;
-
-
- if (argc > 3 &&
- (from = JS_GetStringBytes(JS_ValueToString(cx, argv[0]))) &&
- (to = JS_GetStringBytes(JS_ValueToString(cx, argv[1]))) &&
- (headers = JS_GetStringBytes(JS_ValueToString(cx, argv[2]))) && (body = JS_GetStringBytes(JS_ValueToString(cx, argv[3])))
- ) {
- if (argc > 4) {
- file = JS_GetStringBytes(JS_ValueToString(cx, argv[4]));
- }
- snprintf(filename, 80, "%smail.%ld%04x", SWITCH_GLOBAL_dirs.temp_dir, time(NULL), rand() & 0xffff);
-
- if ((fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0644))) {
- if (file) {
- path = file;
- if ((ifd = open(path, O_RDONLY)) < 1) {
- return JS_FALSE;
- }
-
- snprintf(buf, B64BUFFLEN, "MIME-Version: 1.0\nContent-Type: multipart/mixed; boundary=\"%s\"\n", bound);
- if (!write_buf(fd, buf)) {
- return JS_FALSE;
- }
- }
-
- if (!write_buf(fd, headers))
- return JS_FALSE;
-
- if (!write_buf(fd, "\n\n"))
- return JS_FALSE;
-
- if (file) {
- snprintf(buf, B64BUFFLEN, "--%s\nContent-Type: text/plain\n\n", bound);
- if (!write_buf(fd, buf))
- return JS_FALSE;
- }
-
- if (!write_buf(fd, body))
- return JS_FALSE;
-
- if (file) {
- snprintf(buf, B64BUFFLEN, "\n\n--%s\nContent-Type: application/octet-stream\n"
- "Content-Transfer-Encoding: base64\n"
- "Content-Description: Sound attachment.\n" "Content-Disposition: attachment; filename=\"%s\"\n\n", bound, (argc > 5) ? JS_GetStringBytes(JS_ValueToString(cx,argv[5])) : switch_cut_path(file));
- if (!write_buf(fd, buf))
- return JS_FALSE;
-
- while ((ilen = read(ifd, in, B64BUFFLEN))) {
- for (x = 0; x < ilen; x++) {
- b = (b << 8) + in[x];
- l += 8;
- while (l >= 6) {
- out[bytes++] = c64[(b >> (l -= 6)) % 64];
- if (++y != 72)
- continue;
- out[bytes++] = '\n';
- y = 0;
- }
- }
- if (write(fd, &out, bytes) != bytes) {
- return -1;
- } else
- bytes = 0;
-
- }
-
- if (l > 0) {
- out[bytes++] = c64[((b % 16) << (6 - l)) % 64];
- }
- if (l != 0)
- while (l < 6) {
- out[bytes++] = '=', l += 2;
- }
- if (write(fd, &out, bytes) != bytes) {
- return -1;
- }
-
- }
-
-
-
- if (file) {
- snprintf(buf, B64BUFFLEN, "\n\n--%s--\n.\n", bound);
- if (!write_buf(fd, buf))
- return JS_FALSE;
- }
- }
- if (fd) {
- close(fd);
- }
- if (ifd) {
- close(ifd);
- }
- snprintf(buf, B64BUFFLEN, "/bin/cat %s | /usr/sbin/sendmail -tf \"%s\" %s", filename, from, to);
- if(!system(buf)) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Unable to execute command: %s\n",buf);
- }
-
- unlink(filename);
-
-
- if (file) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Emailed file [%s] to [%s]\n", filename, to);
- } else {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Emailed data to [%s]\n", to);
- }
- return JS_TRUE;
- }
-
-
- return JS_FALSE;
-}
static JSFunctionSpec etpan_methods[] = {
// {"myMethod", odbc_my_method, 1},
1
0
[commit] r5846 - in freeswitch/trunk: . build conf src src/include src/mod/applications/mod_dptools src/mod/applications/mod_voicemail
by Freeswitch SVN 12 Oct '07
by Freeswitch SVN 12 Oct '07
12 Oct '07
Author: anthm
Date: Thu Oct 11 23:28:59 2007
New Revision: 5846
Added:
freeswitch/trunk/conf/voicemail.conf.xml
freeswitch/trunk/conf/voicemail_en_tts.xml
freeswitch/trunk/src/mod/applications/mod_voicemail/
freeswitch/trunk/src/mod/applications/mod_voicemail/Makefile
freeswitch/trunk/src/mod/applications/mod_voicemail/mod_voicemail.c
freeswitch/trunk/src/mod/applications/mod_voicemail/mod_voicemail.vcproj
Modified:
freeswitch/trunk/Makefile.am
freeswitch/trunk/build/modules.conf.in
freeswitch/trunk/conf/default_context.xml
freeswitch/trunk/conf/directory.xml
freeswitch/trunk/conf/freeswitch.xml
freeswitch/trunk/conf/modules.conf.xml
freeswitch/trunk/src/include/switch_apr.h
freeswitch/trunk/src/include/switch_types.h
freeswitch/trunk/src/mod/applications/mod_dptools/mod_dptools.c
freeswitch/trunk/src/switch_apr.c
freeswitch/trunk/src/switch_core.c
freeswitch/trunk/src/switch_core_file.c
freeswitch/trunk/src/switch_xml.c
Log:
EXECUTE ORDER 66
Modified: freeswitch/trunk/Makefile.am
==============================================================================
--- freeswitch/trunk/Makefile.am (original)
+++ freeswitch/trunk/Makefile.am Thu Oct 11 23:28:59 2007
@@ -135,6 +135,7 @@
endif
if ADD_ODBC
+CORE_CFLAGS += -DSWITCH_HAVE_ODBC
libfreeswitch_la_SOURCES += src/switch_odbc.c
libfreeswitch_la_LDFLAGS += -lodbc
endif
Modified: freeswitch/trunk/build/modules.conf.in
==============================================================================
--- freeswitch/trunk/build/modules.conf.in (original)
+++ freeswitch/trunk/build/modules.conf.in Thu Oct 11 23:28:59 2007
@@ -5,6 +5,7 @@
applications/mod_dptools
applications/mod_enum
applications/mod_fifo
+#applications/mod_voicemail
#applications/mod_ivrtest
#applications/mod_soundtouch
#applications/mod_rss
Modified: freeswitch/trunk/conf/default_context.xml
==============================================================================
--- freeswitch/trunk/conf/default_context.xml (original)
+++ freeswitch/trunk/conf/default_context.xml Thu Oct 11 23:28:59 2007
@@ -19,6 +19,21 @@
</condition>
</extension>
+ <extension name="7771">
+ <condition field="destination_number" expression="^7771$">
+ <action application="answer"/>
+ <action application="set" data="voicemail_authorized=${sip_authorized}"/>
+ <action application="voicemail" data="check demo $${domain} ${sip_from_user}"/>
+ </condition>
+ </extension>
+
+ <extension name="7772">
+ <condition field="destination_number" expression="^7772$">
+ <action application="answer"/>
+ <action application="voicemail" data="demo $${domain} ${sip_from_user}"/>
+ </condition>
+ </extension>
+
<extension name="9193">
<condition field="destination_number" expression="^9193$">
<action application="set" data="bridge_pre_execute_bleg_app=soundtouch"/>
Modified: freeswitch/trunk/conf/directory.xml
==============================================================================
--- freeswitch/trunk/conf/directory.xml (original)
+++ freeswitch/trunk/conf/directory.xml Thu Oct 11 23:28:59 2007
@@ -1,7 +1,7 @@
<!--the domain or ip (the right hand side of the @ in the addr-->
<domain name="$${domain}">
<!--the user id (the left hand side of the @ in the addr-->
- <user id="stpeter">
+ <user id="stpeter" mailbox="1000"> <!--if id is numeric mailbox param is not necessary-->
<!-- Outbound Registrations Related to this user -->
<gateways>
<!--<gateway name="asterlink.com">-->
@@ -34,6 +34,8 @@
<params>
<!-- omit password for authless registration -->
<param name="password" value="mypass"/>
+ <param name="vm-password" value="1234"/><!--if vm-password is omitted password param is used-->
+ <!--<param name="vm-mailto" value="me(a)mydomain.com"/>-->
<!-- optionally use this instead if you want to store the hash of user:domain:pass-->
<!--<param name="a1-hash" value="c6440e5de50b403206989679159de89a"/>-->
</params>
Modified: freeswitch/trunk/conf/freeswitch.xml
==============================================================================
--- freeswitch/trunk/conf/freeswitch.xml (original)
+++ freeswitch/trunk/conf/freeswitch.xml Thu Oct 11 23:28:59 2007
@@ -102,6 +102,7 @@
<!--#include "conference.conf.xml"-->
<!-- ivr.conf is used by mod_dptools -->
<!--#include "ivr.conf.xml"-->
+ <!--#include "voicemail.conf.xml"-->
<!-- Dialplan Interfaces -->
<!--#include "dialplan_directory.conf.xml"-->
@@ -145,6 +146,8 @@
<macros>
<language name="en" sound_path="/snds" tts_engine="cepstral" tts_voice="david">
<!--#include "lang_en.xml"-->
+ <!--voicemail_en_tts is purely implemented with tts, we need a files based implementation too -->
+ <!--#include "voicemail_en_tts.xml"-->
</language>
<language name="fr" sound_path="/var/sounds/lang/fr/jean" tts_engine="cepstral" tts_voice="jean-pierre">
<!--#include "lang_fr.xml"-->
Modified: freeswitch/trunk/conf/modules.conf.xml
==============================================================================
--- freeswitch/trunk/conf/modules.conf.xml (original)
+++ freeswitch/trunk/conf/modules.conf.xml Thu Oct 11 23:28:59 2007
@@ -37,6 +37,7 @@
<load module="mod_conference"/>
<load module="mod_dptools"/>
<load module="mod_fifo"/>
+ <!--<load module="mod_voicemail"/>-->
<!-- Dialplan Interfaces -->
<!-- <load module="mod_dialplan_directory"/> -->
Added: freeswitch/trunk/conf/voicemail.conf.xml
==============================================================================
--- (empty file)
+++ freeswitch/trunk/conf/voicemail.conf.xml Thu Oct 11 23:28:59 2007
@@ -0,0 +1,30 @@
+<configuration name="voicemail.conf" description="Voicemail">
+ <settings>
+ </settings>
+ <profiles>
+ <profile name="demo">
+ <param name="terminator-key" value="#"/>
+ <param name="max-login-attempts" value="3"/>
+ <param name="digit-timeout" value="10000"/>
+ <param name="max-record-len" value="300"/>
+ <param name="tone-spec" value="%(1000, 0, 640)"/>
+ <param name="terminator-key" value="#"/>
+ <param name="play-new-messages-key" value="1"/>
+ <param name="play-saved-messages-key" value="2"/>
+ <param name="save-message-key" value="8"/>
+ <param name="delete-message-key" value="7"/>
+ <param name="replay-message-key" value="1"/>
+ <param name="main-menu-key" value="0"/>
+ <param name="config-menu-key" value="5"/>
+ <param name="record-greeting-key" value="1"/>
+ <param name="choose-greeting-key" value="2"/>
+ <param name="record-name-key" value="3"/>
+ <param name="record-file-key" value="3"/>
+ <param name="listen-file-key" value="1"/>
+ <param name="save-file-key" value="2"/>
+ <param name="delete-file-key" value="7"/>
+ <param name="undelete-file-key" value="8"/>
+ <!--<param name="odbc-dsn" value="dsn:user:pass"/>-->
+ </profile>
+ </profiles>
+</configuration>
Added: freeswitch/trunk/conf/voicemail_en_tts.xml
==============================================================================
--- (empty file)
+++ freeswitch/trunk/conf/voicemail_en_tts.xml Thu Oct 11 23:28:59 2007
@@ -0,0 +1,209 @@
+<include><!--This line will be ignored it's here to validate the xml and is optional -->
+ <macro name="voicemail_enter_id">
+ <input pattern="(.*)">
+ <match>
+ <action function="speak-text" data="please enter your i d, followed by $1"/>
+ </match>
+ </input>
+ </macro>
+
+ <macro name="voicemail_enter_pass">
+ <input pattern="(.*)">
+ <match>
+ <action function="speak-text" data="please enter your password, followed by $1"/>
+ </match>
+ </input>
+ </macro>
+
+ <macro name="voicemail_fail_auth">
+ <input pattern="(.*)">
+ <match>
+ <action function="speak-text" data="login incorrect"/>
+ </match>
+ </input>
+ </macro>
+
+ <macro name="voicemail_hello">
+ <input pattern="(.*)">
+ <match>
+ <action function="speak-text" data="welcome to your voicemail"/>
+ </match>
+ </input>
+ </macro>
+
+ <macro name="voicemail_goodbye">
+ <input pattern="(.*)">
+ <match>
+ <action function="speak-text" data="goodbye"/>
+ </match>
+ </input>
+ </macro>
+
+ <macro name="voicemail_abort">
+ <input pattern="(.*)">
+ <match>
+ <action function="speak-text" data="too many failed attempts"/>
+ </match>
+ </input>
+ </macro>
+
+ <macro name="voicemail_new_message_count">
+ <input pattern="(.*)">
+ <match>
+ <action function="speak-text" data="you have $1 new messages in folder ${voicemail_current_folder}"/>
+ </match>
+ </input>
+ </macro>
+
+ <macro name="voicemail_saved_message_count">
+ <input pattern="(.*)">
+ <match>
+ <action function="speak-text" data="you have $1 saved messages in folder ${voicemail_current_folder}"/>
+ </match>
+ </input>
+ </macro>
+
+
+ <macro name="voicemail_menu">
+ <input pattern="^([0-9#*]):([0-9#*]):([0-9#*])$">
+ <match>
+ <action function="speak-text" data="press $1 to listen to new messages. press $2 to listen to saved messages. press $3 for advanced options"/>
+ </match>
+ </input>
+ </macro>
+
+
+ <macro name="voicemail_config_menu">
+ <input pattern="^([0-9#*]):([0-9#*]):([0-9#*]):([0-9#*])$">
+ <match>
+ <action function="speak-text"
+ data="press $1 to record a greeting, press $2 to choose a greeting, press $3 to record your name, press $4 for the main menu"/>
+ </match>
+ </input>
+ </macro>
+
+
+ <macro name="voicemail_record_name">
+ <input pattern="^(.*)$">
+ <match>
+ <action function="speak-text" data="at the tone, record your name, press any key or stop talking to end the recording."/>
+
+ </match>
+ </input>
+ </macro>
+
+ <macro name="voicemail_record_file_check">
+ <input pattern="^([0-9#*]):([0-9#*]):([0-9#*])$">
+ <match>
+ <action function="speak-text"
+ data="press $1 to listen to the recording, press $2 to save the recording, press $3 to re record"/>
+ </match>
+ </input>
+ </macro>
+
+ <macro name="voicemail_listen_file_check">
+ <input pattern="^([0-9#*]):([0-9#*]):([0-9#*]):([0-9#*])$">
+ <match>
+ <action function="speak-text"
+ data="press $1 to listen to the recording again, press $2 to save the recording, press $3 to delete the recording"/>
+ </match>
+ </input>
+ </macro>
+
+ <macro name="voicemail_choose_greeting">
+ <input pattern="^(.*)$">
+ <match>
+ <action function="speak-text" data="choose a greeting between 1 and 3"/>
+ </match>
+ </input>
+ </macro>
+
+ <macro name="voicemail_choose_greeting_fail">
+ <input pattern="^(.*)$">
+ <match>
+ <action function="speak-text" data="invalid value"/>
+ </match>
+ </input>
+ </macro>
+
+ <macro name="voicemail_record_greeting">
+ <input pattern="^(.*)$">
+ <match>
+ <action function="speak-text" data="record your greeting at the tone, press any key or stop talking to end the recording"/>
+ </match>
+ </input>
+ </macro>
+
+ <macro name="voicemail_record_message">
+ <input pattern="^(.*)$">
+ <match>
+ <action function="speak-text" data="record your message at the tone, press any key or stop talking to end the recording"/>
+ </match>
+ </input>
+ </macro>
+
+ <macro name="voicemail_greeting_selected">
+ <input pattern="^(.*)$">
+ <match>
+ <action function="speak-text" data="greeting $1 selected"/>
+ </match>
+ </input>
+ </macro>
+
+ <macro name="voicemail_play_greeting">
+ <input pattern="^(.*)$">
+ <match>
+ <action function="speak-text" data="$1 is not available"/>
+ </match>
+ </input>
+ </macro>
+
+ <macro name="voicemail_say_number">
+ <input pattern="^(.*)$">
+ <match>
+ <action function="speak-text" data="$1"/>
+ </match>
+ </input>
+ </macro>
+
+ <macro name="voicemail_say_message_number">
+ <input pattern="^([a-z]+):(.*)$">
+ <match>
+ <action function="speak-text" data="$1 message number $2"/>
+ </match>
+ </input>
+ </macro>
+
+ <macro name="voicemail_say_phone_number">
+ <input pattern="^(.*)$">
+ <match>
+ <action function="speak-text" data="$1"/>
+ </match>
+ </input>
+ </macro>
+
+ <macro name="voicemail_say_name">
+ <input pattern="^(.*)$">
+ <match>
+ <action function="speak-text" data="$1"/>
+ </match>
+ </input>
+ </macro>
+
+ <macro name="voicemail_ack">
+ <input pattern="^(.*)$">
+ <match>
+ <action function="speak-text" data="message $1"/>
+ </match>
+ </input>
+ </macro>
+
+ <macro name="voicemail_say_date">
+ <input pattern="^(.*)$">
+ <match>
+ <action function="speak-text" data="$strftime($1|%A, %B %d %Y, %I %m %p)"/>
+ </match>
+ </input>
+ </macro>
+
+</include><!--This line will be ignored it's here to validate the xml and is optional -->
Modified: freeswitch/trunk/src/include/switch_apr.h
==============================================================================
--- freeswitch/trunk/src/include/switch_apr.h (original)
+++ freeswitch/trunk/src/include/switch_apr.h Thu Oct 11 23:28:59 2007
@@ -748,6 +748,11 @@
SWITCH_DECLARE(switch_status_t) switch_file_exists(const char *filename, switch_memory_pool_t *pool);
+SWITCH_DECLARE(switch_status_t) switch_dir_make(const char *path, switch_fileperms_t perm,
+ switch_memory_pool_t *pool);
+SWITCH_DECLARE(switch_status_t) switch_dir_make_recursive(const char *path, switch_fileperms_t perm,
+ switch_memory_pool_t *pool);
+
typedef struct switch_dir switch_dir_t;
struct switch_array_header_t {
Modified: freeswitch/trunk/src/include/switch_types.h
==============================================================================
--- freeswitch/trunk/src/include/switch_types.h (original)
+++ freeswitch/trunk/src/include/switch_types.h Thu Oct 11 23:28:59 2007
@@ -253,6 +253,7 @@
char *temp_dir;
char *htdocs_dir;
char *grammar_dir;
+ char *storage_dir;
};
typedef struct switch_directories switch_directories;
Modified: freeswitch/trunk/src/mod/applications/mod_dptools/mod_dptools.c
==============================================================================
--- freeswitch/trunk/src/mod/applications/mod_dptools/mod_dptools.c (original)
+++ freeswitch/trunk/src/mod/applications/mod_dptools/mod_dptools.c Thu Oct 11 23:28:59 2007
@@ -675,9 +675,16 @@
switch_size_t retsize;
switch_time_exp_t tm;
char date[80] = "";
-
- switch_time_exp_lt(&tm, switch_time_now());
- switch_strftime(date, &retsize, sizeof(date), cmd ? cmd : "%Y-%m-%d %T", &tm);
+ switch_time_t thetime;
+ char *p;
+ if (!switch_strlen_zero(cmd) && (p = strchr(cmd, '|'))) {
+ thetime = switch_time_make(atoi(cmd),0);
+ cmd = p+1;
+ } else {
+ thetime = switch_time_now();
+ }
+ switch_time_exp_lt(&tm, thetime);
+ switch_strftime(date, &retsize, sizeof(date), switch_strlen_zero(cmd) ? "%Y-%m-%d %T" : cmd, &tm);
stream->write_function(stream, "%s", date);
return SWITCH_STATUS_SUCCESS;
Added: freeswitch/trunk/src/mod/applications/mod_voicemail/Makefile
==============================================================================
--- (empty file)
+++ freeswitch/trunk/src/mod/applications/mod_voicemail/Makefile Thu Oct 11 23:28:59 2007
@@ -0,0 +1,2 @@
+BASE=../../../..
+include /usr/src/freeswitch.trunk/build/modmake.rules
Added: freeswitch/trunk/src/mod/applications/mod_voicemail/mod_voicemail.c
==============================================================================
--- (empty file)
+++ freeswitch/trunk/src/mod/applications/mod_voicemail/mod_voicemail.c Thu Oct 11 23:28:59 2007
@@ -0,0 +1,1633 @@
+/*
+ * FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
+ * Copyright (C) 2005/2006, Anthony Minessale II <anthmct(a)yahoo.com>
+ *
+ * Version: MPL 1.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
+ *
+ * The Initial Developer of the Original Code is
+ * Anthony Minessale II <anthmct(a)yahoo.com>
+ * Portions created by the Initial Developer are Copyright (C)
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ *
+ * Anthony Minessale II <anthmct(a)yahoo.com>
+ *
+ *
+ * mod_voicemail.c -- Voicemail Module
+ *
+ */
+#include <switch.h>
+
+#ifdef SWITCH_HAVE_ODBC
+#include <switch_odbc.h>
+#endif
+
+
+#define TRY_CODE(code) do {status = code; if (status != SWITCH_STATUS_SUCCESS && status != SWITCH_STATUS_BREAK) { goto end; } break;} while(status)
+
+SWITCH_MODULE_LOAD_FUNCTION(mod_voicemail_load);
+SWITCH_MODULE_DEFINITION(mod_voicemail, mod_voicemail_load, NULL, NULL);
+
+static struct {
+ switch_hash_t *profile_hash;
+ int debug;
+ switch_memory_pool_t *pool;
+} globals;
+
+struct vm_profile {
+ char *name;
+ char *dbname;
+ char *odbc_dsn;
+ char *odbc_user;
+ char *odbc_pass;
+ char terminator_key[2];
+ char play_new_messages_key[2];
+ char play_saved_messages_key[2];
+ char save_message_key[2];
+ char delete_message_key[2];
+ char replay_message_key[2];
+
+ char main_menu_key[2];
+ char config_menu_key[2];
+ char record_greeting_key[2];
+ char choose_greeting_key[2];
+ char record_name_key[2];
+
+ char record_file_key[2];
+ char listen_file_key[2];
+ char save_file_key[2];
+ char delete_file_key[2];
+ char undelete_file_key[2];
+ char *tone_spec;
+ uint32_t digit_timeout;
+ uint32_t max_login_attempts;
+ uint32_t max_record_len;
+ switch_mutex_t *mutex;
+#ifdef SWITCH_HAVE_ODBC
+ switch_odbc_handle_t *master_odbc;
+#else
+ void *filler1;
+#endif
+};
+typedef struct vm_profile vm_profile_t;
+
+
+#define B64BUFFLEN 1024
+static const char c64[65] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+
+static int write_buf(int fd, char *buf)
+{
+
+ int len = (int) strlen(buf);
+ if (fd && write(fd, buf, len) != len) {
+ close(fd);
+ return 0;
+ }
+
+ return 1;
+}
+static switch_bool_t vm_email(char *to, char *from, char *headers, char *body, char *file)
+{
+ char *bound = "XXXX_boundary_XXXX";
+ char filename[80], buf[B64BUFFLEN];
+ int fd = 0, ifd = 0;
+ int x = 0, y = 0, bytes = 0, ilen = 0;
+ unsigned int b = 0, l = 0;
+ unsigned char in[B64BUFFLEN];
+ unsigned char out[B64BUFFLEN + 512];
+ char *path = NULL;
+
+ snprintf(filename, 80, "%smail.%ld%04x", SWITCH_GLOBAL_dirs.temp_dir, time(NULL), rand() & 0xffff);
+
+ if ((fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0644))) {
+ if (file) {
+ path = file;
+ if ((ifd = open(path, O_RDONLY)) < 1) {
+ return SWITCH_FALSE;
+ }
+
+ snprintf(buf, B64BUFFLEN, "MIME-Version: 1.0\nContent-Type: multipart/mixed; boundary=\"%s\"\n", bound);
+ if (!write_buf(fd, buf)) {
+ return SWITCH_FALSE;
+ }
+ }
+
+ if (headers && !write_buf(fd, headers))
+ return SWITCH_FALSE;
+
+ if (!write_buf(fd, "\n\n"))
+ return SWITCH_FALSE;
+
+ if (file) {
+ snprintf(buf, B64BUFFLEN, "--%s\nContent-Type: text/plain\n\n", bound);
+ if (!write_buf(fd, buf))
+ return SWITCH_FALSE;
+ }
+
+ if (body) {
+ if (!write_buf(fd, body)) {
+ return SWITCH_FALSE;
+ }
+ }
+
+ if (file) {
+ snprintf(buf, B64BUFFLEN, "\n\n--%s\nContent-Type: application/octet-stream\n"
+ "Content-Transfer-Encoding: base64\n"
+ "Content-Description: Sound attachment.\n" "Content-Disposition: attachment; filename=\"%s\"\n\n", bound, switch_cut_path(file));
+ if (!write_buf(fd, buf))
+ return SWITCH_FALSE;
+
+ while ((ilen = read(ifd, in, B64BUFFLEN))) {
+ for (x = 0; x < ilen; x++) {
+ b = (b << 8) + in[x];
+ l += 8;
+ while (l >= 6) {
+ out[bytes++] = c64[(b >> (l -= 6)) % 64];
+ if (++y != 72)
+ continue;
+ out[bytes++] = '\n';
+ y = 0;
+ }
+ }
+ if (write(fd, &out, bytes) != bytes) {
+ return -1;
+ } else
+ bytes = 0;
+
+ }
+
+ if (l > 0) {
+ out[bytes++] = c64[((b % 16) << (6 - l)) % 64];
+ }
+ if (l != 0)
+ while (l < 6) {
+ out[bytes++] = '=', l += 2;
+ }
+ if (write(fd, &out, bytes) != bytes) {
+ return -1;
+ }
+
+ }
+
+
+
+ if (file) {
+ snprintf(buf, B64BUFFLEN, "\n\n--%s--\n.\n", bound);
+ if (!write_buf(fd, buf))
+ return SWITCH_FALSE;
+ }
+ }
+
+ if (fd) {
+ close(fd);
+ }
+ if (ifd) {
+ close(ifd);
+ }
+ snprintf(buf, B64BUFFLEN, "/bin/cat %s | /usr/sbin/sendmail -tvf \"%s\" %s", filename, from, to);
+ if(system(buf)) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Unable to execute command: %s\n", buf);
+ }
+
+ unlink(filename);
+
+
+ if (file) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Emailed file [%s] to [%s]\n", filename, to);
+ } else {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Emailed data to [%s]\n", to);
+ }
+
+ return SWITCH_TRUE;
+}
+
+static switch_status_t vm_execute_sql(vm_profile_t *profile, char *sql, switch_mutex_t *mutex)
+{
+ switch_core_db_t *db;
+ switch_status_t status = SWITCH_STATUS_SUCCESS;
+
+ if (mutex) {
+ switch_mutex_lock(mutex);
+ }
+
+#ifdef SWITCH_HAVE_ODBC
+ if (profile->odbc_dsn) {
+ SQLHSTMT stmt;
+ if (switch_odbc_handle_exec(profile->master_odbc, sql, &stmt) != SWITCH_ODBC_SUCCESS) {
+ char *err_str;
+ err_str = switch_odbc_handle_get_error(profile->master_odbc, stmt);
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "ERR: [%s]\n[%s]\n", sql, switch_str_nil(err_str));
+ switch_safe_free(err_str);
+ status = SWITCH_STATUS_FALSE;
+ }
+ SQLFreeHandle(SQL_HANDLE_STMT, stmt);
+ } else {
+#endif
+ if (!(db = switch_core_db_open_file(profile->dbname))) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error Opening DB %s\n", profile->dbname);
+ status = SWITCH_STATUS_FALSE;
+ goto end;
+ }
+
+ status = switch_core_db_persistant_execute(db, sql, 25);
+ switch_core_db_close(db);
+
+#ifdef SWITCH_HAVE_ODBC
+ }
+#endif
+
+
+ end:
+ if (mutex) {
+ switch_mutex_unlock(mutex);
+ }
+
+ return status;
+}
+
+
+static switch_bool_t vm_execute_sql_callback(vm_profile_t *profile,
+ switch_mutex_t *mutex,
+ char *sql,
+ switch_core_db_callback_func_t callback,
+ void *pdata)
+{
+ switch_bool_t ret = SWITCH_FALSE;
+ switch_core_db_t *db;
+ char *errmsg = NULL;
+
+ if (mutex) {
+ switch_mutex_lock(mutex);
+ }
+
+
+#ifdef SWITCH_HAVE_ODBC
+ if (profile->odbc_dsn) {
+ switch_odbc_handle_callback_exec(profile->master_odbc, sql, callback, pdata);
+ } else {
+#endif
+
+
+
+ if (!(db = switch_core_db_open_file(profile->dbname))) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error Opening DB %s\n", profile->dbname);
+ goto end;
+ }
+
+
+ switch_core_db_exec(db, sql, callback, pdata, &errmsg);
+
+ if (errmsg) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "SQL ERR: [%s] %s\n", sql, errmsg);
+ free(errmsg);
+ }
+
+ if (db) {
+ switch_core_db_close(db);
+ }
+
+#ifdef SWITCH_HAVE_ODBC
+ }
+#endif
+
+
+ end:
+
+ if (mutex) {
+ switch_mutex_unlock(mutex);
+ }
+
+
+
+ return ret;
+
+}
+
+
+static char vm_sql[] =
+ "CREATE TABLE voicemail_data (\n"
+ " created_epoch INTEGER(8),\n"
+ " read_epoch INTEGER(8),\n"
+ " user VARCHAR(255),\n"
+ " domain VARCHAR(255),\n"
+ " uuid VARCHAR(255),\n"
+ " cid_name VARCHAR(255),\n"
+ " cid_number VARCHAR(255),\n"
+ " in_folder VARCHAR(255),\n"
+ " file_path VARCHAR(255),\n"
+ " flags VARCHAR(255)\n"
+ ");\n";
+
+
+static char vm_pref_sql[] =
+ "CREATE TABLE voicemail_prefs (\n"
+ " user VARCHAR(255),\n"
+ " domain VARCHAR(255),\n"
+ " name_path VARCHAR(255),\n"
+ " greeting_path VARCHAR(255)\n"
+ ");\n";
+
+
+
+
+static switch_status_t load_config(void)
+{
+ char *cf = "voicemail.conf";
+ vm_profile_t *profile = NULL;
+ switch_xml_t cfg, xml, settings, param, x_profile, x_profiles;
+
+ memset(&globals, 0, sizeof(globals));
+ switch_core_new_memory_pool(&globals.pool);
+ switch_core_hash_init(&globals.profile_hash, globals.pool);
+
+ if (!(xml = switch_xml_open_cfg(cf, &cfg, NULL))) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "open of %s failed\n", cf);
+ return SWITCH_STATUS_TERM;
+ }
+
+ if ((settings = switch_xml_child(cfg, "settings"))) {
+ for (param = switch_xml_child(settings, "param"); param; param = param->next) {
+ char *var = (char *) switch_xml_attr_soft(param, "name");
+ char *val = (char *) switch_xml_attr_soft(param, "value");
+
+ if (!strcasecmp(var, "debug")) {
+ globals.debug = atoi(val);
+ }
+ }
+ }
+
+ if (!(x_profiles = switch_xml_child(cfg, "profiles"))) {
+ goto end;
+ }
+
+ for (x_profile = switch_xml_child(x_profiles, "profile"); x_profile; x_profile = x_profile->next) {
+ char *name = (char *) switch_xml_attr_soft(x_profile, "name");
+ char *odbc_dsn = NULL, *odbc_dsn_tmp = NULL, *odbc_user = NULL, *odbc_pass = NULL, *dbname = NULL;
+ char *terminator_key = "#";
+ char *play_new_messages_key = "1";
+ char *play_saved_messages_key = "2";
+ char *save_message_key = "8";
+ char *delete_message_key = "7";
+ char *replay_message_key = "1";
+
+ char *main_menu_key = "0";
+ char *config_menu_key = "5";
+ char *record_greeting_key = "1";
+ char *choose_greeting_key = "2";
+ char *record_name_key = "3";
+
+ char *record_file_key = "3";
+ char *listen_file_key = "1";
+ char *save_file_key = "2";
+ char *delete_file_key = "7";
+ char *undelete_file_key = "8";
+ char *tone_spec = "%(1000, 0, 640)";
+
+ switch_core_db_t *db;
+ uint32_t timeout = 10000, max_login_attempts = 3, max_record_len = 300;
+
+ db = NULL;
+ for (param = switch_xml_child(x_profile, "param"); param; param = param->next) {
+ char *var, *val;
+
+ var = (char *) switch_xml_attr_soft(param, "name");
+ val = (char *) switch_xml_attr_soft(param, "value");
+
+ if (!strcasecmp(var, "terminator-key") && !switch_strlen_zero(val)) {
+ terminator_key = val;
+ } else if (!strcasecmp(var, "play-new-messages-key") && !switch_strlen_zero(val)) {
+ play_new_messages_key = val;
+ } else if (!strcasecmp(var, "play-saved-messages-key") && !switch_strlen_zero(val)) {
+ play_saved_messages_key = val;
+ } else if (!strcasecmp(var, "save-message-key") && !switch_strlen_zero(val)) {
+ save_message_key = val;
+ } else if (!strcasecmp(var, "delete-message-key") && !switch_strlen_zero(val)) {
+ delete_message_key = val;
+ } else if (!strcasecmp(var, "replay-message-key") && !switch_strlen_zero(val)) {
+ replay_message_key = val;
+ } else if (!strcasecmp(var, "main-menu-key") && !switch_strlen_zero(val)) {
+ main_menu_key = val;
+ } else if (!strcasecmp(var, "config-menu-key") && !switch_strlen_zero(val)) {
+ config_menu_key = val;
+ } else if (!strcasecmp(var, "record-greeting-key") && !switch_strlen_zero(val)) {
+ record_greeting_key = val;
+ } else if (!strcasecmp(var, "choose-greeting-key") && !switch_strlen_zero(val)) {
+ choose_greeting_key = val;
+ } else if (!strcasecmp(var, "record-name-key") && !switch_strlen_zero(val)) {
+ record_name_key = val;
+ } else if (!strcasecmp(var, "listen-file-key") && !switch_strlen_zero(val)) {
+ listen_file_key = val;
+ } else if (!strcasecmp(var, "save-file-key") && !switch_strlen_zero(val)) {
+ save_file_key = val;
+ } else if (!strcasecmp(var, "delete-file-key") && !switch_strlen_zero(val)) {
+ delete_file_key = val;
+ } else if (!strcasecmp(var, "undelete-file-key") && !switch_strlen_zero(val)) {
+ undelete_file_key = val;
+ } else if (!strcasecmp(var, "tone-spec")) {
+ tone_spec = val;
+ } else if (!strcasecmp(var, "digit-timeout")) {
+ int tmp = 0;
+ if (!switch_strlen_zero(val)) {
+ tmp = atoi(val);
+ }
+ if (tmp >= 1000 && tmp <= 30000) {
+ timeout = tmp;
+ } else {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "invalid timeout value [%s] must be between 1000 and 30000 ms\n", val);
+ }
+ } else if (!strcasecmp(var, "max-login-attempts")) {
+ int tmp = 0;
+ if (!switch_strlen_zero(val)) {
+ tmp = atoi(val);
+ }
+ if (tmp > 0 && tmp < 11) {
+ max_login_attempts = tmp;
+ } else {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "invalid attempts [%s] must be between 1 and 10 ms\n", val);
+ }
+ } else if (!strcasecmp(var, "max-record-len")) {
+ int tmp = 0;
+ if (!switch_strlen_zero(val)) {
+ tmp = atoi(val);
+ }
+ if (tmp > 0 && tmp < 10000) {
+ max_record_len = tmp;
+ } else {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "invalid attempts [%s] must be between 1 and 10000s\n", val);
+ }
+ } else if (!strcasecmp(var, "odbc-dsn")) {
+#ifdef SWITCH_HAVE_ODBC
+ odbc_dsn_tmp = val;
+ odbc_dsn = strdup(val);
+
+ if ((odbc_user = strchr(odbc_dsn, ':'))) {
+ *odbc_user++ = '\0';
+ }
+
+ if ((odbc_pass = strchr(odbc_user, ':'))) {
+ *odbc_pass++ = '\0';
+ }
+#else
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "ODBC IS NOT AVAILABLE!\n");
+#endif
+ }
+ }
+
+ if (switch_strlen_zero(name)) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "No name specified.\n");
+ } else {
+ profile = switch_core_alloc(globals.pool, sizeof(*profile));
+ profile->name = switch_core_strdup(globals.pool, name);
+
+ if (!switch_strlen_zero(odbc_dsn) && !switch_strlen_zero(odbc_user) && !switch_strlen_zero(odbc_pass)) {
+ profile->odbc_dsn = switch_core_strdup(globals.pool, odbc_dsn_tmp);
+ profile->odbc_user = switch_core_strdup(globals.pool, odbc_user);
+ profile->odbc_pass = switch_core_strdup(globals.pool, odbc_pass);
+ } else {
+ profile->dbname = switch_core_sprintf(globals.pool, "voicemail_%s", name);
+ }
+#ifdef SWITCH_HAVE_ODBC
+ if (profile->odbc_dsn) {
+ if (!(profile->master_odbc = switch_odbc_handle_new(profile->odbc_dsn, profile->odbc_user, profile->odbc_pass))) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Cannot Open ODBC Database!\n");
+ continue;
+
+ }
+ if (switch_odbc_handle_connect(profile->master_odbc) != SWITCH_ODBC_SUCCESS) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Cannot Open ODBC Database!\n");
+ continue;
+ }
+
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Connected ODBC DSN: %s\n", profile->odbc_dsn);
+ switch_odbc_handle_exec(profile->master_odbc, vm_sql, NULL);
+ switch_odbc_handle_exec(profile->master_odbc, vm_pref_sql, NULL);
+ } else {
+#endif
+ if ((db = switch_core_db_open_file(profile->dbname))) {
+ switch_core_db_test_reactive(db, "select * from voicemail_data", vm_sql);
+ switch_core_db_test_reactive(db, "select * from voicemail_prefs", vm_pref_sql);
+ } else {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Cannot Open SQL Database!\n");
+ continue;
+ }
+ switch_core_db_close(db);
+#ifdef SWITCH_HAVE_ODBC
+ }
+#endif
+ profile->digit_timeout = timeout;
+ profile->max_login_attempts = max_login_attempts;
+ profile->max_record_len = max_record_len;
+ *profile->terminator_key = *terminator_key;
+ *profile->play_new_messages_key = *play_new_messages_key;
+ *profile->play_saved_messages_key = *play_saved_messages_key;
+ *profile->save_message_key = *save_message_key;
+ *profile->delete_message_key = *delete_message_key;
+ *profile->replay_message_key = *replay_message_key;
+ *profile->main_menu_key = *main_menu_key;
+ *profile->config_menu_key = *config_menu_key;
+ *profile->record_greeting_key = *record_greeting_key;
+ *profile->choose_greeting_key = *choose_greeting_key;
+ *profile->record_name_key = *record_name_key;
+ *profile->record_file_key = *record_file_key;
+ *profile->listen_file_key = *listen_file_key;
+ *profile->save_file_key = *save_file_key;
+ *profile->delete_file_key = *delete_file_key;
+ *profile->undelete_file_key = *undelete_file_key;
+ profile->tone_spec = switch_core_strdup(globals.pool, tone_spec);
+
+ switch_mutex_init(&profile->mutex, SWITCH_MUTEX_NESTED, globals.pool);
+
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Added Profile %s\n", profile->name);
+ switch_core_hash_insert(globals.profile_hash, profile->name, profile);
+
+ }
+
+
+
+ switch_safe_free(odbc_dsn);
+ switch_safe_free(dbname);
+
+ }
+
+ end:
+
+ switch_xml_free(xml);
+
+ return SWITCH_STATUS_SUCCESS;
+}
+
+
+static switch_status_t cancel_on_dtmf(switch_core_session_t *session, void *input, switch_input_type_t itype, void *buf, unsigned int buflen)
+{
+
+
+ switch (itype) {
+ case SWITCH_INPUT_TYPE_DTMF:
+ {
+ char *dtmf = (char *) input;
+ if (buf && buflen) {
+ switch_copy_string(buf, dtmf, buflen);
+ }
+ return SWITCH_STATUS_BREAK;
+ }
+ break;
+ default:
+ break;
+ }
+
+ return SWITCH_STATUS_SUCCESS;
+}
+
+
+static switch_status_t control_playback(switch_core_session_t *session, void *input, switch_input_type_t itype, void *buf, unsigned int buflen)
+{
+
+
+ switch (itype) {
+ case SWITCH_INPUT_TYPE_DTMF:
+ {
+ char *dtmf = (char *) input;
+ switch_file_handle_t *fh = (switch_file_handle_t *) buf;
+ uint32_t pos = 0;
+
+ switch(*dtmf) {
+ case '0':
+ {
+ if (switch_test_flag(fh, SWITCH_FILE_PAUSE)) {
+ switch_clear_flag(fh, SWITCH_FILE_PAUSE);
+ } else {
+ switch_set_flag(fh, SWITCH_FILE_PAUSE);
+ }
+ return SWITCH_STATUS_SUCCESS;
+ }
+ break;
+ case '1':
+ {
+ unsigned int pos = 0;
+ fh->speed = 0;
+ switch_core_file_seek(fh, &pos, 0, SEEK_SET);
+ return SWITCH_STATUS_SUCCESS;
+ }
+ break;
+ case '6':
+ {
+ int samps = 24000;
+ switch_core_file_seek(fh, &pos, samps, SEEK_CUR);
+ return SWITCH_STATUS_SUCCESS;
+ }
+ break;
+ case '4':
+ {
+ int samps = 24000;
+ switch_core_file_seek(fh, &pos, fh->pos - samps, SEEK_SET);
+ return SWITCH_STATUS_SUCCESS;
+ }
+ break;
+ case '#':
+ return SWITCH_STATUS_BREAK;
+
+ default:
+ return SWITCH_STATUS_SUCCESS;
+ }
+ }
+ break;
+ default:
+ break;
+ }
+
+ return SWITCH_STATUS_SUCCESS;
+}
+
+struct prefs_callback {
+ char name_path[255];
+ char greeting_path[255];
+};
+typedef struct prefs_callback prefs_callback_t;
+
+static int prefs_callback(void *pArg, int argc, char **argv, char **columnNames)
+{
+ prefs_callback_t *cbt = (prefs_callback_t *) pArg;
+
+ switch_copy_string(cbt->name_path, argv[2], sizeof(cbt->name_path));
+ switch_copy_string(cbt->greeting_path, argv[3], sizeof(cbt->greeting_path));
+
+ return 0;
+}
+
+
+typedef enum {
+ VM_CHECK_START,
+ VM_CHECK_AUTH,
+ VM_CHECK_MENU,
+ VM_CHECK_CONFIG,
+ VM_CHECK_PLAY_MESSAGES,
+ VM_CHECK_FOLDER_SUMMARY,
+ VM_CHECK_LISTEN
+} vm_check_state_t;
+
+
+#define VM_ACK_MACRO "voicemail_ack"
+#define VM_SAY_DATE_MACRO "voicemail_say_date"
+#define VM_PLAY_GREETING_MACRO "voicemail_play_greeting"
+#define VM_SAY_MESSAGE_NUMBER_MACRO "voicemail_say_message_number"
+#define VM_SAY_NUMBER_MACRO "voicemail_say_number"
+#define VM_SAY_PHONE_NUMBER_MACRO "voicemail_say_phone_number"
+#define VM_SAY_NAME_MACRO "voicemail_say_name"
+
+#define VM_RECORD_MESSAGE_MACRO "voicemail_record_message"
+#define VM_CHOOSE_GREETING_MACRO "voicemail_choose_greeting"
+#define VM_CHOOSE_GREETING_FAIL_MACRO "voicemail_choose_greeting_fail"
+#define VM_CHOOSE_GREETING_SELECTED_MACRO "voicemail_greeting_selected"
+#define VM_RECORD_GREETING_MACRO "voicemail_record_greeting"
+#define VM_RECORD_NAME_MACRO "voicemail_record_name"
+#define VM_LISTEN_FILE_CHECK_MACRO "voicemail_listen_file_check"
+#define VM_RECORD_FILE_CHECK_MACRO "voicemail_record_file_check"
+#define VM_MENU_MACRO "voicemail_menu"
+#define VM_CONFIG_MENU_MACRO "voicemail_config_menu"
+#define VM_ENTER_ID_MACRO "voicemail_enter_id"
+#define VM_ENTER_PASS_MACRO "voicemail_enter_pass"
+#define VM_FAIL_AUTH_MACRO "voicemail_fail_auth"
+#define VM_ABORT_MACRO "voicemail_abort"
+#define VM_HELLO_MACRO "voicemail_hello"
+#define VM_GOODBYE_MACRO "voicemail_goodbye"
+#define VM_NEW_MESSAGE_COUNT_MACRO "voicemail_new_message_count"
+#define VM_SAVED_MESSAGE_COUNT_MACRO "voicemail_saved_message_count"
+
+
+static switch_status_t vm_macro_get(switch_core_session_t *session,
+ char *macro,
+ char *macro_arg,
+ char *buf,
+ switch_size_t buflen,
+ switch_size_t maxlen,
+ char *term_chars,
+ char *terminator_key,
+ uint32_t timeout)
+{
+ switch_input_args_t args = { 0 }, *ap = NULL;
+ switch_channel_t *channel;
+ switch_status_t status = SWITCH_STATUS_SUCCESS;
+ switch_size_t bslen;
+
+ channel = switch_core_session_get_channel(session);
+ assert(channel != NULL);
+
+ if (buf && buflen) {
+ *buf = '\0';
+ args.input_callback = cancel_on_dtmf;
+ args.buf = buf;
+ args.buflen = sizeof(buf);
+ ap = &args;
+ }
+
+ status = switch_ivr_phrase_macro(session, macro, macro_arg, NULL, ap);
+
+ if (status != SWITCH_STATUS_SUCCESS && status != SWITCH_STATUS_BREAK) {
+ if (buf) {
+ memset(buf, 0, buflen);
+ }
+ return status;
+ }
+
+ if (!buf) {
+ return status;
+ }
+
+ bslen = strlen(buf);
+
+ if (maxlen == 0 || maxlen > buflen - 1) {
+ maxlen = buflen -1;
+ }
+ if (bslen < maxlen) {
+ status = switch_ivr_collect_digits_count(session, buf + bslen, buflen, maxlen - bslen, term_chars, terminator_key, timeout);
+ }
+
+ return status;
+}
+
+struct callback {
+ char *buf;
+ size_t len;
+ int matches;
+};
+typedef struct callback callback_t;
+
+static int sql2str_callback(void *pArg, int argc, char **argv, char **columnNames)
+{
+ callback_t *cbt = (callback_t *) pArg;
+
+ switch_copy_string(cbt->buf, argv[0], cbt->len);
+ cbt->matches++;
+ return 0;
+}
+
+
+static int unlink_callback(void *pArg, int argc, char **argv, char **columnNames)
+{
+ if (argv[0]) {
+ unlink(argv[0]);
+ }
+ return 0;
+}
+
+
+typedef enum {
+ MSG_NONE,
+ MSG_NEW,
+ MSG_SAVED
+} msg_type_t;
+
+static uint32_t DEFAULT_DIR_PERMS = SWITCH_FPROT_UREAD | SWITCH_FPROT_UWRITE | SWITCH_FPROT_UEXECUTE | SWITCH_FPROT_GREAD | SWITCH_FPROT_GEXECUTE;
+
+
+static switch_status_t create_file(switch_core_session_t *session, vm_profile_t *profile, char *macro_name, char *file_path)
+{
+ switch_channel_t *channel;
+ switch_status_t status = SWITCH_STATUS_SUCCESS;
+ switch_file_handle_t fh = { 0 };
+ switch_input_args_t args = { 0 };
+ char term;
+ char input[10] = "" , key_buf[80] = "";
+
+ channel = switch_core_session_get_channel(session);
+ assert(channel != NULL);
+
+
+ while(switch_channel_ready(channel)) {
+
+
+ switch_channel_set_variable(channel, "RECORD_COMMENT", macro_name);
+
+
+
+
+
+ snprintf(key_buf, sizeof(key_buf), "%s:%s:%s",
+ profile->listen_file_key,
+ profile->save_file_key,
+ profile->record_file_key);
+
+
+ record_file:
+ 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));
+
+ memset(&fh, 0, sizeof(fh));
+ fh.thresh = 200;
+ fh.silence_hits = 2;
+
+
+ switch_ivr_record_file(session, &fh, file_path, &args, profile->max_record_len);
+ status = SWITCH_STATUS_SUCCESS;
+
+ play_file:
+ memset(&fh, 0, sizeof(fh));
+ args.input_callback = control_playback;
+ args.buf = &fh;
+ switch_ivr_play_file(session, &fh, file_path, &args);
+
+
+ while(switch_channel_ready(channel)) {
+ status = vm_macro_get(session, VM_RECORD_FILE_CHECK_MACRO,
+ key_buf, input, sizeof(input), 1, profile->terminator_key, &term, profile->digit_timeout);
+
+ if (!strcmp(input, profile->listen_file_key)) {
+ goto play_file;
+ } 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));
+ goto end;
+ }
+ }
+ }
+
+ end:
+
+ return status;
+}
+
+
+struct listen_callback {
+ char created_epoch[255];
+ char read_epoch[255];
+ char user[255];
+ char domain[255];
+ char uuid[255];
+ char cid_name[255];
+ char cid_number[255];
+ char in_folder[255];
+ char file_path[255];
+ char flags[255];
+ int index;
+ int want;
+ msg_type_t type;
+};
+typedef struct listen_callback listen_callback_t;
+
+static int listen_callback(void *pArg, int argc, char **argv, char **columnNames)
+{
+ listen_callback_t *cbt = (listen_callback_t *) pArg;
+
+ if (cbt->index++ != cbt->want) {
+ return 0;
+ }
+
+ switch_copy_string(cbt->created_epoch, argv[0], 255);
+ switch_copy_string(cbt->read_epoch, argv[1], 255);
+ switch_copy_string(cbt->user, argv[2], 255);
+ switch_copy_string(cbt->domain, argv[3], 255);
+ switch_copy_string(cbt->uuid, argv[4], 255);
+ switch_copy_string(cbt->cid_name, argv[5], 255);
+ switch_copy_string(cbt->cid_number, argv[6], 255);
+ switch_copy_string(cbt->in_folder, argv[7], 255);
+ switch_copy_string(cbt->file_path, argv[8], 255);
+ switch_copy_string(cbt->flags, argv[9], 255);
+
+
+ return -1;
+}
+
+
+static switch_status_t listen_file(switch_core_session_t *session, vm_profile_t *profile, listen_callback_t *cbt)
+{
+ switch_channel_t *channel;
+ switch_status_t status = SWITCH_STATUS_SUCCESS;
+ switch_input_args_t args = { 0 };
+ char term;
+ char input[10] = "" , key_buf[80] = "";
+ switch_file_handle_t fh = { 0 };
+ channel = switch_core_session_get_channel(session);
+ assert(channel != NULL);
+
+
+ if(switch_channel_ready(channel)) {
+
+ args.input_callback = cancel_on_dtmf;
+
+
+ snprintf(key_buf, sizeof(key_buf), "%s:%s:%s:%s",
+ profile->listen_file_key,
+ profile->save_file_key,
+ profile->delete_file_key,
+ profile->undelete_file_key);
+
+
+ snprintf(input, sizeof(input), "%s:%d", cbt->type == MSG_NEW ? "new" : "saved", cbt->index);
+ TRY_CODE(switch_ivr_phrase_macro(session, VM_SAY_MESSAGE_NUMBER_MACRO, input, NULL, NULL));
+ TRY_CODE(switch_ivr_phrase_macro(session, VM_SAY_DATE_MACRO, cbt->created_epoch, NULL, NULL));
+ play_file:
+
+ memset(&fh, 0, sizeof(fh));
+ args.input_callback = control_playback;
+ args.buf = &fh;
+ TRY_CODE(switch_ivr_play_file(session, NULL, cbt->file_path, &args));
+
+ if (switch_channel_ready(channel)) {
+ status = vm_macro_get(session, VM_LISTEN_FILE_CHECK_MACRO,
+ key_buf, input, sizeof(input), 1, profile->terminator_key, &term, profile->digit_timeout);
+
+ if (!strcmp(input, profile->listen_file_key)) {
+ goto play_file;
+ } else if (!strcmp(input, profile->delete_file_key)) {
+ char *sql = switch_mprintf("update voicemail_data set flags='delete' where uuid='%s'", cbt->uuid);
+ vm_execute_sql(profile, sql, profile->mutex);
+ switch_safe_free(sql);
+ TRY_CODE(switch_ivr_phrase_macro(session, VM_ACK_MACRO, "deleted", NULL, NULL));
+ } else {
+ char *sql = switch_mprintf("update voicemail_data set flags='save' where uuid='%s'", cbt->uuid);
+ vm_execute_sql(profile, sql, profile->mutex);
+ switch_safe_free(sql);
+ TRY_CODE(switch_ivr_phrase_macro(session, VM_ACK_MACRO, "saved", NULL, NULL));
+ }
+ }
+ }
+
+ end:
+
+ return status;
+}
+
+static void message_count(vm_profile_t *profile, char *myid, char *domain_name, char *myfolder, int *total_new_messages, int *total_saved_messages)
+{
+ char msg_count[80] = "";
+ callback_t cbt = { 0 };
+ char sql[128];
+
+ cbt.buf = msg_count;
+ cbt.len = sizeof(msg_count);
+
+
+ snprintf(sql, sizeof(sql),
+ "select count(*) from voicemail_data where user='%s' and domain='%s' and in_folder='%s' and read_epoch=0",
+ myid,
+ domain_name,
+ myfolder);
+ vm_execute_sql_callback(profile, profile->mutex, sql, sql2str_callback, &cbt);
+ *total_new_messages = atoi(msg_count);
+
+ snprintf(sql, sizeof(sql),
+ "select count(*) from voicemail_data where user='%s' and domain='%s' and in_folder='%s' and read_epoch!=0",
+ myid,
+ domain_name,
+ myfolder);
+ vm_execute_sql_callback(profile, profile->mutex, sql, sql2str_callback, &cbt);
+ *total_saved_messages = atoi(msg_count);
+}
+
+
+static void voicemail_check_main(switch_core_session_t *session, char *profile_name, char *domain_name, char *id, int auth)
+{
+ vm_check_state_t vm_check_state = VM_CHECK_START;
+ switch_channel_t *channel;
+ vm_profile_t *profile;
+ switch_xml_t x_domain, x_domain_root, x_user, x_params, x_param;
+ switch_status_t status;
+ char pass_buf[80] = "", *mypass = NULL, id_buf[80] = "", *myid = id, *myfolder = NULL;
+ const char *thepass = NULL;
+ char term = 0;
+ uint32_t timeout, attempts = 0;
+ int failed = 0;
+ msg_type_t play_msg_type = MSG_NONE;
+ char *dir_path = NULL, *file_path = NULL;
+ int total_new_messages = 0;
+ int total_saved_messages = 0;
+ int heard_auto_saved = 0, heard_auto_new = 0;
+
+ channel = switch_core_session_get_channel(session);
+ assert(channel != NULL);
+
+
+ if (!(profile = switch_core_hash_find(globals.profile_hash, profile_name))) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error invalid profile %s", profile_name);
+ return;
+ }
+
+ x_user = x_domain = x_domain_root = NULL;
+
+ timeout = profile->digit_timeout;
+ attempts = profile->max_login_attempts;
+
+ status = switch_ivr_phrase_macro(session, VM_HELLO_MACRO, NULL, NULL, NULL);
+
+ while(switch_channel_ready(channel)) {
+
+ switch_ivr_sleep(session, 100);
+
+ switch(vm_check_state) {
+ case VM_CHECK_START:
+ {
+ total_new_messages = 0;
+ total_saved_messages = 0;
+ heard_auto_saved = 0;
+ heard_auto_new = 0;
+ play_msg_type = MSG_NONE;
+ attempts = profile->max_login_attempts;
+ myid = id;
+ mypass = NULL;
+ myfolder = "inbox";
+ vm_check_state = VM_CHECK_AUTH;
+ if (x_domain_root) {
+ switch_xml_free(x_domain_root);
+ }
+ x_user = x_domain = x_domain_root = NULL;
+ }
+ break;
+ case VM_CHECK_FOLDER_SUMMARY:
+ {
+ char msg_count[80] = "";
+ switch_channel_set_variable(channel, "voicemail_current_folder", myfolder);
+ message_count(profile, myid, domain_name, myfolder, &total_new_messages, &total_saved_messages);
+ snprintf(msg_count, sizeof(msg_count), "%d", total_new_messages);
+ if ((status = switch_ivr_phrase_macro(session, VM_NEW_MESSAGE_COUNT_MACRO, msg_count, NULL, NULL)) != SWITCH_STATUS_SUCCESS) {
+ goto end;
+ }
+
+ if (!heard_auto_new && total_new_messages > 0) {
+ heard_auto_new = 1;
+ play_msg_type = MSG_NEW;
+ vm_check_state = VM_CHECK_PLAY_MESSAGES;
+ continue;
+ }
+
+ snprintf(msg_count, sizeof(msg_count), "%d", total_saved_messages);
+ if ((status = switch_ivr_phrase_macro(session, VM_SAVED_MESSAGE_COUNT_MACRO, msg_count, NULL, NULL)) != SWITCH_STATUS_SUCCESS) {
+ goto end;
+ }
+
+ if (!heard_auto_saved && total_saved_messages > 0) {
+ heard_auto_saved = 1;
+ play_msg_type = MSG_SAVED;
+ vm_check_state = VM_CHECK_PLAY_MESSAGES;
+ continue;
+ }
+
+ vm_check_state = VM_CHECK_MENU;
+ }
+ break;
+ case VM_CHECK_PLAY_MESSAGES:
+ {
+ listen_callback_t cbt;
+ char sql[128];
+ int cur_message, total_messages;
+ message_count(profile, myid, domain_name, myfolder, &total_new_messages, &total_saved_messages);
+ memset(&cbt, 0, sizeof(cbt));
+ switch(play_msg_type) {
+ case MSG_NEW:
+ {
+ snprintf(sql, sizeof(sql),
+ "select * from voicemail_data where user='%s' and domain='%s' and read_epoch=0", myid, domain_name);
+ total_messages = total_new_messages;
+ heard_auto_new = heard_auto_saved = 1;
+ }
+ break;
+ case MSG_SAVED:
+ default:
+ {
+ snprintf(sql, sizeof(sql),
+ "select * from voicemail_data where user='%s' and domain='%s' and read_epoch!=0", myid, domain_name);
+ total_messages = total_saved_messages;
+ heard_auto_new = heard_auto_saved = 1;
+ }
+ break;
+ }
+ for (cur_message = 0; cur_message < total_messages; cur_message++) {
+ cbt.index = 0;
+ cbt.want = cur_message;
+ cbt.type = play_msg_type;
+ vm_execute_sql_callback(profile, profile->mutex, sql, listen_callback, &cbt);
+ status = listen_file(session, profile, &cbt);
+ if (status != SWITCH_STATUS_SUCCESS && status != SWITCH_STATUS_BREAK) {
+ break;
+ }
+ }
+ snprintf(sql, sizeof(sql), "update voicemail_data set read_epoch=%ld where user='%s' and domain='%s' and flags='save'",
+ (long)time(NULL), myid, domain_name);
+ vm_execute_sql(profile, sql, profile->mutex);
+ snprintf(sql, sizeof(sql), "select file_path from voicemail_data where user='%s' and domain='%s' and flags='delete'", myid, domain_name);
+ vm_execute_sql_callback(profile, profile->mutex, sql, unlink_callback, NULL);
+ snprintf(sql, sizeof(sql), "delete from voicemail_data where user='%s' and domain='%s' and flags='delete'", myid, domain_name);
+ vm_execute_sql(profile, sql, profile->mutex);
+ vm_check_state = VM_CHECK_FOLDER_SUMMARY;
+ }
+ break;
+ case VM_CHECK_CONFIG:
+ {
+ char *sql = NULL;
+ char input[10] = "";
+ char key_buf[80] = "";
+ callback_t cbt = { 0 };
+ char msg_count[80] = "";
+ cbt.buf = msg_count;
+ cbt.len = sizeof(msg_count);
+ sql = switch_mprintf("select count(*) from voicemail_prefs where user='%q' and domain = '%q'", myid, domain_name);
+ vm_execute_sql_callback(profile, profile->mutex, sql, sql2str_callback, &cbt);
+ switch_safe_free(sql);
+ if (switch_strlen_zero(msg_count) || !atoi(msg_count)) {
+ sql = switch_mprintf("insert into voicemail_prefs values('%q','%q','','')", myid, domain_name);
+ vm_execute_sql(profile, sql, profile->mutex);
+ switch_safe_free(sql);
+ }
+
+ snprintf(key_buf, sizeof(key_buf), "%s:%s:%s:%s",
+ profile->record_greeting_key,
+ profile->choose_greeting_key,
+ profile->record_name_key,
+ profile->main_menu_key);
+
+
+ TRY_CODE(vm_macro_get(session, VM_CONFIG_MENU_MACRO, key_buf, input, sizeof(input), 1,
+ profile->terminator_key, &term, timeout));
+ if (status != SWITCH_STATUS_SUCCESS && status != SWITCH_STATUS_BREAK) {
+ goto end;
+ }
+
+ if (!strcmp(input, profile->main_menu_key)) {
+ vm_check_state = VM_CHECK_MENU;
+ } else if (!strcmp(input, profile->choose_greeting_key)) {
+ int num;
+ switch_input_args_t args = { 0 };
+ args.input_callback = cancel_on_dtmf;
+
+ TRY_CODE(vm_macro_get(session, VM_CHOOSE_GREETING_MACRO, key_buf, input, sizeof(input), 1,
+ profile->terminator_key, &term, timeout));
+
+ num = atoi(input);
+ file_path = switch_mprintf("%s%sgreeting_%d.wav", dir_path, SWITCH_PATH_SEPARATOR, num);
+ if (num < 1 || num > 3) {
+ status = SWITCH_STATUS_FALSE;
+ } else {
+ switch_file_handle_t fh = { 0 };
+ memset(&fh, 0, sizeof(fh));
+ args.input_callback = control_playback;
+ args.buf = &fh;
+ status = switch_ivr_play_file(session, NULL, file_path, &args);
+ }
+ if (status != SWITCH_STATUS_SUCCESS && status != SWITCH_STATUS_BREAK) {
+ TRY_CODE(switch_ivr_phrase_macro(session, VM_CHOOSE_GREETING_FAIL_MACRO, NULL, NULL, NULL));
+ } else {
+ TRY_CODE(switch_ivr_phrase_macro(session, VM_CHOOSE_GREETING_SELECTED_MACRO, input, NULL, NULL));
+ sql = switch_mprintf("update voicemail_prefs set greeting_path='%s' where user='%s' and domain='%s'", file_path, myid, domain_name);
+ vm_execute_sql(profile, sql, profile->mutex);
+ switch_safe_free(sql);
+ }
+ switch_safe_free(file_path);
+ } else if (!strcmp(input, profile->record_greeting_key)) {
+ int num;
+ TRY_CODE(vm_macro_get(session, VM_CHOOSE_GREETING_MACRO, key_buf, input, sizeof(input), 1,
+ profile->terminator_key, &term, timeout));
+
+ num = atoi(input);
+ if (num < 1 || num > 3) {
+ TRY_CODE(switch_ivr_phrase_macro(session, VM_CHOOSE_GREETING_FAIL_MACRO, NULL, NULL, NULL));
+ } else {
+ file_path = switch_mprintf("%s%sgreeting_%d.wav", dir_path, SWITCH_PATH_SEPARATOR, num);
+ TRY_CODE(create_file(session, profile, VM_RECORD_GREETING_MACRO, file_path));
+ sql = switch_mprintf("update voicemail_prefs set greeting_path='%s' where user='%s' and domain='%s'", file_path, myid, domain_name);
+ vm_execute_sql(profile, sql, profile->mutex);
+ switch_safe_free(sql);
+ switch_safe_free(file_path);
+ }
+
+ } else if (!strcmp(input, profile->record_name_key)) {
+ file_path = switch_mprintf("%s%srecorded_name.wav", dir_path, SWITCH_PATH_SEPARATOR);
+ TRY_CODE(create_file(session, profile, VM_RECORD_NAME_MACRO, file_path));
+ sql = switch_mprintf("update voicemail_prefs set name_path='%s' where user='%s' and domain='%s'", file_path, myid, domain_name);
+ vm_execute_sql(profile, sql, profile->mutex);
+ switch_safe_free(file_path);
+ switch_safe_free(sql);
+ }
+
+ continue;
+ }
+ break;
+ case VM_CHECK_MENU:
+ {
+ char input[10] = "";
+ char key_buf[80] = "";
+ play_msg_type = MSG_NONE;
+
+ snprintf(key_buf, sizeof(key_buf), "%s:%s:%s",
+ profile->play_new_messages_key,
+ profile->play_saved_messages_key,
+ profile->config_menu_key);
+
+ status = vm_macro_get(session, VM_MENU_MACRO, key_buf, input, sizeof(input), 1,
+ profile->terminator_key, &term, timeout);
+ if (status != SWITCH_STATUS_SUCCESS && status != SWITCH_STATUS_BREAK) {
+ goto end;
+ }
+
+ if (!strcmp(input, profile->play_new_messages_key)) {
+ play_msg_type = MSG_NEW;
+ } else if (!strcmp(input, profile->play_saved_messages_key)) {
+ play_msg_type = MSG_SAVED;
+ } else if (!strcmp(input, profile->config_menu_key)) {
+ vm_check_state = VM_CHECK_CONFIG;
+ }
+
+ if (play_msg_type) {
+ vm_check_state = VM_CHECK_PLAY_MESSAGES;
+ }
+
+
+ continue;
+ }
+ break;
+ case VM_CHECK_AUTH:
+ {
+ if (!attempts) {
+ failed = 1;
+ goto end;
+ }
+
+ attempts--;
+
+ if (!myid) {
+ status = vm_macro_get(session, VM_ENTER_ID_MACRO, profile->terminator_key, id_buf, sizeof(id_buf), 0,
+ profile->terminator_key, &term, timeout);
+ if (status != SWITCH_STATUS_SUCCESS) {
+ goto end;
+ }
+
+ if (switch_strlen_zero(id_buf)) {
+ continue;
+ } else {
+ myid = id_buf;
+ }
+ }
+
+ if (!x_user) {
+ int ok = 1;
+ char *xtra = switch_mprintf("mailbox=%s", myid);
+
+ assert(xtra);
+
+ if (switch_xml_locate_user(myid, domain_name, switch_channel_get_variable(channel, "network_addr"),
+ &x_domain_root, &x_domain, &x_user, xtra) != SWITCH_STATUS_SUCCESS) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "can't find user [%s@%s]\n", myid, domain_name);
+ ok = 0;
+ }
+
+ switch_safe_free(xtra);
+
+ if (!ok) {
+ goto failed;
+ }
+ }
+
+ if (!mypass) {
+ if (auth) {
+ mypass = "OK";
+ } else {
+ status = vm_macro_get(session, VM_ENTER_PASS_MACRO, profile->terminator_key,
+ pass_buf, sizeof(pass_buf), 0, profile->terminator_key, &term, timeout);
+ if (status != SWITCH_STATUS_SUCCESS) {
+ goto end;
+ }
+ if (switch_strlen_zero(pass_buf)) {
+ continue;
+ } else {
+ mypass = pass_buf;
+ }
+ }
+ }
+
+ if (!(x_params = switch_xml_child(x_user, "params"))) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "can't find params for user [%s@%s]\n", myid, domain_name);
+ goto failed;
+ }
+
+ thepass = NULL;
+ for (x_param = switch_xml_child(x_params, "param"); x_param; x_param = x_param->next) {
+ const char *var = switch_xml_attr_soft(x_param, "name");
+ const char *val = switch_xml_attr_soft(x_param, "value");
+
+ if (!strcasecmp(var, "password")) {
+ thepass = val;
+ } else if (!strcasecmp(var, "vm-password")) {
+ thepass = val;
+ }
+ }
+ switch_xml_free(x_domain_root);
+ x_domain_root = NULL;
+
+ if (auth || !thepass || (thepass && mypass && !strcmp(thepass, mypass))) {
+ if (!dir_path) {
+ dir_path = switch_core_session_sprintf(session, "%s%svoicemail%s%s%s%s%s%s", SWITCH_GLOBAL_dirs.storage_dir,
+ SWITCH_PATH_SEPARATOR,
+ SWITCH_PATH_SEPARATOR,
+ profile->name,
+ SWITCH_PATH_SEPARATOR,
+ domain_name,
+ SWITCH_PATH_SEPARATOR,
+ myid);
+
+
+ if (switch_dir_make_recursive(dir_path, DEFAULT_DIR_PERMS, switch_core_session_get_pool(session)) != SWITCH_STATUS_SUCCESS) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error creating %s", dir_path);
+ return;
+ }
+ }
+
+
+ vm_check_state = VM_CHECK_FOLDER_SUMMARY;
+ //vm_check_state = VM_CHECK_MENU;
+ } else {
+ goto failed;
+ }
+
+ continue;
+ failed:
+ status = switch_ivr_phrase_macro(session, VM_FAIL_AUTH_MACRO, NULL, NULL, NULL);
+ myid = id;
+ mypass = NULL;
+ continue;
+ }
+ break;
+ default:
+ break;
+ }
+ }
+
+ end:
+
+ if (switch_channel_ready(channel)) {
+ if (failed) {
+ status = switch_ivr_phrase_macro(session, VM_ABORT_MACRO, NULL, NULL, NULL);
+ }
+ status = switch_ivr_phrase_macro(session, VM_GOODBYE_MACRO, NULL, NULL, NULL);
+ }
+
+ if (x_domain_root) {
+ switch_xml_free(x_domain_root);
+ }
+
+}
+
+
+static switch_status_t voicemail_leave_main(switch_core_session_t *session, char *profile_name, char *domain_name, char *id)
+{
+ switch_channel_t *channel;
+ char *myfolder = "inbox";
+ char sql[128];
+ prefs_callback_t cbt;
+ vm_profile_t *profile;
+ char *uuid = switch_core_session_get_uuid(session);
+ char *file_path = NULL;
+ char *dir_path = NULL;
+ switch_status_t status = SWITCH_STATUS_SUCCESS;
+ switch_caller_profile_t *caller_profile;
+ switch_file_handle_t fh = { 0 };
+ switch_input_args_t args = { 0 };
+ char *email_vm = NULL;
+
+ memset(&cbt, 0, sizeof(cbt));
+ if (!(profile = switch_core_hash_find(globals.profile_hash, profile_name))) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error invalid profile %s", profile_name);
+ return SWITCH_STATUS_FALSE;
+ }
+
+ channel = switch_core_session_get_channel(session);
+ assert(channel != NULL);
+
+ caller_profile = switch_channel_get_caller_profile(channel);
+ dir_path = switch_core_session_sprintf(session, "%s%svoicemail%s%s%s%s%s%s", SWITCH_GLOBAL_dirs.storage_dir,
+ SWITCH_PATH_SEPARATOR,
+ SWITCH_PATH_SEPARATOR,
+ profile->name,
+ SWITCH_PATH_SEPARATOR,
+ domain_name,
+ SWITCH_PATH_SEPARATOR,
+ id);
+ if (switch_dir_make_recursive(dir_path, DEFAULT_DIR_PERMS, switch_core_session_get_pool(session)) != SWITCH_STATUS_SUCCESS) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error creating %s", dir_path);
+ goto end;
+ }
+
+
+ if (id) {
+ int ok = 1;
+ char *xtra = switch_mprintf("mailbox=%s", id);
+ switch_xml_t x_domain, x_domain_root, x_user, x_params, x_param;
+
+ assert(xtra);
+ x_user = x_domain = x_domain_root = NULL;
+ if (switch_xml_locate_user(id, domain_name, switch_channel_get_variable(channel, "network_addr"),
+ &x_domain_root, &x_domain, &x_user, xtra) != SWITCH_STATUS_SUCCESS) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "can't find user [%s@%s]\n", id, domain_name);
+ ok = 0;
+ }
+
+ if ((x_params = switch_xml_child(x_user, "params"))) {
+ for (x_param = switch_xml_child(x_params, "param"); x_param; x_param = x_param->next) {
+ const char *var = switch_xml_attr_soft(x_param, "name");
+ const char *val = switch_xml_attr_soft(x_param, "value");
+
+ if (!strcasecmp(var, "vm-mailto")) {
+ email_vm = switch_core_session_strdup(session, val);
+ }
+ }
+ }
+
+ switch_safe_free(xtra);
+ switch_xml_free(x_domain_root);
+ if (!ok) {
+ goto end;
+ }
+ }
+
+ snprintf(sql, sizeof(sql),
+ "select * from voicemail_prefs where user='%s' and domain='%s'",
+ id,
+ domain_name);
+ vm_execute_sql_callback(profile, profile->mutex, sql, prefs_callback, &cbt);
+
+ file_path = switch_mprintf("%s%smsg_%s.wav", dir_path, SWITCH_PATH_SEPARATOR, uuid);
+
+ memset(&fh, 0, sizeof(fh));
+ args.input_callback = control_playback;
+ args.buf = &fh;
+
+ if (!switch_strlen_zero(cbt.greeting_path)) {
+ TRY_CODE(switch_ivr_play_file(session, NULL, cbt.greeting_path, NULL));
+ } else {
+ if (!switch_strlen_zero(cbt.name_path)) {
+ TRY_CODE(switch_ivr_play_file(session, NULL, cbt.name_path, NULL));
+ }
+ TRY_CODE(switch_ivr_phrase_macro(session, VM_PLAY_GREETING_MACRO, id, NULL, NULL));
+ }
+
+ if(switch_channel_ready(channel)) {
+ char *usql;
+ status = create_file(session, profile, VM_RECORD_MESSAGE_MACRO, file_path);
+ if (status == SWITCH_STATUS_SUCCESS || status == SWITCH_STATUS_BREAK) {
+ usql = switch_mprintf("insert into voicemail_data values(%ld,0,'%q','%q','%q','%q','%q','%q','%q','')", (long)time(NULL),
+ id, domain_name, uuid, caller_profile->caller_id_name, caller_profile->caller_id_number, myfolder, file_path);
+ vm_execute_sql(profile, usql, profile->mutex);
+ switch_safe_free(usql);
+ } else {
+ unlink(file_path);
+ goto end;
+ }
+
+ }
+
+ end:
+
+ if (!switch_strlen_zero(email_vm)) {
+
+ switch_event_t *event;
+ char *from = switch_core_session_sprintf(session, "FreeSWITCH mod_voicemail <%s@%s>", id, domain_name);
+ char *headers = switch_core_session_sprintf(session, "Subject: Voicemail from %s %s",
+ caller_profile->caller_id_name, caller_profile->caller_id_number);
+ char *body;
+
+
+ if (switch_event_create(&event, SWITCH_EVENT_MESSAGE) == SWITCH_STATUS_SUCCESS) {
+ switch_channel_event_set_data(channel, event);
+ switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Message-Type", "voicemail");
+ switch_event_serialize(event, &body);
+ switch_event_fire(&event);
+ } else {
+ body = switch_mprintf("Voicemail from %s %s",
+ caller_profile->caller_id_name, caller_profile->caller_id_number);
+ }
+
+ //TBD add better formatting to the body
+ vm_email(email_vm, from, headers, body, file_path);
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Sending message to %s", email_vm);
+ switch_safe_free(body);
+ }
+
+ switch_safe_free(file_path);
+
+ if (switch_channel_ready(channel)) {
+ status = switch_ivr_phrase_macro(session, VM_GOODBYE_MACRO, NULL, NULL, NULL);
+ }
+
+ return status;
+
+
+}
+
+
+#define VM_DESC "voicemail"
+#define VM_USAGE "[check|auth] <profile_name> <domain_name> [<id>]"
+
+SWITCH_STANDARD_APP(voicemail_function)
+{
+ int argc = 0;
+ char *argv[4] = { 0 };
+ char *mydata = NULL;
+ char *profile_name = NULL;
+ char *domain_name = NULL;
+ char *id = NULL;
+ char *auth_var = NULL;
+ int x = 0, check = 0, auth = 0;
+ switch_channel_t *channel;
+
+ channel = switch_core_session_get_channel(session);
+ assert(channel != NULL);
+
+ if (switch_dir_make_recursive(SWITCH_GLOBAL_dirs.storage_dir, DEFAULT_DIR_PERMS, switch_core_session_get_pool(session)) != SWITCH_STATUS_SUCCESS) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error creating %s", SWITCH_GLOBAL_dirs.storage_dir);
+ return;
+ }
+
+ if (!switch_strlen_zero(data)) {
+ mydata = switch_core_session_strdup(session, data);
+ argc = switch_separate_string(mydata, ' ', argv, (sizeof(argv) / sizeof(argv[0])));
+ }
+
+ if (argv[x] && !strcasecmp(argv[x], "check")) {
+ check++;
+ x++;
+ }
+
+ if (argv[x] && !strcasecmp(argv[x], "auth")) {
+ auth++;
+ x++;
+ }
+
+ if (argv[x]) {
+ profile_name = argv[x++];
+ }
+
+ if (argv[x]) {
+ domain_name = argv[x++];
+ }
+
+ if (argv[x]) {
+ id = argv[x++];
+ }
+
+
+ if ((auth_var = switch_channel_get_variable(channel, "voicemail_authorized")) && switch_true(auth_var)) {
+ auth = 1;
+ }
+
+ if (switch_strlen_zero(profile_name)) {
+ profile_name = switch_channel_get_variable(channel, "voicemail_profile_name");
+ }
+
+ if (switch_strlen_zero(domain_name)) {
+ domain_name = switch_channel_get_variable(channel, "voicemail_domain_name");
+ }
+
+ if (switch_strlen_zero(id)) {
+ id = switch_channel_get_variable(channel, "voicemail_id");
+ }
+
+ if (switch_strlen_zero(profile_name) || switch_strlen_zero(domain_name)) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error Usage: %s\n", VM_USAGE);
+ return;
+ }
+
+ if (check) {
+ voicemail_check_main(session, profile_name, domain_name, id, auth);
+ } else {
+ voicemail_leave_main(session, profile_name, domain_name, id);
+ }
+}
+
+SWITCH_MODULE_LOAD_FUNCTION(mod_voicemail_load)
+{
+ switch_application_interface_t *app_interface;
+ switch_status_t status;
+
+ if ((status = load_config()) != SWITCH_STATUS_SUCCESS) {
+ return status;
+ }
+ /* 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, "voicemail", "Voicemail", VM_DESC, voicemail_function, VM_USAGE, SAF_NONE);
+
+ /* indicate that the module should continue to be loaded */
+ return SWITCH_STATUS_NOUNLOAD;
+}
+
+/* For Emacs:
+ * Local Variables:
+ * mode:c
+ * indent-tabs-mode:nil
+ * tab-width:4
+ * c-basic-offset:4
+ * End:
+ * For VIM:
+ * vim:set softtabstop=4 shiftwidth=4 tabstop=4 expandtab:
+ */
Added: freeswitch/trunk/src/mod/applications/mod_voicemail/mod_voicemail.vcproj
==============================================================================
--- (empty file)
+++ freeswitch/trunk/src/mod/applications/mod_voicemail/mod_voicemail.vcproj Thu Oct 11 23:28:59 2007
@@ -0,0 +1,210 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="8.00"
+ Name="mod_voicemail"
+ ProjectGUID="{C24FB505-05D7-4319-8485-7540B44C8603}"
+ RootNamespace="mod_voicemail"
+ Keyword="Win32Proj"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="$(ConfigurationName)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="2"
+ InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories=""$(InputDir)..\..\..\include";"$(InputDir)include";"$(InputDir)..\..\..\..\libs\include""
+ PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;MOD_EXPORTS"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
+ UsePrecompiledHeader="0"
+ WarningLevel="4"
+ WarnAsError="true"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ OutputFile="$(SolutionDir)$(OutDir)/mod/$(InputName).dll"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="..\..\..\..\w32\vsnet\$(OutDir)"
+ GenerateDebugInformation="true"
+ ProgramDatabaseFile="$(OutDir)$(TargetName).pdb"
+ SubSystem="2"
+ ImportLibrary="$(OutDir)/mod_voicemail.lib"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="$(ConfigurationName)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="2"
+ InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""$(InputDir)..\..\..\include";"$(InputDir)include";"$(InputDir)..\..\..\..\libs\include""
+ PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;MOD_EXPORTS"
+ RuntimeLibrary="2"
+ UsePrecompiledHeader="0"
+ WarningLevel="4"
+ WarnAsError="true"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ OutputFile="$(SolutionDir)$(OutDir)/mod/$(InputName).dll"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="..\..\..\..\w32\vsnet\$(OutDir)"
+ GenerateDebugInformation="true"
+ ProgramDatabaseFile="$(OutDir)$(TargetName).pdb"
+ SubSystem="2"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ ImportLibrary="$(OutDir)/mod_voicemail.lib"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath=".\mod_voicemail.c"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl;inc;xsd"
+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+ >
+ </Filter>
+ <Filter
+ Name="Resource Files"
+ Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
+ UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
+ >
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
Modified: freeswitch/trunk/src/switch_apr.c
==============================================================================
--- freeswitch/trunk/src/switch_apr.c (original)
+++ freeswitch/trunk/src/switch_apr.c Thu Oct 11 23:28:59 2007
@@ -394,6 +394,51 @@
return status;
}
+/* #define SWITCH_FPROT_USETID 0x8000 /\**< Set user id *\/ */
+/* #define SWITCH_FPROT_UREAD 0x0400 /\**< Read by user *\/ */
+/* #define SWITCH_FPROT_UWRITE 0x0200 /\**< Write by user *\/ */
+/* #define SWITCH_FPROT_UEXECUTE 0x0100 /\**< Execute by user *\/ */
+
+/* #define SWITCH_FPROT_GSETID 0x4000 /\**< Set group id *\/ */
+/* #define SWITCH_FPROT_GREAD 0x0040 /\**< Read by group *\/ */
+/* #define SWITCH_FPROT_GWRITE 0x0020 /\**< Write by group *\/ */
+/* #define SWITCH_FPROT_GEXECUTE 0x0010 /\**< Execute by group *\/ */
+
+/* #define SWITCH_FPROT_WSTICKY 0x2000 /\**< Sticky bit *\/ */
+/* #define SWITCH_FPROT_WREAD 0x0004 /\**< Read by others *\/ */
+/* #define SWITCH_FPROT_WWRITE 0x0002 /\**< Write by others *\/ */
+/* #define SWITCH_FPROT_WEXECUTE 0x0001 /\**< Execute by others *\/ */
+
+/* #define SWITCH_FPROT_OS_DEFAULT 0x0FFF /\**< use OS's default permissions *\/ */
+
+
+/**
+ * Create a new directory on the file system.
+ * @param path the path for the directory to be created. (use / on all systems)
+ * @param perm Permissions for the new direcoty.
+ * @param pool the pool to use.
+ */
+SWITCH_DECLARE(switch_status_t) switch_dir_make(const char *path, switch_fileperms_t perm,
+ switch_memory_pool_t *pool)
+{
+ return apr_dir_make(path, perm, pool);
+}
+
+/** Creates a new directory on the file system, but behaves like
+ * 'mkdir -p'. Creates intermediate directories as required. No error
+ * will be reported if PATH already exists.
+ * @param path the path for the directory to be created. (use / on all systems)
+ * @param perm Permissions for the new direcoty.
+ * @param pool the pool to use.
+ */
+SWITCH_DECLARE(switch_status_t) switch_dir_make_recursive(const char *path,
+ switch_fileperms_t perm,
+ switch_memory_pool_t *pool)
+{
+ return apr_dir_make_recursive(path, perm, pool);
+}
+
+
struct switch_dir {
apr_dir_t *dir_handle;
apr_finfo_t finfo;
Modified: freeswitch/trunk/src/switch_core.c
==============================================================================
--- freeswitch/trunk/src/switch_core.c (original)
+++ freeswitch/trunk/src/switch_core.c Thu Oct 11 23:28:59 2007
@@ -295,6 +295,14 @@
#endif
}
+ if (!SWITCH_GLOBAL_dirs.storage_dir && (SWITCH_GLOBAL_dirs.storage_dir = (char *) malloc(BUFSIZE))) {
+#ifdef SWITCH_STORAGE_DIR
+ switch_snprintf(SWITCH_GLOBAL_dirs.storage_dir, BUFSIZE, "%s", SWITCH_STORAGE_DIR);
+#else
+ switch_snprintf(SWITCH_GLOBAL_dirs.storage_dir, BUFSIZE, "%s%sstorage", base_dir, SWITCH_PATH_SEPARATOR);
+#endif
+ }
+
if (!SWITCH_GLOBAL_dirs.db_dir && (SWITCH_GLOBAL_dirs.db_dir = (char *) malloc(BUFSIZE))) {
#ifdef SWITCH_DB_DIR
switch_snprintf(SWITCH_GLOBAL_dirs.db_dir, BUFSIZE, "%s", SWITCH_DB_DIR);
Modified: freeswitch/trunk/src/switch_core_file.c
==============================================================================
--- freeswitch/trunk/src/switch_core_file.c (original)
+++ freeswitch/trunk/src/switch_core_file.c Thu Oct 11 23:28:59 2007
@@ -55,7 +55,7 @@
}
if ((fh->file_interface = switch_loadable_module_get_file_interface(ext)) == 0) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "invalid file format [%s]!\n", ext);
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "invalid file format [%s] for [%s]!\n", ext, file_path);
return SWITCH_STATUS_GENERR;
}
Modified: freeswitch/trunk/src/switch_xml.c
==============================================================================
--- freeswitch/trunk/src/switch_xml.c (original)
+++ freeswitch/trunk/src/switch_xml.c Thu Oct 11 23:28:59 2007
@@ -1241,7 +1241,8 @@
}
-SWITCH_DECLARE(switch_status_t) switch_xml_locate_user(char *user_name, char *domain_name,
+SWITCH_DECLARE(switch_status_t) switch_xml_locate_user(char *user_name,
+ char *domain_name,
char *ip,
switch_xml_t *root,
switch_xml_t *domain,
@@ -1272,7 +1273,8 @@
}
if (user_name) {
- if (!(*user = switch_xml_find_child(*domain, "user", "id", user_name))) {
+ if (!(*user = switch_xml_find_child(*domain, "user", "id", user_name)) && strstr(xtra_params, "mailbox") &&
+ !(*user = switch_xml_find_child(*domain, "user", "mailbox", user_name))) {
return SWITCH_STATUS_FALSE;
}
return SWITCH_STATUS_SUCCESS;
1
0
[commit] r5845 - in freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua: nta nta/sofia-sip nua su/sofia-sip
by Freeswitch SVN 12 Oct '07
by Freeswitch SVN 12 Oct '07
12 Oct '07
Author: mikej
Date: Thu Oct 11 23:08:54 2007
New Revision: 5845
Modified:
freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nta/nta.c
freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nta/nta_internal.h
freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nta/nta_tag.c
freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nta/sofia-sip/nta_tag.h
freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nua/nua_params.c
freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/su/sofia-sip/su_tag.h
Log:
add NTATAG_MAX_PROCEEDING tag to limit maximum number of concurrent proceeding in the queue.
Modified: freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nta/nta.c
==============================================================================
--- freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nta/nta.c (original)
+++ freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nta/nta.c Thu Oct 11 23:08:54 2007
@@ -346,7 +346,7 @@
* NTATAG_SIP_T1X64(), NTATAG_SIP_T1(), NTATAG_SIP_T2(), NTATAG_SIP_T4(),
* NTATAG_STATELESS(),
* NTATAG_TAG_3261(), NTATAG_TCP_RPORT(), NTATAG_TIMEOUT_408(),
- * NTATAG_TIMER_C(),
+ * NTATAG_TIMER_C(), NTATAG_MAX_PROCEEDING(),
* NTATAG_UA(), NTATAG_UDP_MTU(), NTATAG_USER_VIA(),
* NTATAG_USE_NAPTR(), NTATAG_USE_SRV() and NTATAG_USE_TIMESTAMP().
*
@@ -864,7 +864,7 @@
* INVITE transactions, or how the @Via headers are generated.
*
* @note
- * Setting the parameters NTATAG_MAXSIZE(), NTATAG_UDP_MTU(),
+ * Setting the parameters NTATAG_MAXSIZE(), NTATAG_UDP_MTU(), NTATAG_MAX_PROCEEDING(),
* NTATAG_SIP_T1X64(), NTATAG_SIP_T1(), NTATAG_SIP_T2(), NTATAG_SIP_T4() to
* 0 selects the default value.
*
@@ -882,7 +882,7 @@
* NTATAG_SIP_T1X64(), NTATAG_SIP_T1(), NTATAG_SIP_T2(), NTATAG_SIP_T4(),
* NTATAG_STATELESS(),
* NTATAG_TAG_3261(), NTATAG_TCP_RPORT(), NTATAG_TIMEOUT_408(),
- * NTATAG_TIMER_C(),
+ * NTATAG_TIMER_C(), NTATAG_MAX_PROCEEDING(),
* NTATAG_UA(), NTATAG_UDP_MTU(), NTATAG_USER_VIA(),
* NTATAG_USE_NAPTR(), NTATAG_USE_SRV() and NTATAG_USE_TIMESTAMP().
*
@@ -915,6 +915,7 @@
unsigned bad_req_mask = agent->sa_bad_req_mask;
unsigned bad_resp_mask = agent->sa_bad_resp_mask;
usize_t maxsize = agent->sa_maxsize;
+ usize_t max_proceeding = agent->sa_max_proceeding;
unsigned max_forwards = agent->sa_max_forwards->mf_count;
unsigned udp_mtu = agent->sa_udp_mtu;
unsigned sip_t1 = agent->sa_t1;
@@ -966,6 +967,7 @@
NTATAG_DEFAULT_PROXY_REF(proxy),
NTATAG_EXTRA_100_REF(extra_100),
NTATAG_MAXSIZE_REF(maxsize),
+ NTATAG_MAX_PROCEEDING_REF(max_proceeding),
NTATAG_MAX_FORWARDS_REF(max_forwards),
NTATAG_MCLASS_REF(mclass),
NTATAG_MERGE_482_REF(merge_482),
@@ -1070,6 +1072,9 @@
if (maxsize > NTA_TIME_MAX) maxsize = NTA_TIME_MAX;
agent->sa_maxsize = maxsize;
+ if (max_proceeding == 0) max_proceeding = SIZE_MAX;
+ agent->sa_max_proceeding = max_proceeding;
+
if (max_forwards == 0) max_forwards = 70; /* Default value */
agent->sa_max_forwards->mf_count = max_forwards;
@@ -1178,7 +1183,7 @@
* NTATAG_DEBUG_DROP_PROB_REF(), NTATAG_DEFAULT_PROXY_REF(),
* NTATAG_EXTRA_100_REF(),
* NTATAG_MAXSIZE_REF(), NTATAG_MAX_FORWARDS_REF(), NTATAG_MCLASS_REF(),
- * NTATAG_MERGE_482_REF(),
+ * NTATAG_MERGE_482_REF(), NTATAG_MAX_PROCEEDING_REF(),
* NTATAG_PASS_100_REF(), NTATAG_PASS_408_REF(), NTATAG_PRELOAD_REF(),
* NTATAG_PROGRESS_REF(),
* NTATAG_REL100_REF(),
@@ -1226,6 +1231,7 @@
NTATAG_DEFAULT_PROXY(agent->sa_default_proxy),
NTATAG_EXTRA_100(agent->sa_extra_100),
NTATAG_MAXSIZE(agent->sa_maxsize),
+ NTATAG_MAX_PROCEEDING(agent->sa_max_proceeding),
NTATAG_MAX_FORWARDS(agent->sa_max_forwards->mf_count),
NTATAG_MCLASS(agent->sa_mclass),
NTATAG_MERGE_482(agent->sa_merge_482),
@@ -2390,9 +2396,16 @@
leg_recv(leg, msg, sip, tport);
}
else if (!agent->sa_is_stateless && (leg = agent->sa_default_leg)) {
- SU_DEBUG_5(("nta: %s (%u) %s\n",
- method_name, cseq, "going to a default leg"));
- leg_recv(leg, msg, sip, tport);
+ if (method == sip_method_invite && agent->sa_in.proceeding->q_length >= agent->sa_max_proceeding) {
+ SU_DEBUG_5(("nta: proceeding queue full for %s (%u)\n", method_name, cseq));
+ nta_msg_treply(agent, msg, SIP_486_BUSY_HERE,
+ NTATAG_TPORT(tport),
+ TAG_END());
+ return;
+ } else {
+ SU_DEBUG_5(("nta: %s (%u) %s\n", method_name, cseq, "going to a default leg"));
+ leg_recv(leg, msg, sip, tport);
+ }
}
else if (agent->sa_callback) {
/* Stateless processing for request */
Modified: freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nta/nta_internal.h
==============================================================================
--- freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nta/nta_internal.h (original)
+++ freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nta/nta_internal.h Thu Oct 11 23:08:54 2007
@@ -145,6 +145,9 @@
/** Maximum size of incoming messages */
size_t sa_maxsize;
+ /** Maximum size of proceeding queue */
+ size_t sa_max_proceeding;
+
/** Maximum size of outgoing UDP requests */
unsigned sa_udp_mtu;
Modified: freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nta/nta_tag.c
==============================================================================
--- freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nta/nta_tag.c (original)
+++ freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nta/nta_tag.c Thu Oct 11 23:08:54 2007
@@ -400,6 +400,27 @@
*/
tag_typedef_t ntatag_maxsize = USIZETAG_TYPEDEF(maxsize);
+/**@def NTATAG_MAX_PROCEEDING(x)
+ *
+ * Maximum size of proceeding queue.
+ *
+ * If the size of the proceedng message queue would exceed the
+ * given limit, the stack will automatically respond with <i>486
+ * Server Busy</i>.
+ *
+ * @par Used with
+ * nua_create(), nua_set_params(),
+ * nta_agent_create(), nta_agent_set_params()
+ *
+ * @par Parameter type
+ * - #usize_t
+ *
+ * @par Values
+ * - Maximum acceptable size of a queue (size_t).
+ *
+ */
+tag_typedef_t ntatag_max_proceeding = USIZETAG_TYPEDEF(max_proceeding);
+
/**@def NTATAG_UDP_MTU(x)
*
* Maximum size of outgoing UDP request.
Modified: freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nta/sofia-sip/nta_tag.h
==============================================================================
--- freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nta/sofia-sip/nta_tag.h (original)
+++ freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nta/sofia-sip/nta_tag.h Thu Oct 11 23:08:54 2007
@@ -155,6 +155,12 @@
NTA_DLL extern tag_typedef_t ntatag_udp_mtu_ref;
#define NTATAG_UDP_MTU_REF(x) ntatag_udp_mtu_ref, tag_uint_vr(&(x))
+NTA_DLL extern tag_typedef_t ntatag_max_proceeding;
+#define NTATAG_MAX_PROCEEDING(x) ntatag_max_proceeding, tag_usize_v((x))
+
+NTA_DLL extern tag_typedef_t ntatag_max_proceeding_ref;
+#define NTATAG_MAX_PROCEEDING_REF(x) ntatag_max_proceeding_ref, tag_usize_vr(&(x))
+
NTA_DLL extern tag_typedef_t ntatag_max_forwards;
#define NTATAG_MAX_FORWARDS(x) ntatag_max_forwards, tag_uint_v((x))
Modified: freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nua/nua_params.c
==============================================================================
--- freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nua/nua_params.c (original)
+++ freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/nua/nua_params.c Thu Oct 11 23:08:54 2007
@@ -1526,6 +1526,7 @@
/* nta */
usize_t udp_mtu = 0;
+ usize_t max_proceeding = 0;
unsigned sip_t1 = 0, sip_t2 = 0, sip_t4 = 0, sip_t1x64 = 0;
unsigned debug_drop_prob = 0;
url_string_t const *proxy = NULL;
@@ -1543,6 +1544,7 @@
nta_agent_get_params(nua->nua_nta,
NTATAG_UDP_MTU_REF(udp_mtu),
+ NTATAG_MAX_PROCEEDING_REF(max_proceeding),
NTATAG_SIP_T1_REF(sip_t1),
NTATAG_SIP_T2_REF(sip_t2),
NTATAG_SIP_T4_REF(sip_t4),
@@ -1674,6 +1676,7 @@
#endif
NTATAG_UDP_MTU(udp_mtu),
+ NTATAG_MAX_PROCEEDING(max_proceeding),
NTATAG_SIP_T1(sip_t1),
NTATAG_SIP_T2(sip_t2),
NTATAG_SIP_T4(sip_t4),
Modified: freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/su/sofia-sip/su_tag.h
==============================================================================
--- freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/su/sofia-sip/su_tag.h (original)
+++ freeswitch/trunk/libs/sofia-sip/libsofia-sip-ua/su/sofia-sip/su_tag.h Thu Oct 11 23:08:54 2007
@@ -216,6 +216,8 @@
#define tag_uint_vr(v) (tag_value_t)(v)
#define tag_usize_v(v) (tag_value_t)(v)
#define tag_usize_vr(v) (tag_value_t)(v)
+#define tag_size_v(v) (tag_value_t)(v)
+#define tag_size_vr(v) (tag_value_t)(v)
#define tag_bool_v(v) (tag_value_t)(v != 0)
#define tag_bool_vr(v) (tag_value_t)(v)
#define tag_ptr_v(v) (tag_value_t)(v)
1
0