Beispiel #1
0
        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);
        }
Beispiel #2
0
        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);
        }