Skip to content

Commit

Permalink
PreAnswer
Browse files Browse the repository at this point in the history
  • Loading branch information
Anber committed Feb 10, 2015
1 parent 5513d5a commit 688921a
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 5 deletions.
19 changes: 16 additions & 3 deletions src/NEventSocket/Channels/BasicChannel.cs
Expand Up @@ -140,6 +140,14 @@ public bool IsAnswered
}
}

public bool IsPreAnswered
{
get
{
return Answered.HasValue && Answered.Value == AnswerState.Early;
}
}

public IObservable<string> FeatureCodes(string prefix = "#")
{
return eventSocket
Expand All @@ -162,7 +170,11 @@ public Task<CommandReply> SendCommand(string command)

public Task Hangup(HangupCause hangupCause = FreeSwitch.HangupCause.NormalClearing)
{
return RunIfAnswered(() => eventSocket.SendApi("uuid_kill {0} {1}".Fmt(UUID, hangupCause.ToString().ToUpperWithUnderscores())));
return
RunIfAnswered(
() =>
eventSocket.SendApi("uuid_kill {0} {1}".Fmt(UUID, hangupCause.ToString().ToUpperWithUnderscores())),
true);
}

public async Task PlayFile(string file, Leg leg = Leg.ALeg, bool mix = false, string terminator = null)
Expand Down Expand Up @@ -331,9 +343,10 @@ protected virtual void Dispose(bool disposing)
/// Runs the given async function if the Channel is still connected, otherwise a completed Task.
/// </summary>
/// <param name="toRun">An Async function.</param>
protected Task RunIfAnswered(Func<Task> toRun)
/// <param name="orPreAnswered">Function also run in pre answer state</param>
protected Task RunIfAnswered(Func<Task> toRun, bool orPreAnswered = false)
{
if (!IsAnswered)
if (!IsAnswered && (!orPreAnswered || !IsPreAnswered))
{
return TaskHelper.Completed;
}
Expand Down
9 changes: 7 additions & 2 deletions src/NEventSocket/Channels/Channel.cs
Expand Up @@ -99,7 +99,7 @@ public async Task BridgeTo(Channel other)
throw new InvalidOperationException("Channel {0} is already bridged to {1}".Fmt(UUID, Bridge.Channel.UUID));
}

if (Answered != AnswerState.Answered && other.Answered != AnswerState.Answered)
if (!(IsAnswered || IsPreAnswered) && !(other.IsAnswered || other.IsPreAnswered))
{
throw new InvalidOperationException("At least one channel must be Answered to bridge them");
}
Expand All @@ -118,7 +118,7 @@ public async Task BridgeTo(Channel other)

public async Task BridgeTo(string destination, BridgeOptions options, Action<EventMessage> onProgress = null)
{
if (!IsAnswered)
if (!IsAnswered && !IsPreAnswered)
{
return;
}
Expand Down Expand Up @@ -193,6 +193,11 @@ public Task Answer()
return eventSocket.ExecuteApplication(UUID, "answer");
}

public Task PreAnswer()
{
return eventSocket.ExecuteApplication(UUID, "pre_answer");
}

public Task Sleep(int milliseconds)
{
return eventSocket.ExecuteApplication(UUID, "sleep", milliseconds.ToString());
Expand Down
5 changes: 5 additions & 0 deletions src/NEventSocket/FreeSwitch/AnswerState.cs
Expand Up @@ -11,6 +11,11 @@ namespace NEventSocket.FreeSwitch
/// </summary>
public enum AnswerState
{
/// <summary>
/// The Channel is pre answered
/// </summary>
Early,

/// <summary>
/// The Channel is Answered
/// </summary>
Expand Down

0 comments on commit 688921a

Please sign in to comment.