示例#1
0
        private async Task HandleModuleDataAsync(ModuleInfo module)
        {
            try
            {
                while (module.Node.IsConnected)
                {
                    HPacket packet = await module.Node.ReceivePacketAsync().ConfigureAwait(false);

                    switch (packet.Id)
                    {
                    case 1:
                    {
                        string identifier = packet.ReadUTF8();
                        TaskCompletionSource <HPacket> handledDataSource = null;
                        if (module.DataAwaiters.TryGetValue(identifier, out handledDataSource))
                        {
                            handledDataSource.SetResult(packet);
                        }
                        else
                        {
                            Debugger.Break();
                        }
                        break;
                    }

                    case 2:
                    {
                        byte[] packetData = packet.ReadBytes(packet.ReadInt32(1), 5);
                        if (packet.ReadBoolean())     // IsOutgoing
                        {
                            await App.Master.Connection.SendToServerAsync(packetData).ConfigureAwait(false);
                        }
                        else
                        {
                            await App.Master.Connection.SendToClientAsync(packetData).ConfigureAwait(false);
                        }
                        break;
                    }
                    }
                }
            }
            finally
            {
                Dispatcher.Invoke(() =>
                {
                    module.Dispose();
                    Modules.Remove(module);
                });
            }
        }
示例#2
0
        public virtual void OnPacketIntercept(HPacket packet)
        {
            int    stringifiedInteceptionDataLength = packet.ReadInt32();
            string stringifiedInterceptionData      = Encoding.GetEncoding("latin1").GetString(packet.ReadBytes(stringifiedInteceptionDataLength));

            var dataInterceptedArgs = new DataInterceptedEventArgs(stringifiedInterceptionData);

            OnDataIntercept(dataInterceptedArgs);
        }
示例#3
0
            private void HandleData(DataInterceptedEventArgs e)
            {
                string identifier = e.Timestamp.Ticks.ToString();

                identifier += e.IsOutgoing;
                identifier += e.Step;
                try
                {
                    var interceptedData = new EvaWirePacket(1);
                    interceptedData.Write(identifier);

                    interceptedData.Write(e.Step);
                    interceptedData.Write(e.IsOutgoing);
                    interceptedData.Write(e.Packet.Format.Name);
                    interceptedData.Write(e.IsContinuable && !e.HasContinued);

                    interceptedData.Write(e.GetOriginalData().Length);
                    interceptedData.Write(e.GetOriginalData());

                    interceptedData.Write(e.IsOriginal);
                    if (!e.IsOriginal)
                    {
                        byte[] curPacketData = e.Packet.ToBytes();
                        interceptedData.Write(curPacketData.Length);
                        interceptedData.Write(curPacketData);
                    }

                    _module.DataAwaiters.Add(identifier, new TaskCompletionSource <HPacket>());
                    _module.Node.SendPacketAsync(interceptedData);

                    HPacket handledDataPacket = _module.DataAwaiters[identifier].Task.Result;
                    if (handledDataPacket == null)
                    {
                        return;
                    }
                    // This packet contains the identifier at the start, although we do not read it here.

                    bool isContinuing = handledDataPacket.ReadBoolean();
                    if (isContinuing)
                    {
                        _module.DataAwaiters[identifier] = new TaskCompletionSource <HPacket>();

                        bool wasRelayed = handledDataPacket.ReadBoolean();
                        e.Continue(wasRelayed);

                        if (wasRelayed)
                        {
                            return;             // We have nothing else to do here, packet has already been sent/relayed.
                        }
                        handledDataPacket = _module.DataAwaiters[identifier].Task.Result;
                        isContinuing      = handledDataPacket.ReadBoolean(); // We can ignore this one.
                    }

                    int    newPacketLength = handledDataPacket.ReadInt32();
                    byte[] newPacketData   = handledDataPacket.ReadBytes(newPacketLength);

                    e.Packet    = e.Packet.Format.CreatePacket(newPacketData);
                    e.IsBlocked = handledDataPacket.ReadBoolean();
                }
                finally { _module.DataAwaiters.Remove(identifier); }
            }