[Freeswitch-svn] [commit] r5675 - freeswitch/trunk/scripts/contrib/trixter
Freeswitch SVN
trixter at freeswitch.org
Wed Aug 29 10:37:54 EDT 2007
Author: trixter
Date: Wed Aug 29 10:37:54 2007
New Revision: 5675
Added:
freeswitch/trunk/scripts/contrib/trixter/softphone.pl (contents, props changed)
Log:
initial softphone commit, works for outbound
Added: freeswitch/trunk/scripts/contrib/trixter/softphone.pl
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/trixter/softphone.pl Wed Aug 29 10:37:54 2007
@@ -0,0 +1,179 @@
+#!/usr/bin/perl
+# -*- mode:cperl; tab-width:4; c-basic-offset:4; c-indent-level:4; indent-tabs-mode:nil; -*-
+#
+# FreeSWITCH Softphone
+# Copyright (C) 2007, Bret McDanel <trixter AT 0xdecafbad.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 Softphone
+#
+# The Initial Developer of the Original Code is
+# Bret McDanel <trixter AT 0xdecafbad.com>
+# Portions created by the Initial Developer are Copyright (C)
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#
+# Bret McDanel <trixter AT 0xdecafbad.com>
+#
+# softphone.pl -- FreeSWITCH softphone in perl
+#
+#
+
+#####
+##
+## This is the start of a GUI for FreeSWITCH[tm] using port audio as the channel endpoint.
+## Right now there are a few things that do not work right:
+## * events are not properly read
+## * if remote party hangs up the client doesnt realize it
+## * registration status is not displayed
+## * no redial ability
+## * no transfer, hold, etc
+## * incoming calls cannot be detected, or answered
+##
+## It works for a single channel, and you can type anything into the dial window, if that matches some regexp
+## in your dialplan the call will proceed.
+##
+#####
+
+use FreeSWITCH::Client;
+use Data::Dumper; # used to print out myhash debug info
+use Tk;
+use strict;
+
+
+# configure these
+my $password = "ClueCon"; # the password for event socket
+my $host = "localhost"; # the hostname to connect to
+my $port = 8021; # the port to connect to
+
+
+# random variables that we are going to use
+my $window;
+my $phonenumber;
+my $callInProgress=0;
+my $fs;
+my $errorString = undef;
+
+
+makeWindow();
+MainLoop;
+$fs->sendmsg({'command' => "api pa hangup"}) unless !defined($fs);
+print "We should hang up the calls, and any other cleanup here\n";
+
+
+
+sub getEvent() {
+ if(defined $fs) {
+ my $reply = $fs->readhash(0);
+ if ($reply->{socketerror}) {
+ $errorString = "Got error: ".$reply->{socketerror};
+ es_connect();
+ }
+
+ if ($reply->{body}) {
+ my $myhash = $reply->{event};
+ print Dumper $myhash;
+ }
+ } else {
+ $errorString = "Connecting";
+ es_connect();
+ }
+}
+
+
+# this connects to the event socket
+sub es_connect()
+{
+ $errorString = "Connecting to $host:$port";
+ eval {
+ $fs = init FreeSWITCH::Client {-password => $password, -host => $host, -port => $port};
+ if(defined $fs) {
+ $fs->sendmsg({'command' => 'event plain myevents'});
+ }
+ } or do {
+ $errorString = "Error connecting - waiting for retry";
+ sleep 5;
+ }
+
+}
+
+
+sub makeWindow {
+ $window = MainWindow->new();
+ $window->title("FreeSWITCH[tm] GUI");
+ my $mainframe = $window->Frame()->pack(qw/-side top -padx 10 -expand true -fill both/);
+
+ $mainframe->Entry(-textvariable => \$phonenumber)->pack(qw/-side top/);
+ my $dialpadframe = $mainframe->Frame()->pack(qw/-anchor s -pady 3/);
+ my $dialpadcol1 = $dialpadframe->Frame()->pack(qw/-side left -pady 3/);
+ my $dialpadcol2 = $dialpadframe->Frame()->pack(qw/-side left -pady 3/);
+ my $dialpadcol3 = $dialpadframe->Frame()->pack(qw/-side left -pady 3/);
+ my $errorMsgs = $mainframe->Label(-textvariable => \$errorString)->pack(qw/-side bottom/);
+ my $buttonframe = $mainframe->Frame()->pack(qw/-side bottom/);
+
+ # I really dont like this method, but I dont know Tk that well
+ # basically we have a timer that will call getEvent() 1ms after its finished running
+ # to see about getting more events - threads dont work because you cant share the FreeSWITCH::Client class
+ # forking doesnt work because $fs is always undefined from the GUI side
+ # or maybe you can, I dont know perl all that well either.
+ my $timerid = $window->repeat(100,\&getEvent);
+
+# set up the keys
+ my $phonebutton1 = $dialpadcol1->Button(-text => '1', -command => sub{sendDTMF("1")})->pack(qw/-side top/);
+ my $phonebutton2 = $dialpadcol2->Button(-text => '2', -command => sub{sendDTMF("2")})->pack(qw/-side top/);
+ my $phonebutton3 = $dialpadcol3->Button(-text => '3', -command => sub{sendDTMF("3")})->pack(qw/-side top/);
+ my $phonebutton4 = $dialpadcol1->Button(-text => '4', -command => sub{sendDTMF("4")})->pack(qw/-side top/);
+ my $phonebutton5 = $dialpadcol2->Button(-text => '5', -command => sub{sendDTMF("5")})->pack(qw/-side top/);
+ my $phonebutton6 = $dialpadcol3->Button(-text => '6', -command => sub{sendDTMF("6")})->pack(qw/-side top/);
+ my $phonebutton7 = $dialpadcol1->Button(-text => '7', -command => sub{sendDTMF("7")})->pack(qw/-side top/);
+ my $phonebutton8 = $dialpadcol2->Button(-text => '8', -command => sub{sendDTMF("8")})->pack(qw/-side top/);
+ my $phonebutton9 = $dialpadcol3->Button(-text => '9', -command => sub{sendDTMF("9")})->pack(qw/-side top/);
+ my $phonebuttonstar = $dialpadcol1->Button(-text => '*', -command => sub{sendDTMF("*")})->pack(qw/-side top/);
+ my $phonebutton0 = $dialpadcol2->Button(-text => '0', -command => sub{sendDTMF("0")})->pack(qw/-side top/);
+ my $phonebuttonpound = $dialpadcol3->Button(-text => '#', -command => sub{sendDTMF("#")})->pack(qw/-side top/);
+
+
+ my $dialbutton = $buttonframe->Button(-text => 'Dial/Answer', -command => \&dialAnswer)->pack(qw/-side left/);
+ my $hangupbutton = $buttonframe->Button(-text => 'Hangup', -command => \&hangup)->pack(qw/-side right/);
+}
+
+sub dialAnswer {
+ $callInProgress=1;
+ if(defined($fs)) {
+ $fs->sendmsg({'command' => "api pa call $phonenumber"});
+ } else {
+ $errorString = "Not connected!!!";
+ }
+}
+
+sub hangup {
+ $callInProgress=0;
+ $errorString = "hangup";
+ $phonenumber = "";
+ $fs->sendmsg({'command' => "api pa hangup"}) unless !defined($fs);
+}
+
+sub sendDTMF{
+ my $dtmf=shift;
+ if($callInProgress==1) {
+ if(defined($fs)) {
+ $fs->sendmsg({'command' => "api pa dtmf $dtmf"}) unless !defined($dtmf);
+ } else {
+ $errorString = "Not connected!";
+ }
+ } else {
+ $phonenumber .= $dtmf unless !defined($dtmf);
+ }
+}
More information about the Freeswitch-svn
mailing list