[Freeswitch-branches] [commit] r5478 - in freeswitch/branches/greenlizard: . build build/config conf scripts/contrib/trixter scripts/socket src src/include src/mod/applications/mod_commands src/mod/applications/mod_conference src/mod/applications/mod_dptools src/mod/endpoints/mod_dingaling src/mod/endpoints/mod_portaudio src/mod/endpoints/mod_sofia src/mod/event_handlers/mod_cdr src/mod/event_handlers/mod_event_socket src/mod/event_handlers/mod_radius_cdr src/mod/formats/mod_local_stream src/mod/languages/mod_mono src/mod/languages/mod_python src/mod/languages/mod_spidermonkey src/mod/languages/mod_spidermonkey_core_db src/mod/languages/mod_spidermonkey_odbc src/mod/timers/mod_softtimer src/mod/xml_int/mod_xml_cdr
Freeswitch SVN
greenlizard at freeswitch.org
Wed Jun 27 13:11:16 EDT 2007
Author: greenlizard
Date: Wed Jun 27 13:11:14 2007
New Revision: 5478
Added:
freeswitch/branches/greenlizard/conf/xml_cdr.conf.xml
- copied unchanged from r5476, /freeswitch/trunk/conf/xml_cdr.conf.xml
freeswitch/branches/greenlizard/scripts/contrib/trixter/regexptest.pl
- copied unchanged from r5476, /freeswitch/trunk/scripts/contrib/trixter/regexptest.pl
freeswitch/branches/greenlizard/src/mod/formats/mod_local_stream/
- copied from r5476, /freeswitch/trunk/src/mod/formats/mod_local_stream/
freeswitch/branches/greenlizard/src/mod/formats/mod_local_stream/Makefile
- copied unchanged from r5476, /freeswitch/trunk/src/mod/formats/mod_local_stream/Makefile
freeswitch/branches/greenlizard/src/mod/formats/mod_local_stream/mod_local_stream.c
- copied unchanged from r5476, /freeswitch/trunk/src/mod/formats/mod_local_stream/mod_local_stream.c
freeswitch/branches/greenlizard/src/mod/formats/mod_local_stream/mod_local_stream.vcproj
- copied unchanged from r5476, /freeswitch/trunk/src/mod/formats/mod_local_stream/mod_local_stream.vcproj
Modified:
freeswitch/branches/greenlizard/Freeswitch.sln
freeswitch/branches/greenlizard/build/config/config.sub
freeswitch/branches/greenlizard/build/modules.conf.in
freeswitch/branches/greenlizard/conf/freeswitch.xml
freeswitch/branches/greenlizard/conf/modules.conf.xml
freeswitch/branches/greenlizard/scripts/contrib/trixter/conf-dtmf.pl
freeswitch/branches/greenlizard/scripts/socket/sock.pl
freeswitch/branches/greenlizard/src/include/switch_apr.h
freeswitch/branches/greenlizard/src/include/switch_types.h
freeswitch/branches/greenlizard/src/mod/applications/mod_commands/mod_commands.c
freeswitch/branches/greenlizard/src/mod/applications/mod_conference/mod_conference.c
freeswitch/branches/greenlizard/src/mod/applications/mod_dptools/mod_dptools.c
freeswitch/branches/greenlizard/src/mod/endpoints/mod_dingaling/mod_dingaling.c
freeswitch/branches/greenlizard/src/mod/endpoints/mod_portaudio/pablio.c
freeswitch/branches/greenlizard/src/mod/endpoints/mod_sofia/sofia_glue.c
freeswitch/branches/greenlizard/src/mod/event_handlers/mod_cdr/basecdr.cpp
freeswitch/branches/greenlizard/src/mod/event_handlers/mod_event_socket/mod_event_socket.c
freeswitch/branches/greenlizard/src/mod/event_handlers/mod_radius_cdr/Makefile.am
freeswitch/branches/greenlizard/src/mod/languages/mod_mono/mod_mono.c
freeswitch/branches/greenlizard/src/mod/languages/mod_python/mod_python.i
freeswitch/branches/greenlizard/src/mod/languages/mod_spidermonkey/mod_spidermonkey.c
freeswitch/branches/greenlizard/src/mod/languages/mod_spidermonkey/mod_spidermonkey.h
freeswitch/branches/greenlizard/src/mod/languages/mod_spidermonkey_core_db/mod_spidermonkey_core_db.c
freeswitch/branches/greenlizard/src/mod/languages/mod_spidermonkey_odbc/mod_spidermonkey_odbc.c
freeswitch/branches/greenlizard/src/mod/timers/mod_softtimer/mod_softtimer.c
freeswitch/branches/greenlizard/src/mod/xml_int/mod_xml_cdr/mod_xml_cdr.c
freeswitch/branches/greenlizard/src/mod/xml_int/mod_xml_cdr/mod_xml_cdr.vcproj
freeswitch/branches/greenlizard/src/switch_apr.c
freeswitch/branches/greenlizard/src/switch_channel.c
freeswitch/branches/greenlizard/src/switch_core_session.c
freeswitch/branches/greenlizard/src/switch_core_state_machine.c
freeswitch/branches/greenlizard/src/switch_event.c
freeswitch/branches/greenlizard/src/switch_ivr.c
freeswitch/branches/greenlizard/src/switch_ivr_async.c
freeswitch/branches/greenlizard/src/switch_ivr_bridge.c
freeswitch/branches/greenlizard/src/switch_ivr_play_say.c
freeswitch/branches/greenlizard/src/switch_rtp.c
Log:
merge trunk revision 5440 to 5476
Modified: freeswitch/branches/greenlizard/Freeswitch.sln
==============================================================================
--- freeswitch/branches/greenlizard/Freeswitch.sln (original)
+++ freeswitch/branches/greenlizard/Freeswitch.sln Wed Jun 27 13:11:14 2007
@@ -434,8 +434,9 @@
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_xml_cdr", "src\mod\xml_int\mod_xml_cdr\mod_xml_cdr.vcproj", "{08DAD348-9E0A-4A2E-97F1-F1E7E24A7836}"
ProjectSection(ProjectDependencies) = postProject
- {202D7A4E-760D-4D0E-AFA1-D7459CED30FF} = {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}
{F6C55D93-B927-4483-BB69-15AEF3DD2DFF} = {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}
+ {87EE9DA4-DE1E-4448-8324-183C98DCA588} = {87EE9DA4-DE1E-4448-8324-183C98DCA588}
+ {202D7A4E-760D-4D0E-AFA1-D7459CED30FF} = {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_amr", "src\mod\codecs\mod_amr\mod_amr.vcproj", "{8DEB383C-4091-4F42-A56F-C9E46D552D79}"
@@ -472,6 +473,7 @@
conf\syslog.conf.xml = conf\syslog.conf.xml
conf\wanpipe.conf.xml = conf\wanpipe.conf.xml
conf\woomera.conf.xml = conf\woomera.conf.xml
+ conf\xml_cdr.conf.xml = conf\xml_cdr.conf.xml
conf\xml_curl.conf.xml = conf\xml_curl.conf.xml
conf\xml_rpc.conf.xml = conf\xml_rpc.conf.xml
conf\xmpp_event.conf.xml = conf\xmpp_event.conf.xml
@@ -505,6 +507,7 @@
release\conf\syslog.conf.xml = release\conf\syslog.conf.xml
release\conf\wanpipe.conf.xml = release\conf\wanpipe.conf.xml
release\conf\woomera.conf.xml = release\conf\woomera.conf.xml
+ release\conf\xml_cdr.conf.xml = release\conf\xml_cdr.conf.xml
release\conf\xml_curl.conf.xml = release\conf\xml_curl.conf.xml
release\conf\xml_rpc.conf.xml = release\conf\xml_rpc.conf.xml
release\conf\xmpp_event.conf.xml = release\conf\xmpp_event.conf.xml
@@ -538,6 +541,7 @@
debug\conf\syslog.conf.xml = debug\conf\syslog.conf.xml
debug\conf\wanpipe.conf.xml = debug\conf\wanpipe.conf.xml
debug\conf\woomera.conf.xml = debug\conf\woomera.conf.xml
+ debug\conf\xml_cdr.conf.xml = debug\conf\xml_cdr.conf.xml
debug\conf\xml_curl.conf.xml = debug\conf\xml_curl.conf.xml
debug\conf\xml_rpc.conf.xml = debug\conf\xml_rpc.conf.xml
debug\conf\xmpp_event.conf.xml = debug\conf\xmpp_event.conf.xml
@@ -582,6 +586,11 @@
{202D7A4E-760D-4D0E-AFA1-D7459CED30FF} = {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}
EndProjectSection
EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_local_stream", "src\mod\formats\mod_local_stream\mod_local_stream.vcproj", "{2CA40887-1622-46A1-A7F9-17FD7E7E545B}"
+ ProjectSection(ProjectDependencies) = postProject
+ {202D7A4E-760D-4D0E-AFA1-D7459CED30FF} = {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}
+ EndProjectSection
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Win32 = Debug|Win32
@@ -1086,6 +1095,12 @@
{3850D93A-5F24-4922-BC1C-74D08C37C256}.Release|Win32.ActiveCfg = Release|Win32
{3850D93A-5F24-4922-BC1C-74D08C37C256}.Release|Win32.Build.0 = Release|Win32
{3850D93A-5F24-4922-BC1C-74D08C37C256}.Release|x64.ActiveCfg = Release|Win32
+ {2CA40887-1622-46A1-A7F9-17FD7E7E545B}.Debug|Win32.ActiveCfg = Debug|Win32
+ {2CA40887-1622-46A1-A7F9-17FD7E7E545B}.Debug|Win32.Build.0 = Debug|Win32
+ {2CA40887-1622-46A1-A7F9-17FD7E7E545B}.Debug|x64.ActiveCfg = Debug|Win32
+ {2CA40887-1622-46A1-A7F9-17FD7E7E545B}.Release|Win32.ActiveCfg = Release|Win32
+ {2CA40887-1622-46A1-A7F9-17FD7E7E545B}.Release|Win32.Build.0 = Release|Win32
+ {2CA40887-1622-46A1-A7F9-17FD7E7E545B}.Release|x64.ActiveCfg = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -1110,6 +1125,7 @@
{3D1EED36-A510-4EDB-B4D9-4E0F4A5EC2A8} = {9ADF1E48-2F5C-4ED7-A893-596259FABFE0}
{AFAC0568-7548-42D5-9F6A-8D3400A1E4F6} = {A5A27244-AD24-46E5-B01B-840CD296C91D}
{9254C4B0-6F60-42B6-BB3A-36D63FC001C7} = {A5A27244-AD24-46E5-B01B-840CD296C91D}
+ {2CA40887-1622-46A1-A7F9-17FD7E7E545B} = {A5A27244-AD24-46E5-B01B-840CD296C91D}
{5FD31A25-5D83-4794-8BEE-904DAD84CE71} = {9460B5F1-0A95-41C4-BEB7-9C2C96459A7C}
{FE3540C5-3303-46E0-A69E-D92F775687F1} = {9460B5F1-0A95-41C4-BEB7-9C2C96459A7C}
{3A5B9131-F20C-4A85-9447-6C1610941CEE} = {9460B5F1-0A95-41C4-BEB7-9C2C96459A7C}
Modified: freeswitch/branches/greenlizard/build/config/config.sub
==============================================================================
--- freeswitch/branches/greenlizard/build/config/config.sub (original)
+++ freeswitch/branches/greenlizard/build/config/config.sub Wed Jun 27 13:11:14 2007
@@ -226,6 +226,7 @@
# Recognize the basic CPU types without company name.
# Some are omitted here because they have special meanings below.
1750a | 580 \
+ | bfin \
| a29k \
| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
@@ -292,6 +293,7 @@
;;
# Recognize the basic CPU types with company name.
580-* \
+ | bfin-* \
| a29k-* \
| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
Modified: freeswitch/branches/greenlizard/build/modules.conf.in
==============================================================================
--- freeswitch/branches/greenlizard/build/modules.conf.in (original)
+++ freeswitch/branches/greenlizard/build/modules.conf.in Wed Jun 27 13:11:14 2007
@@ -38,6 +38,7 @@
formats/mod_native_file
formats/mod_sndfile
#formats/mod_shout
+#formats/mod_local_stream
#languages/mod_perl
#languages/mod_python
#languages/mod_spidermonkey
Modified: freeswitch/branches/greenlizard/conf/freeswitch.xml
==============================================================================
--- freeswitch/branches/greenlizard/conf/freeswitch.xml (original)
+++ freeswitch/branches/greenlizard/conf/freeswitch.xml Wed Jun 27 13:11:14 2007
@@ -74,6 +74,7 @@
<!-- XML Interfaces -->
<!--#include "xml_rpc.conf.xml"-->
+ <!--#include "xml_cdr.conf.xml"-->
<!--#include "xml_curl.conf.xml"-->
<!-- none for mod_xml_cdr -->
@@ -124,6 +125,7 @@
<!-- Say -->
<!-- none for mod_say_en -->
<!--#include "mod_cdr.conf.xml"-->
+ <!--#include "mod_local_stream.conf.xml"-->
</section>
<section name="dialplan" description="Regex/XML Dialplan">
Modified: freeswitch/branches/greenlizard/conf/modules.conf.xml
==============================================================================
--- freeswitch/branches/greenlizard/conf/modules.conf.xml (original)
+++ freeswitch/branches/greenlizard/conf/modules.conf.xml Wed Jun 27 13:11:14 2007
@@ -53,6 +53,8 @@
<load module="mod_native_file"/>
<!--For icecast/mp3 streams/files-->
<!--<load module="mod_shout"/>-->
+ <!--For local streams (play all the files in a directory)-->
+ <!--<load module="mod_local_stream"/>-->
<!-- Timers -->
<load module="mod_softtimer"/>
Modified: freeswitch/branches/greenlizard/scripts/contrib/trixter/conf-dtmf.pl
==============================================================================
--- freeswitch/branches/greenlizard/scripts/contrib/trixter/conf-dtmf.pl (original)
+++ freeswitch/branches/greenlizard/scripts/contrib/trixter/conf-dtmf.pl Wed Jun 27 13:11:14 2007
@@ -1,4 +1,5 @@
#!/usr/bin/perl
+# -*- mode:cperl; tab-width:4; c-basic-offset:4; c-indent-level:4; indent-tabs-mode:nil; -*-
use FreeSWITCH::Client;
use POSIX ':signal_h'; # used for alarm to ensure we get heartbeats
use Data::Dumper; # used to print out myhash debug info
@@ -12,9 +13,9 @@
# hash for music, default must be defined, if you define other entities then the conference name will be used to match against that
my %soundfile = (
- 'default' => '/sounds/fpm-calm-river.wav',
- '123' => '/sounds/welcome.raw',
- );
+ 'default' => '/sounds/fpm-calm-river.wav',
+ '123' => '/sounds/welcome.raw',
+ );
@@ -25,31 +26,35 @@
my $lastheartbeat;
-
# this connects to the event socket
sub es_connect()
-{
+ {
print "Connecting to $host:$port\n";
- $fs = init FreeSWITCH::Client {-password => $password, -host => $host, -port => $port};
- if(defined $fs) {
- $fs->sendmsg({'command' => 'event plain heartbeat CUSTOM conference::maintenence'});
- $lastheartbeat = time;
+ eval {
+ $fs = init FreeSWITCH::Client {-password => $password, -host => $host, -port => $port};
+ if(defined $fs) {
+ $fs->sendmsg({'command' => 'event plain heartbeat CUSTOM conference::maintenence'});
+ $lastheartbeat = time;
+ }
+ } or do {
+ print "Error connecting - waiting for retry\n";
}
-}
+
+ }
sigaction SIGALRM, new POSIX::SigAction sub {
- if ($lastheartbeat < (time - $timeout)) {
+ if ($lastheartbeat < (time - $timeout)) {
print "Did not receive a heartbeat in the specified timeout\n";
if (defined $fs) {
- $fs->disconnect();
- undef $fs;
+ $fs->disconnect();
+ undef $fs;
}
es_connect();
- }
-
- # reset the alarm
- alarm $timeout;
+ }
+
+ # reset the alarm
+ alarm $timeout;
} or die "Error setting SIGALRM handler: $!\n";
@@ -59,36 +64,37 @@
while (1) {
if(defined $fs) {
- my $reply = $fs->readhash(undef);
- if ($reply->{socketerror}) {
+ my $reply = $fs->readhash(undef);
+ if ($reply->{socketerror}) {
es_connect();
- }
+ }
- if ($reply->{body}) {
+ if ($reply->{body}) {
$myhash = $reply->{event};
-
+
if ($myhash->{'event-name'} eq "HEARTBEAT") { ## Deal with heartbeats
- $lastheartbeat = time;
- print "Got a heartbeat\n";
-
+ $lastheartbeat = time;
+ print "Got a heartbeat\n";
+
} elsif ($myhash->{'event-subclass'} eq "conference::maintenence") { ## deal with Conference stuff
-
- if($myhash->{'action'} eq 'dtmf') { ## DTMF event
+
+ if($myhash->{'action'} eq 'dtmf') { ## DTMF event
print "conf: $myhash->{'conference-name'}\tmember: $myhash->{'member-id'}\tDTMF: $myhash->{'dtmf-key'}\n";
if(defined $soundfile{$myhash->{'conference-name'}}) {
- $fs->sendmsg({'command' => "api conference $myhash->{'conference-name'} play $soundfile{$myhash->{'conference-name'}}"});
+ $fs->sendmsg({'command' => "api conference $myhash->{'conference-name'} play $soundfile{$myhash->{'conference-name'}}"});
} else {
- $fs->sendmsg({'command' => "api conference $myhash->{'conference-name'} play $soundfile{'default'}"});
+ $fs->sendmsg({'command' => "api conference $myhash->{'conference-name'} play $soundfile{'default'}"});
}
- } else { ## Just print out all other events
+ } else { ## Just print out all other events
print "conf: $myhash->{'conference-name'}\tmemid: $myhash->{'member-id'}\taction: $myhash->{'action'}\tCLID: $myhash->{'caller-caller-id-number'}\n";
- }
+ }
} else { ## Unknown event
- print Dumper $myhash;
-# print "$reply->{body}\n"; # print out what was sent, myhash is translated by Client.pm
+ print Dumper $myhash;
+ # print "$reply->{body}\n"; # print out what was sent, myhash is translated by Client.pm
}
- }
+ }
}
}
+
Modified: freeswitch/branches/greenlizard/scripts/socket/sock.pl
==============================================================================
--- freeswitch/branches/greenlizard/scripts/socket/sock.pl (original)
+++ freeswitch/branches/greenlizard/scripts/socket/sock.pl Wed Jun 27 13:11:14 2007
@@ -21,12 +21,12 @@
$o = $fs->call_command("answer");
#to turn on events when in async mode
-#$o = $fs->raw_command("myevents");
+$o = $fs->raw_command("myevents");
$o = $fs->call_command("playback", "/ram/swimp.raw");
-$o = $fs->call_command("hangup");
+
#comment exit in async mode
-exit;
+#exit;
while(my $r = $fs->readhash(undef)) {
if ($r->{socketerror}) {
@@ -36,7 +36,11 @@
if ($r->{has_event}) {
print Dumper $r->{event};
}
-
+ if ($r->{event}->{'event-name'} !~ /execute/i) {
+ printf "wtf $data->{'unique-id'}\n";
+ $o = $fs->call_command("break");
+ $o = $fs->call_command("hangup");
+ }
}
$fs->disconnect();
Modified: freeswitch/branches/greenlizard/src/include/switch_apr.h
==============================================================================
--- freeswitch/branches/greenlizard/src/include/switch_apr.h (original)
+++ freeswitch/branches/greenlizard/src/include/switch_apr.h Wed Jun 27 13:11:14 2007
@@ -744,7 +744,7 @@
SWITCH_DECLARE(switch_status_t) switch_dir_open(switch_dir_t **new_dir, const char *dirname, switch_memory_pool_t *pool);
SWITCH_DECLARE(switch_status_t) switch_dir_close(switch_dir_t *thedir);
-SWITCH_DECLARE(const char *) switch_dir_next_file(switch_dir_t *thedir);
+SWITCH_DECLARE(const char *) switch_dir_next_file(switch_dir_t *thedir, char *buf, switch_size_t len);
/** @} */
Modified: freeswitch/branches/greenlizard/src/include/switch_types.h
==============================================================================
--- freeswitch/branches/greenlizard/src/include/switch_types.h (original)
+++ freeswitch/branches/greenlizard/src/include/switch_types.h Wed Jun 27 13:11:14 2007
@@ -573,6 +573,7 @@
CF_BROADCAST = (1 << 20) - Channel is broadcasting
CF_UNICAST = (1 << 21) - Channel has a unicast connection
CF_VIDEO = (1 << 22) - Channel has video
+CF_EVENT_LOCK = (1 << 23) - Don't parse events
</pre>
*/
@@ -599,7 +600,8 @@
CF_BREAK = (1 << 19),
CF_BROADCAST = (1 << 20),
CF_UNICAST = (1 << 21),
- CF_VIDEO = (1 << 22)
+ CF_VIDEO = (1 << 22),
+ CF_EVENT_LOCK = (1 << 23)
} switch_channel_flag_t;
@@ -823,12 +825,14 @@
SWITCH_EVENT_CHANNEL_ANSWER - A channel has been answered
SWITCH_EVENT_CHANNEL_HANGUP - A channel has been hungup
SWITCH_EVENT_CHANNEL_EXECUTE - A channel has executed a module's application
+ SWITCH_EVENT_CHANNEL_EXECUTE_COMPLETE - A channel has finshed executing a module's application
SWITCH_EVENT_CHANNEL_BRIDGE - A channel has bridged to another channel
SWITCH_EVENT_CHANNEL_UNBRIDGE - A channel has unbridged from another channel
SWITCH_EVENT_CHANNEL_PROGRESS - A channel has been parked
SWITCH_EVENT_CHANNEL_OUTGOING - A channel has been unparked
SWITCH_EVENT_CHANNEL_PARK - A channel has been parked
SWITCH_EVENT_CHANNEL_UNPARK - A channel has been unparked
+ SWITCH_EVENT_CHANNEL_APPLICATION- A channel has called and event from an application
SWITCH_EVENT_API - An API call has been executed
SWITCH_EVENT_LOG - A LOG event has been triggered
SWITCH_EVENT_INBOUND_CHAN - A new inbound channel has been created
@@ -872,12 +876,14 @@
SWITCH_EVENT_CHANNEL_ANSWER,
SWITCH_EVENT_CHANNEL_HANGUP,
SWITCH_EVENT_CHANNEL_EXECUTE,
+ SWITCH_EVENT_CHANNEL_EXECUTE_COMPLETE,
SWITCH_EVENT_CHANNEL_BRIDGE,
SWITCH_EVENT_CHANNEL_UNBRIDGE,
SWITCH_EVENT_CHANNEL_PROGRESS,
SWITCH_EVENT_CHANNEL_OUTGOING,
SWITCH_EVENT_CHANNEL_PARK,
SWITCH_EVENT_CHANNEL_UNPARK,
+ SWITCH_EVENT_CHANNEL_APPLICATION,
SWITCH_EVENT_API,
SWITCH_EVENT_LOG,
SWITCH_EVENT_INBOUND_CHAN,
Modified: freeswitch/branches/greenlizard/src/mod/applications/mod_commands/mod_commands.c
==============================================================================
--- freeswitch/branches/greenlizard/src/mod/applications/mod_commands/mod_commands.c (original)
+++ freeswitch/branches/greenlizard/src/mod/applications/mod_commands/mod_commands.c Wed Jun 27 13:11:14 2007
@@ -715,6 +715,31 @@
return SWITCH_STATUS_SUCCESS;
}
+#define BREAK_SYNTAX "<uuid>"
+SWITCH_STANDARD_API(break_function)
+{
+ switch_core_session_t *psession = NULL;
+
+ if (session) {
+ return SWITCH_STATUS_FALSE;
+ }
+
+ if (switch_strlen_zero(cmd)) {
+ stream->write_function(stream, "USAGE: %s\n", BREAK_SYNTAX);
+ } else {
+ if ((psession = switch_core_session_locate(cmd))) {
+ switch_channel_t *channel = switch_core_session_get_channel(psession);
+ switch_channel_set_flag(channel, CF_BREAK);
+ switch_core_session_rwunlock(psession);
+ } else {
+ stream->write_function(stream, "No Such Channel!\n");
+ }
+ }
+
+ return SWITCH_STATUS_SUCCESS;
+}
+
+
#define PAUSE_SYNTAX "<uuid> <on|off>"
SWITCH_STANDARD_API(pause_function)
{
@@ -1254,6 +1279,7 @@
SWITCH_ADD_API(commands_api_interface, "load", "Load Module", load_function, LOAD_SYNTAX);
SWITCH_ADD_API(commands_api_interface, "transfer", "Transfer Module", transfer_function, TRANSFER_SYNTAX);
SWITCH_ADD_API(commands_api_interface, "pause", "Pause", pause_function, PAUSE_SYNTAX);
+ SWITCH_ADD_API(commands_api_interface, "break", "Break", break_function, BREAK_SYNTAX);
SWITCH_ADD_API(commands_api_interface, "show", "Show", show_function, SHOW_SYNTAX);
SWITCH_ADD_API(commands_api_interface, "status", "status", status_function, "");
SWITCH_ADD_API(commands_api_interface, "uuid_bridge", "uuid_bridge", uuid_bridge_function, UUID_SYNTAX);
Modified: freeswitch/branches/greenlizard/src/mod/applications/mod_conference/mod_conference.c
==============================================================================
--- freeswitch/branches/greenlizard/src/mod/applications/mod_conference/mod_conference.c (original)
+++ freeswitch/branches/greenlizard/src/mod/applications/mod_conference/mod_conference.c Wed Jun 27 13:11:14 2007
@@ -1576,6 +1576,8 @@
switch_event_t *event;
caller_control_action_t *caller_action = NULL;
+ switch_mutex_lock(member->flag_mutex);
+
if (switch_core_session_dequeue_event(member->session, &event) == SWITCH_STATUS_SUCCESS) {
char *from = switch_event_get_header(event, "from");
char *to = switch_event_get_header(event, "to");
@@ -1649,7 +1651,6 @@
/* handle file and TTS frames */
if (member->fnode) {
- switch_mutex_lock(member->flag_mutex);
/* if we are done, clean it up */
if (member->fnode->done) {
conference_file_node_t *fnode;
@@ -1707,7 +1708,6 @@
}
}
}
- switch_mutex_unlock(member->flag_mutex);
} else { /* send the conferecne frame to the call leg */
switch_buffer_t *use_buffer = NULL;
uint32_t mux_used = (uint32_t) switch_buffer_inuse(member->mux_buffer);
@@ -1770,6 +1770,7 @@
switch_core_timer_next(&timer);
}
}
+ switch_mutex_unlock(member->flag_mutex);
} /* Rinse ... Repeat */
if (member->digit_stream != NULL) {
@@ -3229,12 +3230,13 @@
}
/* move the member from the old conference to the new one */
+ switch_mutex_lock(member->flag_mutex);
conference_del_member(conference, member);
conference_add_member(new_conference, member);
switch_mutex_unlock(new_conference->mutex);
-
+ switch_mutex_unlock(member->flag_mutex);
stream->write_function(stream, "OK Members sent to conference %s.\n", argv[2]);
-
+
/* tell them what happened */
if (switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) {
switch_channel_event_set_data(channel, event);
Modified: freeswitch/branches/greenlizard/src/mod/applications/mod_dptools/mod_dptools.c
==============================================================================
--- freeswitch/branches/greenlizard/src/mod/applications/mod_dptools/mod_dptools.c (original)
+++ freeswitch/branches/greenlizard/src/mod/applications/mod_dptools/mod_dptools.c Wed Jun 27 13:11:14 2007
@@ -94,6 +94,14 @@
switch_channel_ring_ready(channel);
}
+SWITCH_STANDARD_APP(break_function)
+{
+ switch_channel_t *channel;
+ channel = switch_core_session_get_channel(session);
+ assert(channel != NULL);
+ switch_channel_set_flag(channel, CF_BREAK);
+}
+
SWITCH_STANDARD_APP(queue_dtmf_function)
{
switch_channel_t *channel;
@@ -443,6 +451,53 @@
}
+
+
+SWITCH_STANDARD_APP(event_function)
+{
+ switch_channel_t *channel;
+ switch_event_t *event;
+ char *argv[25];
+ int argc = 0;
+ char *lbuf;
+
+ channel = switch_core_session_get_channel(session);
+ assert(channel != NULL);
+
+ if (switch_event_create(&event, SWITCH_EVENT_CHANNEL_APPLICATION) == SWITCH_STATUS_SUCCESS) {
+ switch_channel_event_set_data(channel, event);
+ if (data && (lbuf = switch_core_session_strdup(session, data))
+ && (argc = switch_separate_string(lbuf, ',', argv, (sizeof(argv) / sizeof(argv[0]))))) {
+ int x = 0;
+
+ for (x = 0; x < argc; x++) {
+ char *p, *this = argv[x];
+ p = this;
+ while(*p == ' ') *p++ = '\0';
+ this = p;
+
+ if (this) {
+ char *var = this, *val = NULL;
+ if ((val = strchr(var, '='))) {
+ p = val - 1;
+ *val++ = '\0';
+ while(*p == ' ') *p-- = '\0';
+ p = val;
+ while(*p == ' ') *p++ = '\0';
+ val = p;
+ switch_event_add_header(event, SWITCH_STACK_BOTTOM, var, "%s", val);
+ }
+ }
+
+ }
+ }
+
+ switch_event_fire(&event);
+ }
+
+}
+
+
SWITCH_STANDARD_APP(privacy_function)
{
switch_channel_t *channel;
@@ -1082,10 +1137,12 @@
SWITCH_ADD_APP(app_interface, "hangup", "Hangup the call", "Hangup the call for a channel.", hangup_function, "[<cause>]", SAF_SUPPORT_NOMEDIA);
SWITCH_ADD_APP(app_interface, "log", "Logs a channel varaible", LOG_LONG_DESC, log_function, "<varname>", SAF_SUPPORT_NOMEDIA);
SWITCH_ADD_APP(app_interface, "info", "Display Call Info", "Display Call Info", info_function, "", SAF_SUPPORT_NOMEDIA);
+ SWITCH_ADD_APP(app_interface, "event", "Fire an event", "Fire an event", event_function, "", SAF_SUPPORT_NOMEDIA);
SWITCH_ADD_APP(app_interface, "export", "Export a channel varaible across a bridge", EXPORT_LONG_DESC, export_function, "<varname>=<value>", SAF_SUPPORT_NOMEDIA);
SWITCH_ADD_APP(app_interface, "set", "Set a channel varaible", SET_LONG_DESC, set_function, "<varname>=<value>", SAF_SUPPORT_NOMEDIA);
SWITCH_ADD_APP(app_interface, "unset", "Unset a channel varaible", UNSET_LONG_DESC, unset_function, "<varname>", SAF_SUPPORT_NOMEDIA);
SWITCH_ADD_APP(app_interface, "ring_ready", "Indicate Ring_Ready", "Indicate Ring_Ready on a channel.", ring_ready_function, "", SAF_SUPPORT_NOMEDIA);
+ SWITCH_ADD_APP(app_interface, "break", "Break", "Set the break flag.", break_function, "", SAF_SUPPORT_NOMEDIA);
SWITCH_ADD_APP(app_interface, "detect_speech", "Detect speech", "Detect speech on a channel.", detect_speech_function, DETECT_SPEECH_SYNTAX, SAF_NONE);
SWITCH_ADD_APP(app_interface, "ivr", "Run an ivr menu", "Run an ivr menu.", ivr_application_function, "<menu_name>", SAF_NONE);
SWITCH_ADD_APP(app_interface, "redirect", "Send session redirect", "Send a redirect message to a session.", redirect_function, "<redirect_data>", SAF_SUPPORT_NOMEDIA);
Modified: freeswitch/branches/greenlizard/src/mod/endpoints/mod_dingaling/mod_dingaling.c
==============================================================================
--- freeswitch/branches/greenlizard/src/mod/endpoints/mod_dingaling/mod_dingaling.c (original)
+++ freeswitch/branches/greenlizard/src/mod/endpoints/mod_dingaling/mod_dingaling.c Wed Jun 27 13:11:14 2007
@@ -859,7 +859,7 @@
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "SETUP RTP %s:%d -> %s:%d\n", tech_pvt->profile->ip,
tech_pvt->local_port, tech_pvt->remote_ip, tech_pvt->remote_port);
- flags = SWITCH_RTP_FLAG_GOOGLEHACK | SWITCH_RTP_FLAG_AUTOADJ | SWITCH_RTP_FLAG_RAW_WRITE | SWITCH_RTP_FLAG_AUTO_CNG;
+ flags = SWITCH_RTP_FLAG_DATAWAIT | SWITCH_RTP_FLAG_GOOGLEHACK | SWITCH_RTP_FLAG_AUTOADJ | SWITCH_RTP_FLAG_RAW_WRITE | SWITCH_RTP_FLAG_AUTO_CNG;
if (switch_test_flag(tech_pvt->profile, TFLAG_TIMER)) {
flags |= SWITCH_RTP_FLAG_USE_TIMER;
@@ -1817,7 +1817,7 @@
/* connect my internal structure to the blank pointer passed to me */
*module_interface = switch_loadable_module_create_module_interface(pool, modname);
channel_endpoint_interface = switch_loadable_module_create_interface(*module_interface, SWITCH_ENDPOINT_INTERFACE);
- channel_endpoint_interface->interface_name = "digngaling";
+ channel_endpoint_interface->interface_name = "dingaling";
channel_endpoint_interface->io_routines = &channel_io_routines;
channel_endpoint_interface->state_handler = &channel_event_handlers;
Modified: freeswitch/branches/greenlizard/src/mod/endpoints/mod_portaudio/pablio.c
==============================================================================
--- freeswitch/branches/greenlizard/src/mod/endpoints/mod_portaudio/pablio.c (original)
+++ freeswitch/branches/greenlizard/src/mod/endpoints/mod_portaudio/pablio.c Wed Jun 27 13:11:14 2007
@@ -129,7 +129,6 @@
if (numBytes > 0) {
if (switch_core_timer_check(timer) == SWITCH_STATUS_SUCCESS) {
PaUtil_FlushRingBuffer(&aStream->outFIFO);
- printf("ASS\n");
return 0;
}
switch_yield(1000);
Modified: freeswitch/branches/greenlizard/src/mod/endpoints/mod_sofia/sofia_glue.c
==============================================================================
--- freeswitch/branches/greenlizard/src/mod/endpoints/mod_sofia/sofia_glue.c (original)
+++ freeswitch/branches/greenlizard/src/mod/endpoints/mod_sofia/sofia_glue.c Wed Jun 27 13:11:14 2007
@@ -1055,6 +1055,7 @@
sdp_attribute_t *a;
int first = 0, last = 0;
int ptime = 0, dptime = 0;
+ int sendonly = 0;
int greedy = 0, x = 0, skip = 0, mine = 0;
switch_channel_t *channel = NULL;
char *val;
@@ -1080,33 +1081,44 @@
}
}
+ if (((m = sdp->sdp_media)) && m->m_mode == sdp_sendonly) {
+ sendonly = 1;
+ }
+
for (a = sdp->sdp_attributes; a; a = a->a_next) {
if (switch_strlen_zero(a->a_name)) {
continue;
}
if (!strcasecmp(a->a_name, "sendonly")) {
- if (!switch_test_flag(tech_pvt, TFLAG_SIP_HOLD)) {
- char *stream;
- switch_set_flag_locked(tech_pvt, TFLAG_SIP_HOLD);
- if (!(stream = switch_channel_get_variable(tech_pvt->channel, SWITCH_HOLD_MUSIC_VARIABLE))) {
- stream = tech_pvt->profile->hold_music;
- }
- if (stream) {
- switch_ivr_broadcast(switch_core_session_get_uuid(tech_pvt->session), stream, SMF_ECHO_BLEG | SMF_LOOP);
- }
- }
- } else if (!strcasecmp(a->a_name, "sendrecv")) {
- if (switch_test_flag(tech_pvt, TFLAG_SIP_HOLD)) {
- switch_channel_clear_flag_partner(tech_pvt->channel, CF_BROADCAST);
- switch_channel_set_flag_partner(tech_pvt->channel, CF_BREAK);
- switch_clear_flag_locked(tech_pvt, TFLAG_SIP_HOLD);
- }
+ sendonly = 1;
+ } else if (!strcasecmp(a->a_name, "sendrecv")) {
+ sendonly = 0;
} else if (!strcasecmp(a->a_name, "ptime")) {
dptime = atoi(a->a_value);
}
}
+ if (sendonly) {
+ if (!switch_test_flag(tech_pvt, TFLAG_SIP_HOLD)) {
+ char *stream;
+ switch_set_flag_locked(tech_pvt, TFLAG_SIP_HOLD);
+ if (!(stream = switch_channel_get_variable(tech_pvt->channel, SWITCH_HOLD_MUSIC_VARIABLE))) {
+ stream = tech_pvt->profile->hold_music;
+ }
+ if (stream) {
+ switch_ivr_broadcast(switch_core_session_get_uuid(tech_pvt->session), stream, SMF_ECHO_BLEG | SMF_LOOP);
+ }
+ }
+ } else {
+ if (switch_test_flag(tech_pvt, TFLAG_SIP_HOLD)) {
+ switch_channel_clear_flag_partner(tech_pvt->channel, CF_BROADCAST);
+ switch_channel_set_flag_partner(tech_pvt->channel, CF_BREAK);
+ switch_clear_flag_locked(tech_pvt, TFLAG_SIP_HOLD);
+ }
+ }
+
+
for (m = sdp->sdp_media; m; m = m->m_next) {
sdp_connection_t *connection;
Modified: freeswitch/branches/greenlizard/src/mod/event_handlers/mod_cdr/basecdr.cpp
==============================================================================
--- freeswitch/branches/greenlizard/src/mod/event_handlers/mod_cdr/basecdr.cpp (original)
+++ freeswitch/branches/greenlizard/src/mod/event_handlers/mod_cdr/basecdr.cpp Wed Jun 27 13:11:14 2007
@@ -341,6 +341,7 @@
tempstring_second = (char *) val;
chanvars_supp[tempstring_first] = tempstring_second;
}
+ switch_channel_variable_last(channel);
}
else
{
Modified: freeswitch/branches/greenlizard/src/mod/event_handlers/mod_event_socket/mod_event_socket.c
==============================================================================
--- freeswitch/branches/greenlizard/src/mod/event_handlers/mod_event_socket/mod_event_socket.c (original)
+++ freeswitch/branches/greenlizard/src/mod/event_handlers/mod_event_socket/mod_event_socket.c Wed Jun 27 13:11:14 2007
@@ -642,12 +642,14 @@
listener->event_list[SWITCH_EVENT_CHANNEL_ANSWER] = 1;
listener->event_list[SWITCH_EVENT_CHANNEL_HANGUP] = 1;
listener->event_list[SWITCH_EVENT_CHANNEL_EXECUTE] = 1;
+ listener->event_list[SWITCH_EVENT_CHANNEL_EXECUTE_COMPLETE] = 1;
listener->event_list[SWITCH_EVENT_CHANNEL_BRIDGE] = 1;
listener->event_list[SWITCH_EVENT_CHANNEL_UNBRIDGE] = 1;
listener->event_list[SWITCH_EVENT_CHANNEL_PROGRESS] = 1;
listener->event_list[SWITCH_EVENT_CHANNEL_OUTGOING] = 1;
listener->event_list[SWITCH_EVENT_CHANNEL_PARK] = 1;
listener->event_list[SWITCH_EVENT_CHANNEL_UNPARK] = 1;
+ listener->event_list[SWITCH_EVENT_CHANNEL_APPLICATION] = 1;
listener->event_list[SWITCH_EVENT_TALK] = 1;
listener->event_list[SWITCH_EVENT_DTMF] = 1;
listener->event_list[SWITCH_EVENT_NOTALK] = 1;
Modified: freeswitch/branches/greenlizard/src/mod/event_handlers/mod_radius_cdr/Makefile.am
==============================================================================
--- freeswitch/branches/greenlizard/src/mod/event_handlers/mod_radius_cdr/Makefile.am (original)
+++ freeswitch/branches/greenlizard/src/mod/event_handlers/mod_radius_cdr/Makefile.am Wed Jun 27 13:11:14 2007
@@ -13,7 +13,7 @@
MODNAME=mod_radius_cdr
mod_LTLIBRARIES = mod_radius_cdr.la
mod_radius_cdr_la_SOURCES = mod_radius_cdr.c
-mod_radius_cdr_la_CFLAGS = $(AM_CFLAGS) -l
+mod_radius_cdr_la_CFLAGS = $(AM_CFLAGS)
mod_radius_cdr_la_CPPFLAGS = $(AM_CPPFLAGS)
mod_radius_cdr_la_LIBADD=$(switch_builddir)/libfreeswitch.la
mod_radius_cdr_la_LDFLAGS=-module -avoid-version -no-undefined
Modified: freeswitch/branches/greenlizard/src/mod/languages/mod_mono/mod_mono.c
==============================================================================
--- freeswitch/branches/greenlizard/src/mod/languages/mod_mono/mod_mono.c (original)
+++ freeswitch/branches/greenlizard/src/mod/languages/mod_mono/mod_mono.c Wed Jun 27 13:11:14 2007
@@ -194,12 +194,13 @@
iter = NULL;
mono_plugin *plugin = NULL;
const char *fname = NULL;
+ char buf[512] = "";
if (switch_dir_open(&module_dir_handle, module_dir, mono_pool) != SWITCH_STATUS_SUCCESS)
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Could not open directory: %s\n", module_dir);
/* Read the modules directory */
- while ((fname = switch_dir_next_file(module_dir_handle))) {
+ while ((fname = switch_dir_next_file(module_dir_handle, buf, sizeof(buf)))) {
assembly = (MonoAssembly *) switch_core_alloc(mono_pool, sizeof(assembly));
image = (MonoImage *) switch_core_alloc(mono_pool, sizeof(image));
Modified: freeswitch/branches/greenlizard/src/mod/languages/mod_python/mod_python.i
==============================================================================
--- freeswitch/branches/greenlizard/src/mod/languages/mod_python/mod_python.i (original)
+++ freeswitch/branches/greenlizard/src/mod/languages/mod_python/mod_python.i Wed Jun 27 13:11:14 2007
@@ -9,6 +9,7 @@
%cstring_bounded_mutable(char *dtmf_buf, 128);
%cstring_bounded_mutable(char *terminator, 8);
+
/** insert the following includes into generated code so it compiles */
%{
#include "switch_cpp.h"
Modified: freeswitch/branches/greenlizard/src/mod/languages/mod_spidermonkey/mod_spidermonkey.c
==============================================================================
--- freeswitch/branches/greenlizard/src/mod/languages/mod_spidermonkey/mod_spidermonkey.c (original)
+++ freeswitch/branches/greenlizard/src/mod/languages/mod_spidermonkey/mod_spidermonkey.c Wed Jun 27 13:11:14 2007
@@ -44,19 +44,32 @@
SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_spidermonkey_shutdown);
SWITCH_MODULE_DEFINITION(mod_spidermonkey, mod_spidermonkey_load, mod_spidermonkey_shutdown, NULL);
-#define METHOD_SANITY_CHECK() do { \
+#define METHOD_SANITY_CHECK() do { \
if (!jss || !jss->session) { \
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "You must call the session.originate method before calling this method!\n"); \
+ eval_some_js("~throw new Error(\"You must call the session.originate method before calling this method!\");", cx, obj, rval); \
*rval = BOOLEAN_TO_JSVAL(JS_FALSE); \
- return JS_TRUE; \
+ return JS_FALSE; \
} \
} while(foo == 1)
-#define CHANNEL_SANITY_CHECK() do { \
+#define CHANNEL_SANITY_CHECK() do { \
if (!switch_channel_ready(channel)) { \
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Session is not active!\n"); \
+ eval_some_js("~throw new Error(\"Session is not active!\");", cx, obj, rval); \
*rval = BOOLEAN_TO_JSVAL(JS_FALSE); \
- return JS_TRUE; \
+ return JS_FALSE; \
+ } \
+ if (!((switch_channel_test_flag(channel, CF_ANSWERED) || switch_channel_test_flag(channel, CF_EARLY_MEDIA)))) { \
+ eval_some_js("~throw new Error(\"Session is not answered!\");", cx, obj, rval); \
+ *rval = BOOLEAN_TO_JSVAL(JS_FALSE); \
+ return JS_FALSE; \
+ } \
+ } while (foo == 1)
+
+#define CHANNEL_SANITY_CHECK_ANSWER() do { \
+ if (!switch_channel_ready(channel)) { \
+ eval_some_js("~throw new Error(\"Session is not active!\");", cx, obj, rval); \
+ *rval = BOOLEAN_TO_JSVAL(JS_FALSE); \
+ return JS_FALSE; \
} \
} while (foo == 1)
@@ -838,6 +851,9 @@
jsval argv[4];
JSObject *Event = NULL;
jsval nval , *rval = &nval;
+ JSContext *cx = cb_state->cx;
+ JSObject *obj = cb_state->obj;
+
METHOD_SANITY_CHECK();
@@ -1600,12 +1616,27 @@
channel = switch_core_session_get_channel(jss->session);
assert(channel != NULL);
- CHANNEL_SANITY_CHECK();
+ CHANNEL_SANITY_CHECK_ANSWER();
switch_channel_answer(channel);
return JS_TRUE;
}
+static JSBool session_pre_answer(JSContext * cx, JSObject * obj, uintN argc, jsval * argv, jsval * rval)
+{
+ struct js_session *jss = JS_GetPrivate(cx, obj);
+ switch_channel_t *channel;
+
+ METHOD_SANITY_CHECK();
+
+ channel = switch_core_session_get_channel(jss->session);
+ assert(channel != NULL);
+
+ CHANNEL_SANITY_CHECK_ANSWER();
+
+ switch_channel_pre_answer(channel);
+ return JS_TRUE;
+}
static JSBool session_cdr(JSContext * cx, JSObject * obj, uintN argc, jsval * argv, jsval * rval)
{
@@ -2009,6 +2040,7 @@
{"getVariable", session_get_variable, 1},
{"getDigits", session_get_digits, 1},
{"answer", session_answer, 0},
+ {"preAnswer", session_pre_answer, 0},
{"generateXmlCdr", session_cdr, 0},
{"ready", session_ready, 0},
{"waitForAnswer", session_wait_for_answer, 0},
@@ -2561,6 +2593,13 @@
/*********************************************************************************/
static JSBool js_exit(JSContext * cx, JSObject * obj, uintN argc, jsval * argv, jsval * rval)
{
+ char *supplied_error, code_buf[256] = "";
+
+ if (argc > 0 && (supplied_error = JS_GetStringBytes(JS_ValueToString(cx, argv[0])))) {
+ snprintf(code_buf, sizeof(code_buf), "~throw new Error(\"%s\");", supplied_error);
+ eval_some_js(code_buf, cx, obj, rval);
+ }
+
return JS_FALSE;
}
Modified: freeswitch/branches/greenlizard/src/mod/languages/mod_spidermonkey/mod_spidermonkey.h
==============================================================================
--- freeswitch/branches/greenlizard/src/mod/languages/mod_spidermonkey/mod_spidermonkey.h (original)
+++ freeswitch/branches/greenlizard/src/mod/languages/mod_spidermonkey/mod_spidermonkey.h Wed Jun 27 13:11:14 2007
@@ -145,6 +145,7 @@
JSBool DEFAULT_SET_PROPERTY(JSContext * cx, JSObject *obj, jsval id, jsval *vp)
{
+ eval_some_js("~throw new Error(\"this property cannot be changed!\");", cx, obj, vp);
return JS_FALSE;
}
Modified: freeswitch/branches/greenlizard/src/mod/languages/mod_spidermonkey_core_db/mod_spidermonkey_core_db.c
==============================================================================
--- freeswitch/branches/greenlizard/src/mod/languages/mod_spidermonkey_core_db/mod_spidermonkey_core_db.c (original)
+++ freeswitch/branches/greenlizard/src/mod/languages/mod_spidermonkey_core_db/mod_spidermonkey_core_db.c Wed Jun 27 13:11:14 2007
@@ -247,6 +247,7 @@
char *name = JS_GetStringBytes(JS_ValueToString(cx, id));
if (strcmp(name, "_dB_RoW_DaTa_")) {
+ eval_some_js("~throw new Error(\"this property cannot be changed!\");", cx, obj, vp);
*vp = BOOLEAN_TO_JSVAL(JS_FALSE);
}
return JS_TRUE;
Modified: freeswitch/branches/greenlizard/src/mod/languages/mod_spidermonkey_odbc/mod_spidermonkey_odbc.c
==============================================================================
--- freeswitch/branches/greenlizard/src/mod/languages/mod_spidermonkey_odbc/mod_spidermonkey_odbc.c (original)
+++ freeswitch/branches/greenlizard/src/mod/languages/mod_spidermonkey_odbc/mod_spidermonkey_odbc.c Wed Jun 27 13:11:14 2007
@@ -433,6 +433,7 @@
char *name = JS_GetStringBytes(JS_ValueToString(cx, id));
if (strcmp(name, "_oDbC_dB_RoW_DaTa_")) {
+ eval_some_js("~throw new Error(\"this property cannot be changed!\");", cx, obj, vp);
*vp = BOOLEAN_TO_JSVAL(JS_FALSE);
}
return JS_TRUE;
Modified: freeswitch/branches/greenlizard/src/mod/timers/mod_softtimer/mod_softtimer.c
==============================================================================
--- freeswitch/branches/greenlizard/src/mod/timers/mod_softtimer/mod_softtimer.c (original)
+++ freeswitch/branches/greenlizard/src/mod/timers/mod_softtimer/mod_softtimer.c Wed Jun 27 13:11:14 2007
@@ -43,6 +43,7 @@
static struct {
int32_t RUNNING;
+ int32_t STARTED;
switch_mutex_t *mutex;
} globals;
@@ -76,6 +77,14 @@
static inline switch_status_t timer_init(switch_timer_t *timer)
{
timer_private_t *private_info;
+ int sanity = 0;
+
+ while(globals.STARTED == 0) {
+ switch_yield(100000);
+ if (++sanity == 10) {
+ break;
+ }
+ }
if (globals.RUNNING != 1 || !globals.mutex) {
return SWITCH_STATUS_FALSE;
@@ -220,9 +229,9 @@
memset(&globals, 0, sizeof(globals));
switch_mutex_init(&globals.mutex, SWITCH_MUTEX_NESTED, module_pool);
-
- globals.RUNNING = 1;
-
+
+ globals.STARTED = globals.RUNNING = 1;
+
while (globals.RUNNING == 1) {
reference += STEP_MIC;
Modified: freeswitch/branches/greenlizard/src/mod/xml_int/mod_xml_cdr/mod_xml_cdr.c
==============================================================================
--- freeswitch/branches/greenlizard/src/mod/xml_int/mod_xml_cdr/mod_xml_cdr.c (original)
+++ freeswitch/branches/greenlizard/src/mod/xml_int/mod_xml_cdr/mod_xml_cdr.c Wed Jun 27 13:11:14 2007
@@ -24,13 +24,23 @@
* Contributor(s):
*
* Brian West <brian.west at mac.com>
+ * Bret McDanel <trixter AT 0xdecafbad.com>
*
- *
- * mod_xml_cdr.c -- XML CDR Module
+ * mod_xml_cdr.c -- XML CDR Module to files or curl
*
*/
#include <sys/stat.h>
#include <switch.h>
+#include <curl/curl.h>
+
+static struct {
+ char *cred;
+ char *url;
+ char *logDir;
+ char *errLogDir;
+ uint32_t delay;
+ uint32_t retries;
+} globals;
SWITCH_MODULE_LOAD_FUNCTION(mod_xml_cdr_load);
SWITCH_MODULE_DEFINITION(mod_xml_cdr, mod_xml_cdr_load, NULL, NULL);
@@ -38,25 +48,34 @@
static switch_status_t my_on_hangup(switch_core_session_t *session)
{
switch_xml_t cdr;
+ char *xml_text;
+ char *path;
+ int fd = -1;
+ uint32_t curTry;
+ long httpRes;
+ CURL *curl_handle = NULL;
+ char *curl_xml_text;
+ char *logdir;
+ switch_channel_t *channel = switch_core_session_get_channel(session);
if (switch_ivr_generate_xml_cdr(session, &cdr) == SWITCH_STATUS_SUCCESS) {
- switch_channel_t *channel = switch_core_session_get_channel(session);
- char *xml_text;
- char *path;
- int fd = -1;
- const char *header = "<?xml version=\"1.0\"?>\n";
- char *uuid_str = switch_core_session_get_uuid(session);
- char *logdir = SWITCH_GLOBAL_dirs.log_dir;
- char *alt;
- if ((alt = switch_channel_get_variable(channel, "xml_cdr_base"))) {
- logdir = alt;
+ /* build the XML */
+ if(!(xml_text = switch_mprintf("<?xml version=\"1.0\"?>\n%s",switch_xml_toxml(cdr)) )) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Memory Error!\n");
+ return SWITCH_STATUS_FALSE;
+ }
+
+ /* do we log to the disk no matter what? */
+ /* all previous functionality is retained */
+
+ if (!(logdir = switch_channel_get_variable(channel, "xml_cdr_base"))) {
+ logdir = globals.logDir;
}
- if ((path = switch_mprintf("%s/xml_cdr/%s.cdr.xml", logdir, uuid_str))) {
- if ((xml_text = switch_xml_toxml(cdr))) {
+ if(!switch_strlen_zero(logdir)) {
+ if ((path = switch_mprintf("%s/xml_cdr/%s.cdr.xml", logdir, switch_core_session_get_uuid(session)))) {
if ((fd = open(path, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR)) > -1) {
- write(fd, header, (unsigned) strlen(header));
write(fd, xml_text, (unsigned) strlen(xml_text));
close(fd);
fd = -1;
@@ -69,11 +88,75 @@
#endif
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error![%s]\n", ebuf);
}
+ free(path);
+ }
+ }
+
+ /* try to post it to the web server */
+ if(!switch_strlen_zero(globals.url)) {
+ curl_handle = curl_easy_init();
+ if(!(curl_xml_text = switch_mprintf("cdr=%s",xml_text) )) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Memory Error!\n");
free(xml_text);
+ return SWITCH_STATUS_FALSE;
+ }
+
+ if (!switch_strlen_zero(globals.cred)) {
+ curl_easy_setopt(curl_handle, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
+ curl_easy_setopt(curl_handle, CURLOPT_USERPWD, globals.cred);
+ }
+
+ curl_easy_setopt(curl_handle, CURLOPT_POST, 1);
+ curl_easy_setopt(curl_handle, CURLOPT_POSTFIELDS, curl_xml_text);
+ curl_easy_setopt(curl_handle, CURLOPT_URL, globals.url);
+ curl_easy_setopt(curl_handle, CURLOPT_USERAGENT, "freeswitch-xml/1.0");
+
+ /* these were used for testing, optionally they may be enabled if someone desires
+ curl_easy_setopt(curl_handle, CURLOPT_TIMEOUT, 120); // tcp timeout
+ curl_easy_setopt(curl_handle, CURLOPT_FOLLOWLOCATION, 1); // 302 recursion level
+ */
+
+ for(curTry=0;curTry<=globals.retries;curTry++) {
+ curl_easy_perform(curl_handle);
+ curl_easy_getinfo(curl_handle, CURLINFO_RESPONSE_CODE,&httpRes);
+ if(httpRes==200) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "DEBUG XXX success posting\n");
+ curl_easy_cleanup(curl_handle);
+ free(curl_xml_text);
+ free(xml_text);
+ return SWITCH_STATUS_SUCCESS;
+ } else {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Got error [%ld] posting to web server\n",httpRes);
+ }
+
+ /* bug? feature? we sleep even on the last failure before writing the file */
+ switch_sleep(globals.delay * 1000);
+ }
+ free(curl_xml_text);
+ curl_easy_cleanup(curl_handle);
+ }
+
+ /* if we are here the web post failed for some reason */
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Unable to post to web server, writing to file\n");
+
+ if ((path = switch_mprintf("%s/%s.cdr.xml", globals.errLogDir, switch_core_session_get_uuid(session)))) {
+ if ((fd = open(path, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR)) > -1) {
+ write(fd, xml_text, (unsigned) strlen(xml_text));
+ close(fd);
+ fd = -1;
+ } else {
+ char ebuf[512] = { 0 };
+#ifdef WIN32
+ strerror_s(ebuf, sizeof(ebuf), errno);
+#else
+ strerror_r(errno, ebuf, sizeof(ebuf));
+#endif
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error![%s]\n", ebuf);
}
free(path);
}
+ free(xml_text);
switch_xml_free(cdr);
} else {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error Generating Data!\n");
@@ -82,6 +165,62 @@
return SWITCH_STATUS_SUCCESS;
}
+static switch_status_t do_config(void)
+{
+ char *cf = "xml_cdr.conf";
+ switch_xml_t cfg, xml, settings, param;
+
+ if (!(xml = switch_xml_open_cfg(cf, &cfg, NULL))) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "open of %s failed\n", cf);
+ return SWITCH_STATUS_TERM;
+ }
+
+ if ((settings = switch_xml_child(cfg, "settings"))) {
+ for (param = switch_xml_child(settings, "param"); param; param = param->next) {
+ char *var = (char *) switch_xml_attr_soft(param, "name");
+ char *val = (char *) switch_xml_attr_soft(param, "value");
+
+ if (!strcasecmp(var, "cred")) {
+ globals.cred = val;
+ } else if (!strcasecmp(var, "url")) {
+ globals.url = val;
+ } else if (!strcasecmp(var, "delay")) {
+ globals.delay = (uint32_t) atoi(val);
+ } else if (!strcasecmp(var, "retries")) {
+ globals.retries = (uint32_t) atoi(val);
+ } else if (!strcasecmp(var, "logDir")) {
+ if (switch_strlen_zero(val)) {
+ globals.logDir = SWITCH_GLOBAL_dirs.log_dir;
+ } else {
+ globals.logDir = val;
+ }
+ } else if (!strcasecmp(var, "errLogDir")) {
+ globals.errLogDir = val;
+ }
+
+ }
+ }
+ if(globals.retries < 0) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "retries is negative, setting to 0\n");
+ globals.retries = 0;
+ }
+
+
+ if(globals.retries && globals.delay<=0) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "retries set but delay 0 setting to 5000ms\n");
+ globals.delay = 5000;
+ }
+
+ if(!switch_strlen_zero(globals.url) && switch_strlen_zero(globals.errLogDir)) {
+ if ((globals.errLogDir = switch_mprintf("%s/xml_cdr", SWITCH_GLOBAL_dirs.log_dir))) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Memory Error!\n");
+ return SWITCH_STATUS_FALSE;
+ }
+ }
+
+ return SWITCH_STATUS_SUCCESS;
+}
+
static switch_state_handler_table_t state_handlers = {
/*.on_init */ NULL,
/*.on_ring */ NULL,
@@ -98,6 +237,9 @@
*module_interface = switch_loadable_module_create_module_interface(pool, modname);
+ memset(&globals,0,sizeof(globals));
+ do_config();
+
/* indicate that the module should continue to be loaded */
return SWITCH_STATUS_SUCCESS;
}
Modified: freeswitch/branches/greenlizard/src/mod/xml_int/mod_xml_cdr/mod_xml_cdr.vcproj
==============================================================================
--- freeswitch/branches/greenlizard/src/mod/xml_int/mod_xml_cdr/mod_xml_cdr.vcproj (original)
+++ freeswitch/branches/greenlizard/src/mod/xml_int/mod_xml_cdr/mod_xml_cdr.vcproj Wed Jun 27 13:11:14 2007
@@ -41,8 +41,8 @@
<Tool
Name="VCCLCompilerTool"
Optimization="0"
- AdditionalIncludeDirectories=""$(InputDir)..\..\..\include";"$(InputDir)include";"$(InputDir)..\..\..\..\libs\include""
- PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;MOD_EXPORTS"
+ AdditionalIncludeDirectories=""$(InputDir)..\..\..\include";"$(InputDir)include";"$(InputDir)..\..\..\..\libs\include";"$(InputDir)..\..\..\..\libs\curl\include""
+ PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;MOD_EXPORTS;CURL_STATICLIB"
MinimalRebuild="true"
BasicRuntimeChecks="3"
RuntimeLibrary="3"
@@ -63,6 +63,7 @@
/>
<Tool
Name="VCLinkerTool"
+ AdditionalDependencies="Ws2_32.lib Winmm.lib"
OutputFile="$(SolutionDir)$(OutDir)/mod/$(InputName).dll"
LinkIncremental="1"
AdditionalLibraryDirectories="..\..\..\..\w32\vsnet\$(OutDir)"
@@ -122,8 +123,8 @@
/>
<Tool
Name="VCCLCompilerTool"
- AdditionalIncludeDirectories=""$(InputDir)..\..\..\include";"$(InputDir)include";"$(InputDir)..\..\..\..\libs\include""
- PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;MOD_EXPORTS"
+ AdditionalIncludeDirectories=""$(InputDir)..\..\..\include";"$(InputDir)include";"$(InputDir)..\..\..\..\libs\include";"$(InputDir)..\..\..\..\libs\curl\include""
+ PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;MOD_EXPORTS;CURL_STATICLIB"
RuntimeLibrary="2"
UsePrecompiledHeader="0"
WarningLevel="4"
@@ -142,6 +143,7 @@
/>
<Tool
Name="VCLinkerTool"
+ AdditionalDependencies="Ws2_32.lib Winmm.lib"
OutputFile="$(SolutionDir)$(OutDir)/mod/$(InputName).dll"
LinkIncremental="1"
AdditionalLibraryDirectories="..\..\..\..\w32\vsnet\$(OutDir)"
Modified: freeswitch/branches/greenlizard/src/switch_apr.c
==============================================================================
--- freeswitch/branches/greenlizard/src/switch_apr.c (original)
+++ freeswitch/branches/greenlizard/src/switch_apr.c Wed Jun 27 13:11:14 2007
@@ -391,29 +391,51 @@
SWITCH_DECLARE(switch_status_t) switch_dir_open(switch_dir_t **new_dir, const char *dirname, switch_memory_pool_t *pool)
{
switch_status_t status;
- switch_dir_t *dir = switch_core_alloc(pool, sizeof(switch_dir_t));
- status = apr_dir_open(&(dir->dir_handle), dirname, pool);
- *new_dir = dir;
+ switch_dir_t *dir = malloc(sizeof(*dir));
+
+ memset(dir, 0, sizeof(*dir));
+ if ((status = apr_dir_open(&(dir->dir_handle), dirname, pool)) == APR_SUCCESS) {
+ *new_dir = dir;
+ } else {
+ free(dir);
+ *new_dir = NULL;
+ }
+
return status;
}
SWITCH_DECLARE(switch_status_t) switch_dir_close(switch_dir_t *thedir)
{
- return apr_dir_close(thedir->dir_handle);
+ switch_status_t status = apr_dir_close(thedir->dir_handle);
+
+ free(thedir);
+ return status;
}
-SWITCH_DECLARE(const char *) switch_dir_next_file(switch_dir_t *thedir)
+SWITCH_DECLARE(const char *) switch_dir_next_file(switch_dir_t *thedir, char *buf, switch_size_t len)
{
const char *fname = NULL;
apr_int32_t finfo_flags = APR_FINFO_DIRENT | APR_FINFO_TYPE | APR_FINFO_NAME;
+ const char *name;
+
while (apr_dir_read(&(thedir->finfo), finfo_flags, thedir->dir_handle) == SWITCH_STATUS_SUCCESS) {
- if (thedir->finfo.filetype != APR_REG)
+ if (thedir->finfo.filetype != APR_REG) {
+ continue;
+ }
+ if (!(name = thedir->finfo.fname)) {
+ name = thedir->finfo.name;
+ }
+
+ if (!name) {
continue;
- fname = thedir->finfo.fname;
- if (!fname)
- fname = thedir->finfo.name;
- if (!fname)
+ }
+
+ if (name) {
+ switch_copy_string(buf, name, len);
+ fname = buf;
+ } else {
continue;
+ }
}
return fname;
}
Modified: freeswitch/branches/greenlizard/src/switch_channel.c
==============================================================================
--- freeswitch/branches/greenlizard/src/switch_channel.c (original)
+++ freeswitch/branches/greenlizard/src/switch_channel.c Wed Jun 27 13:11:14 2007
@@ -513,11 +513,6 @@
ret++;
}
- if (switch_test_flag(channel, CF_BREAK)) {
- switch_clear_flag_locked(channel, CF_BREAK);
- ret = (uint8_t) 0;
- }
-
return ret;
}
@@ -772,6 +767,8 @@
const void *var;
char state_num[25];
+ switch_mutex_lock(channel->profile_mutex);
+
if ((caller_profile = switch_channel_get_caller_profile(channel))) {
originator_caller_profile = caller_profile->originator_caller_profile;
originatee_caller_profile = caller_profile->originatee_caller_profile;
@@ -818,7 +815,7 @@
}
}
-
+ switch_mutex_unlock(channel->profile_mutex);
}
Modified: freeswitch/branches/greenlizard/src/switch_core_session.c
==============================================================================
--- freeswitch/branches/greenlizard/src/switch_core_session.c (original)
+++ freeswitch/branches/greenlizard/src/switch_core_session.c Wed Jun 27 13:11:14 2007
@@ -567,11 +567,11 @@
channel = switch_core_session_get_channel(session);
assert(channel != NULL);
- if (switch_channel_test_flag(channel, CF_EVENT_PARSE)) {
+
+ if (switch_channel_test_flag(channel, CF_EVENT_LOCK)) {
return status;
}
-
if (session->private_event_queue) {
if ((status = (switch_status_t) switch_queue_trypop(session->private_event_queue, &pop)) == SWITCH_STATUS_SUCCESS) {
*event = (switch_event_t *) pop;
@@ -912,7 +912,9 @@
SWITCH_DECLARE(switch_status_t) switch_core_session_exec(switch_core_session_t *session,
const switch_application_interface_t *application_interface, char *arg) {
switch_app_log_t *log, *lp;
-
+ switch_event_t *event;
+ switch_channel_t *channel;
+
log = switch_core_session_alloc(session, sizeof(*log));
assert(log != NULL);
@@ -928,7 +930,23 @@
session->app_log = log;
}
+ if (switch_event_create(&event, SWITCH_EVENT_CHANNEL_EXECUTE) == SWITCH_STATUS_SUCCESS) {
+ switch_channel_event_set_data(session->channel, event);
+ switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Application", "%s", application_interface->interface_name);
+ switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Application-Data", arg);
+ switch_event_fire(&event);
+ }
+
+ channel = switch_core_session_get_channel(session);
+ switch_channel_clear_flag(channel, CF_BREAK);
application_interface->application_function(session, arg);
+
+ if (switch_event_create(&event, SWITCH_EVENT_CHANNEL_EXECUTE_COMPLETE) == SWITCH_STATUS_SUCCESS) {
+ switch_channel_event_set_data(session->channel, event);
+ switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Application", "%s", application_interface->interface_name);
+ switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Application-Data", "%s", arg);
+ switch_event_fire(&event);
+ }
return SWITCH_STATUS_SUCCESS;
}
Modified: freeswitch/branches/greenlizard/src/switch_core_state_machine.c
==============================================================================
--- freeswitch/branches/greenlizard/src/switch_core_state_machine.c (original)
+++ freeswitch/branches/greenlizard/src/switch_core_state_machine.c Wed Jun 27 13:11:14 2007
@@ -108,7 +108,6 @@
static void switch_core_standard_on_execute(switch_core_session_t *session)
{
switch_caller_extension_t *extension;
- switch_event_t *event;
const switch_application_interface_t *application_interface;
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Standard EXECUTE\n");
@@ -149,15 +148,6 @@
expanded);
}
- if (switch_event_create(&event, SWITCH_EVENT_CHANNEL_EXECUTE) == SWITCH_STATUS_SUCCESS) {
- switch_channel_event_set_data(session->channel, event);
- switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Application", "%s", extension->current_application->application_name);
- switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Application-Data-Orig", "%s", extension->current_application->application_data);
- switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Application-Data", "%s", expanded);
- switch_event_fire(&event);
- }
-
-
if (switch_channel_get_variable(session->channel, "presence_id")) {
char *arg = switch_mprintf("%s(%s)", extension->current_application->application_name, expanded);
if (arg) {
Modified: freeswitch/branches/greenlizard/src/switch_event.c
==============================================================================
--- freeswitch/branches/greenlizard/src/switch_event.c (original)
+++ freeswitch/branches/greenlizard/src/switch_event.c Wed Jun 27 13:11:14 2007
@@ -103,12 +103,14 @@
"CHANNEL_ANSWER",
"CHANNEL_HANGUP",
"CHANNEL_EXECUTE",
+ "CHANNEL_EXECUTE_COMPLETE",
"CHANNEL_BRIDGE",
"CHANNEL_UNBRIDGE",
"CHANNEL_PROGRESS",
"CHANNEL_OUTGOING",
"CHANNEL_PARK",
"CHANNEL_UNPARK",
+ "CHANNEL_APPLICATION",
"API",
"LOG",
"INBOUND_CHAN",
@@ -682,7 +684,7 @@
}
}
- snprintf(buf + len, dlen - len, "%s: %s\n", hp->name, encode_buf);
+ snprintf(buf + len, dlen - len, "%s: %s\n", hp->name, switch_strlen_zero(encode_buf) ? "_undef_" : encode_buf);
len = strlen(buf);
}
Modified: freeswitch/branches/greenlizard/src/switch_ivr.c
==============================================================================
--- freeswitch/branches/greenlizard/src/switch_ivr.c (original)
+++ freeswitch/branches/greenlizard/src/switch_ivr.c Wed Jun 27 13:11:14 2007
@@ -272,7 +272,9 @@
unsigned long CMD_NOMEDIA = switch_hashfunc_default("nomedia", &hlen);
unsigned long CMD_UNICAST = switch_hashfunc_default("unicast", &hlen);
char *lead_frames = switch_event_get_header(event, "lead-frames");
-
+ char *event_lock = switch_event_get_header(event, "event-lock");
+ switch_status_t status = SWITCH_STATUS_FALSE;
+
assert(channel != NULL);
assert(event != NULL);
@@ -286,15 +288,19 @@
switch_channel_set_flag(channel, CF_EVENT_PARSE);
+ if (switch_true(event_lock)) {
+ switch_channel_set_flag(channel, CF_EVENT_LOCK);
+ }
+
+
if (lead_frames) {
switch_frame_t *read_frame;
int frame_count = atoi(lead_frames);
- switch_status_t status;
while(frame_count > 0) {
status = switch_core_session_read_frame(session, &read_frame, -1, 0);
if (!SWITCH_READ_ACCEPTABLE(status)) {
- return status;
+ goto done;
}
if (!switch_test_flag(read_frame, SFF_CNG)) {
frame_count--;
@@ -308,12 +314,12 @@
char *app_arg = switch_event_get_header(event, "execute-app-arg");
char *loop_h = switch_event_get_header(event, "loops");
int loops = 1;
-
+
if (loop_h) {
loops = atoi(loop_h);
}
-
- if (app_name && app_arg) {
+
+ if (app_name) {
if ((application_interface = switch_loadable_module_get_application_interface(app_name))) {
if (application_interface->application_function) {
int x;
@@ -368,9 +374,13 @@
switch_ivr_nomedia(uuid, SMF_REBRIDGE);
}
+ status = SWITCH_STATUS_SUCCESS;
+ done:
switch_channel_clear_flag(channel, CF_EVENT_PARSE);
- return SWITCH_STATUS_SUCCESS;
+ switch_channel_clear_flag(channel, CF_EVENT_LOCK);
+
+ return status;
}
@@ -906,6 +916,7 @@
switch_channel_set_caller_profile(channel, new_profile);
switch_channel_set_flag(channel, CF_TRANSFER);
+
switch_channel_set_state(channel, CS_RING);
msg.message_id = SWITCH_MESSAGE_INDICATE_TRANSFER;
Modified: freeswitch/branches/greenlizard/src/switch_ivr_async.c
==============================================================================
--- freeswitch/branches/greenlizard/src/switch_ivr_async.c (original)
+++ freeswitch/branches/greenlizard/src/switch_ivr_async.c Wed Jun 27 13:11:14 2007
@@ -1179,6 +1179,7 @@
switch_event_add_header(event, SWITCH_STACK_BOTTOM, "execute-app-name", "%s", app);
switch_event_add_header(event, SWITCH_STACK_BOTTOM, "execute-app-arg", "%s", path);
switch_event_add_header(event, SWITCH_STACK_BOTTOM, "lead-frames", "%d", 5);
+ switch_event_add_header(event, SWITCH_STACK_BOTTOM, "event-lock", "%s", "true");
if ((flags & SMF_LOOP)) {
switch_event_add_header(event, SWITCH_STACK_BOTTOM, "loops", "%d", -1);
}
@@ -1197,6 +1198,7 @@
switch_event_add_header(event, SWITCH_STACK_BOTTOM, "execute-app-name", "%s", app);
switch_event_add_header(event, SWITCH_STACK_BOTTOM, "execute-app-arg", "%s", path);
switch_event_add_header(event, SWITCH_STACK_BOTTOM, "lead-frames", "%d", 5);
+ switch_event_add_header(event, SWITCH_STACK_BOTTOM, "event-lock", "%s", "true");
if ((flags & SMF_LOOP)) {
switch_event_add_header(event, SWITCH_STACK_BOTTOM, "loops", "%d", -1);
}
@@ -1209,6 +1211,7 @@
if (switch_event_create(&event, SWITCH_EVENT_MESSAGE) == SWITCH_STATUS_SUCCESS) {
switch_event_add_header(event, SWITCH_STACK_BOTTOM, "call-command", "nomedia");
switch_event_add_header(event, SWITCH_STACK_BOTTOM, "nomedia-uuid", "%s", uuid);
+ switch_event_add_header(event, SWITCH_STACK_BOTTOM, "event-lock", "%s", "true");
switch_core_session_queue_private_event(master, &event);
}
}
@@ -1218,7 +1221,7 @@
switch_event_add_header(event, SWITCH_STACK_BOTTOM, "call-command", "execute");
switch_event_add_header(event, SWITCH_STACK_BOTTOM, "execute-app-name", "hangup");
switch_event_add_header(event, SWITCH_STACK_BOTTOM, "execute-app-arg", "%s", cause);
-
+ switch_event_add_header(event, SWITCH_STACK_BOTTOM, "event-lock", "%s", "true");
switch_core_session_queue_private_event(session, &event);
}
}
Modified: freeswitch/branches/greenlizard/src/switch_ivr_bridge.c
==============================================================================
--- freeswitch/branches/greenlizard/src/switch_ivr_bridge.c (original)
+++ freeswitch/branches/greenlizard/src/switch_ivr_bridge.c Wed Jun 27 13:11:14 2007
@@ -274,6 +274,7 @@
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "CUSTOM TRANSMIT\n");
switch_channel_clear_state_handler(channel, NULL);
+ switch_channel_set_flag(channel, CF_BREAK);
if (!switch_channel_test_flag(channel, CF_ORIGINATOR)) {
return SWITCH_STATUS_FALSE;
@@ -656,6 +657,9 @@
switch_channel_set_flag(originatee_channel, CF_TAGGED);
switch_channel_set_private(originator_channel, SWITCH_UUID_BRIDGE, originatee_session);
+ switch_channel_set_flag(originator_channel, CF_BREAK);
+ switch_channel_set_flag(originatee_channel, CF_BREAK);
+
/* switch_channel_set_state_flag sets flags you want to be set when the next state change happens */
switch_channel_set_state_flag(originator_channel, CF_TRANSFER);
switch_channel_set_state_flag(originatee_channel, CF_TRANSFER);
Modified: freeswitch/branches/greenlizard/src/switch_ivr_play_say.c
==============================================================================
--- freeswitch/branches/greenlizard/src/switch_ivr_play_say.c (original)
+++ freeswitch/branches/greenlizard/src/switch_ivr_play_say.c Wed Jun 27 13:11:14 2007
@@ -394,11 +394,14 @@
while (switch_channel_ready(channel)) {
switch_size_t len;
- switch_event_t *event;
- if (switch_core_session_dequeue_private_event(session, &event) == SWITCH_STATUS_SUCCESS) {
- switch_ivr_parse_event(session, event);
- switch_event_destroy(&event);
+ if (switch_channel_test_flag(channel, CF_BREAK)) {
+ switch_channel_clear_flag(channel, CF_BREAK);
+ break;
+ }
+
+ if (switch_core_session_private_event_count(session)) {
+ switch_ivr_parse_all_events(session);
}
if (start && (time(NULL) - start) > limit) {
@@ -425,6 +428,8 @@
}
if (args->input_callback) {
+ switch_event_t *event = NULL;
+
if (switch_core_session_dequeue_event(session, &event) == SWITCH_STATUS_SUCCESS) {
status = args->input_callback(session, event, SWITCH_INPUT_TYPE_EVENT, args->buf, args->buflen);
switch_event_destroy(&event);
@@ -537,6 +542,11 @@
while(switch_channel_ready(channel)) {
switch_status_t status = switch_core_session_read_frame(session, &read_frame, 1000, 0);
+ if (switch_channel_test_flag(channel, CF_BREAK)) {
+ switch_channel_clear_flag(channel, CF_BREAK);
+ break;
+ }
+
if (!SWITCH_READ_ACCEPTABLE(status)) {
break;
}
@@ -781,12 +791,14 @@
int done = 0;
int do_speed = 1;
int last_speed = -1;
- switch_event_t *event;
+ if (switch_channel_test_flag(channel, CF_BREAK)) {
+ switch_channel_clear_flag(channel, CF_BREAK);
+ break;
+ }
- if (switch_core_session_dequeue_private_event(session, &event) == SWITCH_STATUS_SUCCESS) {
- switch_ivr_parse_event(session, event);
- switch_event_destroy(&event);
+ if (switch_core_session_private_event_count(session)) {
+ switch_ivr_parse_all_events(session);
}
if (args && (args->input_callback || args->buf || args->buflen)) {
@@ -810,6 +822,8 @@
}
if (args->input_callback) {
+ switch_event_t *event;
+
if (switch_core_session_dequeue_event(session, &event) == SWITCH_STATUS_SUCCESS) {
status = args->input_callback(session, event, SWITCH_INPUT_TYPE_EVENT, args->buf, args->buflen);
switch_event_destroy(&event);
@@ -1151,6 +1165,11 @@
while (switch_channel_ready(channel)) {
switch_event_t *event;
+ if (switch_channel_test_flag(channel, CF_BREAK)) {
+ switch_channel_clear_flag(channel, CF_BREAK);
+ break;
+ }
+
if (switch_core_session_dequeue_private_event(session, &event) == SWITCH_STATUS_SUCCESS) {
switch_ivr_parse_event(session, event);
switch_event_destroy(&event);
Modified: freeswitch/branches/greenlizard/src/switch_rtp.c
==============================================================================
--- freeswitch/branches/greenlizard/src/switch_rtp.c (original)
+++ freeswitch/branches/greenlizard/src/switch_rtp.c Wed Jun 27 13:11:14 2007
@@ -964,12 +964,7 @@
if (status == SWITCH_STATUS_BREAK || bytes == 0) {
if (switch_test_flag(rtp_session, SWITCH_RTP_FLAG_DATAWAIT)) {
- if (rtp_session->ms_per_packet) {
- switch_yield((rtp_session->ms_per_packet / 1000) * 750);
- } else {
- switch_yield(1000);
- }
- continue;
+ goto do_continue;
}
return 0;
}
@@ -1005,9 +1000,9 @@
if (bytes && rtp_session->cng_pt && rtp_session->recv_msg.header.pt == rtp_session->cng_pt) {
- continue;
+ goto do_continue;
}
-
+
if (switch_test_flag(rtp_session, SWITCH_RTP_FLAG_GOOGLEHACK) && rtp_session->recv_msg.header.pt == 102) {
@@ -1054,11 +1049,19 @@
}
}
- continue;
+ goto do_continue;
}
break;
+
+ do_continue:
+
+ if (rtp_session->ms_per_packet) {
+ switch_yield((rtp_session->ms_per_packet / 1000) * 750);
+ } else {
+ switch_yield(1000);
+ }
}
*payload_type = (switch_payload_t) rtp_session->recv_msg.header.pt;
More information about the Freeswitch-branches
mailing list