[Freeswitch-svn] [commit] r8245 - in freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk: EventWatcher FreeSwitchEventSocket FreeSwitchEventSocket/ChannelEvents FreeSwitchEventSocket/Commands FreeSwitchEventSocket/Events FreeSwitchEventSocket/Ivr IvrSocket
Freeswitch SVN
verifier at freeswitch.org
Fri May 2 07:23:28 EDT 2008
Author: verifier
Date: Fri May 2 07:23:27 2008
New Revision: 8245
Added:
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Commands/SendEventCmd.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Ivr/DtmfEventArgs.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Ivr/IvrQueue.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Ivr/PrivateWaitDtmf.cs
Modified:
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/EventWatcher/CallManager.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/ChannelEvents/EventChannelExecute.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/ChannelEvents/EventChannelExecuteComplete.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Commands/AnyCommand.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Commands/AuthCommand.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Commands/CmdBase.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Commands/CommandReply.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Commands/ExecuteJavascript.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Commands/GetVariable.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Commands/Originate.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Commands/Playback.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Commands/SetVariable.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/EventSocket.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Events/EventBase.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Events/EventMessageWaiting.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/FreeSwitch.EventSocket.csproj
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Ivr/IvrInterface.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/IvrSocket/Program.cs
freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/IvrSocket/Voicemail.cs
Log:
Been working on the IvrInterface.
Modified: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/EventWatcher/CallManager.cs
==============================================================================
--- freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/EventWatcher/CallManager.cs (original)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/EventWatcher/CallManager.cs Fri May 2 07:23:27 2008
@@ -222,20 +222,20 @@
{
GetVariableReply gvr = (GetVariableReply) reply;
if (!gvr.Success)
- Debug.WriteLine("OnBridgeCallId " + reply.ErrCode);
+ Debug.WriteLine("OnBridgeCallId " + reply.ErrorMessage);
string otherChannelId = (string) command.ContextData;
SetVariable sv = new SetVariable(otherChannelId, "gate_callid", gvr.Value);
- sv.OnReply += OnCallIdReply;
+ sv.ReplyReceived += OnCallIdReply;
_eventMgr.Send(sv);
- command.OnReply -= OnBridgeCallId;
+ command.ReplyReceived -= OnBridgeCallId;
}
private void OnCallIdReply(CmdBase command, CommandReply reply)
{
if (!reply.Success)
- Debug.WriteLine("OnCallIdReply " + reply.ErrCode);
- command.OnReply -= OnCallIdReply;
+ Debug.WriteLine("OnCallIdReply " + reply.ErrorMessage);
+ command.ReplyReceived -= OnCallIdReply;
}
#region Nested type: ExtensionMapper
Modified: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/ChannelEvents/EventChannelExecute.cs
==============================================================================
--- freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/ChannelEvents/EventChannelExecute.cs (original)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/ChannelEvents/EventChannelExecute.cs Fri May 2 07:23:27 2008
@@ -1,10 +1,32 @@
-using System;
-using System.Collections.Generic;
-using System.Text;
-
namespace FreeSwitch.EventSocket
{
public class EventChannelExecute : EventChannelState
{
+ private string _appName;
+ private string _arguments;
+
+ public string AppName
+ {
+ get { return _appName; }
+ set { _appName = value; }
+ }
+
+ public string Arguments
+ {
+ get { return _arguments; }
+ set { _arguments = value; }
+ }
+
+ public override bool ParseCommand(string name, string value)
+ {
+ if (name == "application")
+ AppName = value;
+ else if (name == "application-data")
+ Arguments = value;
+ else
+ return base.ParseCommand(name, value);
+
+ return true;
+ }
}
}
Modified: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/ChannelEvents/EventChannelExecuteComplete.cs
==============================================================================
--- freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/ChannelEvents/EventChannelExecuteComplete.cs (original)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/ChannelEvents/EventChannelExecuteComplete.cs Fri May 2 07:23:27 2008
@@ -2,6 +2,32 @@
{
public class EventChannelExecuteComplete : EventChannelState
{
+ private string _appName;
+ private string _arguments;
+
+ public string AppName
+ {
+ get { return _appName; }
+ set { _appName = value; }
+ }
+
+ public string Arguments
+ {
+ get { return _arguments; }
+ set { _arguments = value; }
+ }
+
+ public override bool ParseCommand(string name, string value)
+ {
+ if (name == "application")
+ AppName = value;
+ else if (name == "application-data")
+ Arguments = value;
+ else
+ return base.ParseCommand(name, value);
+
+ return true;
+ }
}
}
Modified: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Commands/AnyCommand.cs
==============================================================================
--- freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Commands/AnyCommand.cs (original)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Commands/AnyCommand.cs Fri May 2 07:23:27 2008
@@ -28,7 +28,7 @@
else
{
CommandReply reply = new CommandReply(false);
- reply.ErrCode = dataToParse;
+ reply.ErrorMessage = dataToParse;
return reply;
}
}
Modified: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Commands/AuthCommand.cs
==============================================================================
--- freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Commands/AuthCommand.cs (original)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Commands/AuthCommand.cs Fri May 2 07:23:27 2008
@@ -26,7 +26,7 @@
else
{
CommandReply reply = new CommandReply(false);
- reply.ErrCode = dataToParse;
+ reply.ErrorMessage = dataToParse;
return reply;
}
}
Modified: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Commands/CmdBase.cs
==============================================================================
--- freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Commands/CmdBase.cs (original)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Commands/CmdBase.cs Fri May 2 07:23:27 2008
@@ -8,7 +8,7 @@
public abstract class CmdBase
{
- public event ReplyHandler OnReply;
+ public event ReplyHandler ReplyReceived;
private object _contextData;
@@ -35,16 +35,21 @@
public virtual void HandleReply(CommandReply reply)
{
// a command is only invoked once.
- if (OnReply != null)
+ if (ReplyReceived != null)
{
- OnReply(this, reply);
- OnReply = null;
+ ReplyReceived(this, reply);
+ ReplyReceived = null;
}
}
public virtual CommandReply CreateReply(string dataToParse)
{
- return null;
+ if (string.IsNullOrEmpty(dataToParse.Trim()))
+ return new CommandReply(false);
+
+ CommandReply reply = new CommandReply(dataToParse.Trim()[0] == '+');
+ reply.ErrorMessage = dataToParse;
+ return reply;
}
public override string ToString()
Modified: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Commands/CommandReply.cs
==============================================================================
--- freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Commands/CommandReply.cs (original)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Commands/CommandReply.cs Fri May 2 07:23:27 2008
@@ -6,7 +6,7 @@
public class CommandReply
{
private bool _success;
- private string _errCode;
+ private string _ErrorMessage;
public CommandReply(bool success)
{
@@ -18,10 +18,10 @@
get { return _success; }
}
- public string ErrCode
+ public string ErrorMessage
{
- get { return _errCode; }
- set { _errCode = value; }
+ get { return _ErrorMessage; }
+ set { _ErrorMessage = value; }
}
public override string ToString()
@@ -29,7 +29,7 @@
if (_success)
return "Success";
else
- return "Failed: " + _errCode;
+ return "Failed: " + _ErrorMessage;
}
}
}
Modified: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Commands/ExecuteJavascript.cs
==============================================================================
--- freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Commands/ExecuteJavascript.cs (original)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Commands/ExecuteJavascript.cs Fri May 2 07:23:27 2008
@@ -47,7 +47,7 @@
else
{
CommandReply reply = new CommandReply(false);
- reply.ErrCode = dataToParse;
+ reply.ErrorMessage = dataToParse;
return reply;
}
}
Modified: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Commands/GetVariable.cs
==============================================================================
--- freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Commands/GetVariable.cs (original)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Commands/GetVariable.cs Fri May 2 07:23:27 2008
@@ -39,7 +39,7 @@
else
{
GetVariableReply reply = new GetVariableReply(false, string.Empty);
- reply.ErrCode = dataToParse;
+ reply.ErrorMessage = dataToParse;
return reply;
}
}
Modified: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Commands/Originate.cs
==============================================================================
--- freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Commands/Originate.cs (original)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Commands/Originate.cs Fri May 2 07:23:27 2008
@@ -97,9 +97,9 @@
{
OriginateReply reply = new OriginateReply(false, string.Empty);
if (nameValue.Length > 1)
- reply.ErrCode = nameValue[1];
+ reply.ErrorMessage = nameValue[1];
else
- reply.ErrCode = dataToParse;
+ reply.ErrorMessage = dataToParse;
return reply;
}
}
Modified: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Commands/Playback.cs
==============================================================================
--- freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Commands/Playback.cs (original)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Commands/Playback.cs Fri May 2 07:23:27 2008
@@ -6,6 +6,7 @@
public class PlaybackCmd : SendMsg
{
private readonly string _fileName;
+ private readonly string _dtmfAbort = string.Empty;
/// <summary>
///
@@ -21,6 +22,12 @@
_fileName = fileName;
}
+ public PlaybackCmd(string uuid, string fileName, string dtmfAbort) : base(uuid)
+ {
+ _fileName = fileName;
+ _dtmfAbort = dtmfAbort;
+ }
+
public override string Command
{
get { return "playback"; }
@@ -30,5 +37,10 @@
{
get { return _fileName; }
}
+
+ public string DtmfAbort
+ {
+ get { return _dtmfAbort; }
+ }
}
}
Added: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Commands/SendEventCmd.cs
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Commands/SendEventCmd.cs Fri May 2 07:23:27 2008
@@ -0,0 +1,31 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace FreeSwitch.EventSocket.Commands
+{
+ public class SendEventCmd : CmdBase
+ {
+ private EventBase _event;
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <param name="evt">Note that all events have NOT being developed to be sent, only to be received.</param>
+ public SendEventCmd(EventBase evt)
+ {
+ _event = evt;
+ }
+
+
+ public override string Command
+ {
+ get { return "sendevent " + _event.Name + "\n"; }
+ }
+
+ public override string Arguments
+ {
+ get { return _event.ToString(); }
+ }
+ }
+}
Modified: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Commands/SetVariable.cs
==============================================================================
--- freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Commands/SetVariable.cs (original)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Commands/SetVariable.cs Fri May 2 07:23:27 2008
@@ -25,7 +25,17 @@
public override string Arguments
{
- get { return _channelId + " " + _name + " " + _value; }
+ get { return _channelId + " " + Name + " " + Value; }
+ }
+
+ public string Name
+ {
+ get { return _name; }
+ }
+
+ public string Value
+ {
+ get { return _value; }
}
public override CommandReply CreateReply(string dataToParse)
@@ -35,7 +45,7 @@
else
{
CommandReply reply = new CommandReply(false);
- reply.ErrCode = dataToParse;
+ reply.ErrorMessage = dataToParse;
return reply;
}
}
Modified: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/EventSocket.cs
==============================================================================
--- freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/EventSocket.cs (original)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/EventSocket.cs Fri May 2 07:23:27 2008
@@ -79,7 +79,6 @@
}
catch (SocketException)
{
- Console.WriteLine("EventSocket: Connect failed");
HandleDisconnect();
}
}
@@ -88,8 +87,6 @@
{
lock (_lockobj)
{
- Console.WriteLine("EventSocket.TryConnect: Connecting to " + _hostName + ":" + _port);
-
_socket.Connect(_hostName, _port);
if (_stream == null)
_stream = new NetworkStream(_socket, false);
@@ -167,9 +164,7 @@
{
try
{
- Console.WriteLine("EventSocket.Write: Trying to connect eventsocket.");
TryConnect();
- Console.WriteLine("EventSocket.Write: Connected.");
}
catch (SocketException)
{
@@ -189,7 +184,7 @@
if (msg.ContentType == "auth/request")
{
AuthCommand cmd = new AuthCommand(_password);
- cmd.OnReply += OnAuthed;
+ cmd.ReplyReceived += OnAuthed;
_commands.Enqueue(cmd);
Write(cmd + "\n\n");
}
@@ -199,7 +194,6 @@
if (_commands.Count > 0)
{
CmdBase cmd = _commands.Dequeue();
- Console.WriteLine("Reply to " + cmd.GetType().Name + ": " + msg.Body);
cmd.HandleReply(cmd.CreateReply(msg.Body));
}
else
@@ -285,14 +279,11 @@
EventSocket client = (EventSocket) state;
try
{
- Console.WriteLine("EventSocket.Timer: Trying to connect eventsocket.");
client.TryConnect();
Console.WriteLine("EventSocket.Timer: Connected.");
}
- catch (SocketException err)
- {
- Console.WriteLine("Eventsocket.TryConnect: " + err.Message);
- }
+ catch (SocketException)
+ {}
}
}
}
\ No newline at end of file
Modified: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Events/EventBase.cs
==============================================================================
--- freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Events/EventBase.cs (original)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Events/EventBase.cs Fri May 2 07:23:27 2008
@@ -19,7 +19,27 @@
public string Name
{
- get { return m_name; }
+ get
+ {
+ lock (this)
+ {
+ if (string.IsNullOrEmpty(m_name))
+ {
+ string name = GetType().Name.Substring(5); //remove (Event)
+ m_name = string.Empty;
+ m_name += char.ToUpper(name[0]);
+ for (int i = 1; i < name.Length; ++i)
+ {
+ if (char.IsUpper(name[i]))
+ m_name += '_';
+ else
+ m_name += char.ToUpper(name[i]);
+ }
+ }
+ }
+
+ return m_name;
+ }
set { m_name = value; }
}
Modified: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Events/EventMessageWaiting.cs
==============================================================================
--- freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Events/EventMessageWaiting.cs (original)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Events/EventMessageWaiting.cs Fri May 2 07:23:27 2008
@@ -8,6 +8,18 @@
private int _totalMessages;
private int _totalUrgentMessages;
+ public EventMessageWaiting()
+ {
+
+ }
+
+ public EventMessageWaiting(string account, int newMessages, int totalMessages)
+ {
+ _account = account;
+ _newMessages = newMessages;
+ _totalMessages = totalMessages;
+ }
+
/// <summary>
/// Messages are for this account
/// </summary>
Modified: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/FreeSwitch.EventSocket.csproj
==============================================================================
--- freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/FreeSwitch.EventSocket.csproj (original)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/FreeSwitch.EventSocket.csproj Fri May 2 07:23:27 2008
@@ -35,10 +35,6 @@
<Reference Include="System" />
<Reference Include="System.Data" />
<Reference Include="System.Xml" />
- <Reference Include="Tiny.Net, Version=1.0.0.1, Culture=neutral, PublicKeyToken=15480ee9e0247fcb, processorArchitecture=MSIL">
- <SpecificVersion>False</SpecificVersion>
- <HintPath>..\..\..\dlls\Debug\Tiny.Net.dll</HintPath>
- </Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="ChannelEvents\EventChannelApplication.cs" />
@@ -65,12 +61,16 @@
<Compile Include="Commands\ParkCmd.cs" />
<Compile Include="Commands\Playback.cs" />
<Compile Include="Commands\RecordCmd.cs" />
+ <Compile Include="Commands\SendEventCmd.cs" />
<Compile Include="Commands\SendMsg.cs" />
<Compile Include="Commands\SetVariable.cs" />
<Compile Include="Commands\SleepCmd.cs" />
<Compile Include="EventManager.cs" />
<Compile Include="ChannelEvents\EventDtmfStatus.cs" />
+ <Compile Include="Ivr\DtmfEventArgs.cs" />
<Compile Include="Ivr\IvrInterface.cs" />
+ <Compile Include="Ivr\IvrQueue.cs" />
+ <Compile Include="Ivr\PrivateWaitDtmf.cs" />
<Compile Include="PlainEventMsg.cs" />
<Compile Include="EventParser.cs" />
<Compile Include="Events.cs" />
@@ -118,6 +118,7 @@
</Target>
-->
<PropertyGroup>
- <PostBuildEvent>copy $(TargetPath) $(SolutionDir)..\..\dlls\$(ConfigurationName)</PostBuildEvent>
+ <PostBuildEvent>
+ </PostBuildEvent>
</PropertyGroup>
</Project>
\ No newline at end of file
Added: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Ivr/DtmfEventArgs.cs
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Ivr/DtmfEventArgs.cs Fri May 2 07:23:27 2008
@@ -0,0 +1,44 @@
+using System;
+
+namespace FreeSwitch.EventSocket.Ivr
+{
+
+ public class DtmfEventArgs : EventArgs
+ {
+ private string _dtmf;
+ private string _dtmfCopy;
+
+ public DtmfEventArgs(string dtmf)
+ {
+ _dtmf = dtmf;
+ _dtmfCopy = (string)_dtmf.Clone();
+ }
+
+ /// <summary>
+ /// You cannot remove digits from the buffer (since it's a copy of the real buffer).
+ /// </summary>
+ /// <seealso cref="RemoveDigits"/>
+ public string Dtmf
+ {
+ get { return _dtmfCopy; }
+ }
+
+ /// <summary>
+ /// Remove digits from the real buffer.
+ /// </summary>
+ /// <param name="count">number of digits to remove.</param>
+ public void RemoveDigits(int count)
+ {
+ lock (_dtmf)
+ {
+ if (count > _dtmf.Length)
+ _dtmf = string.Empty;
+ else
+ _dtmf = _dtmf.Remove(0, count);
+ _dtmfCopy = (string)_dtmf.Clone();
+ }
+ }
+ }
+
+ public delegate void DtmfHandler(object source, DtmfEventArgs args);
+}
Modified: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Ivr/IvrInterface.cs
==============================================================================
--- freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Ivr/IvrInterface.cs (original)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Ivr/IvrInterface.cs Fri May 2 07:23:27 2008
@@ -8,16 +8,19 @@
{
public const string AllDigits = "*#0123456789";
private readonly string _uuid;
- private readonly string _baseSoundPath = "sounds\\";
+ private string _baseSoundPath = "sounds\\";
private string _dtmf = string.Empty;
private EventManager _mgr;
public event DtmfHandler DtmfReceived;
- private readonly int _dtmfWaitCount = 0;
- private ManualResetEvent _dtmfWaitEvent;
+ private int _dtmfWaitCount = 0;
private bool _abortSpeechOnDtmf;
private bool _answered;
private IvrInterfaceHandler _handler = null;
private string _lastAbortDigits = "*";
+ private int _defaultTimeout = 10000;
+ private readonly ManualResetEvent _dtmfTimeout = new ManualResetEvent(false);
+ private IvrQueue _queue;
+
public IvrInterface(EventManager mgr, string uuid)
{
@@ -26,6 +29,7 @@
if (string.IsNullOrEmpty(uuid))
throw new ArgumentNullException("uuid");
+ _queue = new IvrQueue(mgr);
_mgr = mgr;
mgr.EventReceived += OnEvent;
_uuid = uuid;
@@ -54,34 +58,64 @@
set { _abortSpeechOnDtmf = value; }
}
+ /// <summary>
+ /// True if IVR call have been answered.
+ /// </summary>
public bool Answered
{
get { return _answered; }
}
+ /// <summary>
+ /// Number of seconds to wait on DTMF
+ /// </summary>
+ public int DefaultTimeout
+ {
+ get { return _defaultTimeout; }
+ set { _defaultTimeout = value; }
+ }
+
+ /// <summary>
+ /// Relative path under FreeSWITCH to where the sound files resides
+ /// </summary>
+ /// <remarks>default is "sounds\"</remarks>
+ public string BaseSoundPath
+ {
+ get { return _baseSoundPath; }
+ set { _baseSoundPath = value; }
+ }
+
private void OnEvent(EventBase receivedEvent)
{
+ if (!receivedEvent.IsChannelEvent)
+ return;
+
+ ChannelEvent channelEvent = (ChannelEvent) receivedEvent;
+ if (channelEvent.UniqueId != _uuid)
+ return;
+
if (receivedEvent is EventChannelAnswer)
{
_answered = true;
}
-/* else if (receivedEvent is EventDtmfStatus)
- {
- // Let's always dequeue dtmf.
- EventDtmfStatus evt = (EventDtmfStatus) receivedEvent;
- if (evt.UniqueId == _uuid)
- _mgr.Send(new GetDtmfCmd(_uuid, evt.Count));
- }*/
else if (receivedEvent is EventDtmf)
{
EventDtmf evt = (EventDtmf) receivedEvent;
- lock (_dtmf)
- _dtmf += evt.Digit;
- if (_dtmfWaitCount >= _dtmf.Length)
- _dtmfWaitEvent.Set();
+ Console.WriteLine("DTMF Event: " + evt.Digit);
+ if (_queue.GotDtmf(evt.Digit))
+ {
+ lock (_dtmf)
+ _dtmf += evt.Digit;
+
+ if (_dtmfWaitCount != 0 && _dtmf.Length >= _dtmfWaitCount)
+ {
+ Console.WriteLine("Got all DTMF: " + _dtmfWaitCount + "/" + _dtmf.Length);
+ _dtmfTimeout.Set();
+ }
- if (DtmfReceived != null)
- DtmfReceived(this, new DtmfEventArgs(_dtmf));
+ if (DtmfReceived != null)
+ DtmfReceived(this, new DtmfEventArgs(_dtmf));
+ }
}
else if (receivedEvent is EventChannelDestroy || receivedEvent is EventChannelHangup)
{
@@ -91,6 +125,16 @@
_mgr = null;
}
}
+ else if (receivedEvent is EventChannelExecute)
+ {
+ EventChannelExecute exec = (EventChannelExecute)receivedEvent;
+ _queue.Execute(exec);
+ }
+ else if (receivedEvent is EventChannelExecuteComplete)
+ {
+ EventChannelExecuteComplete exec = (EventChannelExecuteComplete)receivedEvent;
+ _queue.ExecuteComplete(exec);
+ }
}
/// <summary>
@@ -104,15 +148,26 @@
{
if (_mgr == null)
return string.Empty;
- if (_dtmfWaitEvent != null)
- throw new InvalidOperationException("Already waiting on an event.");
+
+ lock (_dtmf)
+ {
+ if (_dtmfWaitCount > 0)
+ throw new InvalidOperationException("Already waiting on an event.");
+ _dtmfWaitCount = 1;
+ _dtmfTimeout.Reset();
+ }
if (_dtmf.Length < count)
{
- _dtmfWaitEvent = new ManualResetEvent(false);
- if (!_dtmfWaitEvent.WaitOne(timeout * 1000, true))
+ if (_queue.CommandRunning)
+ _queue.Add(new PrivateWaitDtmf(OnDtmfTimeout, timeout));
+
+ _dtmfWaitCount = count - _dtmf.Length;
+ if (!_dtmfTimeout.WaitOne(timeout, true))
{
+ Console.WriteLine("Didn't get any DTMF: " + _dtmf);
_dtmf = string.Empty;
+ _dtmfWaitCount = 0;
return string.Empty;
}
}
@@ -122,14 +177,54 @@
if (_dtmf.Length >= count)
{
string dtmf = _dtmf.Substring(0, count);
- _dtmf = _dtmf.Remove(count);
+ if (_dtmf.Length == count)
+ _dtmf = string.Empty;
+ else
+ _dtmf = _dtmf.Remove(count);
+ _dtmfWaitCount = 0;
return dtmf;
}
}
+ _dtmfWaitCount = 0;
return string.Empty;
}
+ private void OnDtmfTimeout(PrivateWaitDtmf dtmf)
+ {
+ dtmf.Dispose();
+ _dtmfTimeout.Set();
+ }
+
+ /// <summary>
+ /// Wait on dtmf.
+ /// </summary>
+ /// <param name="count">Number of digits to get</param>
+ /// <remarks>You can also used the Dtmf event if you want to use asynchrounous programming.</remarks>
+ /// <seealso cref="DtmfReceived"/>
+ /// <seealso cref="DefaultTimeout"/>
+ public string GetDtmf(int count)
+ {
+ return GetDtmf(count, _defaultTimeout);
+ }
+
+ /// <summary>
+ /// Play a sound file
+ /// </summary>
+ /// <param name="path">Path to sound file.</param>
+ /// <seealso cref="AllDigits"/>
+ /// <remarks>Prepends <see cref="BaseSoundPath"/> to path.</remarks>
+ public void Play(string path)
+ {
+ Play(path, AllDigits);
+ }
+
+ /// <summary>
+ /// Play a sound file
+ /// </summary>
+ /// <param name="path">Path to sound file.</param>
+ /// <param name="digitsToAbortOn">DTMF digits that can abort speech.</param>
+ /// <remarks>Prepends <see cref="BaseSoundPath"/> to path.</remarks>
public void Play(string path, string digitsToAbortOn)
{
if (_mgr == null)
@@ -144,69 +239,61 @@
_lastAbortDigits = digitsToAbortOn;
}
- _mgr.Send(new PlaybackCmd(_uuid, _baseSoundPath + path));
+ _queue.Add(new PlaybackCmd(_uuid, GetSoundPath(path, false), digitsToAbortOn));
}
- public void Record(string path, bool stop, int limit)
- {
- if (_mgr == null)
- return;
- _mgr.Send(new RecordCmd(_uuid, _baseSoundPath + path, stop, limit));
- }
- public void Record(string path, int limit)
- {
- if (_mgr == null)
- return;
- _mgr.Send(new RecordCmd(_uuid, _baseSoundPath + path, limit));
- }
- public void Sleep(int ms)
+ /// <summary>
+ /// Record a sound file
+ /// </summary>
+ /// <param name="path">Where to store the sound</param>
+ /// <param name="limit">Maximum number of seconds that can be recorded.</param>
+ /// <param name="stop">stop an ongoing recording</param>
+ public void Record(string path, int limit, bool stop)
{
if (_mgr == null)
return;
- _mgr.Send(new SleepCmd(_uuid, ms));
- }
- }
- public class DtmfEventArgs : EventArgs
- {
- private string _dtmf;
- private string _dtmfCopy;
+ _queue.Add(new RecordCmd(_uuid, GetSoundPath(path, true), stop, limit));
+ }
- public DtmfEventArgs(string dtmf)
+ /// <summary>
+ /// Record a sound file
+ /// </summary>
+ /// <param name="path">Where to store the sound</param>
+ /// <param name="limit">Maximum number of seconds that can be recorded.</param>
+ public void Record(string path, int limit)
{
- _dtmf = dtmf;
- _dtmfCopy = (string) _dtmf.Clone();
+ Record(path, limit, false);
}
/// <summary>
- /// You cannot remove digits from the buffer (since it's a copy of the real buffer).
+ /// This method can be used to build paths for different languages and such.
/// </summary>
- /// <seealso cref="RemoveDigits"/>
- public string Dtmf
+ /// <param name="fileName">soundfile</param>
+ /// <param name="isRecording">path is to a file being recorded</param>
+ /// <returns>Path to sound file</returns>
+ protected virtual string GetSoundPath(string fileName, bool isRecording)
{
- get { return _dtmfCopy; }
+ return BaseSoundPath + fileName;
}
/// <summary>
- /// Remove digits from the real buffer.
+ /// Tell script to sleep for a while.
/// </summary>
- /// <param name="count">number of digits to remove.</param>
- public void RemoveDigits(int count)
+ /// <param name="ms">number of milliseconds</param>
+ public void Sleep(int ms)
{
- lock (_dtmf)
- {
- if (count > _dtmf.Length)
- _dtmf = string.Empty;
- else
- _dtmf = _dtmf.Remove(0, count);
- _dtmfCopy = (string)_dtmf.Clone();
- }
+ if (_mgr == null)
+ return;
+
+ _queue.Add(new SleepCmd(_uuid, ms));
}
+
+
}
- public delegate void DtmfHandler(object source, DtmfEventArgs args);
public delegate void IvrInterfaceHandler(IvrInterface app);
-}
+}
\ No newline at end of file
Added: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Ivr/IvrQueue.cs
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Ivr/IvrQueue.cs Fri May 2 07:23:27 2008
@@ -0,0 +1,159 @@
+using System;
+using System.Collections.Generic;
+using FreeSwitch.EventSocket.Commands;
+
+namespace FreeSwitch.EventSocket.Ivr
+{
+ internal class IvrQueue
+ {
+ private readonly Queue<CmdBase> _items = new Queue<CmdBase>();
+ private readonly EventManager _mgr;
+ private CmdBase _currentCommand;
+
+ public IvrQueue(EventManager mgr)
+ {
+ if (mgr == null)
+ throw new ArgumentNullException("mgr");
+
+ _mgr = mgr;
+ }
+
+ public bool CommandRunning
+ {
+ get { return _currentCommand != null; }
+ }
+
+ public void Add(CmdBase cmd)
+ {
+ lock (_items)
+ _items.Enqueue(cmd);
+ }
+
+ public void Execute(EventChannelExecute evt)
+ {
+ }
+
+ public void ExecuteComplete(EventChannelExecuteComplete evt)
+ {
+ Console.WriteLine(evt.AppName + "(" + evt.Arguments + ") is done.");
+
+ if (_currentCommand != null && evt.AppName != _currentCommand.Command)
+ {
+ Console.WriteLine("Executed something that is not ours: " + _currentCommand.Command);
+ return;
+ }
+
+ // run next command
+ lock (_items)
+ {
+ _currentCommand = null;
+
+ if (_items.Count > 0)
+ {
+ // check if next cmd is waiting on dtmf, then trigger it to start.
+ if (_items.Peek().Command == "privdtmf")
+ ((PrivateWaitDtmf) _items.Peek()).Trigger();
+
+ SendNextCommand();
+ }
+ }
+ }
+
+ /// <summary>
+ /// a DTMF was pressed. Validate it towards the queue
+ /// </summary>
+ /// <param name="digit"></param>
+ /// <returns>true if it can be processed, false if not.</returns>
+ public bool GotDtmf(char digit)
+ {
+ bool isValid = true;
+
+ lock (_items)
+ {
+ // dequeue all play commands if correct digit is pressed.
+ while (_items.Count > 0)
+ {
+ if (_items.Peek().GetType() == typeof (SetVariable))
+ {
+ Console.WriteLine("Is SetVariable");
+ SetVariable var = (SetVariable) _items.Peek();
+ string digits = string.Empty;
+ digits += digit;
+ if (var.Name == "playback_terminators" )
+ {
+ if (var.Value.Contains(digits))
+ {
+ _items.Dequeue();
+ if (_items.Count > 0 && _items.Peek().GetType() == typeof(PlaybackCmd))
+ _items.Dequeue();
+ }
+ else
+ isValid = false; //digit was not one of the terminators. skip it.
+ }
+ }
+ else if (_items.Peek().GetType() == typeof(PlaybackCmd))
+ {
+ Console.WriteLine("Is PlaybackCmd");
+ PlaybackCmd cmd = (PlaybackCmd)_items.Peek();
+ string digits = string.Empty;
+ digits += digit;
+ if (cmd.DtmfAbort.Contains(digits))
+ _items.Dequeue();
+ else
+ {
+ isValid = false; //digit was not one of the terminators, skip it.
+ break;
+ }
+ }
+ else
+ break;
+ }
+
+ // and dequeue the dtmf command.
+ if (_items.Count > 0 && _items.Peek().GetType() == typeof(PrivateWaitDtmf))
+ ((PrivateWaitDtmf) _items.Dequeue()).Dispose();
+ }
+
+ return isValid;
+ }
+
+ private static void OnCommandReply(CmdBase command, CommandReply reply)
+ {
+ command.ReplyReceived -= OnCommandReply;
+ if (!reply.Success)
+ {
+ Console.WriteLine("Command failed: " + reply.ErrorMessage);
+ }
+ }
+
+ public CmdBase Peek()
+ {
+ lock (_items)
+ {
+ return _items.Peek();
+ }
+ }
+
+ public CmdBase Pop()
+ {
+ lock (_items)
+ {
+ return _items.Dequeue();
+ }
+ }
+
+ private void SendNextCommand()
+ {
+ lock (_items)
+ {
+ if (_currentCommand != null)
+ throw new InvalidOperationException("A command is already running.");
+
+ _currentCommand = _items.Dequeue();
+ }
+
+ _currentCommand.ReplyReceived += OnCommandReply;
+ _mgr.Send(_currentCommand);
+ }
+ }
+}
\ No newline at end of file
Added: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Ivr/PrivateWaitDtmf.cs
==============================================================================
--- (empty file)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/FreeSwitchEventSocket/Ivr/PrivateWaitDtmf.cs Fri May 2 07:23:27 2008
@@ -0,0 +1,70 @@
+using System;
+using System.Threading;
+using FreeSwitch.EventSocket.Commands;
+
+namespace FreeSwitch.EventSocket.Ivr
+{
+ internal delegate void DtmfTimeoutHandler(PrivateWaitDtmf dtmf);
+
+ internal class PrivateWaitDtmf : CmdBase, IDisposable
+ {
+ private Timer _timer;
+ private readonly int _waitTime;
+ private readonly DtmfTimeoutHandler _handler;
+
+ /// <summary>
+ /// DTMF timeouts should be counted AFTER a phrase has been said.
+ /// this small command allows us to start the timer when so.
+ /// </summary>
+ /// <param name="handler">Method that will be signalled when the DTMF command goes on timeout.</param>
+ /// <param name="time">Number of seconds to wait on input.</param>
+ public PrivateWaitDtmf(DtmfTimeoutHandler handler, int time)
+ {
+ if (handler == null)
+ throw new ArgumentNullException("handler");
+ if (time == 0)
+ throw new ArgumentException("time cannot be 0.", "time");
+ if (time < 100)
+ time *= 1000;
+ _waitTime = time;
+ _handler = handler;
+ }
+
+ public override string Command
+ {
+ get { return "privdtmf"; }
+ }
+
+ public override string Arguments
+ {
+ get { return _waitTime.ToString(); }
+ }
+
+ public void Trigger()
+ {
+ _timer = new Timer(OnTimeout, null, _waitTime, Timeout.Infinite);
+ }
+
+ private void OnTimeout(object state)
+ {
+ _timer.Dispose();
+ _timer = null;
+ _handler(this);
+ }
+
+ #region IDisposable Members
+
+ ///<summary>
+ ///Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
+ ///</summary>
+ ///<filterpriority>2</filterpriority>
+ public void Dispose()
+ {
+ if (_timer != null)
+ _timer.Dispose();
+ _timer = null;
+ }
+
+ #endregion
+ }
+}
Modified: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/IvrSocket/Program.cs
==============================================================================
--- freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/IvrSocket/Program.cs (original)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/IvrSocket/Program.cs Fri May 2 07:23:27 2008
@@ -1,5 +1,7 @@
using System;
+using System.Threading;
using FreeSwitch.EventSocket;
+using FreeSwitch.EventSocket.Commands;
namespace IvrSocket
{
@@ -12,17 +14,13 @@
mgr.EventReceived += IvrManager;
mgr.Subscribe(Event.All);
mgr.Start("localhost");
+ Thread.Sleep(1000);
+ //mgr.Send(new SendEventCmd(new EventMessageWaiting("jonas at 192.168.0.58", 1, 2)));
Console.ReadLine();
}
private static void IvrManager(EventBase receivedEvent)
{
- Console.WriteLine(receivedEvent.Name);
- if (receivedEvent is ChannelEvent)
- {
- ChannelEvent evt = (ChannelEvent) receivedEvent;
- Console.WriteLine(evt.Name + ": " + evt.UniqueId);
- }
if (receivedEvent is EventChannelAnswer)
{
EventChannelAnswer answer = (EventChannelAnswer)receivedEvent;
Modified: freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/IvrSocket/Voicemail.cs
==============================================================================
--- freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/IvrSocket/Voicemail.cs (original)
+++ freeswitch/trunk/scripts/contrib/verifier/EventSocket/trunk/IvrSocket/Voicemail.cs Fri May 2 07:23:27 2008
@@ -21,6 +21,10 @@
private void OnIvr(IvrInterface app)
{
_ivr.Play("sv\\system\\record_after_beep.wav", IvrInterface.AllDigits);
+ _ivr.Play("sv\\system\\record_after_beep.wav", IvrInterface.AllDigits);
+ _ivr.Play("sv\\system\\record_after_beep.wav", "2");
+ string dtmf = _ivr.GetDtmf(4);
+ Console.WriteLine("Got DTMF: " + dtmf);
//_ivr.Sleep(5000);
//_ivr.Record("voicemails\\" + Guid.NewGuid() + ".wav", 60);
}
More information about the Freeswitch-svn
mailing list