예제 #1
0
 public Task OnDisconnectNotice(EslMessage eslMessage,
                                EndPoint channelEndPoint)
 {
     _logger.Debug("received disconnection message : {0}", eslMessage);
     _logger.Warn("channel {0} disconnected", channelEndPoint);
     return(Task.CompletedTask);
 }
        /// <summary>
        ///     Valiates every response received seeing that we can send commands to FreeSwitch asynchronously and wait for
        ///     responses.
        ///     However some responses may be for another command previously sent. In that regard, every command has a sequence
        ///     number
        ///     attached to it that helps differentiate between them and easily map their responses.
        /// </summary>
        /// <param name="command">The original command send</param>
        /// <param name="response">The actual response received</param>
        /// <returns>EslMessage</returns>
        protected async Task <EslMessage> ValidateResponse(BaseCommand command, EslMessage response)
        {
            if (response == null)
            {
                return(null);
            }
            if (_requestsQueue.Count <= 0)
            {
                return(null);
            }
            CommandAsyncEvent event2;

            if (!_requestsQueue.TryDequeue(out event2))
            {
                return(null);
            }
            if (event2 == null)
            {
                return(null);
            }
            if (!event2.Command.Equals(command))
            {
                return(null);
            }
            event2.Complete(response);
            return(await event2.Task);
        }
예제 #3
0
 public async Task OnDisconnectNotice(EslMessage eslMessage,
                                      EndPoint channelEndPoint)
 {
     _logger.Debug("received disconnection message : {0}", eslMessage);
     _logger.Warn("channel {0} disconnected", channelEndPoint);
     await CleanUpAsync();
 }
예제 #4
0
 private void SetActualMessage()
 {
     if (_actualMessage == null)
     {
         _actualMessage = new EslMessage();
     }
 }
예제 #5
0
 private void CompleteDecoding(List <object> output)
 {
     // complete the decoding. Get ready for the next message
     Checkpoint(DecoderState.ReadHeader);
     // send message upstream
     output.Add(_actualMessage);
     _actualMessage = null;
 }
예제 #6
0
        public CommandReply(string command,
                            EslMessage response)
        {
            Command   = command;
            Response  = response;
            ReplyText = Response != null?Response.HeaderValue(EslHeaders.ReplyText) : string.Empty;

            IsOk = !string.IsNullOrEmpty(ReplyText) && ReplyText.StartsWith(EslHeadersValues.Ok);
        }
예제 #7
0
 public void OnEventReceived(EslMessage eslMessage)
 {
     try
     {
         var eslEvent  = new EslEvent(eslMessage);
         var eventType = Enumm.Parse <EslEventType>(eslEvent.EventName);
         _eventReceived.OnNext(new EslEventStream(eslEvent,
                                                  eventType));
     }
     catch (Exception exception)
     {
         _logger.Warn($"Encountered an issue on the channel: {exception}.");
         _eventReceived.OnError(exception);
     }
 }
예제 #8
0
 public Dtmf(EslMessage message) : base(message)
 {
 }
예제 #9
0
 public EslEvent(EslMessage response,
                 bool ignoreBody = false)
 {
     _response   = response;
     _ignoreBody = ignoreBody;
 }
예제 #10
0
 public ChannelExecuteComplete(EslMessage message) : base(message)
 {
 }
예제 #11
0
 public ChannelStateEvent(EslMessage message) : base(message)
 {
 }
