Пример #1
0
        protected override async Task HandleMessage(ReceivedWapMessage message)
        {
            switch (message.Type)
            {
            case MessageType.Event:
                await HandleEventMessage(message);

                break;

            case MessageType.MethodCall:
                var msg = await HandleMethodCall(message);

                msg.SetSequenceNumber(message.SequenceNumber);
                await SendMesssage(msg);

                break;

            case MessageType.MethodResponse:
                var call = await _methodCalls.Get(message.SequenceNumber);

                if ((call != null) && (call.Messsage.EndPoint == message.EndPoint))
                {
                    call.CompletionSource.SetResult(message);
                }
                break;
            }
        }
Пример #2
0
 private async Task <WapMessage> MethodCallHandler(ClientConnection client, ReceivedWapMessage message)
 {
     if (_serverMethods.HasMethod(message.EndPoint))
     {
         try
         {
             return(await _serverMethods.CallMethod(client, WapEndPoint.Parse(message.EndPoint), message));
         }
         catch (Exception ex)
         {
             return(new WapMessage <MethodResult <Empty> >(MessageType.MethodResponse, message.EndPoint, new MethodResult <Empty>()
             {
                 Success = false,
                 Error = ex.Message
             }));
         }
     }
     else if (_clientMethods.ContainsKey(message.EndPoint))
     {
         return(await _clientMethods[message.EndPoint].Client.CallMethod(message));
     }
     else
     {
         return(new WapMessage <MethodResult <Empty> >(MessageType.MethodResponse, message.EndPoint, new MethodResult <Empty>()
         {
             Success = false,
             Error = "Method not found"
         }));
     }
 }
Пример #3
0
        public async Task <WapMessage> CallMethod(WapEndPoint ep, ReceivedWapMessage msg)
        {
            if (!HasMethod(ep))
            {
                return(null);
            }

            return(await _methods[ep.ToString()](msg));
        }
Пример #4
0
        private Task <WapMessage> MethodCallHandler(ReceivedWapMessage receivedWapMessage)
        {
            if (!_methods.HasMethod(receivedWapMessage.EndPoint))
            {
                var mres = MethodResult <Empty> .FromError("Method not found in this endpoint!");

                var msg = new WapMessage <MethodResult <Empty> >(MessageType.MethodResponse, receivedWapMessage.EndPoint, mres);
                return(Task.FromResult <WapMessage>(msg));
            }

            return(_methods.CallMethod(WapEndPoint.Parse(receivedWapMessage.EndPoint), receivedWapMessage));
        }
Пример #5
0
        private Task EventHandler(ReceivedWapMessage receivedWapMessage)
        {
            var hdlrs =
                _eventHandlers.Where(hdl => hdl.Key.Endpoint.ToString() == receivedWapMessage.EndPoint)
                .Select(hdl => hdl.Value);

            var tsks = new List <Task>();

            foreach (var action in hdlrs)
            {
                tsks.Add(Task.Run(() => action(receivedWapMessage)));
            }

            return(Task.WhenAll(tsks));
        }
Пример #6
0
        private Task EventMessageHandler(ClientConnection client, ReceivedWapMessage msg)
        {
            if (!client.IsAuthenticated || !client.PublishingEvents.Contains(msg.EndPoint))
            {
                return(Task.FromResult(0)); // just return a completed task
            }

            List <Task> sendTasks = new List <Task>();

            foreach (var subscr in _events[msg.EndPoint].Subscribtions)
            {
                sendTasks.Add(subscr.SendEventMessage(msg));
            }

            return(Task.WhenAll(sendTasks));
        }
Пример #7
0
 protected override Task HandleEventMessage(ReceivedWapMessage msg)
 {
     return(_eventHandler?.Invoke(msg));
 }
Пример #8
0
 protected override Task <WapMessage> HandleMethodCall(ReceivedWapMessage msg)
 {
     return(_methodCallHandler?.Invoke(msg));
 }
 protected abstract Task HandleMessage(ReceivedWapMessage msg);
        private async Task <ReceivedWapMessage> ReceiveMessage(CancellationToken ct)
        {
            ReceiveStates state    = ReceiveStates.Idle;
            List <byte>   msgBytes = new List <byte>();

            await _rxSem.WaitAsync(ct);

            while (true)
            {
                if (ct.IsCancellationRequested)
                {
                    _rxSem.Release();
                    ct.ThrowIfCancellationRequested();
                }

                byte[] bs;
                if (_bufBytes.Count > 0)
                {
                    bs = _bufBytes.ToArray();
                    _bufBytes.Clear();
                }
                else
                {
                    byte[] buf   = new byte[ReadBlockSize];
                    int    count = await _stream.ReadAsync(buf, 0, ReadBlockSize, ct).ConfigureAwait(false);

                    if (count == 0)
                    {
                        _rxSem.Release();
                        throw new OperationCanceledException("End of Stream reached during reading");
                    }

                    bs = new byte[count];
                    Array.Copy(buf, bs, count);
                }

                for (int i = 0; i < bs.Length; i++)
                {
                    byte b = bs[i];

                    switch (state)
                    {
                    case ReceiveStates.Idle:
                        if (b == StartByte)
                        {
                            state = ReceiveStates.Reading;
                        }
                        break;

                    case ReceiveStates.Reading:
                        if (b == StartByte)
                        {
                            _rxSem.Release();
                            throw new BrokenFrameException("Unexpected start byte", msgBytes);
                        }
                        else if (b == EndByte)
                        {
                            ReceivedWapMessage msg;
                            try
                            {
                                msg = new ReceivedWapMessage(msgBytes.ToArray());
                            }
                            catch (Exception ex)
                            {
                                _rxSem.Release();
                                throw new BrokenFrameException("Parsing failed", msgBytes, ex);
                            }

                            _bufBytes.AddRange(bs.Skip(i + 1));
                            _rxSem.Release();
                            return(msg);
                        }
                        else if (b == EscapeByte)
                        {
                            state = ReceiveStates.ReadingEscaped;
                        }
                        else
                        {
                            msgBytes.Add(b);
                        }
                        break;

                    case ReceiveStates.ReadingEscaped:
                        if (b < EscapeOffset)
                        {
                            msgBytes.Add(b);
                            _rxSem.Release();
                            throw new BrokenFrameException("Illegal escaped sequence", msgBytes);
                        }
                        else
                        {
                            b -= EscapeOffset;
                            msgBytes.Add(b);
                            state = ReceiveStates.Reading;
                        }
                        break;
                    }
                }
            }
        }
Пример #11
0
 protected abstract Task <WapMessage> HandleMethodCall(ReceivedWapMessage msg);