/// <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 = (IPacket)m_Constructor.Invoke(new object[0]); definition.ReadFields(packet, reader); return(packet); }
/// <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_ThreadInfoPacketType) { packet = new ThreadInfoPacket(); } else if (definition.TypeName == m_SessionStartInfoPacketType) { packet = new SessionSummaryPacket(); } else if (definition.TypeName == m_SessionEndInfoPacketType) { packet = new SessionClosePacket(); } else if (definition.TypeName == m_SessionFilePacketType) { packet = new SessionFragmentPacket(); } 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."); } //this feels a little crazy, but you have to do your own read call here - we aren't just creating the packet //object, we actually have to make the standard call to have it read data... definition.ReadFields(packet, reader); return(packet); }
/// <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); }
public IPacket CreatePacket(PacketDefinition definition, IFieldReader reader) { IPacket packet; if (definition.TypeName == m_SampledMetricDefinitionPacketType) { //sampled metrics can't be created directly - they're an abstract class. throw new ArgumentOutOfRangeException(nameof(definition), definition.TypeName, "Sampled Metric objects can't be created, only derived classes can."); } //what we create varies by what specific definition they're looking for if (definition.TypeName == m_MetricDefinitionPacketType) { packet = new MetricDefinitionPacket(m_Session); } else if (definition.TypeName == m_EventMetricDefinitionPacketType) { packet = new EventMetricDefinitionPacket(m_Session); } else if (definition.TypeName == m_EventMetricValueDefinitionPacketType) { packet = new EventMetricValueDefinitionPacket(m_Session); } else if (definition.TypeName == m_CustomSampledMetricDefinitionPacketType) { packet = new CustomSampledMetricDefinitionPacket(m_Session); } else { //crap, we don't know what to do here. throw new ArgumentOutOfRangeException(nameof(definition), definition.TypeName, "This packet factory doesn't undersatnd how to create packets for the provided type."); } //this feels a little crazy, but you have to do your own read call here - we aren't just creating the packet //object, we actually have to make the standard call to have it read data... definition.ReadFields(packet, reader); return(packet); }