internal bool Process(GameClient client, Direction direction, ref PacketHeader header, ref byte[] payload) { var rawHandlers = new List <RawPacketHandler>(); // Make a copy so we don't have to lock while iterating. lock (_lock) { rawHandlers.AddRange(_wildcardRawHandlers); rawHandlers.AddRange(_rawHandlers[header.OpCode]); } var send = true; var name = Serializer.GameMessages.OpCodeToName[header.OpCode]; if (rawHandlers.Count != 0) { var packet = new RawPacket(name) { Payload = payload.Slice(0, header.Length) }; foreach (var handler in rawHandlers) { try { lock (handler) send &= handler(client, direction, packet); } catch (Exception e) { if (Debugger.IsAttached) { throw; } _log.Error("Unhandled exception in raw packet handler:"); _log.Error(e.ToString()); } } payload = packet.Payload; header = new PacketHeader((ushort)packet.Payload.Length, header.OpCode); } IReadOnlyCollection <Delegate> handlers = _handlers[header.OpCode]; lock (_lock) handlers = handlers.Count != 0 ? handlers.ToArray() : _emptyHandlers; if (handlers.Count != 0) { var packet = Serializer.Create(header.OpCode); Serializer.Deserialize(payload, packet); foreach (var handler in handlers) { try { lock (handler) send &= (bool)handler.DynamicInvoke(client, direction, packet); } catch (Exception e) { if (Debugger.IsAttached) { throw; } _log.Error("Unhandled exception in packet handler:"); _log.Error(e.ToString()); } } payload = Serializer.Serialize(packet); header = new PacketHeader((ushort)payload.Length, header.OpCode); } if (LogWriter != null) { lock (LogWriter) LogWriter.Write(new PacketLogEntry(DateTime.Now, client.Proxy.Info.Name, direction, header.OpCode, payload.Slice(0, header.Length))); } _log.Debug("{0}: {1} ({2} bytes{3})", direction.ToDirectionString(), name, header.Length, send ? string.Empty : ", discarded"); return(send); }
internal bool Process(GameClient client, Direction direction, ref PacketHeader header, ref byte[] payload) { var rawHandlers = new List <RawPacketHandler>(); // Make a copy so we don't have to lock while iterating. lock (_listLock) { rawHandlers.AddRange(_wildcardRawHandlers); rawHandlers.AddRange(_rawHandlers[header.OpCode]); } var send = true; var name = Serializer.Messages.Game.OpCodeToName[header.OpCode]; var original = payload; if (rawHandlers.Count != 0) { var packet = new RawPacket(name) { Payload = payload.Slice(0, header.Length) }; foreach (var handler in rawHandlers) { try { lock (_invokeLock) send &= handler(client, direction, packet); } catch (Exception e) when(!Debugger.IsAttached) { _log.Error("Unhandled exception in raw packet handler:"); _log.Error(e.ToString()); } } payload = packet.Payload; header = new PacketHeader((ushort)packet.Payload.Length, header.OpCode); } IReadOnlyCollection <Delegate> handlers = _handlers[header.OpCode]; lock (_listLock) handlers = handlers.Count != 0 ? handlers.ToArray() : _emptyHandlers; if (handlers.Count != 0) { var packet = Serializer.Create(header.OpCode); var good = true; try { Serializer.Deserialize(payload.Slice(0, header.Length), packet); } catch (EndOfStreamException) { _log.Error("{0}: {1} failed to deserialize; skipping typed packet handlers", direction.ToDirectionString(), name); good = false; } if (good) { foreach (var handler in handlers) { try { lock (_invokeLock) send &= (bool)handler.DynamicInvoke(client, direction, packet); } catch (Exception e) when(!Debugger.IsAttached) { _log.Error("Unhandled exception in packet handler:"); _log.Error(e.ToString()); } } payload = Serializer.Serialize(packet); header = new PacketHeader((ushort)payload.Length, header.OpCode); } } _log.Debug("{0}: {1} ({2} bytes{3})", direction.ToDirectionString(), name, header.Length, send ? string.Empty : ", discarded"); if (send && payload.Length > PacketHeader.MaxPayloadSize) { _log.Error("{0}: {1} is too big ({2} bytes) to be sent correctly; sending original", direction.ToDirectionString(), name, payload.Length); payload = original; header = new PacketHeader((ushort)payload.Length, header.OpCode); } return(send); }