#!/usr/bin/perl

=pod

dialnplay script

=cut

sub DEBUG() { 1 }

my ($SIPURI, $filename);

BEGIN{
($SIPURI, $filename) = @ARGV;
$filename or die <<USAGE;
USAGE: $0 [sip uri] [filename]

sip uri is something like 203\@pbx.mindtrust
filename is something like /tmp/gaim/dsafsdfs.au

USAGE

};

use strict;

use lib 'lib';

use FreeSWITCH::Client;

sub find_sofia_profile_name(){

	my $found_sofia_section;
	my $s_p;
	open FSXML, "/usr/local/freeswitch/log/freeswitch.xml.fsxml";
	while (<FSXML>){

		$found_sofia_section or
			/configuration name="sofia.conf"/ or
				next;

		$found_sofia_section++;

		/<profile name="([^"]+)"/ and $s_p = $1 and last;

	};

	close FSXML;
	return $s_p

};

my $fsc;
my $fspid;

$SIG{INT} = sub {die "caught @_\n"};

END{
#  defined $fspid and print "TRYING TO KILL $fspid:\n", `kill $fspid`
};
# use constant fs_initdelay => 10;

eval {$fsc = FreeSWITCH::Client->init({ -password => 'ClueCon' })};

my $StartFailures;

while ($@){
	print "starting freeswitch due to conn err\n";
	$fspid = fork;
	if ($fspid){
		sleep 10;
		eval {
			$fsc = FreeSWITCH::Client->init(
				{ -password => 'ClueCon' }
			)
		};

		$@ and die 
			"freeswitch start failure: $@";

	}else{
		#child
		print "starting freeswitch in pid $$\n";
		chdir '/usr/local/freeswitch/bin';
		exec '/usr/local/freeswitch/bin/freeswitch -nc';
		die "FAILED TO EXEC";
	}

#	print "LAUNCHED freeswitch as pid $fspid\n";

};

DEBUG and  print "have FreeSwitch clinet obj $fsc\n";

my $SofiaProfile = find_sofia_profile_name();

my @FSevents;
#######
# enable event monitoring from FS
#######
push @FSevents, $fsc->raw_command("event ALL");

our $e;
our $chanid;


sub CALL(){
DEBUG and print "trying to call sofia/$SofiaProfile/$SIPURI\n";
   $fsc->raw_command( 
      "api originate sofia/$SofiaProfile/$SIPURI &park()\n"
   )
};


sub killchan(){
   DEBUG and print "killing channel\n";
   $fsc->raw_command( 
      "api killchan $chanid\n"
   );
};


sub PLAY(){
$chanid = $e->{event}->{'unique-id'};
DEBUG and print "trying to play $filename\n";

$fsc->raw_command(<<FOO);
sendmsg $chanid
call-command: execute
execute-app-name: playback
execute-app-arg: $filename
X-nowdo: HANGUP
FOO

};

CALL;


my $ONCE = 0;

for(;;){
	push @FSevents, @{$fsc->get_events};
	while (@FSevents){
		$e  = shift @FSevents;
#		print "$e\t$e->{'content-type'}\t$e->{has_event}\n";
DEBUG and $e->{has_event} and print "event-name: $e->{event}->{'event-name'}\n";
		$e->{event}->{'event-name'} eq 'CHANNEL_PARK' and last;
		$e->{event}->{'event-name'} eq 'PRIVATE_COMMAND' and 
		$e->{body} =~ m/^X-nowdo: HANGUP/m and killchan;
		$e->{event}->{'event-name'} eq 'CHANNEL_DESTROY' and
		$e->{event}->{'unique-id'} eq $chanid and exit;

	};

	$ONCE++ or PLAY;
	
};

__END__


