Exemple #1
0
        /// <summary>
        /// Read and return the next IPacket from the stream
        /// </summary>
        public IPacket ReadPacket(Stream packetStream)
        {
            m_Reader.ReplaceStream(packetStream);

            PacketDefinition definition;
            int typeIndex = (int)m_Reader.ReadUInt32();

            if (typeIndex >= m_cachedTypes.Count)
            {
                definition = PacketDefinition.ReadPacketDefinition(m_Reader);
                if (string.IsNullOrEmpty(definition.TypeName))
                {
                    //we're hosed...  we won't be able to parse this packet.
                    throw new GibraltarSerializationException("The type name of the definition is null, which can't be correct.  The packet stream is corrupted.", true);
                }

                m_cachedTypes.Add(definition);
                m_cachedTypes.Commit();
            }
            else
            {
                definition = m_cachedTypes[typeIndex];
            }
            definition.PacketCount++;
            definition.PacketSize += packetStream.Length;

            IPacketFactory factory = m_PacketFactory.GetPacketFactory(definition.TypeName);
            IPacket        packet  = factory.CreatePacket(definition, m_Reader);

            return(packet);
        }
Exemple #2
0
        private void AwaitClientHandshake(TcpClient client)
        {
            try
            {
                RequestResult createUserResult;
                do
                {
                    var packet = _packetFactory.CreatePacket(client.GetStream()) as RegisterRequest;
                    _clientList.AddConnectingClient(packet.UniqueId, client.GetStream());
                    createUserResult = _mediator.Send(packet).Result;
                } while (!createUserResult.Success);

                HandleClientConnection(client);
            }
            catch (Exception)
            { }
        }
Exemple #3
0
 private void HandleConnection()
 {
     while (true)
     {
         var packet = _packetFactory.CreatePacket(_client.GetStream());
         _mediator.Send(packet);
     }
 }
Exemple #4
0
        /// <summary>
        /// Read and return the next IPacket from the stream
        /// </summary>
        public IPacket Read()
        {
#if ADD_GUARD_BYTES
            byte[] preamble = new byte[4];
            m_Stream.Read(preamble, 0, 4);

            //now compare it against the preamble.
            CompareArrays(preamble, PacketWriter.s_PreambleGuardPattern);
#endif

            int packetSize = (int)m_Reader.ReadUInt64();

            //if the packet size is less than one, that's obviously wrong
            if (packetSize < 1)
            {
                throw new GibraltarSerializationException("The size of the next packet is smaller than 1 byte or negative, which can't be correct.  The packet stream is corrupted.", true);
            }

            // TODO: There's got to be a more efficient way to get this done
            byte[] buffer = new byte[packetSize];
            m_Stream.Read(buffer, 0, packetSize);
            IFieldReader bufferReader = new FieldReader(new MemoryStream(buffer), m_Reader.Strings, m_MajorVersion, m_MinorVersion);

            PacketDefinition definition;
            int typeIndex = (int)bufferReader.ReadUInt32();
            if (typeIndex >= m_cachedTypes.Count)
            {
                definition = PacketDefinition.ReadPacketDefinition(bufferReader);
                if (string.IsNullOrEmpty(definition.TypeName))
                {
                    //we're hosed...  we won't be able to parse this packet.
                    throw new GibraltarSerializationException("The type name of the definition is null, which can't be correct.  The packet stream is corrupted.", true);
                }

                m_cachedTypes.Add(definition);
                m_cachedTypes.Commit();
            }
            else
            {
                definition = m_cachedTypes[typeIndex];
            }

            IPacketFactory factory = m_PacketFactory.GetPacketFactory(definition.TypeName);
            IPacket        packet  = factory.CreatePacket(definition, bufferReader);

            //we used to populate a packet cache here, but a cached packet should be read just once - it shouldn't be in the stream
            //(and I changed PacketWriter to enforce that)

#if ADD_GUARD_BYTES
            byte[] postamble = new byte[4];
            m_Stream.Read(postamble, 0, 4);

            //now compare it against the preamble.
            CompareArrays(postamble, PacketWriter.s_PostambleGuardPattern);
#endif

            return(packet);
        }
        public static byte[] PinResponse(this IPacketFactory packetFactory, PinResponseType result)
        {
            using (var builder = packetFactory.CreatePacket("PinResponse"))
            {
                builder.WriteByte(result);

                return(builder.ToByteArray());
            }
        }
        public PacketBase <T> CreatePacket <T>(PacketIdDefine id) where T : new()
        {
            PacketIdDefine key = id;

            if (m_Packets.ContainsKey(key))
            {
                IPacketFactory factory = m_Packets[key];
                return(factory.CreatePacket() as PacketBase <T>);
            }
            LogModule.LogInfo("Can't find packet factory for type : {0}", key);
            return(null);
        }
Exemple #7
0
        public IClient CreateRemoteClient(IPEndPoint ip, Predicate <WorldServer> serverSelector, Predicate <SelectableCharacter> characterSelector)
        {
            INetwork network = networkFactory.CreateRemoteNetwork(ip);
            IClient  client  = new Client(network);

            client.AddConfiguration(new LoginConfiguration(serverSelector, characterSelector));

            client.PacketReceived += packet =>
            {
                IPacket typedPacket = packetFactory.CreatePacket(packet);
                if (typedPacket == null)
                {
                    return;
                }

                packetManager.Process(client, typedPacket);
            };

            return(client);
        }
Exemple #8
0
    public SomeMethodThatNeedsToCreateIPacketInstance()
    {
        IPacket packet = _factory.CreatePacket();

        //work with packet without caring what type it is
    }