예제 #12
0
        public void OnEventReceived(EslMessage eslMessage)
        {
            var eslEvent  = new EslEvent(eslMessage);
            var eventName = eslEvent.EventName;
            var eventType = Enumm.Parse <EslEventType>(eventName);

            switch (eventType)
            {
            case EslEventType.BACKGROUND_JOB:
                var backgroundJob = new BackgroundJob(eslMessage);
                eslEvent = backgroundJob;
                break;

            case EslEventType.CALL_UPDATE:
                var callUpdate = new CallUpdate(eslMessage);
                eslEvent = callUpdate;
                break;

            case EslEventType.CHANNEL_BRIDGE:
                var channelBridge = new ChannelBridge(eslMessage);
                eslEvent = channelBridge;
                break;

            case EslEventType.CHANNEL_HANGUP:
            case EslEventType.CHANNEL_HANGUP_COMPLETE:
                var channelHangup = new ChannelHangup(eslMessage);
                eslEvent = channelHangup;
                break;

            case EslEventType.CHANNEL_PROGRESS:
                var channelProgress = new ChannelProgress(eslMessage);
                eslEvent = channelProgress;
                break;

            case EslEventType.CHANNEL_PROGRESS_MEDIA:
                var channelProgressMedia = new ChannelProgressMedia(eslMessage);
                eslEvent = channelProgressMedia;
                break;

            case EslEventType.CHANNEL_EXECUTE:
                var channelExecute = new ChannelExecute(eslMessage);
                eslEvent = channelExecute;
                break;

            case EslEventType.CHANNEL_EXECUTE_COMPLETE:
                var channelExecuteComplete = new ChannelExecuteComplete(eslMessage);
                eslEvent = channelExecuteComplete;
                break;

            case EslEventType.CHANNEL_UNBRIDGE:
                var channelUnbridge = new ChannelUnbridge(eslMessage);
                eslEvent = channelUnbridge;
                break;

            case EslEventType.SESSION_HEARTBEAT:
                var sessionHeartbeat = new SessionHeartbeat(eslMessage);
                eslEvent = sessionHeartbeat;
                break;

            case EslEventType.DTMF:
                var dtmf = new Dtmf(eslMessage);
                eslEvent = dtmf;
                break;

            case EslEventType.RECORD_STOP:
                var recordStop = new RecordStop(eslMessage);
                eslEvent = recordStop;
                break;

            case EslEventType.CUSTOM:
                var custom = new Custom(eslMessage);
                eslEvent = custom;
                break;

            case EslEventType.CHANNEL_STATE:
                var channelState = new ChannelStateEvent(eslMessage);
                eslEvent = channelState;
                break;

            case EslEventType.CHANNEL_ANSWER:
                eslEvent = new EslEvent(eslMessage);
                break;

            case EslEventType.CHANNEL_ORIGINATE:
                eslEvent = new EslEvent(eslMessage);
                break;

            case EslEventType.CHANNEL_PARK:
                var channelPark = new ChannelPark(eslMessage);
                eslEvent = channelPark;
                break;

            case EslEventType.CHANNEL_UNPARK:
                eslEvent = new EslEvent(eslMessage);
                break;

            default:
                OnUnhandledEvents(new EslEvent(eslMessage));
                break;
            }
            HandleEvents(eslEvent,
                         eventType);
        }
예제 #13
0
 public ChannelPark(EslMessage message) : base(message)
 {
 }
예제 #14
0
        public async Task OnEventReceived(EslMessage eslMessage)
        {
            var eslEvent     = new EslEvent(eslMessage);
            var eventType    = Enumm.Parse <EslEventType>(eslEvent.EventName);
            var eslEventArgs = new EslEventArgs(new EslEvent(eslMessage));
            AsyncEventHandler <EslEventArgs> handler;

            switch (eventType)
            {
            case EslEventType.BACKGROUND_JOB:
                handler = OnBackgroundJob;
                break;

            case EslEventType.CALL_UPDATE:
                handler = OnCallUpdate;
                break;

            case EslEventType.CHANNEL_BRIDGE:
                handler = OnChannelBridge;
                break;

            case EslEventType.CHANNEL_HANGUP:
                handler = OnChannelHangup;
                break;

            case EslEventType.CHANNEL_HANGUP_COMPLETE:
                handler = OnChannelHangupComplete;
                break;

            case EslEventType.CHANNEL_PROGRESS:
                handler = OnChannelProgress;
                break;

            case EslEventType.CHANNEL_PROGRESS_MEDIA:
                handler = OnChannelProgressMedia;
                break;

            case EslEventType.CHANNEL_EXECUTE:
                handler = OnChannelExecute;
                break;

            case EslEventType.CHANNEL_EXECUTE_COMPLETE:
                handler = OnChannelExecuteComplete;
                break;

            case EslEventType.CHANNEL_UNBRIDGE:
                handler = OnChannelUnbridge;
                break;

            case EslEventType.SESSION_HEARTBEAT:
                handler = OnSessionHeartbeat;
                break;

            case EslEventType.DTMF:
                handler = OnDtmf;
                break;

            case EslEventType.RECORD_STOP:
                handler = OnRecordStop;
                break;

            case EslEventType.CUSTOM:
                handler = OnCustom;
                break;

            case EslEventType.CHANNEL_STATE:
                handler = OnChannelState;
                break;

            case EslEventType.CHANNEL_ANSWER:
                handler = OnChannelAnswer;
                break;

            case EslEventType.CHANNEL_ORIGINATE:
                handler = OnChannelOriginate;
                break;

            case EslEventType.CHANNEL_PARK:
                handler = OnChannelPark;
                break;

            case EslEventType.CHANNEL_UNPARK:
                handler = OnChannelUnPark;
                break;

            default:
                _logger.Debug("received unhandled freeSwitch event:");
                _logger.Debug(eslEvent);
                handler = OnReceivedUnHandledEvent;
                break;
            }
            if (handler != null)
            {
                await handler(this, eslEventArgs);
            }
        }
