/// <summary>
        /// This is the method that is invoked on an IPacketFactory to create an IPacket
        /// from the data in an IFieldReader given a specified PacketDefinition.
        /// </summary>
        /// <param name="definition">Definition of the fields expected in the next packet</param>
        /// <param name="reader">Data stream to be read</param>
        /// <returns>An IPacket corresponding to the PacketDefinition and the stream data</returns>
        public IPacket CreatePacket(PacketDefinition definition, IFieldReader reader)
        {
            IPacket packet;

            //what we create varies by what specific definition they're looking for
            if (definition.TypeName == m_LogMessagePacketType)
            {
                var logPacket = new LogMessagePacket(m_SessionPacketCache);
                packet = logPacket;

                if (!ReferenceEquals(definition, m_CachedLogMessagePacketDefinition))
                {
                    var currentDefinition = PacketDefinition.CreatePacketDefinition(packet);
                    m_UseFastDeserialization           = definition.Equals(currentDefinition);
                    m_CachedLogMessagePacketDefinition = definition;
                }

                if (m_UseFastDeserialization)
                {
                    logPacket.ReadFieldsFast(reader);
                }
                else
                {
                    definition.ReadFields(packet, reader);
                }
            }
            else if (definition.TypeName == m_ExceptionInfoPacketType)
            {
                packet = new ExceptionInfoPacket();
                definition.ReadFields(packet, reader);
            }
            else if (definition.TypeName == m_ApplicationUserPacketType)
            {
                packet = new ApplicationUserPacket();
                definition.ReadFields(packet, reader);
            }
            else
            {
                //crap, we don't know what to do here.
                throw new ArgumentOutOfRangeException(nameof(definition), definition.TypeName, "This packet factory doesn't understand how to create packets for the provided type.");
            }

            return(packet);
        }
Exemple #2
0
        private Dictionary <IPacket, IPacket> GetRequiredPackets(IPacket packet)
        {
            PacketDefinition previewDefinition;
            int previewTypeIndex = m_CachedTypes.IndexOf(packet);

            if (previewTypeIndex < 0)
            {
                previewDefinition = PacketDefinition.CreatePacketDefinition(packet);
                m_CachedTypes.Add(previewDefinition);
            }
            else
            {
                previewDefinition = m_CachedTypes[previewTypeIndex];
            }

            Dictionary <IPacket, IPacket> requiredPackets = previewDefinition.GetRequiredPackets(packet);

            return(requiredPackets);
        }