using System; using System.Text; using System.Collections.Generic; namespace AsterNET.Manager.Event { /// /// Abstract base class for all Events that can be received from the Asterisk server.
/// Events contain data pertaining to an event generated from within the Asterisk /// core or an extension module.
/// There is one conrete subclass of ManagerEvent per each supported Asterisk /// Event. ///
public abstract class ManagerEvent : EventArgs, IParseSupport { private DateTime dateReceived; private string privilege; private string server; private double timestamp; private string uniqueId; private string channel; private ManagerConnection src; protected Dictionary attributes; #region Constructors public ManagerEvent() { this.dateReceived = DateTime.Now; } public ManagerEvent(ManagerConnection source) : this() { this.src = source as ManagerConnection; } #endregion #region Attributes /// /// Store all unknown (without setter) keys from manager event.
/// Use in default Parse method . ///
public Dictionary Attributes { get { return attributes; } } #endregion #region Server /// /// Specify a server to which to send your commands (x.x.x.x or hostname).
/// This should match the server name specified in your config file's "host" entry. /// If you do not specify a server, the proxy will pick the first one it finds -- fine in single-server configurations. ///
public string Server { get { return server; } set { server = value; } } #endregion #region Timestamp /// /// Returns the timestamp for this event.
/// The timestamp property is available in Asterisk since 1.4 /// if enabled in manager.conf by setting timestampevents = yes. /// In contains the time the event was generated in seconds since the epoch. ///
public double Timestamp { get { return this.timestamp; } set { this.timestamp = value; } } #endregion #region DateReceived /// /// Get/Set the point in time this event was received from the Asterisk server.
/// Pseudo events that are not directly received from the asterisk server /// (for example ConnectEvent and DisconnectEvent) may return null. ///
public DateTime DateReceived { get { return this.dateReceived; } set { this.dateReceived = value; } } #endregion #region Privilege /// /// Get/Set the AMI authorization class of this event.
/// This is one or more of system, call, log, verbose, command, agent or user. /// Multiple privileges are separated by comma.
/// Note: This property is not available from Asterisk 1.0 servers. ///
public string Privilege { get { return privilege; } set { this.privilege = value; } } #endregion #region Source /// /// Event source. /// public ManagerConnection Source { get { return this.src; } } #endregion #region UniqueId /// /// Get/Set the unique id of the channel. /// public string UniqueId { get { return uniqueId; } set { this.uniqueId = value; } } #endregion #region Channel /// /// Get/Set the name of the channel. /// public string Channel { get { return channel; } set { this.channel = value; } } #endregion #region Parse(string key, string value) /// /// Unknown properties parser /// /// key name /// key value /// true - value parsed, false - can't parse value public virtual bool Parse(string key, string value) { if (attributes == null) attributes = new Dictionary(); if (attributes.ContainsKey(key)) // Key already presents, add with delimiter attributes[key] += string.Concat(Common.LINE_SEPARATOR, value); else attributes.Add(key, value); return true; } #endregion #region ParseSpecial(Dictionary attributes) /// /// Unknown properties parser /// /// dictionary /// updated dictionary public virtual Dictionary ParseSpecial(Dictionary attributes) { return attributes; } #endregion #region ToString() public override string ToString() { return Helper.ToString(this); } #endregion } }