コード例 #1
0
        public void Register <T>(int id, string name, int length, TypedPacketReceiveHandler onReceive) where T : IRecvPacket
        {
            Type type = typeof(T);

            ConstructorInfo[] ctors = type.GetConstructors();

            bool valid = false;

            for (int i = 0; i < ctors.Length && !valid; i++)
            {
                ParameterInfo[] parameters = ctors[i].GetParameters();
                valid = (parameters.Length == 1 && parameters[0].ParameterType == typeof(PacketReader));
            }

            if (!valid)
            {
                throw new NetworkException(string.Format("Unable to register packet type {0} without a public constructor with a {1} parameter", type, typeof(PacketReader)));
            }

            if (id > byte.MaxValue)
            {
                throw new NetworkException(string.Format("Unable to register packet id {0:X2} because it is greater than byte.MaxValue", id));
            }

            TypedPacketHandler handler = new TypedPacketHandler(id, name, type, length, onReceive);

            m_TypedHandlers[id].Add(handler);
        }
コード例 #2
0
        public void RegisterExtended <T>(int extendedId, int subId, string name, int length, TypedPacketReceiveHandler onReceive) where T : IRecvPacket
        {
            Type type = typeof(T);

            ConstructorInfo[] ctors = type.GetConstructors();

            bool valid = false;

            for (int i = 0; i < ctors.Length && !valid; i++)
            {
                ParameterInfo[] parameters = ctors[i].GetParameters();
                valid = (parameters.Length == 1 && parameters[0].ParameterType == typeof(PacketReader));
            }

            if (!valid)
            {
                throw new NetworkException(string.Format("Unable to register packet type {0} without a public constructor with a {1} parameter", type, typeof(PacketReader)));
            }

            if (extendedId > byte.MaxValue)
            {
                throw new NetworkException(string.Format("Unable to register packet extendedId {0:X2} because it is greater than byte.MaxValue", extendedId));
            }

            if (subId > byte.MaxValue)
            {
                throw new NetworkException(string.Format("Unable to register packet subId {0:X2} because it is greater than byte.MaxValue", subId));
            }

            if (m_ExtendedTypedHandlers[extendedId] == null)
            {
                m_ExtendedTypedHandlers[extendedId] = new List <PacketHandler> [0x100];

                for (int i = 0; i < m_ExtendedTypedHandlers[extendedId].Length; i++)
                {
                    m_ExtendedTypedHandlers[extendedId][i] = new List <PacketHandler>();
                }
            }

            Tracer.Debug("Registering Extended Command: id: 0x{0:X2} subCommand: 0x{1:X2} Name: {2} Length: {3}", extendedId, subId, name, length);

            TypedPacketHandler handler = new TypedPacketHandler(subId, name, type, length, onReceive);

            m_ExtendedTypedHandlers[extendedId][subId].Add(handler);
        }
コード例 #3
0
 public void Unregister(int id, TypedPacketReceiveHandler onRecieve)
 {
     for (int i = 0; i < m_TypedHandlers[id].Count; i++)
     {
         TypedPacketHandler handler = m_TypedHandlers[id][i] as TypedPacketHandler;
         if (handler != null && handler.TypeHandler != null)
         {
             if (handler.TypeHandler.Method.Equals(onRecieve.Method))
             {
                 m_TypedHandlers[id].RemoveAt(i);
                 break;
             }
         }
         else
         {
             Tracer.Critical("Unable to unregister this onReceive method.");
         }
     }
 }
コード例 #4
0
        private void InvokeHandlers(List <PacketHandler> packetHandlers, byte[] buffer, int length)
        {
            if (packetHandlers == null)
            {
                return;
            }

            int count = packetHandlers.Count;

            for (int i = 0; i < count; i++)
            {
                PacketHandler      handler      = packetHandlers[i];
                TypedPacketHandler typedHandler = packetHandlers[i] as TypedPacketHandler;

                if (typedHandler != null)
                {
                    PacketReader reader = PacketReader.CreateInstance(buffer, length, typedHandler.Length != -1);

                    IRecvPacket recvPacket = typedHandler.CreatePacket(reader);

                    if (typedHandler.TypeHandler != null)
                    {
                        typedHandler.TypeHandler(recvPacket);
                    }
                    else
                    {
                        Tracer.Warn("ClientNetwork: Unknown packet received!");
                    }
                }
                else
                {
                    PacketReader reader = PacketReader.CreateInstance(buffer, length, packetHandlers[i].Length != -1);

                    if (handler.Handler != null)
                    {
                        handler.Handler(reader);
                    }
                }
            }
        }
コード例 #5
0
        private void InvokeHandler(PacketHandler packetHandler, byte[] buffer, int length)
        {
            if (packetHandler == null)
            {
                return;
            }

            TypedPacketHandler typedHandler = packetHandler as TypedPacketHandler;

            if (typedHandler != null)
            {
                PacketReader reader = PacketReader.CreateInstance(buffer, length, typedHandler.Length != -1);

                IRecvPacket recvPacket = typedHandler.CreatePacket(reader);

                if (typedHandler.TypeHandler != null)
                {
                    typedHandler.TypeHandler(recvPacket);
                }
                else
                {
                    Tracer.Warn("NetworkClient: Unhandled packet received! [typedHandler != null]");
                }
            }
            else
            {
                PacketReader reader = PacketReader.CreateInstance(buffer, length, packetHandler.Length != -1);

                if (packetHandler.Handler != null)
                {
                    packetHandler.Handler(reader);
                }
                else
                {
                    Tracer.Warn("NetworkClient: Unhandled packet received! [typedHandler == null]");
                }
            }
        }