using System;
using System.Collections.Generic;
using System.Linq;
using PepperDash.Essentials.Core;
using PepperDash.Essentials.Devices.Common.Codec;
namespace PepperDash.Essentials.Devices.Common.AudioCodec
{
///
/// Abstract base class for audio codec devices
///
public abstract class AudioCodecBase : EssentialsDevice, IHasDialer, IUsageTracking, IAudioCodecInfo
{
///
/// Event fired when call status changes
///
public event EventHandler CallStatusChange;
///
/// Gets or sets the CodecInfo
///
public AudioCodecInfo CodecInfo { get; protected set; }
#region IUsageTracking Members
///
/// Gets or sets the UsageTracker
///
public UsageTracking UsageTracker { get; set; }
#endregion
///
/// Returns true when any call is not in state Unknown, Disconnecting, Disconnected
///
public bool IsInCall
{
get
{
bool value;
if (ActiveCalls != null)
value = ActiveCalls.Any(c => c.IsActiveCall);
else
value = false;
return value;
}
}
// In most cases only a single call can be active
///
/// Gets or sets the ActiveCalls
///
public List ActiveCalls { get; set; }
///
/// Constructor for AudioCodecBase
///
/// Device key
/// Device name
public AudioCodecBase(string key, string name)
: base(key, name)
{
ActiveCalls = new List();
}
///
/// Helper method to fire CallStatusChange event with old and new status
///
protected void SetNewCallStatusAndFireCallStatusChange(eCodecCallStatus newStatus, CodecActiveCallItem call)
{
call.Status = newStatus;
OnCallStatusChange(call);
}
///
/// Handles call status change events
///
/// The call item that changed status
protected void OnCallStatusChange(CodecActiveCallItem item)
{
var handler = CallStatusChange;
if (handler != null)
handler(this, new CodecCallStatusItemChangeEventArgs(item));
if (UsageTracker != null)
{
if (IsInCall && !UsageTracker.UsageTrackingStarted)
UsageTracker.StartDeviceUsage();
else if (UsageTracker.UsageTrackingStarted && !IsInCall)
UsageTracker.EndDeviceUsage();
}
}
#region IHasDialer Members
///
public abstract void Dial(string number);
///
public abstract void EndCall(CodecActiveCallItem activeCall);
///
public abstract void EndAllCalls();
///
public abstract void AcceptCall(CodecActiveCallItem item);
///
public abstract void RejectCall(CodecActiveCallItem item);
///
public abstract void SendDtmf(string digit);
#endregion
}
}