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); }); } }
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); }
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); } }