Author: anthm Date: Thu Jul 13 09:20:20 2006 New Revision: 1864 Added: freeswitch/trunk/src/mod/applications/mod_dptools/ freeswitch/trunk/src/mod/applications/mod_dptools/mod_dptools.c freeswitch/trunk/src/mod/applications/mod_dptools/mod_dptools.vcproj Modified: freeswitch/trunk/conf/freeswitch.xml freeswitch/trunk/modules.conf.in freeswitch/trunk/src/include/switch_ivr.h freeswitch/trunk/src/switch_channel.c freeswitch/trunk/src/switch_ivr.c Log: add mod_dptools, for set variable and sleep from the dialplan Modified: freeswitch/trunk/conf/freeswitch.xml ============================================================================== --- freeswitch/trunk/conf/freeswitch.xml (original) +++ freeswitch/trunk/conf/freeswitch.xml Thu Jul 13 09:20:20 2006 @@ -36,6 +36,7 @@ <!-- Applications --> <load module="mod_bridgecall"/> <load module="mod_echo"/> + <load module="mod_dptools"/> <!-- <load module="mod_ivrtest"/> --> <load module="mod_playback"/> <load module="mod_commands"/> Modified: freeswitch/trunk/modules.conf.in ============================================================================== --- freeswitch/trunk/modules.conf.in (original) +++ freeswitch/trunk/modules.conf.in Thu Jul 13 09:20:20 2006 @@ -1,5 +1,6 @@ loggers/mod_console loggers/mod_syslog +applications/mod_dptools applications/mod_commands applications/mod_conference applications/mod_bridgecall Modified: freeswitch/trunk/src/include/switch_ivr.h ============================================================================== --- freeswitch/trunk/src/include/switch_ivr.h (original) +++ freeswitch/trunk/src/include/switch_ivr.h Thu Jul 13 09:20:20 2006 @@ -50,6 +50,15 @@ * @{ */ + +/*! + \brief Wait for time to pass for a specified number of milliseconds + \param session the session to wait for. + \param ms the number of milliseconds + \return SWITCH_STATUS_SUCCESS if the channel is still up +*/ +SWITCH_DECLARE(switch_status_t) switch_ivr_sleep(switch_core_session_t *session, uint32_t ms); + /*! \brief Wait for DTMF digits calling a pluggable callback function when digits are collected. \param session the session to read. Added: freeswitch/trunk/src/mod/applications/mod_dptools/mod_dptools.c ============================================================================== --- (empty file) +++ freeswitch/trunk/src/mod/applications/mod_dptools/mod_dptools.c Thu Jul 13 09:20:20 2006 @@ -0,0 +1,111 @@ +/* + * FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application + * Copyright (C) 2005/2006, Anthony Minessale II <anthmct@yahoo.com> + * + * Version: MPL 1.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application + * + * The Initial Developer of the Original Code is + * Anthony Minessale II <anthmct@yahoo.com> + * Portions created by the Initial Developer are Copyright (C) + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * Anthony Minessale II <anthmct@yahoo.com> + * + * + * mod_dptools.c -- Raw Audio File Streaming Application Module + * + */ +#include <switch.h> + +static const char modname[] = "mod_dptools"; + + +static void sleep_function(switch_core_session_t *session, char *data) +{ + + if (switch_strlen_zero(data)) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "No timeout specified.\n"); + } else { + uint32_t ms = atoi(data); + switch_ivr_sleep(session, ms); + } +} + +static void set_function(switch_core_session_t *session, char *data) +{ + switch_channel_t *channel; + char *var, *val = NULL; + + channel = switch_core_session_get_channel(session); + assert(channel != NULL); + + if (switch_strlen_zero(data)) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "No variable name specified.\n"); + } else { + var = switch_core_session_strdup(session, data); + val = strchr(var, '='); + + if (val) { + *val++ = '\0'; + if (!strcmp(val, "_UNDEF_")) { + val = NULL; + } + } + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "SET [%s]=[%s]\n", var, val ? val : "UNDEF"); + switch_channel_set_variable(channel, var, val); + } +} + +static const switch_application_interface_t set_application_interface = { + /*.interface_name */ "set", + /*.application_function */ set_function +}; + +static const switch_application_interface_t sleep_application_interface = { + /*.interface_name */ "sleep", + /*.application_function */ sleep_function, + NULL,NULL,NULL, + &set_application_interface +}; + +static const switch_loadable_module_interface_t mod_dptools_module_interface = { + /*.module_name = */ modname, + /*.endpoint_interface = */ NULL, + /*.timer_interface = */ NULL, + /*.dialplan_interface = */ NULL, + /*.codec_interface = */ NULL, + /*.application_interface */ &sleep_application_interface +}; + +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 = &mod_dptools_module_interface; + + + /* indicate that the module should continue to be loaded */ + return SWITCH_STATUS_SUCCESS; +} + +/* 'switch_module_runtime' will start up in a thread by itself just by having it exist +if it returns anything but SWITCH_STATUS_TERM it will be called again automaticly +*/ + + +//switch_status_t switch_module_runtime(void) Added: freeswitch/trunk/src/mod/applications/mod_dptools/mod_dptools.vcproj ============================================================================== --- (empty file) +++ freeswitch/trunk/src/mod/applications/mod_dptools/mod_dptools.vcproj Thu Jul 13 09:20:20 2006 @@ -0,0 +1,209 @@ +<?xml version="1.0" encoding="Windows-1252"?> +<VisualStudioProject + ProjectType="Visual C++" + Version="8.00" + Name="mod_dptools" + ProjectGUID="{78100236-7CEA-4948-96CC-E8ED3160329C}" + RootNamespace="mod_dptools" + Keyword="Win32Proj" + > + <Platforms> + <Platform + Name="Win32" + /> + </Platforms> + <ToolFiles> + </ToolFiles> + <Configurations> + <Configuration + Name="Debug|Win32" + OutputDirectory="Debug" + IntermediateDirectory="Debug" + ConfigurationType="2" + InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops" + CharacterSet="2" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + Optimization="0" + AdditionalIncludeDirectories=""$(InputDir)..\..\..\include";"$(InputDir)include";"$(InputDir)..\..\..\..\libs\include"" + PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;MOD_EXPORTS" + MinimalRebuild="true" + BasicRuntimeChecks="3" + RuntimeLibrary="1" + UsePrecompiledHeader="0" + WarningLevel="4" + WarnAsError="true" + Detect64BitPortabilityProblems="true" + DebugInformationFormat="4" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + OutputFile="..\..\..\..\w32\vsnet\$(OutDir)/mod/mod_dptools.dll" + LinkIncremental="2" + AdditionalLibraryDirectories="..\..\..\..\w32\vsnet\$(OutDir)" + GenerateDebugInformation="true" + ProgramDatabaseFile="$(OutDir)/mod_dptools.pdb" + SubSystem="2" + ImportLibrary="$(OutDir)/mod_dptools.lib" + TargetMachine="1" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCWebDeploymentTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + <Configuration + Name="Release|Win32" + OutputDirectory="Release" + IntermediateDirectory="Release" + ConfigurationType="2" + InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops" + CharacterSet="2" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories=""$(InputDir)..\..\..\include";"$(InputDir)include";"$(InputDir)..\..\..\..\libs\include"" + PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;MOD_EXPORTS" + RuntimeLibrary="0" + UsePrecompiledHeader="0" + WarningLevel="4" + WarnAsError="true" + Detect64BitPortabilityProblems="true" + DebugInformationFormat="3" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + OutputFile="..\..\..\..\w32\vsnet\$(OutDir)/mod/mod_dptools.dll" + LinkIncremental="1" + AdditionalLibraryDirectories="..\..\..\..\w32\vsnet\$(OutDir)" + GenerateDebugInformation="true" + SubSystem="2" + OptimizeReferences="2" + EnableCOMDATFolding="2" + ImportLibrary="$(OutDir)/mod_dptools.lib" + TargetMachine="1" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCWebDeploymentTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + </Configurations> + <References> + </References> + <Files> + <Filter + Name="Source Files" + Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx" + UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}" + > + <File + RelativePath=".\mod_dptools.c" + > + </File> + </Filter> + <Filter + Name="Header Files" + Filter="h;hpp;hxx;hm;inl;inc;xsd" + UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}" + > + </Filter> + <Filter + Name="Resource Files" + Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx" + UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}" + > + </Filter> + </Files> + <Globals> + </Globals> +</VisualStudioProject> Modified: freeswitch/trunk/src/switch_channel.c ============================================================================== --- freeswitch/trunk/src/switch_channel.c (original) +++ freeswitch/trunk/src/switch_channel.c Thu Jul 13 09:20:20 2006 @@ -339,11 +339,18 @@ SWITCH_DECLARE(switch_status_t) switch_channel_set_variable(switch_channel_t *channel, char *varname, char *value) { assert(channel != NULL); - switch_core_hash_delete(channel->variables, varname); - switch_core_hash_insert_dup(channel->variables, varname, switch_core_session_strdup(channel->session, value)); + if (varname) { + switch_core_hash_delete(channel->variables, varname); + if (value) { + switch_core_hash_insert_dup(channel->variables, varname, switch_core_session_strdup(channel->session, value)); + } else { + switch_core_hash_delete(channel->variables, varname); + } + return SWITCH_STATUS_SUCCESS; + } - return SWITCH_STATUS_SUCCESS; + return SWITCH_STATUS_FALSE; } SWITCH_DECLARE(int) switch_channel_test_flag(switch_channel_t *channel, switch_channel_flag_t flags) Modified: freeswitch/trunk/src/switch_ivr.c ============================================================================== --- freeswitch/trunk/src/switch_ivr.c (original) +++ freeswitch/trunk/src/switch_ivr.c Thu Jul 13 09:20:20 2006 @@ -34,6 +34,46 @@ static const switch_state_handler_table_t audio_bridge_peer_state_handlers; +SWITCH_DECLARE(switch_status_t) switch_ivr_sleep(switch_core_session_t *session, uint32_t ms) +{ + switch_channel_t *channel; + switch_status_t status = SWITCH_STATUS_SUCCESS; + switch_time_t start, now, done = switch_time_now() + (ms * 1000); + switch_frame_t *read_frame; + int32_t left, elapsed; + + channel = switch_core_session_get_channel(session); + assert(channel != NULL); + + start = switch_time_now(); + + for(;;) { + now = switch_time_now(); + elapsed = (int32_t)((now - start) / 1000); + left = ms - elapsed; + + if (!switch_channel_ready(channel)) { + status = SWITCH_STATUS_FALSE; + break; + } + + if (now > done || left <= 0) { + break; + } + + if (switch_channel_test_flag(channel, CF_SERVICE)) { + switch_yield(1000); + } else { + status = switch_core_session_read_frame(session, &read_frame, left, 0); + if (!SWITCH_READ_ACCEPTABLE(status)) { + break; + } + } + } + + + return status; +} SWITCH_DECLARE(switch_status_t) switch_ivr_collect_digits_callback(switch_core_session_t *session, switch_input_callback_function_t input_callback,