Freeswitch-branches
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
- 1655 discussions
[commit] r3339 - freeswitch/branches/knhor/trunk/src/mod/applications/mod_ivr
by Freeswitch SVN 13 Nov '06
by Freeswitch SVN 13 Nov '06
13 Nov '06
Author: knhor
Date: Mon Nov 13 00:21:31 2006
New Revision: 3339
Added:
freeswitch/branches/knhor/trunk/src/mod/applications/mod_ivr/
freeswitch/branches/knhor/trunk/src/mod/applications/mod_ivr/mod_ivr.c
Log:
initial commit of mod_ivr that uses switch_ivr_xml_menu_stack function
Added: freeswitch/branches/knhor/trunk/src/mod/applications/mod_ivr/mod_ivr.c
==============================================================================
--- (empty file)
+++ freeswitch/branches/knhor/trunk/src/mod/applications/mod_ivr/mod_ivr.c Mon Nov 13 00:21:31 2006
@@ -0,0 +1,105 @@
+/*
+ * 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
+ * Neal Horman <neal at wanlink dot com>
+ * Portions created by the Initial Developer are Copyright (C)
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ *
+ * Neal Horman <neal at wanlink dot com>
+ *
+ *
+ * mod_ivr.c -- IVR application using core ivr functions
+ *
+ */
+#include <switch.h>
+
+static const char modname[] = "mod_ivr";
+static const char global_app_name[] = "ivr";
+static char *global_cf_name = "ivr.conf";
+
+static void ivr_application_function(switch_core_session_t *session, char *data);
+
+static const switch_application_interface_t ivr_application_interface = {
+ /*.interface_name */ global_app_name,
+ /*.application_function */ &ivr_application_function,
+ NULL,
+ NULL,
+ NULL,
+ /*.next */ NULL
+};
+
+static switch_loadable_module_interface_t skel_module_interface = {
+ /*.module_name */ modname,
+ /*.endpoint_interface */ NULL,
+ /*.timer_interface */ NULL,
+ /*.dialplan_interface */ NULL,
+ /*.codec_interface */ NULL,
+ /*.application_interface */ &ivr_application_interface,
+ /*.api_interface */ NULL,
+ /*.file_interface */ NULL,
+ /*.speech_interface */ NULL,
+ /*.directory_interface */ NULL,
+ /*.chat_interface */ NULL
+};
+
+static void ivr_application_function(switch_core_session_t *session, char *data)
+{
+ switch_channel_t *channel = switch_core_session_get_channel(session);
+ char *params = switch_core_session_strdup(session,data);
+
+ if (channel != NULL && params != NULL) {
+ switch_xml_t cxml = NULL, cfg = NULL, xml_menus = NULL, xml_menu = NULL;
+
+ // Open the config from the xml registry
+ if ((cxml = switch_xml_open_cfg(global_cf_name, &cfg, NULL)) != NULL) {
+ switch_xml_free(cxml);
+ if ((xml_menus = switch_xml_child(cfg, "menus"))) {
+ xml_menu = switch_xml_find_child(xml_menus, "menu", "name", params);
+
+ // if the menu was found
+ if (xml_menu != NULL) {
+ switch_ivr_menu_t *menu_stack = NULL;
+
+ // build a menu tree and execute it
+ if (switch_ivr_build_xml_menu_stack(&menu_stack,xml_menus,xml_menu,NULL) == SWITCH_STATUS_SUCCESS) {
+ switch_channel_answer(channel);
+ switch_ivr_menu_execute(session,menu_stack,params,NULL);
+ } else {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Unable to create menu '%s'\n", params);
+ }
+ } else {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Unable to find menu '%s'\n", params);
+ }
+ }
+ } else {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "open of %s failed\n", global_cf_name);
+ }
+ }
+}
+
+SWITCH_MOD_DECLARE(switch_status_t) switch_module_load(const switch_loadable_module_interface_t **module_interface, char *filename)
+{
+ /* connect my internal structure to the blank pointer passed to me */
+ *module_interface = &skel_module_interface;
+
+ /* indicate that the module should continue to be loaded */
+ return SWITCH_STATUS_SUCCESS;
+}
1
0
13 Nov '06
Author: knhor
Date: Mon Nov 13 00:14:29 2006
New Revision: 3338
Modified:
freeswitch/branches/knhor/trunk/src/include/switch_ivr.h
freeswitch/branches/knhor/trunk/src/switch_ivr.c
Log:
fix docs for switch_ivr_menu_init.
add switch_ivr_build_xml_menu_stack function, it expects xml like in the following example;
<menus>
<menu name="main" greet-long="greet-long.wav" greet-short="greet-short.wav" invalid-sound="invalid.wav" timeout ="15000" max-failures="3">
<entry action="exit" digits="*"/>
<entry action="menu-sub" digits="2" param="menu2"/>
<entry action="exec-api" digits="3" param="api arg"/>
<entry action="play-sound" digits="4" param="asound.wav"/>
<entry action="call-transfer" digits="7" param="888"/>
<entry action="menu-sub" digits="8" param="menu8"/>>
</menu>
<menu name="menu8" greet-long="greet-long.wav" greet-short="greet-short.wav" invalid-sound="invalid.wav" timeout ="15000" max-failures="3">
<entry action="menu-back" digits="#"/>
<entry action="play-sound" digits="4" param="asound.wav"/>
<entry action="menu-top" digits="*"/>
</menu>
<menu name="menu2" greet-long="greet-long.wav" greet-short="greet-short.wav" invalid-sound="invalid.wav" timeout ="15000" max-failures="3">
<entry action="menu-back" digits="#"/>
<entry action="play-sound" digits="4" param="asound.wav"/>
<entry action="menu-top" digits="*"/>
</menu>
</menus>
Modified: freeswitch/branches/knhor/trunk/src/include/switch_ivr.h
==============================================================================
--- freeswitch/branches/knhor/trunk/src/include/switch_ivr.h (original)
+++ freeswitch/branches/knhor/trunk/src/include/switch_ivr.h Mon Nov 13 00:14:29 2006
@@ -499,10 +499,12 @@
*\param greeting_sound Optional pointer to a main sound (press 1 for this 2 for that).
*\param short_greeting_sound Optional pointer to a shorter main sound for subsequent loops.
*\param invalid_sound Optional pointer to a sound to play after invalid input.
+ *\param tts_engine Text To Speech engine name
+ *\param tts_voice Text To Speech engine voice name
*\param timeout A number of milliseconds to pause before looping.
*\param max_failures Maximum number of failures to withstand before hangingup This resets everytime you enter the menu.
*\param pool memory pool (NULL to create one)
- *\return SWUTCH_STATUS_SUCCESS if the menu was created
+ *\return SWITCH_STATUS_SUCCESS if the menu was created
*/
SWITCH_DECLARE(switch_status_t) switch_ivr_menu_init(switch_ivr_menu_t **new_menu,
switch_ivr_menu_t *main,
@@ -557,6 +559,18 @@
*/
SWITCH_DECLARE(switch_status_t) switch_ivr_menu_free_stack(switch_ivr_menu_t *stack);
+/*!
+ *\brief build a menu stack from an xml source
+ *\param menu_stack The menu stack object that will be created for you
+ *\param xml_menus The xml Menus source
+ *\param xml_menu The xml Menu source of the menu to be created
+ *\param pool memory pool (NULL to create one)
+ *\return SWITCH_STATUS_SUCCESS if all is well
+ */
+SWITCH_DECLARE(switch_status_t) switch_ivr_build_xml_menu_stack(switch_ivr_menu_t **menu_stack,
+ switch_xml_t xml_menus,
+ switch_xml_t xml_menu,
+ switch_memory_pool_t *pool);
/** @} */
SWITCH_END_EXTERN_C
Modified: freeswitch/branches/knhor/trunk/src/switch_ivr.c
==============================================================================
--- freeswitch/branches/knhor/trunk/src/switch_ivr.c (original)
+++ freeswitch/branches/knhor/trunk/src/switch_ivr.c Mon Nov 13 00:14:29 2006
@@ -3695,15 +3695,16 @@
if (!strcmp(menu->buf, ap->bind)) {
char *membuf;
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "IVR menu %s matched %s\n", menu->name, menu->buf);
match++;
errs = 0;
if (ap->function) {
todo = ap->function(menu, arg, sizeof(arg), obj);
aptr = arg;
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "IVR function on menu '%s' matched '%s'\n", menu->name, menu->buf);
} else {
todo = ap->ivr_action;
aptr = ap->arg;
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "IVR action on menu '%s' matched '%s' param '%s'\n", menu->name, menu->buf,aptr);
}
switch(todo) {
@@ -3728,6 +3729,7 @@
break;
case SWITCH_IVR_ACTION_EXECAPP: {
const switch_application_interface_t *application_interface;
+
if ((membuf = strdup(aptr))) {
char *app_name = membuf;
char *app_arg = strchr(app_name, ' ');
@@ -3788,6 +3790,95 @@
}
switch_safe_free(menu->buf);
+
+ return status;
+}
+
+SWITCH_DECLARE(switch_status_t) switch_ivr_build_xml_menu_stack(switch_ivr_menu_t **menu_stack,
+ switch_xml_t xml_menus,
+ switch_xml_t xml_menu,
+ switch_memory_pool_t *pool)
+{
+ switch_status_t status = SWITCH_STATUS_FALSE;
+ char *menu_name = (char *)switch_xml_attr_soft(xml_menu,"name"); // if the attr doesn't exist, return ""
+ char *greet_long = (char *)switch_xml_attr(xml_menu,"greet-long"); // if the attr doesn't exist, return NULL
+ char *greet_short = (char *)switch_xml_attr(xml_menu,"greet-short"); // if the attr doesn't exist, return NULL
+ char *invalid_sound = (char *)switch_xml_attr(xml_menu,"invalid-sound"); // if the attr doesn't exist, return NULL
+ char *tts_engine = (char *)switch_xml_attr(xml_menu,"tts-engine"); // if the attr doesn't exist, return NULL
+ char *tts_voice = (char *)switch_xml_attr(xml_menu,"tts-voice"); // if the attr doesn't exist, return NULL
+ char *timeout = (char *)switch_xml_attr_soft(xml_menu,"timeout"); // if the attr doesn't exist, return ""
+ char *max_failures = (char *)switch_xml_attr_soft(xml_menu,"max-failures"); // if the attr doesn't exist, return ""
+ switch_ivr_menu_t *menu = NULL;
+
+ status = switch_ivr_menu_init(&menu,
+ *menu_stack,
+ menu_name,
+ greet_long,
+ greet_short,
+ invalid_sound,
+ tts_engine,
+ tts_voice,
+ atoi(timeout)*1000,
+ atoi(max_failures),
+ pool
+ );
+ if (status == SWITCH_STATUS_SUCCESS) {
+ switch_xml_t xml_kvp;
+ struct ivr_action_map {
+ char *name;
+ switch_ivr_action_t action;
+ } iam [] = {
+ {"exit", SWITCH_IVR_ACTION_DIE},
+ {"menu-sub", SWITCH_IVR_ACTION_EXECMENU},
+ {"exec-api", SWITCH_IVR_ACTION_EXECAPP},
+ {"play-sound", SWITCH_IVR_ACTION_PLAYSOUND},
+ {"say-text", SWITCH_IVR_ACTION_SAYTEXT},
+ {"menu-back", SWITCH_IVR_ACTION_BACK},
+ {"menu-top", SWITCH_IVR_ACTION_TOMAIN},
+ {"call-transfer", SWITCH_IVR_ACTION_TRANSFER},
+ };
+ int iam_qty = sizeof(iam)/sizeof(iam[0]);
+
+ // set the menu stack for the caller
+ if (*menu_stack == NULL) {
+ *menu_stack = menu;
+ }
+
+ // build menu entries
+ for(xml_kvp = switch_xml_child(xml_menu, "entry"); xml_kvp != NULL && status == SWITCH_STATUS_SUCCESS; xml_kvp = xml_kvp->next) {
+ char *action = (char *)switch_xml_attr(xml_kvp, "action");
+ char *digits = (char *)switch_xml_attr(xml_kvp, "digits");
+ char *param = (char *)switch_xml_attr_soft(xml_kvp, "param");
+
+ if (!switch_strlen_zero(action) && !switch_strlen_zero(digits)) {
+ int i,found;
+
+ for(i=0,found=0; i<iam_qty && !found; i++) {
+ found = (strcasecmp(iam[i].name,action) == 0);
+ }
+
+ if (found) {
+ i--;
+ // do we need to build a new sub-menu ?
+ if (iam[i].action == SWITCH_IVR_ACTION_EXECMENU && switch_ivr_find_menu(*menu_stack, param) == NULL) {
+ if ((xml_menu = switch_xml_find_child(xml_menus, "menu", "name", param)) != NULL) {
+ status = switch_ivr_build_xml_menu_stack(menu_stack, xml_menus, xml_menu, pool);
+ }
+ }
+ // finally bind the menu entry
+ if (status == SWITCH_STATUS_SUCCESS) {
+ status = switch_ivr_menu_bind_action(menu, iam[i].action, param, digits);
+ }
+ }
+ } else {
+ status = SWITCH_STATUS_FALSE;
+ }
+ }
+ }
+
+ if (status != SWITCH_STATUS_SUCCESS) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Unable to build xml menu '%s'\n",menu_name);
+ }
return status;
}
1
0
12 Nov '06
Author: knhor
Date: Sun Nov 12 18:25:29 2006
New Revision: 3337
Modified:
freeswitch/branches/knhor/trunk/ (props changed)
freeswitch/branches/knhor/trunk/Freeswitch.sln
freeswitch/branches/knhor/trunk/src/include/switch_ivr.h
freeswitch/branches/knhor/trunk/src/switch_ivr.c
Log:
Merged revisions 3333-3336 via svnmerge from trunk
Modified: freeswitch/branches/knhor/trunk/Freeswitch.sln
==============================================================================
--- freeswitch/branches/knhor/trunk/Freeswitch.sln (original)
+++ freeswitch/branches/knhor/trunk/Freeswitch.sln Sun Nov 12 18:25:29 2006
@@ -549,11 +549,11 @@
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
+ {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}
{6EDFEFD5-3596-4FA9-8EBA-B331547B35A3} = {6EDFEFD5-3596-4FA9-8EBA-B331547B35A3}
- {202D7A4E-760D-4D0E-AFA1-D7459CED30FF} = {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}
- {1AD3F51E-BBB6-4090-BA39-9DFAB1EF1F5F} = {1AD3F51E-BBB6-4090-BA39-9DFAB1EF1F5F}
+ {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}"
@@ -567,734 +567,364 @@
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
- Debug|Mixed Platforms = Debug|Mixed Platforms
Debug|Win32 = Debug|Win32
- Release|Mixed Platforms = Release|Mixed Platforms
Release|Win32 = Release|Win32
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {1AF3A893-F7BE-43DD-B697-8AB2397C0D67}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {1AF3A893-F7BE-43DD-B697-8AB2397C0D67}.Debug|Mixed Platforms.Build.0 = Debug|Win32
{1AF3A893-F7BE-43DD-B697-8AB2397C0D67}.Debug|Win32.ActiveCfg = Debug|Win32
{1AF3A893-F7BE-43DD-B697-8AB2397C0D67}.Debug|Win32.Build.0 = Debug|Win32
- {1AF3A893-F7BE-43DD-B697-8AB2397C0D67}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {1AF3A893-F7BE-43DD-B697-8AB2397C0D67}.Release|Mixed Platforms.Build.0 = Release|Win32
{1AF3A893-F7BE-43DD-B697-8AB2397C0D67}.Release|Win32.ActiveCfg = Release|Win32
{1AF3A893-F7BE-43DD-B697-8AB2397C0D67}.Release|Win32.Build.0 = Release|Win32
- {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}.Debug|Mixed Platforms.Build.0 = Debug|Win32
{202D7A4E-760D-4D0E-AFA1-D7459CED30FF}.Debug|Win32.ActiveCfg = Debug|Win32
{202D7A4E-760D-4D0E-AFA1-D7459CED30FF}.Debug|Win32.Build.0 = Debug|Win32
- {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}.Release|Mixed Platforms.Build.0 = Release|Win32
{202D7A4E-760D-4D0E-AFA1-D7459CED30FF}.Release|Win32.ActiveCfg = Release|Win32
{202D7A4E-760D-4D0E-AFA1-D7459CED30FF}.Release|Win32.Build.0 = Release|Win32
- {1D95CD95-0DE2-48C3-AC23-D5C7D1C9C0F0}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {1D95CD95-0DE2-48C3-AC23-D5C7D1C9C0F0}.Debug|Mixed Platforms.Build.0 = Debug|Win32
{1D95CD95-0DE2-48C3-AC23-D5C7D1C9C0F0}.Debug|Win32.ActiveCfg = Debug Passthrough|Win32
{1D95CD95-0DE2-48C3-AC23-D5C7D1C9C0F0}.Debug|Win32.Build.0 = Debug Passthrough|Win32
- {1D95CD95-0DE2-48C3-AC23-D5C7D1C9C0F0}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {1D95CD95-0DE2-48C3-AC23-D5C7D1C9C0F0}.Release|Mixed Platforms.Build.0 = Release|Win32
{1D95CD95-0DE2-48C3-AC23-D5C7D1C9C0F0}.Release|Win32.ActiveCfg = Release Passthrough|Win32
{1D95CD95-0DE2-48C3-AC23-D5C7D1C9C0F0}.Release|Win32.Build.0 = Release Passthrough|Win32
- {4926323F-4EA8-4B7D-A3D3-65488725988F}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {4926323F-4EA8-4B7D-A3D3-65488725988F}.Debug|Mixed Platforms.Build.0 = Debug|Win32
{4926323F-4EA8-4B7D-A3D3-65488725988F}.Debug|Win32.ActiveCfg = Debug|Win32
{4926323F-4EA8-4B7D-A3D3-65488725988F}.Debug|Win32.Build.0 = Debug|Win32
- {4926323F-4EA8-4B7D-A3D3-65488725988F}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {4926323F-4EA8-4B7D-A3D3-65488725988F}.Release|Mixed Platforms.Build.0 = Release|Win32
{4926323F-4EA8-4B7D-A3D3-65488725988F}.Release|Win32.ActiveCfg = Release|Win32
{4926323F-4EA8-4B7D-A3D3-65488725988F}.Release|Win32.Build.0 = Release|Win32
- {F10BE67C-A8FF-4CB2-AF29-D46D2590DC59}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {F10BE67C-A8FF-4CB2-AF29-D46D2590DC59}.Debug|Mixed Platforms.Build.0 = Debug|Win32
{F10BE67C-A8FF-4CB2-AF29-D46D2590DC59}.Debug|Win32.ActiveCfg = Debug|Win32
{F10BE67C-A8FF-4CB2-AF29-D46D2590DC59}.Debug|Win32.Build.0 = Debug|Win32
- {F10BE67C-A8FF-4CB2-AF29-D46D2590DC59}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {F10BE67C-A8FF-4CB2-AF29-D46D2590DC59}.Release|Mixed Platforms.Build.0 = Release|Win32
{F10BE67C-A8FF-4CB2-AF29-D46D2590DC59}.Release|Win32.ActiveCfg = Release|Win32
{F10BE67C-A8FF-4CB2-AF29-D46D2590DC59}.Release|Win32.Build.0 = Release|Win32
- {AFAC0568-7548-42D5-9F6A-8D3400A1E4F6}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {AFAC0568-7548-42D5-9F6A-8D3400A1E4F6}.Debug|Mixed Platforms.Build.0 = Debug|Win32
{AFAC0568-7548-42D5-9F6A-8D3400A1E4F6}.Debug|Win32.ActiveCfg = Debug|Win32
{AFAC0568-7548-42D5-9F6A-8D3400A1E4F6}.Debug|Win32.Build.0 = Debug|Win32
- {AFAC0568-7548-42D5-9F6A-8D3400A1E4F6}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {AFAC0568-7548-42D5-9F6A-8D3400A1E4F6}.Release|Mixed Platforms.Build.0 = Release|Win32
{AFAC0568-7548-42D5-9F6A-8D3400A1E4F6}.Release|Win32.ActiveCfg = Release|Win32
{AFAC0568-7548-42D5-9F6A-8D3400A1E4F6}.Release|Win32.Build.0 = Release|Win32
- {E1794405-29D4-466D-9BE3-DD2344C2A663}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {E1794405-29D4-466D-9BE3-DD2344C2A663}.Debug|Mixed Platforms.Build.0 = Debug|Win32
{E1794405-29D4-466D-9BE3-DD2344C2A663}.Debug|Win32.ActiveCfg = Debug|Win32
{E1794405-29D4-466D-9BE3-DD2344C2A663}.Debug|Win32.Build.0 = Debug|Win32
- {E1794405-29D4-466D-9BE3-DD2344C2A663}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {E1794405-29D4-466D-9BE3-DD2344C2A663}.Release|Mixed Platforms.Build.0 = Release|Win32
{E1794405-29D4-466D-9BE3-DD2344C2A663}.Release|Win32.ActiveCfg = Release|Win32
{E1794405-29D4-466D-9BE3-DD2344C2A663}.Release|Win32.Build.0 = Release|Win32
- {3A2A7795-C216-4FFF-B8EF-4D17A84BACCC}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {3A2A7795-C216-4FFF-B8EF-4D17A84BACCC}.Debug|Mixed Platforms.Build.0 = Debug|Win32
{3A2A7795-C216-4FFF-B8EF-4D17A84BACCC}.Debug|Win32.ActiveCfg = Debug|Win32
{3A2A7795-C216-4FFF-B8EF-4D17A84BACCC}.Debug|Win32.Build.0 = Debug|Win32
- {3A2A7795-C216-4FFF-B8EF-4D17A84BACCC}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {3A2A7795-C216-4FFF-B8EF-4D17A84BACCC}.Release|Mixed Platforms.Build.0 = Release|Win32
{3A2A7795-C216-4FFF-B8EF-4D17A84BACCC}.Release|Win32.ActiveCfg = Release|Win32
{3A2A7795-C216-4FFF-B8EF-4D17A84BACCC}.Release|Win32.Build.0 = Release|Win32
- {B1FE4613-3F4B-4DAF-9714-2472BF8F56AE}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {B1FE4613-3F4B-4DAF-9714-2472BF8F56AE}.Debug|Mixed Platforms.Build.0 = Debug|Win32
{B1FE4613-3F4B-4DAF-9714-2472BF8F56AE}.Debug|Win32.ActiveCfg = Debug|Win32
{B1FE4613-3F4B-4DAF-9714-2472BF8F56AE}.Debug|Win32.Build.0 = Debug|Win32
- {B1FE4613-3F4B-4DAF-9714-2472BF8F56AE}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {B1FE4613-3F4B-4DAF-9714-2472BF8F56AE}.Release|Mixed Platforms.Build.0 = Release|Win32
{B1FE4613-3F4B-4DAF-9714-2472BF8F56AE}.Release|Win32.ActiveCfg = Release|Win32
{B1FE4613-3F4B-4DAF-9714-2472BF8F56AE}.Release|Win32.Build.0 = Release|Win32
- {3A5B9131-F20C-4A85-9447-6C1610941CEE}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {3A5B9131-F20C-4A85-9447-6C1610941CEE}.Debug|Mixed Platforms.Build.0 = Debug|Win32
{3A5B9131-F20C-4A85-9447-6C1610941CEE}.Debug|Win32.ActiveCfg = Debug|Win32
{3A5B9131-F20C-4A85-9447-6C1610941CEE}.Debug|Win32.Build.0 = Debug|Win32
- {3A5B9131-F20C-4A85-9447-6C1610941CEE}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {3A5B9131-F20C-4A85-9447-6C1610941CEE}.Release|Mixed Platforms.Build.0 = Release|Win32
{3A5B9131-F20C-4A85-9447-6C1610941CEE}.Release|Win32.ActiveCfg = Release|Win32
{3A5B9131-F20C-4A85-9447-6C1610941CEE}.Release|Win32.Build.0 = Release|Win32
- {78100236-7CEA-4948-96CC-E8ED3160329C}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {78100236-7CEA-4948-96CC-E8ED3160329C}.Debug|Mixed Platforms.Build.0 = Debug|Win32
{78100236-7CEA-4948-96CC-E8ED3160329C}.Debug|Win32.ActiveCfg = Debug|Win32
{78100236-7CEA-4948-96CC-E8ED3160329C}.Debug|Win32.Build.0 = Debug|Win32
- {78100236-7CEA-4948-96CC-E8ED3160329C}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {78100236-7CEA-4948-96CC-E8ED3160329C}.Release|Mixed Platforms.Build.0 = Release|Win32
{78100236-7CEA-4948-96CC-E8ED3160329C}.Release|Win32.ActiveCfg = Release|Win32
{78100236-7CEA-4948-96CC-E8ED3160329C}.Release|Win32.Build.0 = Release|Win32
- {5FD31A25-5D83-4794-8BEE-904DAD84CE71}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {5FD31A25-5D83-4794-8BEE-904DAD84CE71}.Debug|Mixed Platforms.Build.0 = Debug|Win32
{5FD31A25-5D83-4794-8BEE-904DAD84CE71}.Debug|Win32.ActiveCfg = Debug|Win32
{5FD31A25-5D83-4794-8BEE-904DAD84CE71}.Debug|Win32.Build.0 = Debug|Win32
- {5FD31A25-5D83-4794-8BEE-904DAD84CE71}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {5FD31A25-5D83-4794-8BEE-904DAD84CE71}.Release|Mixed Platforms.Build.0 = Release|Win32
{5FD31A25-5D83-4794-8BEE-904DAD84CE71}.Release|Win32.ActiveCfg = Release|Win32
{5FD31A25-5D83-4794-8BEE-904DAD84CE71}.Release|Win32.Build.0 = Release|Win32
- {5844AFE1-AA3E-4BDB-A9EF-119AEF19DF88}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {5844AFE1-AA3E-4BDB-A9EF-119AEF19DF88}.Debug|Mixed Platforms.Build.0 = Debug|Win32
{5844AFE1-AA3E-4BDB-A9EF-119AEF19DF88}.Debug|Win32.ActiveCfg = Debug|Win32
{5844AFE1-AA3E-4BDB-A9EF-119AEF19DF88}.Debug|Win32.Build.0 = Debug|Win32
- {5844AFE1-AA3E-4BDB-A9EF-119AEF19DF88}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {5844AFE1-AA3E-4BDB-A9EF-119AEF19DF88}.Release|Mixed Platforms.Build.0 = Release|Win32
{5844AFE1-AA3E-4BDB-A9EF-119AEF19DF88}.Release|Win32.ActiveCfg = Release|Win32
{5844AFE1-AA3E-4BDB-A9EF-119AEF19DF88}.Release|Win32.Build.0 = Release|Win32
- {DCC13474-28DF-47CA-A8EB-72F8CE9A78C5}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {DCC13474-28DF-47CA-A8EB-72F8CE9A78C5}.Debug|Mixed Platforms.Build.0 = Debug|Win32
{DCC13474-28DF-47CA-A8EB-72F8CE9A78C5}.Debug|Win32.ActiveCfg = Debug|Win32
{DCC13474-28DF-47CA-A8EB-72F8CE9A78C5}.Debug|Win32.Build.0 = Debug|Win32
- {DCC13474-28DF-47CA-A8EB-72F8CE9A78C5}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {DCC13474-28DF-47CA-A8EB-72F8CE9A78C5}.Release|Mixed Platforms.Build.0 = Release|Win32
{DCC13474-28DF-47CA-A8EB-72F8CE9A78C5}.Release|Win32.ActiveCfg = Release|Win32
{DCC13474-28DF-47CA-A8EB-72F8CE9A78C5}.Release|Win32.Build.0 = Release|Win32
- {5580D60E-0F77-4716-9CD4-B8E5986FA375}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {5580D60E-0F77-4716-9CD4-B8E5986FA375}.Debug|Mixed Platforms.Build.0 = Debug|Win32
{5580D60E-0F77-4716-9CD4-B8E5986FA375}.Debug|Win32.ActiveCfg = Debug|Win32
{5580D60E-0F77-4716-9CD4-B8E5986FA375}.Debug|Win32.Build.0 = Debug|Win32
- {5580D60E-0F77-4716-9CD4-B8E5986FA375}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {5580D60E-0F77-4716-9CD4-B8E5986FA375}.Release|Mixed Platforms.Build.0 = Release|Win32
{5580D60E-0F77-4716-9CD4-B8E5986FA375}.Release|Win32.ActiveCfg = Release|Win32
{5580D60E-0F77-4716-9CD4-B8E5986FA375}.Release|Win32.Build.0 = Release|Win32
- {FE3540C5-3303-46E0-A69E-D92F775687F1}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {FE3540C5-3303-46E0-A69E-D92F775687F1}.Debug|Mixed Platforms.Build.0 = Debug|Win32
{FE3540C5-3303-46E0-A69E-D92F775687F1}.Debug|Win32.ActiveCfg = Debug|Win32
{FE3540C5-3303-46E0-A69E-D92F775687F1}.Debug|Win32.Build.0 = Debug|Win32
- {FE3540C5-3303-46E0-A69E-D92F775687F1}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {FE3540C5-3303-46E0-A69E-D92F775687F1}.Release|Mixed Platforms.Build.0 = Release|Win32
{FE3540C5-3303-46E0-A69E-D92F775687F1}.Release|Win32.ActiveCfg = Release|Win32
{FE3540C5-3303-46E0-A69E-D92F775687F1}.Release|Win32.Build.0 = Release|Win32
- {1A1FF289-4FD6-4285-A422-D31DD67A4723}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {1A1FF289-4FD6-4285-A422-D31DD67A4723}.Debug|Mixed Platforms.Build.0 = Debug|Win32
{1A1FF289-4FD6-4285-A422-D31DD67A4723}.Debug|Win32.ActiveCfg = Debug|Win32
- {1A1FF289-4FD6-4285-A422-D31DD67A4723}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {1A1FF289-4FD6-4285-A422-D31DD67A4723}.Release|Mixed Platforms.Build.0 = Release|Win32
{1A1FF289-4FD6-4285-A422-D31DD67A4723}.Release|Win32.ActiveCfg = Release|Win32
- {07113B25-D3AF-4E04-BA77-4CD1171F022C}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {07113B25-D3AF-4E04-BA77-4CD1171F022C}.Debug|Mixed Platforms.Build.0 = Debug|Win32
{07113B25-D3AF-4E04-BA77-4CD1171F022C}.Debug|Win32.ActiveCfg = Debug|Win32
{07113B25-D3AF-4E04-BA77-4CD1171F022C}.Debug|Win32.Build.0 = Debug|Win32
- {07113B25-D3AF-4E04-BA77-4CD1171F022C}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {07113B25-D3AF-4E04-BA77-4CD1171F022C}.Release|Mixed Platforms.Build.0 = Release|Win32
{07113B25-D3AF-4E04-BA77-4CD1171F022C}.Release|Win32.ActiveCfg = Release|Win32
{07113B25-D3AF-4E04-BA77-4CD1171F022C}.Release|Win32.Build.0 = Release|Win32
- {419AA391-5F3F-4BFE-A869-9D154D62A792}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {419AA391-5F3F-4BFE-A869-9D154D62A792}.Debug|Mixed Platforms.Build.0 = Debug|Win32
{419AA391-5F3F-4BFE-A869-9D154D62A792}.Debug|Win32.ActiveCfg = Debug|Win32
{419AA391-5F3F-4BFE-A869-9D154D62A792}.Debug|Win32.Build.0 = Debug|Win32
- {419AA391-5F3F-4BFE-A869-9D154D62A792}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {419AA391-5F3F-4BFE-A869-9D154D62A792}.Release|Mixed Platforms.Build.0 = Release|Win32
{419AA391-5F3F-4BFE-A869-9D154D62A792}.Release|Win32.ActiveCfg = Release|Win32
{419AA391-5F3F-4BFE-A869-9D154D62A792}.Release|Win32.Build.0 = Release|Win32
- {B17FFBE6-A942-4056-8346-B624FB5D995B}.Debug|Mixed Platforms.ActiveCfg = Debug with MySql
- {B17FFBE6-A942-4056-8346-B624FB5D995B}.Debug|Mixed Platforms.Build.0 = Debug with MySql
{B17FFBE6-A942-4056-8346-B624FB5D995B}.Debug|Win32.ActiveCfg = Debug
- {B17FFBE6-A942-4056-8346-B624FB5D995B}.Release|Mixed Platforms.ActiveCfg = Release with MySql
- {B17FFBE6-A942-4056-8346-B624FB5D995B}.Release|Mixed Platforms.Build.0 = Release with MySql
{B17FFBE6-A942-4056-8346-B624FB5D995B}.Release|Win32.ActiveCfg = Release
- {EC3E5C7F-EE09-47E2-80FE-546363D14A98}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {EC3E5C7F-EE09-47E2-80FE-546363D14A98}.Debug|Mixed Platforms.Build.0 = Debug|Win32
{EC3E5C7F-EE09-47E2-80FE-546363D14A98}.Debug|Win32.ActiveCfg = Debug MS-LDAP|Win32
{EC3E5C7F-EE09-47E2-80FE-546363D14A98}.Debug|Win32.Build.0 = Debug MS-LDAP|Win32
- {EC3E5C7F-EE09-47E2-80FE-546363D14A98}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {EC3E5C7F-EE09-47E2-80FE-546363D14A98}.Release|Mixed Platforms.Build.0 = Release|Win32
{EC3E5C7F-EE09-47E2-80FE-546363D14A98}.Release|Win32.ActiveCfg = Release MS-LDAP|Win32
{EC3E5C7F-EE09-47E2-80FE-546363D14A98}.Release|Win32.Build.0 = Release MS-LDAP|Win32
- {A27CCA23-1541-4337-81A4-F0A6413078A0}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {A27CCA23-1541-4337-81A4-F0A6413078A0}.Debug|Mixed Platforms.Build.0 = Debug|Win32
{A27CCA23-1541-4337-81A4-F0A6413078A0}.Debug|Win32.ActiveCfg = Debug|Win32
{A27CCA23-1541-4337-81A4-F0A6413078A0}.Debug|Win32.Build.0 = Debug|Win32
- {A27CCA23-1541-4337-81A4-F0A6413078A0}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {A27CCA23-1541-4337-81A4-F0A6413078A0}.Release|Mixed Platforms.Build.0 = Release|Win32
{A27CCA23-1541-4337-81A4-F0A6413078A0}.Release|Win32.ActiveCfg = Release|Win32
{A27CCA23-1541-4337-81A4-F0A6413078A0}.Release|Win32.Build.0 = Release|Win32
- {C7705DC4-2088-493E-AF8D-65BC6D65C125}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {C7705DC4-2088-493E-AF8D-65BC6D65C125}.Debug|Mixed Platforms.Build.0 = Debug|Win32
{C7705DC4-2088-493E-AF8D-65BC6D65C125}.Debug|Win32.ActiveCfg = Debug|Win32
{C7705DC4-2088-493E-AF8D-65BC6D65C125}.Debug|Win32.Build.0 = Debug|Win32
- {C7705DC4-2088-493E-AF8D-65BC6D65C125}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {C7705DC4-2088-493E-AF8D-65BC6D65C125}.Release|Mixed Platforms.Build.0 = Release|Win32
{C7705DC4-2088-493E-AF8D-65BC6D65C125}.Release|Win32.ActiveCfg = Release|Win32
{C7705DC4-2088-493E-AF8D-65BC6D65C125}.Release|Win32.Build.0 = Release|Win32
- {784113EF-44D9-4949-835D-7065D3C7AD08}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {784113EF-44D9-4949-835D-7065D3C7AD08}.Debug|Mixed Platforms.Build.0 = Debug|Win32
{784113EF-44D9-4949-835D-7065D3C7AD08}.Debug|Win32.ActiveCfg = Debug|Win32
{784113EF-44D9-4949-835D-7065D3C7AD08}.Debug|Win32.Build.0 = Debug|Win32
- {784113EF-44D9-4949-835D-7065D3C7AD08}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {784113EF-44D9-4949-835D-7065D3C7AD08}.Release|Mixed Platforms.Build.0 = Release|Win32
{784113EF-44D9-4949-835D-7065D3C7AD08}.Release|Win32.ActiveCfg = Release|Win32
{784113EF-44D9-4949-835D-7065D3C7AD08}.Release|Win32.Build.0 = Release|Win32
- {89385C74-5860-4174-9CAF-A39E7C48909C}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {89385C74-5860-4174-9CAF-A39E7C48909C}.Debug|Mixed Platforms.Build.0 = Debug|Win32
{89385C74-5860-4174-9CAF-A39E7C48909C}.Debug|Win32.ActiveCfg = Debug|Win32
{89385C74-5860-4174-9CAF-A39E7C48909C}.Debug|Win32.Build.0 = Debug|Win32
- {89385C74-5860-4174-9CAF-A39E7C48909C}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {89385C74-5860-4174-9CAF-A39E7C48909C}.Release|Mixed Platforms.Build.0 = Release|Win32
{89385C74-5860-4174-9CAF-A39E7C48909C}.Release|Win32.ActiveCfg = Release|Win32
{89385C74-5860-4174-9CAF-A39E7C48909C}.Release|Win32.Build.0 = Release|Win32
- {1AD3F51E-BBB6-4090-BA39-9DFAB1EF1F5F}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {1AD3F51E-BBB6-4090-BA39-9DFAB1EF1F5F}.Debug|Mixed Platforms.Build.0 = Debug|Win32
{1AD3F51E-BBB6-4090-BA39-9DFAB1EF1F5F}.Debug|Win32.ActiveCfg = Debug|Win32
{1AD3F51E-BBB6-4090-BA39-9DFAB1EF1F5F}.Debug|Win32.Build.0 = Debug|Win32
- {1AD3F51E-BBB6-4090-BA39-9DFAB1EF1F5F}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {1AD3F51E-BBB6-4090-BA39-9DFAB1EF1F5F}.Release|Mixed Platforms.Build.0 = Release|Win32
{1AD3F51E-BBB6-4090-BA39-9DFAB1EF1F5F}.Release|Win32.ActiveCfg = Release|Win32
{1AD3F51E-BBB6-4090-BA39-9DFAB1EF1F5F}.Release|Win32.Build.0 = Release|Win32
- {692F6330-4D87-4C82-81DF-40DB5892636E}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {692F6330-4D87-4C82-81DF-40DB5892636E}.Debug|Mixed Platforms.Build.0 = Debug|Win32
{692F6330-4D87-4C82-81DF-40DB5892636E}.Debug|Win32.ActiveCfg = Debug|Win32
- {692F6330-4D87-4C82-81DF-40DB5892636E}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {692F6330-4D87-4C82-81DF-40DB5892636E}.Release|Mixed Platforms.Build.0 = Release|Win32
{692F6330-4D87-4C82-81DF-40DB5892636E}.Release|Win32.ActiveCfg = Release|Win32
- {B0C6CFF9-7DCD-4A21-8BA4-C2011E18DED8}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {B0C6CFF9-7DCD-4A21-8BA4-C2011E18DED8}.Debug|Mixed Platforms.Build.0 = Debug|Win32
{B0C6CFF9-7DCD-4A21-8BA4-C2011E18DED8}.Debug|Win32.ActiveCfg = Debug|Win32
- {B0C6CFF9-7DCD-4A21-8BA4-C2011E18DED8}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {B0C6CFF9-7DCD-4A21-8BA4-C2011E18DED8}.Release|Mixed Platforms.Build.0 = Release|Win32
{B0C6CFF9-7DCD-4A21-8BA4-C2011E18DED8}.Release|Win32.ActiveCfg = Release|Win32
- {7B077E7F-1BE7-4291-AB86-55E527B25CAC}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {7B077E7F-1BE7-4291-AB86-55E527B25CAC}.Debug|Mixed Platforms.Build.0 = Debug|Win32
{7B077E7F-1BE7-4291-AB86-55E527B25CAC}.Debug|Win32.ActiveCfg = Debug|Win32
- {7B077E7F-1BE7-4291-AB86-55E527B25CAC}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {7B077E7F-1BE7-4291-AB86-55E527B25CAC}.Release|Mixed Platforms.Build.0 = Release|Win32
{7B077E7F-1BE7-4291-AB86-55E527B25CAC}.Release|Win32.ActiveCfg = Release|Win32
- {0E2C6395-13B9-46E5-9264-8859D346018D}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {0E2C6395-13B9-46E5-9264-8859D346018D}.Debug|Mixed Platforms.Build.0 = Debug|Win32
{0E2C6395-13B9-46E5-9264-8859D346018D}.Debug|Win32.ActiveCfg = Debug|Win32
{0E2C6395-13B9-46E5-9264-8859D346018D}.Debug|Win32.Build.0 = Debug|Win32
- {0E2C6395-13B9-46E5-9264-8859D346018D}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {0E2C6395-13B9-46E5-9264-8859D346018D}.Release|Mixed Platforms.Build.0 = Release|Win32
{0E2C6395-13B9-46E5-9264-8859D346018D}.Release|Win32.ActiveCfg = Release|Win32
{0E2C6395-13B9-46E5-9264-8859D346018D}.Release|Win32.Build.0 = Release|Win32
- {D3EC0AFF-76FC-4210-A825-9A17410660A3}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {D3EC0AFF-76FC-4210-A825-9A17410660A3}.Debug|Mixed Platforms.Build.0 = Debug|Win32
{D3EC0AFF-76FC-4210-A825-9A17410660A3}.Debug|Win32.ActiveCfg = Debug|Win32
{D3EC0AFF-76FC-4210-A825-9A17410660A3}.Debug|Win32.Build.0 = Debug|Win32
- {D3EC0AFF-76FC-4210-A825-9A17410660A3}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {D3EC0AFF-76FC-4210-A825-9A17410660A3}.Release|Mixed Platforms.Build.0 = Release|Win32
{D3EC0AFF-76FC-4210-A825-9A17410660A3}.Release|Win32.ActiveCfg = Release|Win32
{D3EC0AFF-76FC-4210-A825-9A17410660A3}.Release|Win32.Build.0 = Release|Win32
- {FFAA4C52-3A53-4F99-90C1-D59D1F0427F3}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {FFAA4C52-3A53-4F99-90C1-D59D1F0427F3}.Debug|Mixed Platforms.Build.0 = Debug|Win32
{FFAA4C52-3A53-4F99-90C1-D59D1F0427F3}.Debug|Win32.ActiveCfg = Debug|Win32
{FFAA4C52-3A53-4F99-90C1-D59D1F0427F3}.Debug|Win32.Build.0 = Debug|Win32
- {FFAA4C52-3A53-4F99-90C1-D59D1F0427F3}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {FFAA4C52-3A53-4F99-90C1-D59D1F0427F3}.Release|Mixed Platforms.Build.0 = Release|Win32
{FFAA4C52-3A53-4F99-90C1-D59D1F0427F3}.Release|Win32.ActiveCfg = Release|Win32
{FFAA4C52-3A53-4F99-90C1-D59D1F0427F3}.Release|Win32.Build.0 = Release|Win32
- {30A5B29C-983E-4580-9FD0-D647CCDCC7EB}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {30A5B29C-983E-4580-9FD0-D647CCDCC7EB}.Debug|Mixed Platforms.Build.0 = Debug|Win32
{30A5B29C-983E-4580-9FD0-D647CCDCC7EB}.Debug|Win32.ActiveCfg = Debug|Win32
{30A5B29C-983E-4580-9FD0-D647CCDCC7EB}.Debug|Win32.Build.0 = Debug|Win32
- {30A5B29C-983E-4580-9FD0-D647CCDCC7EB}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {30A5B29C-983E-4580-9FD0-D647CCDCC7EB}.Release|Mixed Platforms.Build.0 = Release|Win32
{30A5B29C-983E-4580-9FD0-D647CCDCC7EB}.Release|Win32.ActiveCfg = Release|Win32
{30A5B29C-983E-4580-9FD0-D647CCDCC7EB}.Release|Win32.Build.0 = Release|Win32
- {1C453396-D912-4213-89FD-9B489162B7B5}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {1C453396-D912-4213-89FD-9B489162B7B5}.Debug|Mixed Platforms.Build.0 = Debug|Win32
{1C453396-D912-4213-89FD-9B489162B7B5}.Debug|Win32.ActiveCfg = Debug|Win32
{1C453396-D912-4213-89FD-9B489162B7B5}.Debug|Win32.Build.0 = Debug|Win32
- {1C453396-D912-4213-89FD-9B489162B7B5}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {1C453396-D912-4213-89FD-9B489162B7B5}.Release|Mixed Platforms.Build.0 = Release|Win32
{1C453396-D912-4213-89FD-9B489162B7B5}.Release|Win32.ActiveCfg = Release|Win32
{1C453396-D912-4213-89FD-9B489162B7B5}.Release|Win32.Build.0 = Release|Win32
- {CBEC7225-0C21-4DA8-978E-1F158F8AD950}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {CBEC7225-0C21-4DA8-978E-1F158F8AD950}.Debug|Mixed Platforms.Build.0 = Debug|Win32
{CBEC7225-0C21-4DA8-978E-1F158F8AD950}.Debug|Win32.ActiveCfg = Debug|Win32
{CBEC7225-0C21-4DA8-978E-1F158F8AD950}.Debug|Win32.Build.0 = Debug|Win32
- {CBEC7225-0C21-4DA8-978E-1F158F8AD950}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {CBEC7225-0C21-4DA8-978E-1F158F8AD950}.Release|Mixed Platforms.Build.0 = Release|Win32
{CBEC7225-0C21-4DA8-978E-1F158F8AD950}.Release|Win32.ActiveCfg = Release|Win32
{CBEC7225-0C21-4DA8-978E-1F158F8AD950}.Release|Win32.Build.0 = Release|Win32
- {B69247FA-ECD6-40ED-8E44-5CA6C3BAF9A4}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {B69247FA-ECD6-40ED-8E44-5CA6C3BAF9A4}.Debug|Mixed Platforms.Build.0 = Debug|Win32
{B69247FA-ECD6-40ED-8E44-5CA6C3BAF9A4}.Debug|Win32.ActiveCfg = Debug|Win32
{B69247FA-ECD6-40ED-8E44-5CA6C3BAF9A4}.Debug|Win32.Build.0 = Debug|Win32
- {B69247FA-ECD6-40ED-8E44-5CA6C3BAF9A4}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {B69247FA-ECD6-40ED-8E44-5CA6C3BAF9A4}.Release|Mixed Platforms.Build.0 = Release|Win32
{B69247FA-ECD6-40ED-8E44-5CA6C3BAF9A4}.Release|Win32.ActiveCfg = Release|Win32
{B69247FA-ECD6-40ED-8E44-5CA6C3BAF9A4}.Release|Win32.Build.0 = Release|Win32
- {C24FB505-05D7-4319-8485-7540B44C8603}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {C24FB505-05D7-4319-8485-7540B44C8603}.Debug|Mixed Platforms.Build.0 = Debug|Win32
{C24FB505-05D7-4319-8485-7540B44C8603}.Debug|Win32.ActiveCfg = Debug|Win32
{C24FB505-05D7-4319-8485-7540B44C8603}.Debug|Win32.Build.0 = Debug|Win32
- {C24FB505-05D7-4319-8485-7540B44C8603}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {C24FB505-05D7-4319-8485-7540B44C8603}.Release|Mixed Platforms.Build.0 = Release|Win32
{C24FB505-05D7-4319-8485-7540B44C8603}.Release|Win32.ActiveCfg = Release|Win32
{C24FB505-05D7-4319-8485-7540B44C8603}.Release|Win32.Build.0 = Release|Win32
- {B5881A85-FE70-4F64-8607-2CAAE52669C6}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {B5881A85-FE70-4F64-8607-2CAAE52669C6}.Debug|Mixed Platforms.Build.0 = Debug|Win32
{B5881A85-FE70-4F64-8607-2CAAE52669C6}.Debug|Win32.ActiveCfg = Debug|Win32
{B5881A85-FE70-4F64-8607-2CAAE52669C6}.Debug|Win32.Build.0 = Debug|Win32
- {B5881A85-FE70-4F64-8607-2CAAE52669C6}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {B5881A85-FE70-4F64-8607-2CAAE52669C6}.Release|Mixed Platforms.Build.0 = Release|Win32
{B5881A85-FE70-4F64-8607-2CAAE52669C6}.Release|Win32.ActiveCfg = Release|Win32
{B5881A85-FE70-4F64-8607-2CAAE52669C6}.Release|Win32.Build.0 = Release|Win32
- {05515420-16DE-4E63-BE73-85BE85BA5142}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {05515420-16DE-4E63-BE73-85BE85BA5142}.Debug|Mixed Platforms.Build.0 = Debug|Win32
{05515420-16DE-4E63-BE73-85BE85BA5142}.Debug|Win32.ActiveCfg = Debug|Win32
{05515420-16DE-4E63-BE73-85BE85BA5142}.Debug|Win32.Build.0 = Debug|Win32
- {05515420-16DE-4E63-BE73-85BE85BA5142}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {05515420-16DE-4E63-BE73-85BE85BA5142}.Release|Mixed Platforms.Build.0 = Release|Win32
{05515420-16DE-4E63-BE73-85BE85BA5142}.Release|Win32.ActiveCfg = Release|Win32
{05515420-16DE-4E63-BE73-85BE85BA5142}.Release|Win32.Build.0 = Release|Win32
- {3D1EED36-A510-4EDB-B4D9-4E0F4A5EC2A8}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {3D1EED36-A510-4EDB-B4D9-4E0F4A5EC2A8}.Debug|Mixed Platforms.Build.0 = Debug|Win32
{3D1EED36-A510-4EDB-B4D9-4E0F4A5EC2A8}.Debug|Win32.ActiveCfg = Debug|Win32
{3D1EED36-A510-4EDB-B4D9-4E0F4A5EC2A8}.Debug|Win32.Build.0 = Debug|Win32
- {3D1EED36-A510-4EDB-B4D9-4E0F4A5EC2A8}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {3D1EED36-A510-4EDB-B4D9-4E0F4A5EC2A8}.Release|Mixed Platforms.Build.0 = Release|Win32
{3D1EED36-A510-4EDB-B4D9-4E0F4A5EC2A8}.Release|Win32.ActiveCfg = Release|Win32
{3D1EED36-A510-4EDB-B4D9-4E0F4A5EC2A8}.Release|Win32.Build.0 = Release|Win32
- {8FD2E297-4096-47E5-9258-C48FF1841523}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {8FD2E297-4096-47E5-9258-C48FF1841523}.Debug|Mixed Platforms.Build.0 = Debug|Win32
{8FD2E297-4096-47E5-9258-C48FF1841523}.Debug|Win32.ActiveCfg = Debug|Win32
{8FD2E297-4096-47E5-9258-C48FF1841523}.Debug|Win32.Build.0 = Debug|Win32
- {8FD2E297-4096-47E5-9258-C48FF1841523}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {8FD2E297-4096-47E5-9258-C48FF1841523}.Release|Mixed Platforms.Build.0 = Release|Win32
{8FD2E297-4096-47E5-9258-C48FF1841523}.Release|Win32.ActiveCfg = Release|Win32
{8FD2E297-4096-47E5-9258-C48FF1841523}.Release|Win32.Build.0 = Release|Win32
- {989BB874-7AF1-44CB-8E5C-CC8113D267E8}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {989BB874-7AF1-44CB-8E5C-CC8113D267E8}.Debug|Mixed Platforms.Build.0 = Debug|Win32
{989BB874-7AF1-44CB-8E5C-CC8113D267E8}.Debug|Win32.ActiveCfg = Debug|Win32
{989BB874-7AF1-44CB-8E5C-CC8113D267E8}.Debug|Win32.Build.0 = Debug|Win32
- {989BB874-7AF1-44CB-8E5C-CC8113D267E8}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {989BB874-7AF1-44CB-8E5C-CC8113D267E8}.Release|Mixed Platforms.Build.0 = Release|Win32
{989BB874-7AF1-44CB-8E5C-CC8113D267E8}.Release|Win32.ActiveCfg = Release|Win32
{989BB874-7AF1-44CB-8E5C-CC8113D267E8}.Release|Win32.Build.0 = Release|Win32
- {5CC054B7-6DAA-46BF-9A08-3B33B83E8D3E}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {5CC054B7-6DAA-46BF-9A08-3B33B83E8D3E}.Debug|Mixed Platforms.Build.0 = Debug|Win32
{5CC054B7-6DAA-46BF-9A08-3B33B83E8D3E}.Debug|Win32.ActiveCfg = Debug|Win32
{5CC054B7-6DAA-46BF-9A08-3B33B83E8D3E}.Debug|Win32.Build.0 = Debug|Win32
- {5CC054B7-6DAA-46BF-9A08-3B33B83E8D3E}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {5CC054B7-6DAA-46BF-9A08-3B33B83E8D3E}.Release|Mixed Platforms.Build.0 = Release|Win32
{5CC054B7-6DAA-46BF-9A08-3B33B83E8D3E}.Release|Win32.ActiveCfg = Release|Win32
{5CC054B7-6DAA-46BF-9A08-3B33B83E8D3E}.Release|Win32.Build.0 = Release|Win32
- {1906D736-08BD-4EE1-924F-B536249B9A54}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {1906D736-08BD-4EE1-924F-B536249B9A54}.Debug|Mixed Platforms.Build.0 = Debug|Win32
{1906D736-08BD-4EE1-924F-B536249B9A54}.Debug|Win32.ActiveCfg = Debug|Win32
{1906D736-08BD-4EE1-924F-B536249B9A54}.Debug|Win32.Build.0 = Debug|Win32
- {1906D736-08BD-4EE1-924F-B536249B9A54}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {1906D736-08BD-4EE1-924F-B536249B9A54}.Release|Mixed Platforms.Build.0 = Release|Win32
{1906D736-08BD-4EE1-924F-B536249B9A54}.Release|Win32.ActiveCfg = Release|Win32
{1906D736-08BD-4EE1-924F-B536249B9A54}.Release|Win32.Build.0 = Release|Win32
- {EEF031CB-FED8-451E-A471-91EC8D4F6750}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {EEF031CB-FED8-451E-A471-91EC8D4F6750}.Debug|Mixed Platforms.Build.0 = Debug|Win32
{EEF031CB-FED8-451E-A471-91EC8D4F6750}.Debug|Win32.ActiveCfg = Debug|Win32
{EEF031CB-FED8-451E-A471-91EC8D4F6750}.Debug|Win32.Build.0 = Debug|Win32
- {EEF031CB-FED8-451E-A471-91EC8D4F6750}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {EEF031CB-FED8-451E-A471-91EC8D4F6750}.Release|Mixed Platforms.Build.0 = Release|Win32
{EEF031CB-FED8-451E-A471-91EC8D4F6750}.Release|Win32.ActiveCfg = Release|Win32
{EEF031CB-FED8-451E-A471-91EC8D4F6750}.Release|Win32.Build.0 = Release|Win32
- {6EDFEFD5-3596-4FA9-8EBA-B331547B35A3}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {6EDFEFD5-3596-4FA9-8EBA-B331547B35A3}.Debug|Mixed Platforms.Build.0 = Debug|Win32
{6EDFEFD5-3596-4FA9-8EBA-B331547B35A3}.Debug|Win32.ActiveCfg = Debug DLL|Win32
{6EDFEFD5-3596-4FA9-8EBA-B331547B35A3}.Debug|Win32.Build.0 = Debug DLL|Win32
- {6EDFEFD5-3596-4FA9-8EBA-B331547B35A3}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {6EDFEFD5-3596-4FA9-8EBA-B331547B35A3}.Release|Mixed Platforms.Build.0 = Release|Win32
{6EDFEFD5-3596-4FA9-8EBA-B331547B35A3}.Release|Win32.ActiveCfg = Release DLL|Win32
{6EDFEFD5-3596-4FA9-8EBA-B331547B35A3}.Release|Win32.Build.0 = Release DLL|Win32
- {8D04B550-D240-4A44-8A18-35DA3F7038D9}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {8D04B550-D240-4A44-8A18-35DA3F7038D9}.Debug|Mixed Platforms.Build.0 = Debug|Win32
{8D04B550-D240-4A44-8A18-35DA3F7038D9}.Debug|Win32.ActiveCfg = Debug DLL|Win32
{8D04B550-D240-4A44-8A18-35DA3F7038D9}.Debug|Win32.Build.0 = Debug DLL|Win32
- {8D04B550-D240-4A44-8A18-35DA3F7038D9}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {8D04B550-D240-4A44-8A18-35DA3F7038D9}.Release|Mixed Platforms.Build.0 = Release|Win32
{8D04B550-D240-4A44-8A18-35DA3F7038D9}.Release|Win32.ActiveCfg = Release DLL|Win32
{8D04B550-D240-4A44-8A18-35DA3F7038D9}.Release|Win32.Build.0 = Release DLL|Win32
- {1CED5987-A529-46DC-B30F-870D85FF9C94}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {1CED5987-A529-46DC-B30F-870D85FF9C94}.Debug|Mixed Platforms.Build.0 = Debug|Win32
{1CED5987-A529-46DC-B30F-870D85FF9C94}.Debug|Win32.ActiveCfg = Debug|Win32
{1CED5987-A529-46DC-B30F-870D85FF9C94}.Debug|Win32.Build.0 = Debug|Win32
- {1CED5987-A529-46DC-B30F-870D85FF9C94}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {1CED5987-A529-46DC-B30F-870D85FF9C94}.Release|Mixed Platforms.Build.0 = Release|Win32
{1CED5987-A529-46DC-B30F-870D85FF9C94}.Release|Win32.ActiveCfg = Release|Win32
{1CED5987-A529-46DC-B30F-870D85FF9C94}.Release|Win32.Build.0 = Release|Win32
- {50AD0E28-B8D7-4FCC-8FC3-599F6AC69761}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {50AD0E28-B8D7-4FCC-8FC3-599F6AC69761}.Debug|Mixed Platforms.Build.0 = Debug|Win32
{50AD0E28-B8D7-4FCC-8FC3-599F6AC69761}.Debug|Win32.ActiveCfg = Debug|Win32
{50AD0E28-B8D7-4FCC-8FC3-599F6AC69761}.Debug|Win32.Build.0 = Debug|Win32
- {50AD0E28-B8D7-4FCC-8FC3-599F6AC69761}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {50AD0E28-B8D7-4FCC-8FC3-599F6AC69761}.Release|Mixed Platforms.Build.0 = Release|Win32
{50AD0E28-B8D7-4FCC-8FC3-599F6AC69761}.Release|Win32.ActiveCfg = Release|Win32
{50AD0E28-B8D7-4FCC-8FC3-599F6AC69761}.Release|Win32.Build.0 = Release|Win32
- {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}.Debug|Mixed Platforms.Build.0 = Debug|Win32
{F6C55D93-B927-4483-BB69-15AEF3DD2DFF}.Debug|Win32.ActiveCfg = Debug|Win32
{F6C55D93-B927-4483-BB69-15AEF3DD2DFF}.Debug|Win32.Build.0 = Debug|Win32
- {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}.Release|Mixed Platforms.Build.0 = Release|Win32
{F6C55D93-B927-4483-BB69-15AEF3DD2DFF}.Release|Win32.ActiveCfg = Release|Win32
{F6C55D93-B927-4483-BB69-15AEF3DD2DFF}.Release|Win32.Build.0 = Release|Win32
- {101130D1-3EA6-4ED2-B65D-CEB5243A20ED}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {101130D1-3EA6-4ED2-B65D-CEB5243A20ED}.Debug|Mixed Platforms.Build.0 = Debug|Win32
{101130D1-3EA6-4ED2-B65D-CEB5243A20ED}.Debug|Win32.ActiveCfg = Debug|Win32
{101130D1-3EA6-4ED2-B65D-CEB5243A20ED}.Debug|Win32.Build.0 = Debug|Win32
- {101130D1-3EA6-4ED2-B65D-CEB5243A20ED}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {101130D1-3EA6-4ED2-B65D-CEB5243A20ED}.Release|Mixed Platforms.Build.0 = Release|Win32
{101130D1-3EA6-4ED2-B65D-CEB5243A20ED}.Release|Win32.ActiveCfg = Release|Win32
{101130D1-3EA6-4ED2-B65D-CEB5243A20ED}.Release|Win32.Build.0 = Release|Win32
- {F057DA7F-79E5-4B00-845C-EF446EF055E3}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {F057DA7F-79E5-4B00-845C-EF446EF055E3}.Debug|Mixed Platforms.Build.0 = Debug|Win32
{F057DA7F-79E5-4B00-845C-EF446EF055E3}.Debug|Win32.ActiveCfg = Debug|Win32
{F057DA7F-79E5-4B00-845C-EF446EF055E3}.Debug|Win32.Build.0 = Debug|Win32
- {F057DA7F-79E5-4B00-845C-EF446EF055E3}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {F057DA7F-79E5-4B00-845C-EF446EF055E3}.Release|Mixed Platforms.Build.0 = Release|Win32
{F057DA7F-79E5-4B00-845C-EF446EF055E3}.Release|Win32.ActiveCfg = Release|Win32
{F057DA7F-79E5-4B00-845C-EF446EF055E3}.Release|Win32.Build.0 = Release|Win32
- {C4854C1D-5478-4F87-AB62-36CCDDDBA3C7}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {C4854C1D-5478-4F87-AB62-36CCDDDBA3C7}.Debug|Mixed Platforms.Build.0 = Debug|Win32
{C4854C1D-5478-4F87-AB62-36CCDDDBA3C7}.Debug|Win32.ActiveCfg = Debug|Win32
{C4854C1D-5478-4F87-AB62-36CCDDDBA3C7}.Debug|Win32.Build.0 = Debug|Win32
- {C4854C1D-5478-4F87-AB62-36CCDDDBA3C7}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {C4854C1D-5478-4F87-AB62-36CCDDDBA3C7}.Release|Mixed Platforms.Build.0 = Release|Win32
{C4854C1D-5478-4F87-AB62-36CCDDDBA3C7}.Release|Win32.ActiveCfg = Release|Win32
{C4854C1D-5478-4F87-AB62-36CCDDDBA3C7}.Release|Win32.Build.0 = Release|Win32
- {5786D51D-1C6A-4BE1-8804-29954DB5258F}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {5786D51D-1C6A-4BE1-8804-29954DB5258F}.Debug|Mixed Platforms.Build.0 = Debug|Win32
{5786D51D-1C6A-4BE1-8804-29954DB5258F}.Debug|Win32.ActiveCfg = Debug|Win32
{5786D51D-1C6A-4BE1-8804-29954DB5258F}.Debug|Win32.Build.0 = Debug|Win32
- {5786D51D-1C6A-4BE1-8804-29954DB5258F}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {5786D51D-1C6A-4BE1-8804-29954DB5258F}.Release|Mixed Platforms.Build.0 = Release|Win32
{5786D51D-1C6A-4BE1-8804-29954DB5258F}.Release|Win32.ActiveCfg = Release|Win32
{5786D51D-1C6A-4BE1-8804-29954DB5258F}.Release|Win32.Build.0 = Release|Win32
- {E969F3E0-1043-482A-AD49-787B8356BA92}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {E969F3E0-1043-482A-AD49-787B8356BA92}.Debug|Mixed Platforms.Build.0 = Debug|Win32
{E969F3E0-1043-482A-AD49-787B8356BA92}.Debug|Win32.ActiveCfg = Debug|Win32
{E969F3E0-1043-482A-AD49-787B8356BA92}.Debug|Win32.Build.0 = Debug|Win32
- {E969F3E0-1043-482A-AD49-787B8356BA92}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {E969F3E0-1043-482A-AD49-787B8356BA92}.Release|Mixed Platforms.Build.0 = Release|Win32
{E969F3E0-1043-482A-AD49-787B8356BA92}.Release|Win32.ActiveCfg = Release|Win32
{E969F3E0-1043-482A-AD49-787B8356BA92}.Release|Win32.Build.0 = Release|Win32
- {91695C7C-7AD1-4782-9727-508F82D9C577}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {91695C7C-7AD1-4782-9727-508F82D9C577}.Debug|Mixed Platforms.Build.0 = Debug|Win32
{91695C7C-7AD1-4782-9727-508F82D9C577}.Debug|Win32.ActiveCfg = Debug|Win32
{91695C7C-7AD1-4782-9727-508F82D9C577}.Debug|Win32.Build.0 = Debug|Win32
- {91695C7C-7AD1-4782-9727-508F82D9C577}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {91695C7C-7AD1-4782-9727-508F82D9C577}.Release|Mixed Platforms.Build.0 = Release|Win32
{91695C7C-7AD1-4782-9727-508F82D9C577}.Release|Win32.ActiveCfg = Release|Win32
{91695C7C-7AD1-4782-9727-508F82D9C577}.Release|Win32.Build.0 = Release|Win32
- {6B9217D6-8259-4817-B8A5-2FEAD349EDEB}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {6B9217D6-8259-4817-B8A5-2FEAD349EDEB}.Debug|Mixed Platforms.Build.0 = Debug|Win32
{6B9217D6-8259-4817-B8A5-2FEAD349EDEB}.Debug|Win32.ActiveCfg = Debug|Win32
{6B9217D6-8259-4817-B8A5-2FEAD349EDEB}.Debug|Win32.Build.0 = Debug|Win32
- {6B9217D6-8259-4817-B8A5-2FEAD349EDEB}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {6B9217D6-8259-4817-B8A5-2FEAD349EDEB}.Release|Mixed Platforms.Build.0 = Release|Win32
{6B9217D6-8259-4817-B8A5-2FEAD349EDEB}.Release|Win32.ActiveCfg = Release|Win32
{6B9217D6-8259-4817-B8A5-2FEAD349EDEB}.Release|Win32.Build.0 = Release|Win32
- {5C9C69D2-8B98-42DA-8D82-6E0B48446FAC}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {5C9C69D2-8B98-42DA-8D82-6E0B48446FAC}.Debug|Mixed Platforms.Build.0 = Debug|Win32
{5C9C69D2-8B98-42DA-8D82-6E0B48446FAC}.Debug|Win32.ActiveCfg = Debug|Win32
{5C9C69D2-8B98-42DA-8D82-6E0B48446FAC}.Debug|Win32.Build.0 = Debug|Win32
- {5C9C69D2-8B98-42DA-8D82-6E0B48446FAC}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {5C9C69D2-8B98-42DA-8D82-6E0B48446FAC}.Release|Mixed Platforms.Build.0 = Release|Win32
{5C9C69D2-8B98-42DA-8D82-6E0B48446FAC}.Release|Win32.ActiveCfg = Release|Win32
{5C9C69D2-8B98-42DA-8D82-6E0B48446FAC}.Release|Win32.Build.0 = Release|Win32
- {1C469CDD-A3AF-4A94-A592-B2CF12F2D918}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {1C469CDD-A3AF-4A94-A592-B2CF12F2D918}.Debug|Mixed Platforms.Build.0 = Debug|Win32
{1C469CDD-A3AF-4A94-A592-B2CF12F2D918}.Debug|Win32.ActiveCfg = Debug|Win32
{1C469CDD-A3AF-4A94-A592-B2CF12F2D918}.Debug|Win32.Build.0 = Debug|Win32
- {1C469CDD-A3AF-4A94-A592-B2CF12F2D918}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {1C469CDD-A3AF-4A94-A592-B2CF12F2D918}.Release|Mixed Platforms.Build.0 = Release|Win32
{1C469CDD-A3AF-4A94-A592-B2CF12F2D918}.Release|Win32.ActiveCfg = Release|Win32
{1C469CDD-A3AF-4A94-A592-B2CF12F2D918}.Release|Win32.Build.0 = Release|Win32
- {F8C28DF9-D76A-449E-A621-D97D869974DA}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {F8C28DF9-D76A-449E-A621-D97D869974DA}.Debug|Mixed Platforms.Build.0 = Debug|Win32
{F8C28DF9-D76A-449E-A621-D97D869974DA}.Debug|Win32.ActiveCfg = Debug|Win32
{F8C28DF9-D76A-449E-A621-D97D869974DA}.Debug|Win32.Build.0 = Debug|Win32
- {F8C28DF9-D76A-449E-A621-D97D869974DA}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {F8C28DF9-D76A-449E-A621-D97D869974DA}.Release|Mixed Platforms.Build.0 = Release|Win32
{F8C28DF9-D76A-449E-A621-D97D869974DA}.Release|Win32.ActiveCfg = Release|Win32
{F8C28DF9-D76A-449E-A621-D97D869974DA}.Release|Win32.Build.0 = Release|Win32
- {E727E8F6-935D-46FE-8B0E-37834748A0E3}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {E727E8F6-935D-46FE-8B0E-37834748A0E3}.Debug|Mixed Platforms.Build.0 = Debug|Win32
{E727E8F6-935D-46FE-8B0E-37834748A0E3}.Debug|Win32.ActiveCfg = Debug|Win32
{E727E8F6-935D-46FE-8B0E-37834748A0E3}.Debug|Win32.Build.0 = Debug|Win32
- {E727E8F6-935D-46FE-8B0E-37834748A0E3}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {E727E8F6-935D-46FE-8B0E-37834748A0E3}.Release|Mixed Platforms.Build.0 = Release|Win32
{E727E8F6-935D-46FE-8B0E-37834748A0E3}.Release|Win32.ActiveCfg = Release|Win32
{E727E8F6-935D-46FE-8B0E-37834748A0E3}.Release|Win32.Build.0 = Release|Win32
- {985135DA-BBE1-42D2-8A85-1F7DF0609B3D}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {985135DA-BBE1-42D2-8A85-1F7DF0609B3D}.Debug|Mixed Platforms.Build.0 = Debug|Win32
{985135DA-BBE1-42D2-8A85-1F7DF0609B3D}.Debug|Win32.ActiveCfg = Debug|Win32
{985135DA-BBE1-42D2-8A85-1F7DF0609B3D}.Debug|Win32.Build.0 = Debug|Win32
- {985135DA-BBE1-42D2-8A85-1F7DF0609B3D}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {985135DA-BBE1-42D2-8A85-1F7DF0609B3D}.Release|Mixed Platforms.Build.0 = Release|Win32
{985135DA-BBE1-42D2-8A85-1F7DF0609B3D}.Release|Win32.ActiveCfg = Release|Win32
{985135DA-BBE1-42D2-8A85-1F7DF0609B3D}.Release|Win32.Build.0 = Release|Win32
- {C30D35E4-7FC6-4E97-9BE5-4BC077BE0D4B}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {C30D35E4-7FC6-4E97-9BE5-4BC077BE0D4B}.Debug|Mixed Platforms.Build.0 = Debug|Win32
{C30D35E4-7FC6-4E97-9BE5-4BC077BE0D4B}.Debug|Win32.ActiveCfg = Debug|Win32
{C30D35E4-7FC6-4E97-9BE5-4BC077BE0D4B}.Debug|Win32.Build.0 = Debug|Win32
- {C30D35E4-7FC6-4E97-9BE5-4BC077BE0D4B}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {C30D35E4-7FC6-4E97-9BE5-4BC077BE0D4B}.Release|Mixed Platforms.Build.0 = Release|Win32
{C30D35E4-7FC6-4E97-9BE5-4BC077BE0D4B}.Release|Win32.ActiveCfg = Release|Win32
{C30D35E4-7FC6-4E97-9BE5-4BC077BE0D4B}.Release|Win32.Build.0 = Release|Win32
- {5927104D-C14C-4AC8-925C-4AB681762E75}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {5927104D-C14C-4AC8-925C-4AB681762E75}.Debug|Mixed Platforms.Build.0 = Debug|Win32
{5927104D-C14C-4AC8-925C-4AB681762E75}.Debug|Win32.ActiveCfg = Debug|Win32
{5927104D-C14C-4AC8-925C-4AB681762E75}.Debug|Win32.Build.0 = Debug|Win32
- {5927104D-C14C-4AC8-925C-4AB681762E75}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {5927104D-C14C-4AC8-925C-4AB681762E75}.Release|Mixed Platforms.Build.0 = Release|Win32
{5927104D-C14C-4AC8-925C-4AB681762E75}.Release|Win32.ActiveCfg = Release|Win32
{5927104D-C14C-4AC8-925C-4AB681762E75}.Release|Win32.Build.0 = Release|Win32
- {0D826AF5-0506-4C50-BB8B-7DB019AC21AE}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {0D826AF5-0506-4C50-BB8B-7DB019AC21AE}.Debug|Mixed Platforms.Build.0 = Debug|Win32
{0D826AF5-0506-4C50-BB8B-7DB019AC21AE}.Debug|Win32.ActiveCfg = Debug|Win32
{0D826AF5-0506-4C50-BB8B-7DB019AC21AE}.Debug|Win32.Build.0 = Debug|Win32
- {0D826AF5-0506-4C50-BB8B-7DB019AC21AE}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {0D826AF5-0506-4C50-BB8B-7DB019AC21AE}.Release|Mixed Platforms.Build.0 = Release|Win32
{0D826AF5-0506-4C50-BB8B-7DB019AC21AE}.Release|Win32.ActiveCfg = Release|Win32
{0D826AF5-0506-4C50-BB8B-7DB019AC21AE}.Release|Win32.Build.0 = Release|Win32
- {49C34584-B6DA-448F-83CF-27584DC9FC90}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {49C34584-B6DA-448F-83CF-27584DC9FC90}.Debug|Mixed Platforms.Build.0 = Debug|Win32
{49C34584-B6DA-448F-83CF-27584DC9FC90}.Debug|Win32.ActiveCfg = Debug|Win32
{49C34584-B6DA-448F-83CF-27584DC9FC90}.Debug|Win32.Build.0 = Debug|Win32
- {49C34584-B6DA-448F-83CF-27584DC9FC90}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {49C34584-B6DA-448F-83CF-27584DC9FC90}.Release|Mixed Platforms.Build.0 = Release|Win32
{49C34584-B6DA-448F-83CF-27584DC9FC90}.Release|Win32.ActiveCfg = Release|Win32
{49C34584-B6DA-448F-83CF-27584DC9FC90}.Release|Win32.Build.0 = Release|Win32
- {EFA9E76E-62A5-4237-B7E9-F39B8E174CD5}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {EFA9E76E-62A5-4237-B7E9-F39B8E174CD5}.Debug|Mixed Platforms.Build.0 = Debug|Win32
{EFA9E76E-62A5-4237-B7E9-F39B8E174CD5}.Debug|Win32.ActiveCfg = Debug|Win32
{EFA9E76E-62A5-4237-B7E9-F39B8E174CD5}.Debug|Win32.Build.0 = Debug|Win32
- {EFA9E76E-62A5-4237-B7E9-F39B8E174CD5}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {EFA9E76E-62A5-4237-B7E9-F39B8E174CD5}.Release|Mixed Platforms.Build.0 = Release|Win32
{EFA9E76E-62A5-4237-B7E9-F39B8E174CD5}.Release|Win32.ActiveCfg = Release|Win32
{EFA9E76E-62A5-4237-B7E9-F39B8E174CD5}.Release|Win32.Build.0 = Release|Win32
- {3D0370CA-BED2-4657-A475-32375CBCB6E4}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {3D0370CA-BED2-4657-A475-32375CBCB6E4}.Debug|Mixed Platforms.Build.0 = Debug|Win32
{3D0370CA-BED2-4657-A475-32375CBCB6E4}.Debug|Win32.ActiveCfg = Debug|Win32
{3D0370CA-BED2-4657-A475-32375CBCB6E4}.Debug|Win32.Build.0 = Debug|Win32
- {3D0370CA-BED2-4657-A475-32375CBCB6E4}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {3D0370CA-BED2-4657-A475-32375CBCB6E4}.Release|Mixed Platforms.Build.0 = Release|Win32
{3D0370CA-BED2-4657-A475-32375CBCB6E4}.Release|Win32.ActiveCfg = Release|Win32
{3D0370CA-BED2-4657-A475-32375CBCB6E4}.Release|Win32.Build.0 = Release|Win32
- {831F76E8-D288-4C54-9B6D-281D9436CCC7}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {831F76E8-D288-4C54-9B6D-281D9436CCC7}.Debug|Mixed Platforms.Build.0 = Debug|Win32
{831F76E8-D288-4C54-9B6D-281D9436CCC7}.Debug|Win32.ActiveCfg = Debug|Win32
{831F76E8-D288-4C54-9B6D-281D9436CCC7}.Debug|Win32.Build.0 = Debug|Win32
- {831F76E8-D288-4C54-9B6D-281D9436CCC7}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {831F76E8-D288-4C54-9B6D-281D9436CCC7}.Release|Mixed Platforms.Build.0 = Release|Win32
{831F76E8-D288-4C54-9B6D-281D9436CCC7}.Release|Win32.ActiveCfg = Release|Win32
{831F76E8-D288-4C54-9B6D-281D9436CCC7}.Release|Win32.Build.0 = Release|Win32
- {87EE9DA4-DE1E-4448-8324-183C98DCA588}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {87EE9DA4-DE1E-4448-8324-183C98DCA588}.Debug|Mixed Platforms.Build.0 = Debug|Win32
{87EE9DA4-DE1E-4448-8324-183C98DCA588}.Debug|Win32.ActiveCfg = Debug|Win32
{87EE9DA4-DE1E-4448-8324-183C98DCA588}.Debug|Win32.Build.0 = Debug|Win32
- {87EE9DA4-DE1E-4448-8324-183C98DCA588}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {87EE9DA4-DE1E-4448-8324-183C98DCA588}.Release|Mixed Platforms.Build.0 = Release|Win32
{87EE9DA4-DE1E-4448-8324-183C98DCA588}.Release|Win32.ActiveCfg = Release|Win32
{87EE9DA4-DE1E-4448-8324-183C98DCA588}.Release|Win32.Build.0 = Release|Win32
- {EC8D4AE8-0F3E-454A-BFB8-D56A5D9C0121}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {EC8D4AE8-0F3E-454A-BFB8-D56A5D9C0121}.Debug|Mixed Platforms.Build.0 = Debug|Win32
{EC8D4AE8-0F3E-454A-BFB8-D56A5D9C0121}.Debug|Win32.ActiveCfg = Debug|Win32
{EC8D4AE8-0F3E-454A-BFB8-D56A5D9C0121}.Debug|Win32.Build.0 = Debug|Win32
- {EC8D4AE8-0F3E-454A-BFB8-D56A5D9C0121}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {EC8D4AE8-0F3E-454A-BFB8-D56A5D9C0121}.Release|Mixed Platforms.Build.0 = Release|Win32
{EC8D4AE8-0F3E-454A-BFB8-D56A5D9C0121}.Release|Win32.ActiveCfg = Release|Win32
{EC8D4AE8-0F3E-454A-BFB8-D56A5D9C0121}.Release|Win32.Build.0 = Release|Win32
- {A3FE0076-B366-429D-A238-D7304DA7D3C1}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {A3FE0076-B366-429D-A238-D7304DA7D3C1}.Debug|Mixed Platforms.Build.0 = Debug|Win32
{A3FE0076-B366-429D-A238-D7304DA7D3C1}.Debug|Win32.ActiveCfg = Debug|Win32
{A3FE0076-B366-429D-A238-D7304DA7D3C1}.Debug|Win32.Build.0 = Debug|Win32
- {A3FE0076-B366-429D-A238-D7304DA7D3C1}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {A3FE0076-B366-429D-A238-D7304DA7D3C1}.Release|Mixed Platforms.Build.0 = Release|Win32
{A3FE0076-B366-429D-A238-D7304DA7D3C1}.Release|Win32.ActiveCfg = Release|Win32
{A3FE0076-B366-429D-A238-D7304DA7D3C1}.Release|Win32.Build.0 = Release|Win32
- {356EC96D-4C9F-47B5-9083-FC328B87BA94}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {356EC96D-4C9F-47B5-9083-FC328B87BA94}.Debug|Mixed Platforms.Build.0 = Debug|Win32
{356EC96D-4C9F-47B5-9083-FC328B87BA94}.Debug|Win32.ActiveCfg = Debug|Win32
{356EC96D-4C9F-47B5-9083-FC328B87BA94}.Debug|Win32.Build.0 = Debug|Win32
- {356EC96D-4C9F-47B5-9083-FC328B87BA94}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {356EC96D-4C9F-47B5-9083-FC328B87BA94}.Release|Mixed Platforms.Build.0 = Release|Win32
{356EC96D-4C9F-47B5-9083-FC328B87BA94}.Release|Win32.ActiveCfg = Release|Win32
{356EC96D-4C9F-47B5-9083-FC328B87BA94}.Release|Win32.Build.0 = Release|Win32
- {155844C3-EC5F-407F-97A4-A2DDADED9B2F}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {155844C3-EC5F-407F-97A4-A2DDADED9B2F}.Debug|Mixed Platforms.Build.0 = Debug|Win32
{155844C3-EC5F-407F-97A4-A2DDADED9B2F}.Debug|Win32.ActiveCfg = Debug|Win32
{155844C3-EC5F-407F-97A4-A2DDADED9B2F}.Debug|Win32.Build.0 = Debug|Win32
- {155844C3-EC5F-407F-97A4-A2DDADED9B2F}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {155844C3-EC5F-407F-97A4-A2DDADED9B2F}.Release|Mixed Platforms.Build.0 = Release|Win32
{155844C3-EC5F-407F-97A4-A2DDADED9B2F}.Release|Win32.ActiveCfg = Release|Win32
{155844C3-EC5F-407F-97A4-A2DDADED9B2F}.Release|Win32.Build.0 = Release|Win32
- {B0AA13FC-636C-45A7-8EAE-663220679A75}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {B0AA13FC-636C-45A7-8EAE-663220679A75}.Debug|Mixed Platforms.Build.0 = Debug|Win32
{B0AA13FC-636C-45A7-8EAE-663220679A75}.Debug|Win32.ActiveCfg = Debug|Win32
{B0AA13FC-636C-45A7-8EAE-663220679A75}.Debug|Win32.Build.0 = Debug|Win32
- {B0AA13FC-636C-45A7-8EAE-663220679A75}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {B0AA13FC-636C-45A7-8EAE-663220679A75}.Release|Mixed Platforms.Build.0 = Release|Win32
{B0AA13FC-636C-45A7-8EAE-663220679A75}.Release|Win32.ActiveCfg = Release|Win32
{B0AA13FC-636C-45A7-8EAE-663220679A75}.Release|Win32.Build.0 = Release|Win32
- {76D0A759-9C07-42D4-90A9-82AE15462C95}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {76D0A759-9C07-42D4-90A9-82AE15462C95}.Debug|Mixed Platforms.Build.0 = Debug|Win32
{76D0A759-9C07-42D4-90A9-82AE15462C95}.Debug|Win32.ActiveCfg = Debug|Win32
{76D0A759-9C07-42D4-90A9-82AE15462C95}.Debug|Win32.Build.0 = Debug|Win32
- {76D0A759-9C07-42D4-90A9-82AE15462C95}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {76D0A759-9C07-42D4-90A9-82AE15462C95}.Release|Mixed Platforms.Build.0 = Release|Win32
{76D0A759-9C07-42D4-90A9-82AE15462C95}.Release|Win32.ActiveCfg = Release|Win32
{76D0A759-9C07-42D4-90A9-82AE15462C95}.Release|Win32.Build.0 = Release|Win32
- {204FA0DE-305D-4414-AE2E-F195A23F390D}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {204FA0DE-305D-4414-AE2E-F195A23F390D}.Debug|Mixed Platforms.Build.0 = Debug|Win32
{204FA0DE-305D-4414-AE2E-F195A23F390D}.Debug|Win32.ActiveCfg = Debug|Win32
{204FA0DE-305D-4414-AE2E-F195A23F390D}.Debug|Win32.Build.0 = Debug|Win32
- {204FA0DE-305D-4414-AE2E-F195A23F390D}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {204FA0DE-305D-4414-AE2E-F195A23F390D}.Release|Mixed Platforms.Build.0 = Release|Win32
{204FA0DE-305D-4414-AE2E-F195A23F390D}.Release|Win32.ActiveCfg = Release|Win32
{204FA0DE-305D-4414-AE2E-F195A23F390D}.Release|Win32.Build.0 = Release|Win32
- {0DF3ABD0-DDC0-4265-B778-07C66780979B}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {0DF3ABD0-DDC0-4265-B778-07C66780979B}.Debug|Mixed Platforms.Build.0 = Debug|Win32
{0DF3ABD0-DDC0-4265-B778-07C66780979B}.Debug|Win32.ActiveCfg = Debug|Win32
{0DF3ABD0-DDC0-4265-B778-07C66780979B}.Debug|Win32.Build.0 = Debug|Win32
- {0DF3ABD0-DDC0-4265-B778-07C66780979B}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {0DF3ABD0-DDC0-4265-B778-07C66780979B}.Release|Mixed Platforms.Build.0 = Release|Win32
{0DF3ABD0-DDC0-4265-B778-07C66780979B}.Release|Win32.ActiveCfg = Release|Win32
{0DF3ABD0-DDC0-4265-B778-07C66780979B}.Release|Win32.Build.0 = Release|Win32
- {5A6A281A-AA50-470A-8305-202BDA1CD1BF}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {5A6A281A-AA50-470A-8305-202BDA1CD1BF}.Debug|Mixed Platforms.Build.0 = Debug|Win32
{5A6A281A-AA50-470A-8305-202BDA1CD1BF}.Debug|Win32.ActiveCfg = Debug|Win32
{5A6A281A-AA50-470A-8305-202BDA1CD1BF}.Debug|Win32.Build.0 = Debug|Win32
- {5A6A281A-AA50-470A-8305-202BDA1CD1BF}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {5A6A281A-AA50-470A-8305-202BDA1CD1BF}.Release|Mixed Platforms.Build.0 = Release|Win32
{5A6A281A-AA50-470A-8305-202BDA1CD1BF}.Release|Win32.ActiveCfg = Release|Win32
{5A6A281A-AA50-470A-8305-202BDA1CD1BF}.Release|Win32.Build.0 = Release|Win32
- {486369EB-F150-4B56-BCC8-77B9E18FF5F5}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {486369EB-F150-4B56-BCC8-77B9E18FF5F5}.Debug|Mixed Platforms.Build.0 = Debug|Win32
{486369EB-F150-4B56-BCC8-77B9E18FF5F5}.Debug|Win32.ActiveCfg = Debug|Win32
{486369EB-F150-4B56-BCC8-77B9E18FF5F5}.Debug|Win32.Build.0 = Debug|Win32
- {486369EB-F150-4B56-BCC8-77B9E18FF5F5}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {486369EB-F150-4B56-BCC8-77B9E18FF5F5}.Release|Mixed Platforms.Build.0 = Release|Win32
{486369EB-F150-4B56-BCC8-77B9E18FF5F5}.Release|Win32.ActiveCfg = Release|Win32
{486369EB-F150-4B56-BCC8-77B9E18FF5F5}.Release|Win32.Build.0 = Release|Win32
- {D71E7338-8D9C-4FE4-A15F-D5CC60202C7C}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {D71E7338-8D9C-4FE4-A15F-D5CC60202C7C}.Debug|Mixed Platforms.Build.0 = Debug|Win32
{D71E7338-8D9C-4FE4-A15F-D5CC60202C7C}.Debug|Win32.ActiveCfg = Debug|Win32
{D71E7338-8D9C-4FE4-A15F-D5CC60202C7C}.Debug|Win32.Build.0 = Debug|Win32
- {D71E7338-8D9C-4FE4-A15F-D5CC60202C7C}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {D71E7338-8D9C-4FE4-A15F-D5CC60202C7C}.Release|Mixed Platforms.Build.0 = Release|Win32
{D71E7338-8D9C-4FE4-A15F-D5CC60202C7C}.Release|Win32.ActiveCfg = Release|Win32
{D71E7338-8D9C-4FE4-A15F-D5CC60202C7C}.Release|Win32.Build.0 = Release|Win32
- {D42518CC-7475-454D-B392-0E132C07D761}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {D42518CC-7475-454D-B392-0E132C07D761}.Debug|Mixed Platforms.Build.0 = Debug|Win32
{D42518CC-7475-454D-B392-0E132C07D761}.Debug|Win32.ActiveCfg = Debug|Win32
{D42518CC-7475-454D-B392-0E132C07D761}.Debug|Win32.Build.0 = Debug|Win32
- {D42518CC-7475-454D-B392-0E132C07D761}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {D42518CC-7475-454D-B392-0E132C07D761}.Release|Mixed Platforms.Build.0 = Release|Win32
{D42518CC-7475-454D-B392-0E132C07D761}.Release|Win32.ActiveCfg = Release|Win32
{D42518CC-7475-454D-B392-0E132C07D761}.Release|Win32.Build.0 = Release|Win32
- {2740F45C-475A-4DE0-BCED-6E2E5F6C4B8B}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {2740F45C-475A-4DE0-BCED-6E2E5F6C4B8B}.Debug|Mixed Platforms.Build.0 = Debug|Win32
{2740F45C-475A-4DE0-BCED-6E2E5F6C4B8B}.Debug|Win32.ActiveCfg = Debug|Win32
{2740F45C-475A-4DE0-BCED-6E2E5F6C4B8B}.Debug|Win32.Build.0 = Debug|Win32
- {2740F45C-475A-4DE0-BCED-6E2E5F6C4B8B}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {2740F45C-475A-4DE0-BCED-6E2E5F6C4B8B}.Release|Mixed Platforms.Build.0 = Release|Win32
{2740F45C-475A-4DE0-BCED-6E2E5F6C4B8B}.Release|Win32.ActiveCfg = Release|Win32
{2740F45C-475A-4DE0-BCED-6E2E5F6C4B8B}.Release|Win32.Build.0 = Release|Win32
- {8B2CE7D1-77EF-45ED-927D-82147805440B}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {8B2CE7D1-77EF-45ED-927D-82147805440B}.Debug|Mixed Platforms.Build.0 = Debug|Win32
{8B2CE7D1-77EF-45ED-927D-82147805440B}.Debug|Win32.ActiveCfg = Debug|Win32
{8B2CE7D1-77EF-45ED-927D-82147805440B}.Debug|Win32.Build.0 = Debug|Win32
- {8B2CE7D1-77EF-45ED-927D-82147805440B}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {8B2CE7D1-77EF-45ED-927D-82147805440B}.Release|Mixed Platforms.Build.0 = Release|Win32
{8B2CE7D1-77EF-45ED-927D-82147805440B}.Release|Win32.ActiveCfg = Release|Win32
{8B2CE7D1-77EF-45ED-927D-82147805440B}.Release|Win32.Build.0 = Release|Win32
- {70A49BC2-7500-41D0-B75D-EDCC5BE987A0}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {70A49BC2-7500-41D0-B75D-EDCC5BE987A0}.Debug|Mixed Platforms.Build.0 = Debug|Win32
{70A49BC2-7500-41D0-B75D-EDCC5BE987A0}.Debug|Win32.ActiveCfg = Debug|Win32
{70A49BC2-7500-41D0-B75D-EDCC5BE987A0}.Debug|Win32.Build.0 = Debug|Win32
- {70A49BC2-7500-41D0-B75D-EDCC5BE987A0}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {70A49BC2-7500-41D0-B75D-EDCC5BE987A0}.Release|Mixed Platforms.Build.0 = Release|Win32
{70A49BC2-7500-41D0-B75D-EDCC5BE987A0}.Release|Win32.ActiveCfg = Release|Win32
{70A49BC2-7500-41D0-B75D-EDCC5BE987A0}.Release|Win32.Build.0 = Release|Win32
- {8B3B4C4C-13C2-446C-BEB0-F412CC2CFB9A}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {8B3B4C4C-13C2-446C-BEB0-F412CC2CFB9A}.Debug|Mixed Platforms.Build.0 = Debug|Win32
{8B3B4C4C-13C2-446C-BEB0-F412CC2CFB9A}.Debug|Win32.ActiveCfg = Debug|Win32
{8B3B4C4C-13C2-446C-BEB0-F412CC2CFB9A}.Debug|Win32.Build.0 = Debug|Win32
- {8B3B4C4C-13C2-446C-BEB0-F412CC2CFB9A}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {8B3B4C4C-13C2-446C-BEB0-F412CC2CFB9A}.Release|Mixed Platforms.Build.0 = Release|Win32
{8B3B4C4C-13C2-446C-BEB0-F412CC2CFB9A}.Release|Win32.ActiveCfg = Release|Win32
{8B3B4C4C-13C2-446C-BEB0-F412CC2CFB9A}.Release|Win32.Build.0 = Release|Win32
- {DF018947-0FFF-4EB3-BDEE-441DC81DA7A4}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {DF018947-0FFF-4EB3-BDEE-441DC81DA7A4}.Debug|Mixed Platforms.Build.0 = Debug|Win32
{DF018947-0FFF-4EB3-BDEE-441DC81DA7A4}.Debug|Win32.ActiveCfg = Debug DLL|Win32
{DF018947-0FFF-4EB3-BDEE-441DC81DA7A4}.Debug|Win32.Build.0 = Debug DLL|Win32
- {DF018947-0FFF-4EB3-BDEE-441DC81DA7A4}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {DF018947-0FFF-4EB3-BDEE-441DC81DA7A4}.Release|Mixed Platforms.Build.0 = Release|Win32
{DF018947-0FFF-4EB3-BDEE-441DC81DA7A4}.Release|Win32.ActiveCfg = Release DLL|Win32
{DF018947-0FFF-4EB3-BDEE-441DC81DA7A4}.Release|Win32.Build.0 = Release DLL|Win32
- {FEA1EEF7-876F-48DE-88BF-C0E3E606D758}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {FEA1EEF7-876F-48DE-88BF-C0E3E606D758}.Debug|Mixed Platforms.Build.0 = Debug|Win32
{FEA1EEF7-876F-48DE-88BF-C0E3E606D758}.Debug|Win32.ActiveCfg = Debug Passthrough|Win32
{FEA1EEF7-876F-48DE-88BF-C0E3E606D758}.Debug|Win32.Build.0 = Debug Passthrough|Win32
- {FEA1EEF7-876F-48DE-88BF-C0E3E606D758}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {FEA1EEF7-876F-48DE-88BF-C0E3E606D758}.Release|Mixed Platforms.Build.0 = Release|Win32
{FEA1EEF7-876F-48DE-88BF-C0E3E606D758}.Release|Win32.ActiveCfg = Release Passthrough|Win32
{FEA1EEF7-876F-48DE-88BF-C0E3E606D758}.Release|Win32.Build.0 = Release Passthrough|Win32
- {9254C4B0-6F60-42B6-BB3A-36D63FC001C7}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {9254C4B0-6F60-42B6-BB3A-36D63FC001C7}.Debug|Mixed Platforms.Build.0 = Debug|Win32
{9254C4B0-6F60-42B6-BB3A-36D63FC001C7}.Debug|Win32.ActiveCfg = Debug|Win32
{9254C4B0-6F60-42B6-BB3A-36D63FC001C7}.Debug|Win32.Build.0 = Debug|Win32
- {9254C4B0-6F60-42B6-BB3A-36D63FC001C7}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {9254C4B0-6F60-42B6-BB3A-36D63FC001C7}.Release|Mixed Platforms.Build.0 = Release|Win32
{9254C4B0-6F60-42B6-BB3A-36D63FC001C7}.Release|Win32.ActiveCfg = Release|Win32
{9254C4B0-6F60-42B6-BB3A-36D63FC001C7}.Release|Win32.Build.0 = Release|Win32
- {251CAABC-16C3-4593-A491-603B908094E0}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
- {251CAABC-16C3-4593-A491-603B908094E0}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{251CAABC-16C3-4593-A491-603B908094E0}.Debug|Win32.ActiveCfg = Debug|Any CPU
- {251CAABC-16C3-4593-A491-603B908094E0}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
- {251CAABC-16C3-4593-A491-603B908094E0}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{251CAABC-16C3-4593-A491-603B908094E0}.Release|Win32.ActiveCfg = Release|Any CPU
- {ACFFF684-4D19-4D48-AF12-88EA1D778BDF}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {ACFFF684-4D19-4D48-AF12-88EA1D778BDF}.Debug|Mixed Platforms.Build.0 = Debug|Win32
{ACFFF684-4D19-4D48-AF12-88EA1D778BDF}.Debug|Win32.ActiveCfg = Debug|Win32
{ACFFF684-4D19-4D48-AF12-88EA1D778BDF}.Debug|Win32.Build.0 = Debug|Win32
- {ACFFF684-4D19-4D48-AF12-88EA1D778BDF}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {ACFFF684-4D19-4D48-AF12-88EA1D778BDF}.Release|Mixed Platforms.Build.0 = Release|Win32
{ACFFF684-4D19-4D48-AF12-88EA1D778BDF}.Release|Win32.ActiveCfg = Release|Win32
{ACFFF684-4D19-4D48-AF12-88EA1D778BDF}.Release|Win32.Build.0 = Release|Win32
- {8F992C49-6C51-412F-B2A3-34EAB708EB65}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {8F992C49-6C51-412F-B2A3-34EAB708EB65}.Debug|Mixed Platforms.Build.0 = Debug|Win32
{8F992C49-6C51-412F-B2A3-34EAB708EB65}.Debug|Win32.ActiveCfg = Debug|Win32
{8F992C49-6C51-412F-B2A3-34EAB708EB65}.Debug|Win32.Build.0 = Debug|Win32
- {8F992C49-6C51-412F-B2A3-34EAB708EB65}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {8F992C49-6C51-412F-B2A3-34EAB708EB65}.Release|Mixed Platforms.Build.0 = Release|Win32
{8F992C49-6C51-412F-B2A3-34EAB708EB65}.Release|Win32.ActiveCfg = Release|Win32
{8F992C49-6C51-412F-B2A3-34EAB708EB65}.Release|Win32.Build.0 = Release|Win32
EndGlobalSection
Modified: freeswitch/branches/knhor/trunk/src/include/switch_ivr.h
==============================================================================
--- freeswitch/branches/knhor/trunk/src/include/switch_ivr.h (original)
+++ freeswitch/branches/knhor/trunk/src/include/switch_ivr.h Sun Nov 12 18:25:29 2006
@@ -493,7 +493,7 @@
/*!
*\brief Create a new menu object.
- *\param new the pointer to the new menu
+ *\param new_menu the pointer to the new menu
*\param main The top level menu, (NULL if this is the top level one).
*\param name A pointer to the name of this menu.
*\param greeting_sound Optional pointer to a main sound (press 1 for this 2 for that).
@@ -504,7 +504,7 @@
*\param pool memory pool (NULL to create one)
*\return SWUTCH_STATUS_SUCCESS if the menu was created
*/
-SWITCH_DECLARE(switch_status_t) switch_ivr_menu_init(switch_ivr_menu_t **new,
+SWITCH_DECLARE(switch_status_t) switch_ivr_menu_init(switch_ivr_menu_t **new_menu,
switch_ivr_menu_t *main,
char *name,
char *greeting_sound,
Modified: freeswitch/branches/knhor/trunk/src/switch_ivr.c
==============================================================================
--- freeswitch/branches/knhor/trunk/src/switch_ivr.c (original)
+++ freeswitch/branches/knhor/trunk/src/switch_ivr.c Sun Nov 12 18:25:29 2006
@@ -3430,7 +3430,7 @@
char *ptr;
int max_failures;
int timeout;
- int inlen;
+ uint32_t inlen;
uint32_t flags;
struct switch_ivr_menu_action *actions;
struct switch_ivr_menu *next;
@@ -3470,7 +3470,7 @@
}
-SWITCH_DECLARE(switch_status_t) switch_ivr_menu_init(switch_ivr_menu_t **new,
+SWITCH_DECLARE(switch_status_t) switch_ivr_menu_init(switch_ivr_menu_t **new_menu,
switch_ivr_menu_t *main,
char *name,
char *greeting_sound,
@@ -3547,7 +3547,7 @@
menu->flags |= SWITCH_IVR_MENU_FLAG_STACK;
}
- *new = menu;
+ *new_menu = menu;
return SWITCH_STATUS_SUCCESS;
}
@@ -3556,14 +3556,14 @@
SWITCH_DECLARE(switch_status_t) switch_ivr_menu_bind_action(switch_ivr_menu_t *menu, switch_ivr_action_t ivr_action, char *arg, char *bind)
{
switch_ivr_menu_action_t *action;
- switch_size_t len;
+ uint32_t len;
if ((action = switch_core_alloc(menu->pool, sizeof(*action)))) {
action->bind = switch_core_strdup(menu->pool, bind);
action->next = menu->actions;
action->arg = switch_core_strdup(menu->pool, arg);
- len = strlen(action->bind);
+ len = (uint32_t)strlen(action->bind);
if (len > menu->inlen) {
- menu->inlen = (uint32_t)len;
+ menu->inlen = len;
}
action->ivr_action = ivr_action;
menu->actions = action;
@@ -3608,14 +3608,12 @@
static switch_status_t play_or_say(switch_core_session_t *session, switch_ivr_menu_t *menu, char *sound, uint32_t need)
{
- memset(menu->buf, 0, menu->inlen);
- menu->ptr = menu->buf;
char terminator;
uint32_t len;
char *ptr;
-
switch_status_t status = SWITCH_STATUS_SUCCESS;
+ memset(menu->buf, 0, menu->inlen);
menu->ptr = menu->buf;
if (!need) {
1
0
[commit] r3333 - in freeswitch/branches/knhor/trunk: . src src/include src/mod/applications/mod_ivrtest
by Freeswitch SVN 12 Nov '06
by Freeswitch SVN 12 Nov '06
12 Nov '06
Author: knhor
Date: Sun Nov 12 16:01:45 2006
New Revision: 3333
Modified:
freeswitch/branches/knhor/trunk/ (props changed)
freeswitch/branches/knhor/trunk/src/include/switch_ivr.h
freeswitch/branches/knhor/trunk/src/mod/applications/mod_ivrtest/mod_ivrtest.c
freeswitch/branches/knhor/trunk/src/switch_ivr.c
Log:
Merged revisions 3326-3332 via svnmerge from trunk
Modified: freeswitch/branches/knhor/trunk/src/include/switch_ivr.h
==============================================================================
--- freeswitch/branches/knhor/trunk/src/include/switch_ivr.h (original)
+++ freeswitch/branches/knhor/trunk/src/include/switch_ivr.h Sun Nov 12 16:01:45 2006
@@ -480,6 +480,7 @@
SWITCH_IVR_ACTION_EXECMENU, /* Goto another menu in the stack. */
SWITCH_IVR_ACTION_EXECAPP, /* Execute an application. */
SWITCH_IVR_ACTION_PLAYSOUND, /* Play a sound. */
+ SWITCH_IVR_ACTION_SAYTEXT, /* say text. */
SWITCH_IVR_ACTION_BACK, /* Go back 1 menu. */
SWITCH_IVR_ACTION_TOMAIN, /* Go back to the top level menu. */
SWITCH_IVR_ACTION_TRANSFER, /* Transfer caller to another ext. */
@@ -500,7 +501,6 @@
*\param invalid_sound Optional pointer to a sound to play after invalid input.
*\param timeout A number of milliseconds to pause before looping.
*\param max_failures Maximum number of failures to withstand before hangingup This resets everytime you enter the menu.
- *\param inlen The max len of the input (1 for 1 digit menu opts, 2 for 2 digit etc.)
*\param pool memory pool (NULL to create one)
*\return SWUTCH_STATUS_SUCCESS if the menu was created
*/
@@ -510,9 +510,10 @@
char *greeting_sound,
char *short_greeting_sound,
char *invalid_sound,
+ char *tts_engine,
+ char *tts_voice,
int timeout,
int max_failures,
- int inlen,
switch_memory_pool_t *pool);
/*!
Modified: freeswitch/branches/knhor/trunk/src/mod/applications/mod_ivrtest/mod_ivrtest.c
==============================================================================
--- freeswitch/branches/knhor/trunk/src/mod/applications/mod_ivrtest/mod_ivrtest.c (original)
+++ freeswitch/branches/knhor/trunk/src/mod/applications/mod_ivrtest/mod_ivrtest.c Sun Nov 12 16:01:45 2006
@@ -81,6 +81,65 @@
}
+static void ivr_application_function(switch_core_session_t *session, char *data)
+{
+ switch_channel_t *channel = switch_core_session_get_channel(session);
+ char *params = switch_core_session_strdup(session,data);
+
+ if (channel != NULL && params != NULL) {
+ switch_ivr_menu_t *menu = NULL, *sub_menu = NULL;
+ switch_status_t status;
+
+ // answer the channel if need be
+ switch_channel_answer(channel);
+
+ status = switch_ivr_menu_init(&menu,
+ NULL,
+ "main",
+ "please enter some numbers so i can figure out if I have any bugs or not",
+ "enter some numbers",
+ "I have no idea what that is",
+ "cepstral",
+ "david",
+ 15000, 10, NULL);
+
+
+ status = switch_ivr_menu_init(&sub_menu,
+ menu,
+ "sub",
+ "/ram/congrats.wav",
+ "/ram/extension.wav",
+ "/ram/invalid.wav",
+ NULL,
+ NULL,
+ 15000, 10, NULL);
+
+ if (status == SWITCH_STATUS_SUCCESS) {
+ // build the menu
+ switch_ivr_menu_bind_action(menu, SWITCH_IVR_ACTION_PLAYSOUND, "/ram/swimp.raw", "1");
+ switch_ivr_menu_bind_action(menu, SWITCH_IVR_ACTION_PLAYSOUND, "/ram/congrats.wav", "2");
+ switch_ivr_menu_bind_action(menu, SWITCH_IVR_ACTION_EXECMENU, "sub", "3");
+ //switch_ivr_menu_bind_action(menu, SWITCH_IVR_ACTION_PLAYSOUND, "/usr/local/freeswitch/sounds/3.wav", "3");
+
+
+ switch_ivr_menu_bind_action(sub_menu, SWITCH_IVR_ACTION_PLAYSOUND, "/ram/swimp.raw", "1");
+ switch_ivr_menu_bind_action(sub_menu, SWITCH_IVR_ACTION_BACK, NULL, "2");
+
+
+ // start the menu
+ status = switch_ivr_menu_execute(session, menu, "main", NULL);
+
+ // cleaup the menu
+ switch_ivr_menu_free_stack(menu);
+ } else {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "unable to build menu %s\n",params);
+ }
+
+
+ switch_ivr_play_file(session, NULL,"/ram/goodbye.wav",NULL,NULL,NULL,0);
+ }
+}
+
static void dirtest_function(switch_core_session_t *session, char *data)
{
char *var, *val;
@@ -354,11 +413,19 @@
};
+
+static const switch_application_interface_t ivr_application_interface = {
+ /*.interface_name */ "ivrmenu",
+ /*.application_function */ ivr_application_function,
+ NULL, NULL, NULL,
+ /*.next*/ NULL
+};
+
static const switch_application_interface_t xml_application_interface = {
/*.interface_name */ "xml",
/*.application_function */ xml_function,
NULL, NULL, NULL,
- /*.next*/ NULL
+ /*.next*/ &ivr_application_interface
};
static const switch_application_interface_t disast_application_interface = {
Modified: freeswitch/branches/knhor/trunk/src/switch_ivr.c
==============================================================================
--- freeswitch/branches/knhor/trunk/src/switch_ivr.c (original)
+++ freeswitch/branches/knhor/trunk/src/switch_ivr.c Sun Nov 12 16:01:45 2006
@@ -431,12 +431,16 @@
switch_event_destroy(&event);
}
- if (input_callback || buf) {
+ if (input_callback || buf || buflen) {
/*
dtmf handler function you can hook up to be executed when a digit is dialed during playback
if you return anything but SWITCH_STATUS_SUCCESS the playback will stop.
*/
if (switch_channel_has_dtmf(channel)) {
+ if (!input_callback && !buf) {
+ status = SWITCH_STATUS_BREAK;
+ break;
+ }
switch_channel_dequeue_dtmf(channel, dtmf, sizeof(dtmf));
if (input_callback) {
status = input_callback(session, dtmf, SWITCH_INPUT_TYPE_DTMF, buf, buflen);
@@ -1094,12 +1098,17 @@
switch_event_destroy(&event);
}
- if (input_callback || buf) {
+ if (input_callback || buf || buflen) {
/*
dtmf handler function you can hook up to be executed when a digit is dialed during playback
if you return anything but SWITCH_STATUS_SUCCESS the playback will stop.
*/
if (switch_channel_has_dtmf(channel)) {
+ if (!input_callback && !buf) {
+ status = SWITCH_STATUS_BREAK;
+ done = 1;
+ break;
+ }
switch_channel_dequeue_dtmf(channel, dtmf, sizeof(dtmf));
if (input_callback) {
status = input_callback(session, dtmf, SWITCH_INPUT_TYPE_DTMF, buf, buflen);
@@ -1390,7 +1399,7 @@
if (switch_regex_match(digit_buffer, digits_regex) == SWITCH_STATUS_SUCCESS) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Match found!\n");
//Jobs done
- return switch_channel_get_state(channel);
+ return SWITCH_STATUS_SUCCESS;
} else {
//See if a bad input prompt was specified, if so, play it
if (strlen(bad_input_audio_file) > 0) {
@@ -1405,14 +1414,14 @@
}
} else {
//Jobs done
- return switch_channel_get_state(channel);
+ return SWITCH_STATUS_SUCCESS;
}
}
}
//if we got here, we got no digits or lost the channel
digit_buffer = "\0";
- return switch_channel_get_state(channel);
+ return SWITCH_STATUS_FALSE;
}
@@ -1485,12 +1494,17 @@
switch_event_destroy(&event);
}
- if (input_callback || buf) {
+ if (input_callback || buf || buflen) {
/*
dtmf handler function you can hook up to be executed when a digit is dialed during playback
if you return anything but SWITCH_STATUS_SUCCESS the playback will stop.
*/
if (switch_channel_has_dtmf(channel)) {
+ if (!input_callback && !buf) {
+ status = SWITCH_STATUS_BREAK;
+ done = 1;
+ break;
+ }
if (buf && !strcasecmp(buf, "_break_")) {
status = SWITCH_STATUS_BREAK;
} else {
@@ -1630,11 +1644,15 @@
switch_status_t status = SWITCH_STATUS_SUCCESS;
switch_speech_handle_t sh;
switch_speech_flag_t flags = SWITCH_SPEECH_FLAG_NONE;
+ switch_codec_t *read_codec;
-
channel = switch_core_session_get_channel(session);
assert(channel != NULL);
+ if (rate == 0) {
+ read_codec = switch_core_session_get_read_codec(session);
+ rate = read_codec->implementation->samples_per_second;
+ }
memset(&sh, 0, sizeof(sh));
if (switch_core_speech_open(&sh,
@@ -3406,6 +3424,10 @@
char *greeting_sound;
char *short_greeting_sound;
char *invalid_sound;
+ char *tts_engine;
+ char *tts_voice;
+ char *buf;
+ char *ptr;
int max_failures;
int timeout;
int inlen;
@@ -3454,9 +3476,10 @@
char *greeting_sound,
char *short_greeting_sound,
char *invalid_sound,
+ char *tts_engine,
+ char *tts_voice,
int timeout,
int max_failures,
- int inlen,
switch_memory_pool_t *pool)
{
switch_ivr_menu_t *menu;
@@ -3477,25 +3500,47 @@
return SWITCH_STATUS_MEMERR;
}
}
+
menu->pool = pool;
- menu->name = switch_core_strdup(menu->pool, name);
- menu->greeting_sound = switch_core_strdup(menu->pool, greeting_sound);
- menu->short_greeting_sound = switch_core_strdup(menu->pool, short_greeting_sound);
- menu->invalid_sound = switch_core_strdup(menu->pool, invalid_sound);
+ if (name) {
+ menu->name = switch_core_strdup(menu->pool, name);
+ }
+
+ if (greeting_sound) {
+ menu->greeting_sound = switch_core_strdup(menu->pool, greeting_sound);
+ }
+
+ if (short_greeting_sound) {
+ menu->short_greeting_sound = switch_core_strdup(menu->pool, short_greeting_sound);
+ }
+
+ if (invalid_sound) {
+ menu->invalid_sound = switch_core_strdup(menu->pool, invalid_sound);
+ }
+
+ if (tts_engine) {
+ menu->tts_engine = switch_core_strdup(menu->pool, tts_engine);
+ }
+
+ if (tts_voice) {
+ menu->tts_voice = switch_core_strdup(menu->pool, tts_voice);
+ }
+
menu->max_failures = max_failures;
+
menu->timeout = timeout;
+
menu->actions = NULL;
- menu->inlen = inlen;
+
if (newpool) {
menu->flags |= SWITCH_IVR_MENU_FLAG_FREEPOOL;
}
- if (menu->timeout <= 0)
+ if (menu->timeout <= 0) {
menu->timeout = 10000;
- if (menu->inlen <= 0)
- menu->inlen = 1;
-
+ }
+
if (main) {
switch_ivr_menu_stack(&main, menu);
} else {
@@ -3511,11 +3556,15 @@
SWITCH_DECLARE(switch_status_t) switch_ivr_menu_bind_action(switch_ivr_menu_t *menu, switch_ivr_action_t ivr_action, char *arg, char *bind)
{
switch_ivr_menu_action_t *action;
-
+ switch_size_t len;
if ((action = switch_core_alloc(menu->pool, sizeof(*action)))) {
- action->bind = bind;
+ action->bind = switch_core_strdup(menu->pool, bind);
action->next = menu->actions;
- action->arg = arg;
+ action->arg = switch_core_strdup(menu->pool, arg);
+ len = strlen(action->bind);
+ if (len > menu->inlen) {
+ menu->inlen = (uint32_t)len;
+ }
action->ivr_action = ivr_action;
menu->actions = action;
return SWITCH_STATUS_SUCCESS;
@@ -3557,11 +3606,50 @@
}
+static switch_status_t play_or_say(switch_core_session_t *session, switch_ivr_menu_t *menu, char *sound, uint32_t need)
+{
+ memset(menu->buf, 0, menu->inlen);
+ menu->ptr = menu->buf;
+ char terminator;
+ uint32_t len;
+ char *ptr;
+
+ switch_status_t status = SWITCH_STATUS_SUCCESS;
+
+ menu->ptr = menu->buf;
+
+ if (!need) {
+ len = 1;
+ ptr = NULL;
+ } else {
+ len = menu->inlen + 1;
+ ptr = menu->ptr;
+ }
+
+ if (*sound == '/' || *sound == '\\') {
+ switch_ivr_play_file(session, NULL, sound, NULL, NULL, ptr, len);
+ } else {
+ if (menu->tts_engine && menu->tts_voice) {
+ switch_ivr_speak_text(session, menu->tts_engine, menu->tts_voice, NULL, 0, NULL, sound, ptr, len);
+ }
+ }
+
+ if (need) {
+ menu->ptr += strlen(menu->buf);
+ if (strlen(menu->buf) < need) {
+ status = switch_ivr_collect_digits_count(session, menu->ptr, menu->inlen - strlen(menu->buf), need, "#", &terminator, menu->timeout);
+ }
+ }
+
+ return status;
+
+}
+
SWITCH_DECLARE(switch_status_t) switch_ivr_menu_execute(switch_core_session_t *session, switch_ivr_menu_t *stack, char *name, void *obj)
{
int reps = 0, errs = 0, match = 0, running = 1;
char *greeting_sound = NULL, *aptr;
- char *buf, arg[512];
+ char arg[512];
switch_ivr_action_t todo = SWITCH_IVR_ACTION_DIE;
switch_ivr_menu_action_t *ap;
switch_ivr_menu_t *menu;
@@ -3577,7 +3665,7 @@
return -1;
}
- if (!(buf = malloc(menu->inlen))) {
+ if (!(menu->buf = malloc(menu->inlen))) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "No Memory!\n");
return -1;
}
@@ -3585,12 +3673,10 @@
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Executing IVR menu %s\n", menu->name);
for (reps = 0 ; (running && status == SWITCH_STATUS_SUCCESS && errs < menu->max_failures) ; reps++) {
-
if (!switch_channel_ready(channel)) {
break;
}
-
if (reps > 0 && menu->short_greeting_sound) {
greeting_sound = menu->short_greeting_sound;
} else {
@@ -3599,28 +3685,19 @@
match = 0;
aptr = NULL;
- memset(buf, 0, menu->inlen);
+
memset(arg, 0, sizeof(arg));
- if (switch_play_and_get_digits(session,
- menu->inlen,
- menu->inlen,
- 1,
- menu->timeout, "#",
- greeting_sound,
- NULL,
- buf,
- menu->inlen,
- NULL) != SWITCH_STATUS_SUCCESS) {
- break;
- }
+
+ play_or_say(session, menu, greeting_sound, menu->inlen);
- if (!switch_strlen_zero(buf)) {
+
+ if (!switch_strlen_zero(menu->buf)) {
for(ap = menu->actions; ap ; ap = ap->next) {
- if (!strcmp(buf, ap->bind)) {
+ if (!strcmp(menu->buf, ap->bind)) {
char *membuf;
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "IVR menu %s matched %s\n", menu->name, buf);
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "IVR menu %s matched %s\n", menu->name, menu->buf);
match++;
errs = 0;
if (ap->function) {
@@ -3638,6 +3715,11 @@
case SWITCH_IVR_ACTION_PLAYSOUND:
status = switch_ivr_play_file(session, NULL, aptr, NULL, NULL, NULL, 0);
break;
+ case SWITCH_IVR_ACTION_SAYTEXT:
+ if (menu->tts_engine && menu->tts_voice) {
+ switch_ivr_speak_text(session, menu->tts_engine, menu->tts_voice, NULL, 0, NULL, aptr, NULL, 0);
+ }
+ break;
case SWITCH_IVR_ACTION_TRANSFER:
switch_ivr_session_transfer(session, aptr, NULL, NULL);
running = 0;
@@ -3693,10 +3775,10 @@
}
}
if (!match) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "IVR menu %s caught invalid input %s\n", menu->name, buf);
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "IVR menu %s caught invalid input %s\n", menu->name, menu->buf);
if (menu->invalid_sound) {
- status = switch_ivr_play_file(session, NULL, aptr, NULL, NULL, NULL, 0);
+ play_or_say(session, menu, menu->invalid_sound, 0);
}
errs++;
@@ -3707,7 +3789,7 @@
}
- switch_safe_free(buf);
+ switch_safe_free(menu->buf);
return status;
}
1
0
[commit] r3330 - in freeswitch/branches/knhor/trunk/src: . include mod/applications/mod_conference
by Freeswitch SVN 12 Nov '06
by Freeswitch SVN 12 Nov '06
12 Nov '06
Author: knhor
Date: Sun Nov 12 11:52:15 2006
New Revision: 3330
Modified:
freeswitch/branches/knhor/trunk/src/include/switch_ivr.h
freeswitch/branches/knhor/trunk/src/mod/applications/mod_conference/mod_conference.c
freeswitch/branches/knhor/trunk/src/switch_ivr.c
Log:
change digit action from type int to type void*
Modified: freeswitch/branches/knhor/trunk/src/include/switch_ivr.h
==============================================================================
--- freeswitch/branches/knhor/trunk/src/include/switch_ivr.h (original)
+++ freeswitch/branches/knhor/trunk/src/include/switch_ivr.h Sun Nov 12 11:52:15 2006
@@ -424,10 +424,10 @@
\brief Set a digit string to action mapping
\param parser a pointer to the parser object created by switch_ivr_digit_stream_parser_new
\param digits a string of digits to associate with an action
- \param action the action to signal when the digit string is matched
+ \param data consumer data attached to this digit string
\return SWITCH_STATUS_SUCCESS if all is well
*/
-SWITCH_DECLARE(switch_status_t) switch_ivr_digit_stream_parser_set_event(switch_ivr_digit_stream_parser_t *parser, char *digits, int action);
+SWITCH_DECLARE(switch_status_t) switch_ivr_digit_stream_parser_set_event(switch_ivr_digit_stream_parser_t *parser, char *digits, void *data);
/*!
\brief Delete a string to action mapping
@@ -441,9 +441,9 @@
\brief Create a digit stream parser object
\param parser a pointer to the parser object created by switch_ivr_digit_stream_parser_new
\param digit a digit to collect and test against the map of digit strings
- \return 0 if no match found or non-zero action that was associated with a given digit string when matched
+ \return NULL if no match found or consumer data that was associated with a given digit string when matched
*/
-SWITCH_DECLARE(int) switch_ivr_digit_stream_parser_feed(switch_ivr_digit_stream_parser_t *parser, char digit);
+SWITCH_DECLARE(void *) switch_ivr_digit_stream_parser_feed(switch_ivr_digit_stream_parser_t *parser, char digit);
/*!
\brief Reset the collected digit stream to nothing
Modified: freeswitch/branches/knhor/trunk/src/mod/applications/mod_conference/mod_conference.c
==============================================================================
--- freeswitch/branches/knhor/trunk/src/mod/applications/mod_conference/mod_conference.c (original)
+++ freeswitch/branches/knhor/trunk/src/mod/applications/mod_conference/mod_conference.c Sun Nov 12 11:52:15 2006
@@ -1019,7 +1019,7 @@
if(member->conference->dtmf_parser != NULL) {
for (digit = dtmf; *digit; digit++) {
- switch(switch_ivr_digit_stream_parser_feed(member->conference->dtmf_parser, *digit)) {
+ switch((int)switch_ivr_digit_stream_parser_feed(member->conference->dtmf_parser, *digit)) {
case CALLER_CONTROL_NOEVENT:
// the digit string collected so far has not been recognized
break;
@@ -3475,7 +3475,7 @@
// map in the default control handler strings only if the profile has no caller control definitions
if (i == 0) {
for(i=0,status=SWITCH_STATUS_SUCCESS; status == SWITCH_STATUS_SUCCESS && i<ccds_qty; i++) {
- status = switch_ivr_digit_stream_parser_set_event(conference->dtmf_parser,ccds[i].digits,ccds[i].action);
+ status = switch_ivr_digit_stream_parser_set_event(conference->dtmf_parser,ccds[i].digits,(void *)ccds[i].action);
}
}
@@ -3490,7 +3490,7 @@
// stop scanning the table, and go to the next xml kvp.
for(i=0,status=SWITCH_STATUS_NOOP; i<ccds_qty && status == SWITCH_STATUS_NOOP; i++) {
if(strcasecmp(ccds[i].key,key) == 0) {
- status = switch_ivr_digit_stream_parser_set_event(conference->dtmf_parser,val,ccds[i].action);
+ status = switch_ivr_digit_stream_parser_set_event(conference->dtmf_parser,val,(void *)ccds[i].action);
}
}
if(status == SWITCH_STATUS_NOOP) {
Modified: freeswitch/branches/knhor/trunk/src/switch_ivr.c
==============================================================================
--- freeswitch/branches/knhor/trunk/src/switch_ivr.c (original)
+++ freeswitch/branches/knhor/trunk/src/switch_ivr.c Sun Nov 12 11:52:15 2006
@@ -3303,19 +3303,19 @@
return status;
}
-SWITCH_DECLARE(switch_status_t) switch_ivr_digit_stream_parser_set_event(switch_ivr_digit_stream_parser_t *parser, char *digits, int action)
+SWITCH_DECLARE(switch_status_t) switch_ivr_digit_stream_parser_set_event(switch_ivr_digit_stream_parser_t *parser, char *digits, void *data)
{ switch_status_t status = SWITCH_STATUS_FALSE;
if (parser != NULL && digits != NULL && *digits && parser->hash != NULL) {
int len;
- status = switch_core_hash_insert_dup(parser->hash,digits,(void *)action);
+ status = switch_core_hash_insert_dup(parser->hash,digits,data);
if (status == SWITCH_STATUS_SUCCESS && parser->terminator == '\0' && (len = strlen(digits)) > parser->maxlen) {
parser->maxlen = len;
}
}
if (status != SWITCH_STATUS_SUCCESS) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "unable to add hash for '%s' action: %d\n",digits,action);
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "unable to add hash for '%s'\n",digits);
}
return status;
@@ -3335,8 +3335,8 @@
return status;
}
-SWITCH_DECLARE(int) switch_ivr_digit_stream_parser_feed(switch_ivr_digit_stream_parser_t *parser, char digit)
-{ int result = 0;
+SWITCH_DECLARE(void *) switch_ivr_digit_stream_parser_feed(switch_ivr_digit_stream_parser_t *parser, char digit)
+{ void *result = NULL;
if (parser != NULL && digit != '\0') {
size_t len = (parser->digits != NULL ? strlen(parser->digits) : 0);
@@ -3362,10 +3362,10 @@
// if we have digits to test
if (len) {
- result = (int)switch_core_hash_find(parser->hash,parser->digits);
+ result = switch_core_hash_find(parser->hash,parser->digits);
// if we matched the digit string, or this digit is the terminator
// reset the collected digits for next digit string
- if (result != 0 || parser->terminator == digit) {
+ if (result != NULL || parser->terminator == digit) {
free(parser->digits);
parser->digits = NULL;
}
1
0
Author: knhor
Date: Sun Nov 12 09:50:39 2006
New Revision: 3329
Modified:
freeswitch/branches/knhor/trunk/src/switch_ivr.c
Log:
automatically keep the digit collection to a maximum length determined by the largest digit string added to the hash
Modified: freeswitch/branches/knhor/trunk/src/switch_ivr.c
==============================================================================
--- freeswitch/branches/knhor/trunk/src/switch_ivr.c (original)
+++ freeswitch/branches/knhor/trunk/src/switch_ivr.c Sun Nov 12 09:50:39 2006
@@ -3242,6 +3242,7 @@
switch_hash_t *hash;
char *digits;
char terminator;
+ int maxlen;
};
SWITCH_DECLARE(switch_status_t) switch_ivr_digit_stream_parser_new(switch_memory_pool_t *pool, switch_ivr_digit_stream_parser_t **parser)
@@ -3306,7 +3307,12 @@
{ switch_status_t status = SWITCH_STATUS_FALSE;
if (parser != NULL && digits != NULL && *digits && parser->hash != NULL) {
+ int len;
+
status = switch_core_hash_insert_dup(parser->hash,digits,(void *)action);
+ if (status == SWITCH_STATUS_SUCCESS && parser->terminator == '\0' && (len = strlen(digits)) > parser->maxlen) {
+ parser->maxlen = len;
+ }
}
if (status != SWITCH_STATUS_SUCCESS) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "unable to add hash for '%s' action: %d\n",digits,action);
@@ -3336,10 +3342,22 @@
size_t len = (parser->digits != NULL ? strlen(parser->digits) : 0);
// if it's not a terminator digit, add it to the collected digits
- if (parser->terminator != digit) {
- parser->digits = realloc(parser->digits,len+2);
- *(parser->digits+(len++)) = digit;
- *(parser->digits+len) = '\0';
+ if (digit != parser->terminator) {
+ // if collected digits length >= the max length of the keys
+ // in the hash table, then left shift the digit string
+ if ( len > 1 && parser->maxlen != 0 && len >= parser->maxlen) {
+ char *src = parser->digits + 1;
+ char *dst = parser->digits;
+
+ while (*src) {
+ *(dst++) = *(src++);
+ }
+ *dst = digit;
+ } else {
+ parser->digits = realloc(parser->digits,len+2);
+ *(parser->digits+(len++)) = digit;
+ *(parser->digits+len) = '\0';
+ }
}
// if we have digits to test
@@ -3374,6 +3392,7 @@
if (parser != NULL) {
parser->terminator = digit;
+ parser->maxlen = 0;
status = SWITCH_STATUS_SUCCESS;
}
1
0
Author: sphere
Date: Sun Nov 12 08:48:16 2006
New Revision: 3328
Added:
freeswitch/branches/cseket/
Log:
Creating empty folder for cseket
1
0
Author: sphere
Date: Sun Nov 12 04:01:19 2006
New Revision: 3327
Added:
freeswitch/branches/phuybre/
Log:
Creating empty folder for phuybre
1
0
[commit] r3326 - in freeswitch/branches/knhor/trunk: . src src/include src/mod/languages/mod_spidermonkey
by Freeswitch SVN 12 Nov '06
by Freeswitch SVN 12 Nov '06
12 Nov '06
Author: knhor
Date: Sun Nov 12 00:08:38 2006
New Revision: 3326
Modified:
freeswitch/branches/knhor/trunk/ (props changed)
freeswitch/branches/knhor/trunk/src/include/switch_ivr.h
freeswitch/branches/knhor/trunk/src/mod/languages/mod_spidermonkey/mod_spidermonkey.c
freeswitch/branches/knhor/trunk/src/switch_ivr.c
Log:
Merged revisions 3317-3325 via svnmerge from trunk
Modified: freeswitch/branches/knhor/trunk/src/include/switch_ivr.h
==============================================================================
--- freeswitch/branches/knhor/trunk/src/include/switch_ivr.h (original)
+++ freeswitch/branches/knhor/trunk/src/include/switch_ivr.h Sun Nov 12 00:08:38 2006
@@ -75,8 +75,8 @@
SWITCH_DECLARE(switch_status_t) switch_ivr_collect_digits_callback(switch_core_session_t *session,
switch_input_callback_function_t dtmf_callback,
void *buf,
- unsigned int buflen,
- unsigned int timeout);
+ uint32_t buflen,
+ uint32_t timeout);
/*!
\brief Wait for specified number of DTMF digits, untile terminator is received or until the channel hangs up.
@@ -91,11 +91,11 @@
*/
SWITCH_DECLARE(switch_status_t) switch_ivr_collect_digits_count(switch_core_session_t *session,
char *buf,
- unsigned int buflen,
- unsigned int maxdigits,
+ uint32_t buflen,
+ uint32_t maxdigits,
const char *terminators,
char *terminator,
- unsigned int timeout);
+ uint32_t timeout);
/*!
\brief Engage background Speech detection on a session
@@ -187,7 +187,7 @@
char *timer_name,
switch_input_callback_function_t dtmf_callback,
void *buf,
- unsigned int buflen);
+ uint32_t buflen);
@@ -207,7 +207,7 @@
char *file,
switch_input_callback_function_t dtmf_callback,
void *buf,
- unsigned int buflen);
+ uint32_t buflen);
/*!
\brief Function to evaluate an expression against a string
@@ -234,15 +234,15 @@
\note to test for digit capture failure look for \\0 in the first position of the buffer
*/
SWITCH_DECLARE(switch_status_t) switch_play_and_get_digits(switch_core_session_t *session,
- unsigned int min_digits,
- unsigned int max_digits,
- unsigned int max_tries,
- unsigned int timeout,
+ uint32_t min_digits,
+ uint32_t max_digits,
+ uint32_t max_tries,
+ uint32_t timeout,
char* valid_terminators,
char* audio_file,
char* bad_input_audio_file,
void* digit_buffer,
- unsigned int digit_buffer_length,
+ uint32_t digit_buffer_length,
char* digits_regex);
SWITCH_DECLARE(switch_status_t) switch_ivr_speak_text_handle(switch_core_session_t *session,
@@ -252,7 +252,7 @@
switch_input_callback_function_t dtmf_callback,
char *text,
void *buf,
- unsigned int buflen);
+ uint32_t buflen);
/*!
\brief Speak given text with given tts engine
@@ -275,7 +275,7 @@
switch_input_callback_function_t dtmf_callback,
char *text,
void *buf,
- unsigned int buflen);
+ uint32_t buflen);
/*!
\brief Make an outgoing call
@@ -458,6 +458,103 @@
\return SWITCH_STATUS_SUCCESS if all is well
*/
SWITCH_DECLARE(switch_status_t) switch_ivr_digit_stream_parser_set_terminator(switch_ivr_digit_stream_parser_t *parser, char digit);
+
+/** @} */
+
+/**
+ * @defgroup switch_ivr_menu IVR Menu Library
+ * @ingroup switch_ivr
+ * IVR menu functions
+ *
+ * @{
+ */
+
+typedef enum {
+ SWITCH_IVR_MENU_FLAG_FALLTOMAIN = (1 << 0),
+ SWITCH_IVR_MENU_FLAG_FREEPOOL = (1 << 1),
+ SWITCH_IVR_MENU_FLAG_STACK = (1 << 2),
+} switch_ivr_menu_flags;
+/* Actions are either set in switch_ivr_menu_bind_function or returned by a callback */
+typedef enum {
+ SWITCH_IVR_ACTION_DIE, /* Exit the menu. */
+ SWITCH_IVR_ACTION_EXECMENU, /* Goto another menu in the stack. */
+ SWITCH_IVR_ACTION_EXECAPP, /* Execute an application. */
+ SWITCH_IVR_ACTION_PLAYSOUND, /* Play a sound. */
+ SWITCH_IVR_ACTION_BACK, /* Go back 1 menu. */
+ SWITCH_IVR_ACTION_TOMAIN, /* Go back to the top level menu. */
+ SWITCH_IVR_ACTION_TRANSFER, /* Transfer caller to another ext. */
+} switch_ivr_action_t;
+struct switch_ivr_menu;
+typedef switch_ivr_action_t switch_ivr_menu_action_function_t(struct switch_ivr_menu *, char *, size_t, void *);
+typedef struct switch_ivr_menu switch_ivr_menu_t;
+typedef struct switch_ivr_menu_action switch_ivr_menu_action_t;
+/******************************************************************************************************/
+
+/*!
+ *\brief Create a new menu object.
+ *\param new the pointer to the new menu
+ *\param main The top level menu, (NULL if this is the top level one).
+ *\param name A pointer to the name of this menu.
+ *\param greeting_sound Optional pointer to a main sound (press 1 for this 2 for that).
+ *\param short_greeting_sound Optional pointer to a shorter main sound for subsequent loops.
+ *\param invalid_sound Optional pointer to a sound to play after invalid input.
+ *\param timeout A number of milliseconds to pause before looping.
+ *\param max_failures Maximum number of failures to withstand before hangingup This resets everytime you enter the menu.
+ *\param inlen The max len of the input (1 for 1 digit menu opts, 2 for 2 digit etc.)
+ *\param pool memory pool (NULL to create one)
+ *\return SWUTCH_STATUS_SUCCESS if the menu was created
+ */
+SWITCH_DECLARE(switch_status_t) switch_ivr_menu_init(switch_ivr_menu_t **new,
+ switch_ivr_menu_t *main,
+ char *name,
+ char *greeting_sound,
+ char *short_greeting_sound,
+ char *invalid_sound,
+ int timeout,
+ int max_failures,
+ int inlen,
+ switch_memory_pool_t *pool);
+
+/*!
+ *\brief switch_ivr_menu_bind_action: Bind a keystroke to an action.
+ *\param menu The menu obj you wish to bind to.
+ *\param ivr_action switch_ivr_action_t enum of what you want to do.
+ *\param arg Optional (sometimes necessary) string arguement.
+ *\param bind KeyStrokes to bind the action to.
+ *\return SWUTCH_STATUS_SUCCESS if the action was binded
+ */
+SWITCH_DECLARE(switch_status_t) switch_ivr_menu_bind_action(switch_ivr_menu_t *menu, switch_ivr_action_t ivr_action, char *arg, char *bind);
+
+
+/*!
+ *\brief Bind a keystroke to a callback function.
+ *\param menu The menu obj you wish to bind to.
+ *\param function The function to call [int proto(struct switch_ivr_menu *, char *, size_t, void *)]
+ *\param bind KeyStrokes to bind the action to.
+ *\note The function is passed a buffer to fill in with any required argument data.
+ *\note The function is also passed an optional void pointer to an object set upon menu execution. (think threads)
+ *\note The function returns an switch_ivr_action_t enum of what you want to do. and looks to your buffer for args.
+ *\return SWUTCH_STATUS_SUCCESS if the function was binded
+ */
+SWITCH_DECLARE(switch_status_t) switch_ivr_menu_bind_function(switch_ivr_menu_t *menu, switch_ivr_menu_action_function_t *function, char *bind);
+
+
+/*!
+ *\brief Execute a menu.
+ *\param session The session running the menu.
+ *\param stack The top-level menu object (the first one you created.)
+ *\param name A pointer to the name of the menu.
+ *\param obj A void pointer to an object you want to make avaliable to your callback functions that you may have binded with switch_ivr_menu_bind_function.
+ *\return SWITCH_STATUS_SUCCESS if all is well
+ */
+SWITCH_DECLARE(switch_status_t) switch_ivr_menu_execute(switch_core_session_t *session, switch_ivr_menu_t *stack, char *name, void *obj);
+
+/*!
+ *\brief free a stack of menu objects.
+ *\param stack The top level menu you wish to destroy.
+ *\return SWITCH_STATUS_SUCCESS if the object was a top level menu and it was freed
+ */
+SWITCH_DECLARE(switch_status_t) switch_ivr_menu_free_stack(switch_ivr_menu_t *stack);
/** @} */
Modified: freeswitch/branches/knhor/trunk/src/mod/languages/mod_spidermonkey/mod_spidermonkey.c
==============================================================================
--- freeswitch/branches/knhor/trunk/src/mod/languages/mod_spidermonkey/mod_spidermonkey.c (original)
+++ freeswitch/branches/knhor/trunk/src/mod/languages/mod_spidermonkey/mod_spidermonkey.c Sun Nov 12 00:08:38 2006
@@ -415,7 +415,7 @@
apr_dso_handle_t *dso = NULL;
apr_status_t status = SWITCH_STATUS_SUCCESS;
apr_dso_handle_sym_t function_handle = NULL;
- spidermonkey_init_t spidermonkey_init;
+ spidermonkey_init_t spidermonkey_init = NULL;
const sm_module_interface_t *module_interface, *mp;
int loading = 1;
Modified: freeswitch/branches/knhor/trunk/src/switch_ivr.c
==============================================================================
--- freeswitch/branches/knhor/trunk/src/switch_ivr.c (original)
+++ freeswitch/branches/knhor/trunk/src/switch_ivr.c Sun Nov 12 00:08:38 2006
@@ -176,13 +176,13 @@
SWITCH_DECLARE(switch_status_t) switch_ivr_collect_digits_callback(switch_core_session_t *session,
switch_input_callback_function_t input_callback,
void *buf,
- unsigned int buflen,
- unsigned int timeout)
+ uint32_t buflen,
+ uint32_t timeout)
{
switch_channel_t *channel;
switch_status_t status = SWITCH_STATUS_SUCCESS;
switch_time_t started = 0;
- unsigned int elapsed;
+ uint32_t elapsed;
channel = switch_core_session_get_channel(session);
assert(channel != NULL);
@@ -201,7 +201,7 @@
char dtmf[128];
if (timeout) {
- elapsed = (unsigned int)((switch_time_now() - started) / 1000);
+ elapsed = (uint32_t)((switch_time_now() - started) / 1000);
if (elapsed >= timeout) {
break;
}
@@ -243,17 +243,17 @@
SWITCH_DECLARE(switch_status_t) switch_ivr_collect_digits_count(switch_core_session_t *session,
char *buf,
- unsigned int buflen,
- unsigned int maxdigits,
+ uint32_t buflen,
+ uint32_t maxdigits,
const char *terminators,
char *terminator,
- unsigned int timeout)
+ uint32_t timeout)
{
- unsigned int i = 0, x = (unsigned int) strlen(buf);
+ uint32_t i = 0, x = (uint32_t) strlen(buf);
switch_channel_t *channel;
switch_status_t status = SWITCH_STATUS_SUCCESS;
switch_time_t started = 0;
- unsigned int elapsed;
+ uint32_t elapsed;
channel = switch_core_session_get_channel(session);
assert(channel != NULL);
@@ -278,7 +278,7 @@
switch_event_t *event;
if (timeout) {
- elapsed = (unsigned int)((switch_time_now() - started) / 1000);
+ elapsed = (uint32_t)((switch_time_now() - started) / 1000);
if (elapsed >= timeout) {
break;
}
@@ -292,7 +292,7 @@
if (switch_channel_has_dtmf(channel)) {
char dtmf[128];
switch_channel_dequeue_dtmf(channel, dtmf, sizeof(dtmf));
- for(i =0 ; i < (unsigned int) strlen(dtmf); i++) {
+ for(i =0 ; i < (uint32_t) strlen(dtmf); i++) {
if (strchr(terminators, dtmf[i])) {
*terminator = dtmf[i];
@@ -327,7 +327,7 @@
char *file,
switch_input_callback_function_t input_callback,
void *buf,
- unsigned int buflen)
+ uint32_t buflen)
{
switch_channel_t *channel;
char dtmf[128];
@@ -911,7 +911,7 @@
char *timer_name,
switch_input_callback_function_t input_callback,
void *buf,
- unsigned int buflen)
+ uint32_t buflen)
{
switch_channel_t *channel;
int16_t abuf[FILE_STARTSAMPLES];
@@ -1264,9 +1264,9 @@
pcre_prepared = pcre_compile(expression, 0, &error, &error_offset, NULL);
//See if there was an error in the expression
- if(error != NULL) {
+ if (error != NULL) {
//Clean up after ourselves
- if(pcre_prepared) {
+ if (pcre_prepared) {
pcre_free(pcre_prepared);
pcre_prepared = NULL;
}
@@ -1282,7 +1282,7 @@
match_count = pcre_exec(pcre_prepared, NULL, target, (int) strlen(target), 0, 0, offset_vectors, sizeof(offset_vectors) / sizeof(offset_vectors[0]));
//Clean up
- if(pcre_prepared) {
+ if (pcre_prepared) {
pcre_free(pcre_prepared);
pcre_prepared = NULL;
}
@@ -1290,7 +1290,7 @@
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "number of matches: %d\n", match_count);
//Was it a match made in heaven?
- if(match_count > 0) {
+ if (match_count > 0) {
return SWITCH_STATUS_SUCCESS;
} else {
return SWITCH_STATUS_FALSE;
@@ -1298,15 +1298,15 @@
}
SWITCH_DECLARE(switch_status_t) switch_play_and_get_digits(switch_core_session_t *session,
- unsigned int min_digits,
- unsigned int max_digits,
- unsigned int max_tries,
- unsigned int timeout,
+ uint32_t min_digits,
+ uint32_t max_digits,
+ uint32_t max_tries,
+ uint32_t timeout,
char* valid_terminators,
char* prompt_audio_file,
char* bad_input_audio_file,
void* digit_buffer,
- unsigned int digit_buffer_length,
+ uint32_t digit_buffer_length,
char* digits_regex)
{
@@ -1341,19 +1341,19 @@
}
//we only get one digit out of playback, see if thats all we needed and what we got
- if(max_digits == 1 && status == SWITCH_STATUS_BREAK) {
+ if (max_digits == 1 && status == SWITCH_STATUS_BREAK) {
//Check the digit if we have a regex
- if(digits_regex != NULL) {
+ if (digits_regex != NULL) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Checking regex [%s] on [%s]\n", digits_regex, digit_buffer);
//Make sure the digit is allowed
- if(switch_regex_match(digit_buffer, digits_regex) == SWITCH_STATUS_SUCCESS) {
+ if (switch_regex_match(digit_buffer, digits_regex) == SWITCH_STATUS_SUCCESS) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Match found!\n");
//jobs done
break;
} else {
//See if a bad input prompt was specified, if so, play it
- if(strlen(bad_input_audio_file) > 0) {
+ if (strlen(bad_input_audio_file) > 0) {
status = switch_ivr_play_file(session, NULL, bad_input_audio_file, NULL, NULL, NULL, 0);
//Make sure we made it out alive
@@ -1375,25 +1375,25 @@
status = switch_ivr_collect_digits_count(session, digit_buffer, digit_buffer_length, max_digits, valid_terminators, &terminator, timeout);
//Make sure we made it out alive
- if(status != SWITCH_STATUS_SUCCESS) {
+ if (status != SWITCH_STATUS_SUCCESS) {
//Bail
switch_channel_hangup(channel, SWITCH_CAUSE_NORMAL_CLEARING);
break;
}
//see if we got enough
- if(min_digits <= strlen(digit_buffer)) {
+ if (min_digits <= strlen(digit_buffer)) {
//See if we need to test a regex
- if(digits_regex != NULL) {
+ if (digits_regex != NULL) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Checking regex [%s] on [%s]\n", digits_regex, digit_buffer);
//Test the regex
- if(switch_regex_match(digit_buffer, digits_regex) == SWITCH_STATUS_SUCCESS) {
+ if (switch_regex_match(digit_buffer, digits_regex) == SWITCH_STATUS_SUCCESS) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Match found!\n");
//Jobs done
return switch_channel_get_state(channel);
} else {
//See if a bad input prompt was specified, if so, play it
- if(strlen(bad_input_audio_file) > 0) {
+ if (strlen(bad_input_audio_file) > 0) {
status = switch_ivr_play_file(session, NULL, bad_input_audio_file, NULL, NULL, NULL, 0);
//Make sure we made it out alive
@@ -1423,7 +1423,7 @@
switch_input_callback_function_t input_callback,
char *text,
void *buf,
- unsigned int buflen)
+ uint32_t buflen)
{
switch_channel_t *channel;
short abuf[960];
@@ -1614,7 +1614,7 @@
switch_input_callback_function_t input_callback,
char *text,
void *buf,
- unsigned int buflen)
+ uint32_t buflen)
{
switch_channel_t *channel;
int interval = 0;
@@ -1640,7 +1640,7 @@
if (switch_core_speech_open(&sh,
tts_name,
voice_name,
- (unsigned int)rate,
+ (uint32_t)rate,
&flags,
switch_core_session_get_pool(session)) != SWITCH_STATUS_SUCCESS) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invalid TTS module!\n");
@@ -3376,6 +3376,319 @@
parser->terminator = digit;
status = SWITCH_STATUS_SUCCESS;
}
+
+ return status;
+}
+
+struct switch_ivr_menu_action;
+
+struct switch_ivr_menu {
+ char *name;
+ char *greeting_sound;
+ char *short_greeting_sound;
+ char *invalid_sound;
+ int max_failures;
+ int timeout;
+ int inlen;
+ uint32_t flags;
+ struct switch_ivr_menu_action *actions;
+ struct switch_ivr_menu *next;
+ switch_memory_pool_t *pool;
+};
+
+
+struct switch_ivr_menu_action {
+ switch_ivr_menu_action_function_t *function;
+ switch_ivr_action_t ivr_action;
+ char *arg;
+ char *bind;
+ struct switch_ivr_menu_action *next;
+};
+
+static switch_ivr_menu_t *switch_ivr_find_menu(switch_ivr_menu_t *stack, char *name) {
+ switch_ivr_menu_t *ret;
+ for(ret = stack; ret ; ret = ret->next) {
+ if (!name || !strcmp(ret->name, name))
+ break;
+ }
+ return ret;
+}
+
+
+static void switch_ivr_menu_stack(switch_ivr_menu_t **top, switch_ivr_menu_t *bottom)
+{
+ switch_ivr_menu_t *ptr;
+
+ for(ptr = *top ; ptr && ptr->next ; ptr = ptr->next);
+
+ if (ptr) {
+ ptr->next = bottom;
+ } else {
+ *top = bottom;
+ }
+
+}
+
+SWITCH_DECLARE(switch_status_t) switch_ivr_menu_init(switch_ivr_menu_t **new,
+ switch_ivr_menu_t *main,
+ char *name,
+ char *greeting_sound,
+ char *short_greeting_sound,
+ char *invalid_sound,
+ int timeout,
+ int max_failures,
+ int inlen,
+ switch_memory_pool_t *pool)
+{
+ switch_ivr_menu_t *menu;
+ uint8_t newpool = 0;
+
+ if (!pool) {
+ if (switch_core_new_memory_pool(&pool) != SWITCH_STATUS_SUCCESS) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "OH OH no pool\n");
+ return SWITCH_STATUS_MEMERR;
+ }
+ newpool = 1;
+ }
+
+ if (!(menu = switch_core_alloc(pool, sizeof(*menu)))) {
+ if (newpool) {
+ switch_core_destroy_memory_pool(&pool);
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Memory Error!\n");
+ return SWITCH_STATUS_MEMERR;
+ }
+ }
+ menu->pool = pool;
+
+ menu->name = switch_core_strdup(menu->pool, name);
+ menu->greeting_sound = switch_core_strdup(menu->pool, greeting_sound);
+ menu->short_greeting_sound = switch_core_strdup(menu->pool, short_greeting_sound);
+ menu->invalid_sound = switch_core_strdup(menu->pool, invalid_sound);
+ menu->max_failures = max_failures;
+ menu->timeout = timeout;
+ menu->actions = NULL;
+ menu->inlen = inlen;
+ if (newpool) {
+ menu->flags |= SWITCH_IVR_MENU_FLAG_FREEPOOL;
+ }
+
+ if (menu->timeout <= 0)
+ menu->timeout = 10000;
+ if (menu->inlen <= 0)
+ menu->inlen = 1;
+
+ if (main) {
+ switch_ivr_menu_stack(&main, menu);
+ } else {
+ menu->flags |= SWITCH_IVR_MENU_FLAG_STACK;
+ }
+
+ *new = menu;
+
+ return SWITCH_STATUS_SUCCESS;
+}
+
+
+SWITCH_DECLARE(switch_status_t) switch_ivr_menu_bind_action(switch_ivr_menu_t *menu, switch_ivr_action_t ivr_action, char *arg, char *bind)
+{
+ switch_ivr_menu_action_t *action;
+
+ if ((action = switch_core_alloc(menu->pool, sizeof(*action)))) {
+ action->bind = bind;
+ action->next = menu->actions;
+ action->arg = arg;
+ action->ivr_action = ivr_action;
+ menu->actions = action;
+ return SWITCH_STATUS_SUCCESS;
+ }
+
+ return SWITCH_STATUS_MEMERR;
+}
+
+
+SWITCH_DECLARE(switch_status_t) switch_ivr_menu_bind_function(switch_ivr_menu_t *menu, switch_ivr_menu_action_function_t *function, char *bind)
+{
+ switch_ivr_menu_action_t *action;
+
+
+ if ((action = switch_core_alloc(menu->pool, sizeof(*action)))) {
+ action->bind = bind;
+ action->function = function;
+ action->next = menu->actions;
+ menu->actions = action;
+ return SWITCH_STATUS_SUCCESS;
+ }
+
+ return SWITCH_STATUS_MEMERR;
+}
+
+SWITCH_DECLARE(switch_status_t) switch_ivr_menu_free_stack(switch_ivr_menu_t *stack)
+{
+ switch_memory_pool_t *pool;
+
+ if (!switch_test_flag(stack, SWITCH_IVR_MENU_FLAG_STACK) || switch_test_flag(stack, SWITCH_IVR_MENU_FLAG_FREEPOOL)) {
+ return SWITCH_STATUS_FALSE;
+ }
+
+ pool = stack->pool;
+ switch_core_destroy_memory_pool(&pool);
+ pool = NULL;
+
+ return SWITCH_STATUS_SUCCESS;
+
+}
+
+SWITCH_DECLARE(switch_status_t) switch_ivr_menu_execute(switch_core_session_t *session, switch_ivr_menu_t *stack, char *name, void *obj)
+{
+ int reps = 0, errs = 0, match = 0, running = 1;
+ char *greeting_sound = NULL, *aptr;
+ char *buf, arg[512];
+ switch_ivr_action_t todo = SWITCH_IVR_ACTION_DIE;
+ switch_ivr_menu_action_t *ap;
+ switch_ivr_menu_t *menu;
+ switch_channel_t *channel;
+ switch_status_t status = SWITCH_STATUS_SUCCESS;
+
+ channel = switch_core_session_get_channel(session);
+ assert(channel != NULL);
+
+
+ if (!(menu = switch_ivr_find_menu(stack, name))) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invalid Menu!\n");
+ return -1;
+ }
+
+ if (!(buf = malloc(menu->inlen))) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "No Memory!\n");
+ return -1;
+ }
+
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Executing IVR menu %s\n", menu->name);
+
+ for (reps = 0 ; (running && status == SWITCH_STATUS_SUCCESS && errs < menu->max_failures) ; reps++) {
+
+ if (!switch_channel_ready(channel)) {
+ break;
+ }
+
+
+ if (reps > 0 && menu->short_greeting_sound) {
+ greeting_sound = menu->short_greeting_sound;
+ } else {
+ greeting_sound = menu->greeting_sound;
+ }
+
+ match = 0;
+ aptr = NULL;
+ memset(buf, 0, menu->inlen);
+ memset(arg, 0, sizeof(arg));
+
+ if (switch_play_and_get_digits(session,
+ menu->inlen,
+ menu->inlen,
+ 1,
+ menu->timeout, "#",
+ greeting_sound,
+ NULL,
+ buf,
+ menu->inlen,
+ NULL) != SWITCH_STATUS_SUCCESS) {
+ break;
+ }
+
+ if (!switch_strlen_zero(buf)) {
+ for(ap = menu->actions; ap ; ap = ap->next) {
+ if (!strcmp(buf, ap->bind)) {
+ char *membuf;
+
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "IVR menu %s matched %s\n", menu->name, buf);
+ match++;
+ errs = 0;
+ if (ap->function) {
+ todo = ap->function(menu, arg, sizeof(arg), obj);
+ aptr = arg;
+ } else {
+ todo = ap->ivr_action;
+ aptr = ap->arg;
+ }
+
+ switch(todo) {
+ case SWITCH_IVR_ACTION_DIE:
+ status = SWITCH_STATUS_FALSE;
+ break;
+ case SWITCH_IVR_ACTION_PLAYSOUND:
+ status = switch_ivr_play_file(session, NULL, aptr, NULL, NULL, NULL, 0);
+ break;
+ case SWITCH_IVR_ACTION_TRANSFER:
+ switch_ivr_session_transfer(session, aptr, NULL, NULL);
+ running = 0;
+ break;
+ case SWITCH_IVR_ACTION_EXECMENU:
+ reps = -1;
+ status = switch_ivr_menu_execute(session, stack, aptr, obj);
+ break;
+ case SWITCH_IVR_ACTION_EXECAPP: {
+ const switch_application_interface_t *application_interface;
+ if ((membuf = strdup(aptr))) {
+ char *app_name = membuf;
+ char *app_arg = strchr(app_name, ' ');
+
+ if (app_arg) {
+ *app_arg = '\0';
+ app_arg++;
+ }
+
+ if (app_name && app_arg) {
+ if ((application_interface = switch_loadable_module_get_application_interface(app_name))) {
+ if (application_interface->application_function) {
+ application_interface->application_function(session, app_arg);
+ }
+ }
+ }
+ }
+ }
+ break;
+ case SWITCH_IVR_ACTION_BACK:
+ running = 0;
+ status = SWITCH_STATUS_SUCCESS;
+ break;
+ case SWITCH_IVR_ACTION_TOMAIN:
+ switch_set_flag(stack, SWITCH_IVR_MENU_FLAG_FALLTOMAIN);
+ status = SWITCH_STATUS_BREAK;
+ break;
+ default:
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Invalid TODO!\n");
+ break;
+ }
+ }
+ }
+
+
+ if (switch_test_flag(menu, SWITCH_IVR_MENU_FLAG_STACK)) { /* top level */
+ if (switch_test_flag(stack, SWITCH_IVR_MENU_FLAG_FALLTOMAIN)) { /* catch the fallback and recover */
+ switch_clear_flag(stack, SWITCH_IVR_MENU_FLAG_FALLTOMAIN);
+ status = SWITCH_STATUS_SUCCESS;
+ running = 1;
+ continue;
+ }
+ }
+ }
+ if (!match) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "IVR menu %s caught invalid input %s\n", menu->name, buf);
+
+ if (menu->invalid_sound) {
+ status = switch_ivr_play_file(session, NULL, aptr, NULL, NULL, NULL, 0);
+ }
+ errs++;
+
+ if (status == SWITCH_STATUS_SUCCESS) {
+ status = switch_ivr_sleep(session, 1000);
+ }
+ }
+
+ }
+
+ switch_safe_free(buf);
return status;
}
1
0
[commit] r3325 - freeswitch/branches/knhor/trunk/src/mod/applications/mod_conference
by Freeswitch SVN 12 Nov '06
by Freeswitch SVN 12 Nov '06
12 Nov '06
Author: knhor
Date: Sat Nov 11 23:54:12 2006
New Revision: 3325
Modified:
freeswitch/branches/knhor/trunk/src/mod/applications/mod_conference/mod_conference.c
Log:
better invalid caller control config entry handling. do not populate default handlers if there are config entries in the profile.
Modified: freeswitch/branches/knhor/trunk/src/mod/applications/mod_conference/mod_conference.c
==============================================================================
--- freeswitch/branches/knhor/trunk/src/mod/applications/mod_conference/mod_conference.c (original)
+++ freeswitch/branches/knhor/trunk/src/mod/applications/mod_conference/mod_conference.c Sat Nov 11 23:54:12 2006
@@ -3447,7 +3447,6 @@
conference->interval = interval;
if(switch_ivr_digit_stream_parser_new(conference->pool,&conference->dtmf_parser) == SWITCH_STATUS_SUCCESS) {
- int i;
struct _ccds {
char *key;
char *digits;
@@ -3467,29 +3466,38 @@
{"hangup", "#", CALLER_CONTROL_HANGUP},
};
int ccds_qty = sizeof(ccds)/sizeof(ccds[0]);
+ int i;
- // set the default control handler strings
- for(i=0,status=SWITCH_STATUS_SUCCESS; status == SWITCH_STATUS_SUCCESS && i<ccds_qty; i++) {
- status = switch_ivr_digit_stream_parser_set_event(conference->dtmf_parser,ccds[i].digits,ccds[i].action);
+ // count the number of caller control definitons in the profile
+ for (i=0,xml_kvp = switch_xml_child(profile, "control"); xml_kvp; xml_kvp = xml_kvp->next) {
+ i++;
}
+ // map in the default control handler strings only if the profile has no caller control definitions
+ if (i == 0) {
+ for(i=0,status=SWITCH_STATUS_SUCCESS; status == SWITCH_STATUS_SUCCESS && i<ccds_qty; i++) {
+ status = switch_ivr_digit_stream_parser_set_event(conference->dtmf_parser,ccds[i].digits,ccds[i].action);
+ }
+ }
// parse the profile tree for caller control digit strings
for (xml_kvp = switch_xml_child(profile, "control"); xml_kvp; xml_kvp = xml_kvp->next) {
- char *key = (char *) switch_xml_attr_soft(xml_kvp, "action");
- char *val = (char *) switch_xml_attr_soft(xml_kvp, "digits");
+ char *key = (char *) switch_xml_attr(xml_kvp, "action");
+ char *val = (char *) switch_xml_attr(xml_kvp, "digits");
- if(key != NULL && val != NULL) {
+ if(key != NULL && val != NULL && *key && *val) {
// scan through all of the valid actions, and if found,
// set the new caller control action digit string, then
// stop scanning the table, and go to the next xml kvp.
for(i=0,status=SWITCH_STATUS_NOOP; i<ccds_qty && status == SWITCH_STATUS_NOOP; i++) {
if(strcasecmp(ccds[i].key,key) == 0) {
- status = switch_ivr_digit_stream_parser_set_event(conference->dtmf_parser,ccds[i].key,ccds[i].action);
+ status = switch_ivr_digit_stream_parser_set_event(conference->dtmf_parser,val,ccds[i].action);
}
}
if(status == SWITCH_STATUS_NOOP) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Invalid caller control action name '%'.\n",key);
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Invalid caller control action name '%s'.\n",key);
}
+ } else {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Invalid caller control config entry pair action='%s' digits='%s'\n",key,val);
}
}
} else {
1
0