예제 #15
0
 public SessionHeartbeat(EslMessage message) : base(message)
 {
 }
 /// <summary>
 ///     Valiates every response received seeing that we can send commands to FreeSwitch asynchronously and wait for
 ///     responses.
 ///     However some responses may be for another command previously sent. In that regard, every command has a sequence
 ///     number
 ///     attached to it that helps differentiate between them and easily map their responses.
 /// </summary>
 /// <param name="command">The original command send</param>
 /// <param name="response">The actual response received</param>
 /// <returns>EslMessage</returns>
 protected async Task<EslMessage> ValidateResponse(BaseCommand command, EslMessage response) {
     if (response == null) return null;
     if (_requestsQueue.Count <= 0) return null;
     CommandAsyncEvent event2;
     if (!_requestsQueue.TryDequeue(out event2)) return null;
     if (event2 == null) return null;
     if (!event2.Command.Equals(command)) return null;
     event2.Complete(response);
     return await event2.Task;
 }
예제 #17
0
 public ChannelProgress(EslMessage message) : base(message)
 {
 }
예제 #18
0
 public BackgroundJob(EslMessage message) : base(message)
 {
 }
예제 #19
0
 public RecordStop(EslMessage message) : base(message)
 {
 }
예제 #20
0
 public Custom(EslMessage message) : base(message)
 {
 }
예제 #21
0
 public ChannelHangup(EslMessage message) : base(message)
 {
 }
예제 #22
0
 public CallUpdate(EslMessage message) : base(message)
 {
 }
        /// <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);
        }
예제 #24
0
 public ChannelUnbridge(EslMessage message) : base(message)
 {
 }
예제 #25
0
        private async void OnMessageReceived(ITcpChannel channel, object message)
        {
            // Here we validate the channel.
            if (!channel.ChannelId.Equals(_channel.ChannelId))
            {
                return;
            }
            var decodedMessage = message as EslDecodedMessage;

            // Handle decoded message.
            if (decodedMessage?.Headers == null ||
                !decodedMessage.Headers.HasKeys())
            {
                return;
            }

            var    headers = decodedMessage.Headers;
            object response;
            var    contentType = headers["Content-Type"];

            if (string.IsNullOrEmpty(contentType))
            {
                return;
            }
            contentType = contentType.ToLowerInvariant();
            switch (contentType)
            {
            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/disconnect-notice":
                var notice = new DisconnectNotice(decodedMessage.BodyText);
                response = notice;
                break;

            case "text/rude-rejection":
                await _channel.CloseAsync();

                var reject = new RudeRejection(decodedMessage.BodyText);
                response = reject;
                break;

            default:
                // Here we are handling an unknown message
                var msg = new EslMessage(decodedMessage.Headers, decodedMessage.OriginalMessage);
                response = msg;
                break;
            }

            await HandleResponse(response);
        }
예제 #26
0
 public EslEvent(EslMessage response) : this(response, false)
 {
 }