public EslEventArgs(EslEvent eventReceived) { _eventReceived = eventReceived; }
 /// <summary>
 ///     FreeSwitch Events listener hook
 /// </summary>
 protected void PopEvent(EslEvent @event) {
     if (string.IsNullOrEmpty(@event.EventName)) return;
     switch (@event.EventName.ToUpper()) {
         case "CHANNEL_HANGUP":
             DispatchEvents(EslEventType.CHANNEL_HANGUP, new EslEventArgs(new ChannelHangup(@event.Items)));
             break;
         case "CHANNEL_HANGUP_COMPLETE":
             DispatchEvents(EslEventType.CHANNEL_HANGUP_COMPLETE,
                 new EslEventArgs(new ChannelHangup(@event.Items)));
             break;
         case "CHANNEL_PROGRESS":
             DispatchEvents(EslEventType.CHANNEL_PROGRESS, new EslEventArgs(new ChannelProgress(@event.Items)));
             break;
         case "CHANNEL_PROGRESS_MEDIA":
             DispatchEvents(EslEventType.CHANNEL_PROGRESS_MEDIA,
                 new EslEventArgs(new ChannelProgressMedia(@event.Items)));
             break;
         case "CHANNEL_EXECUTE":
             DispatchEvents(EslEventType.CHANNEL_EXECUTE, new EslEventArgs(new ChannelExecute(@event.Items)));
             break;
         case "CHANNEL_EXECUTE_COMPLETE":
             DispatchEvents(EslEventType.CHANNEL_EXECUTE_COMPLETE,
                 new EslEventArgs(new ChannelExecuteComplete(@event.Items)));
             break;
         case "CHANNEL_BRIDGE":
             DispatchEvents(EslEventType.CHANNEL_BRIDGE, new EslEventArgs(new ChannelBridge(@event.Items)));
             break;
         case "CHANNEL_UNBRIDGE":
             DispatchEvents(EslEventType.CHANNEL_UNBRIDGE, new EslEventArgs(new ChannelUnbridge(@event.Items)));
             break;
         case "BACKGROUND_JOB":
             DispatchEvents(EslEventType.BACKGROUND_JOB, new EslEventArgs(new BackgroundJob(@event.Items)));
             break;
         case "SESSION_HEARTBEAT":
             DispatchEvents(EslEventType.SESSION_HEARTBEAT, new EslEventArgs(new SessionHeartbeat(@event.Items)));
             break;
         case "CHANNEL_STATE":
             DispatchEvents(EslEventType.CHANNEL_STATE, new EslEventArgs(new ChannelStateEvent(@event.Items)));
             break;
         case "DTMF":
             DispatchEvents(EslEventType.DTMF, new EslEventArgs(new Dtmf(@event.Items)));
             break;
         case "RECORD_STOP":
             DispatchEvents(EslEventType.RECORD_STOP, new EslEventArgs(new RecordStop(@event.Items)));
             break;
         case "CALL_UPDATE":
             DispatchEvents(EslEventType.CALL_UPDATE, new EslEventArgs(new CallUpdate(@event.Items)));
             break;
         case "CUSTOM":
             DispatchEvents(EslEventType.CUSTOM, new EslEventArgs(new Custom(@event.Items)));
             break;
         case "CHANNEL_ANSWER":
             DispatchEvents(EslEventType.CHANNEL_ANSWER, new EslEventArgs(@event));
             break;
         case "CHANNEL_ORIGINATE":
             DispatchEvents(EslEventType.CHANNEL_ORIGINATE, new EslEventArgs(@event));
             break;
         case "CHANNEL_PARK":
             DispatchEvents(EslEventType.CHANNEL_PARK, new EslEventArgs(new ChannelPark(@event.Items)));
             break;
         case "CHANNEL_UNPARK":
             DispatchEvents(EslEventType.CHANNEL_UNPARK, new EslEventArgs(@event));
             break;
         default:
             DispatchEvents(EslEventType.UN_HANDLED_EVENT, new EslEventArgs(@event));
             break;
     }
 }
        /// <summary>
        ///     Fired when a decoded message is received by the channel.
        /// </summary>
        /// <param name="channel">Receiving channel</param>
        /// <param name="message">Decoded message received</param>
        private async void OnMessageReceived(ITcpChannel channel, object message) {
            var decodedMessage = message as EslDecodedMessage;
            // Handle decoded message.
            if (decodedMessage?.Headers == null
                || !decodedMessage.Headers.HasKeys())
                return;
            var headers = decodedMessage.Headers;
            object response = null;
            var contentType = headers["Content-Type"];
            if (string.IsNullOrEmpty(contentType)) return;
            contentType = contentType.ToLowerInvariant();
            switch (contentType) {
                case "auth/request":
                    if (OnAuthentication != null) await OnAuthentication(this, EventArgs.Empty).ConfigureAwait(false);
                    break;
                case "command/reply":
                    var reply = new CommandReply(headers, decodedMessage.OriginalMessage);
                    response = reply;
                    break;
                case "api/response":
                    var apiResponse = new ApiResponse(decodedMessage.BodyText);
                    response = apiResponse;
                    break;
                case "text/event-plain":
                    var parameters = decodedMessage.BodyLines.AllKeys.ToDictionary(key => key,
                        key => decodedMessage.BodyLines[key]);
                    var @event = new EslEvent(parameters);
                    response = @event;
                    break;
                case "log/data":
                    var logdata = new LogData(headers, decodedMessage.BodyText);
                    response = logdata;
                    break;
                case "text/rude-rejection":
                    await _channel.CloseAsync();
                    var reject = new RudeRejection(decodedMessage.BodyText);
                    response = reject;
                    break;
                case "text/disconnect-notice":
                    var notice = new DisconnectNotice(decodedMessage.BodyText);
                    response = notice;
                    break;
                default:
                    // Here we are handling an unknown message
                    var msg = new EslMessage(decodedMessage.Headers, decodedMessage.OriginalMessage);
                    response = msg;
                    break;
            }

            await HandleResponse(response).ConfigureAwait(false);
        }
 public SendEventCommand(EslEvent @event) {
     _event = @event;
 }