Ejemplo n.º 1
0
 private void OnMessageReceived(Message message)
 {
     if (State == ConnectionState.Connected)
     {
         //只有在连接状态,才重置超时。如果对方在我这里同意连接之前不停的发其它消息,忽略。
         if (message is ConversationMessage)
         {
             timeoutTimer.ReStart();
             ConversationMessageReceived?.Invoke((ConversationMessage)message, this);
         }
         else
         {
             if (message is DisconnectMessage)
             {
                 State = ConnectionState.Disconnected;
             }
         }
     }
     else
     {
         if (message is ConnectMessage)
         {
             timeoutTimer.ReStart();
             ConnectMessage connetMsg = (ConnectMessage)message;
             Peer = connetMsg.Device;
             //TODO 这个地方应该直接打到最上层。甚至高于AppModel
             ConnectMessageReceived?.Invoke(this);
         }
         else if (message is RejectMessage)
         {
             if (channel.IsInitiative)
             {
                 //TODO Trigger connectio rejected event.
                 State = ConnectionState.Rejected;
             }
         }
         else if (message is AcceptMessage)
         {
             if (channel.IsInitiative)//不能我是被连接的一方,对方还发来一个Accept消息。
             {
                 //TODO Trigger connection agreed event.
                 State = ConnectionState.Connected;
                 timeoutTimer.ReStart();
             }
         }
         else if (message is CancelMessage)
         {
             //TODO ??
         }
     }
 }
        public void EventDataHandler(object sender, EventDataArg <string> e)
        {
            Logger.Info($"Invoked EventDataHandler for {e.HostInfo.Host} via {e.HostInfo.Protocol}, message {e.Data}");
            IMessage message = Deserializing.GetMessage(e.Data, out MessageType type);

            Logger.Debug($"File {message} deserialized to {type} for {e.HostInfo.Host} via {e.HostInfo.Protocol}, message {e.Data}");
            if (message == default(IMessage))
            {
                Logger.Error("Desirializing error");
                return;
            }
            switch (type)
            {
            case MessageType.Command:
            {
                CommandMessageReceived?.Invoke(e.HostInfo, new EventCommandMessageArgs(message as CommandMessage));
                break;
            }

            case MessageType.Connect:
            {
                ConnectMessageReceived?.Invoke(e.HostInfo, new EventMessageConnectArgs(message as ConnectMessage));
                break;
            }

            case MessageType.Request:
            {
                RequestReceived?.Invoke(e.HostInfo, new EventRequestArgs(message as Request));
                break;
            }

            case MessageType.Telemetry:
            {
                TelemetryReceived?.Invoke(e.HostInfo, new EventTelemetryArgs(message as Telemetry));
                break;
            }

            case MessageType.Call:
            {
                CallReceived?.Invoke(e.HostInfo, new EventCallArgs(message as Call));
                break;
            }

            case MessageType.Order:
            {
                OrderReceived?.Invoke(e.HostInfo, new EventOrderArgs(message as Order));
                break;
            }

            //TODO ВСЕХ НЕВЕРНЫХ СЖЕЧЬ!.. Всмысле, в error
            case MessageType.Err:
            {
                ErrorMessageReceived?.Invoke(e.HostInfo, new EventErrArgs(message as ErrorMessage));
                break;
            }

            default:
                Logger.Error("Desirializing error unknow MessageType");
                return;
            }
        }
Ejemplo n.º 3
0
 public void ConnectMessageReceivedInvoke(RemoteHostInfo hostInfo, EventMessageConnectArgs args) => ConnectMessageReceived?.Invoke(hostInfo, args);
Ejemplo n.º 4
0
        private async void EventReceivedCallback(object sender, EventReceivedEventArgs e)
        {
            try
            {
                Command command;
                object  param;
                switch (e.Event.MessageType)
                {
                case MessageType.UserControlMessage:
                    UserControlMessage userControlMessage = (UserControlMessage)e.Event;
                    if (userControlMessage.EventType == UserControlMessageType.PingRequest)
                    {
                        WriteProtocolControlMessage(new UserControlMessage(UserControlMessageType.PingResponse, userControlMessage.Values));
                        break;
                    }
                    break;

                case MessageType.CommandAmf3:
                case MessageType.DataAmf0:
                case MessageType.CommandAmf0:
                    command = (Command)e.Event;
                    Method methodCall = command.MethodCall;
                    param = methodCall.Parameters.Length == 1 ? methodCall.Parameters[0] : (object)methodCall.Parameters;
                    if (methodCall.Name == "_result" || methodCall.Name == "_error" || methodCall.Name == "receive")
                    {
                        throw new InvalidDataException();
                    }
                    if (!(methodCall.Name == "onstatus"))
                    {
                        if (methodCall.Name == "connect")
                        {
                            CommandMessage parameter = (CommandMessage)methodCall.Parameters[3];
                            object         obj1;
                            parameter.Headers.TryGetValue("DSEndpoint", out obj1);
                            object obj2;
                            parameter.Headers.TryGetValue("DSId", out obj2);
                            ConnectMessageEventArgs args = new ConnectMessageEventArgs((string)methodCall.Parameters[1], (string)methodCall.Parameters[2], parameter, (string)obj1, (string)obj2, command.InvokeId, (AsObject)command.ConnectionParameters);

                            ConnectMessageReceived?.Invoke(this, args);
                            if (parameter.Operation == CommandOperation.ClientPing)
                            {
                                AsObject asObject1 = await InvokeConnectResultAsync(command.InvokeId, (AsObject)args.Result.Body);
                            }
                            else
                            {
                                AsObject asObject2 = await InvokeReconnectResultInvokeAsync(command.InvokeId, (AsObject)args.Result.Body);
                            }
                            args = null;
                            break;
                        }
                        if (param is RemotingMessage)
                        {
                            RemotingMessage message = param as RemotingMessage;
                            object          obj1;
                            message.Headers.TryGetValue("DSEndpoint", out obj1);
                            object obj2;
                            message.Headers.TryGetValue("DSId", out obj2);
                            string endpoint = (string)obj1;
                            string clientId = (string)obj2;
                            int    invokeId = command.InvokeId;
                            RemotingMessageReceivedEventArgs receivedEventArgs = new RemotingMessageReceivedEventArgs(message, endpoint, clientId, invokeId);

                            RemotingMessageReceived?.Invoke(this, receivedEventArgs);
                            if (receivedEventArgs.Error == null)
                            {
                                InvokeResult(command.InvokeId, receivedEventArgs.Result);
                                break;
                            }
                            InvokeError(command.InvokeId, receivedEventArgs.Error);
                            break;
                        }
                        if (param is CommandMessage)
                        {
                            CommandMessage message = param as CommandMessage;
                            object         obj1;
                            message.Headers.TryGetValue("DSEndpoint", out obj1);
                            object obj2;
                            message.Headers.TryGetValue("DSId", out obj2);
                            string endpoint = obj1 as string;
                            string dsId     = obj2 as string;
                            int    invokeId = command.InvokeId;
                            CommandMessageReceivedEventArgs receivedEventArgs = new CommandMessageReceivedEventArgs(message, endpoint, dsId, invokeId);

                            CommandMessageReceived?.Invoke(this, receivedEventArgs);
                            InvokeResult(command.InvokeId, receivedEventArgs.Result);
                            break;
                        }
                        break;
                    }
                    break;
                }
                command = null;
                param   = null;
            }
            catch (ClientDisconnectedException ex)
            {
                Tools.Log(ex.StackTrace);
            }
        }