public static void PutDataSubMessage(this IoBuffer buffer, Data obj) { buffer.PutInt16(obj.ExtraFlags.Value); short octetsToInlineQos = 0; if (obj.HasInlineQosFlag) { octetsToInlineQos = 4 + 4 + 8;// EntityId.LENGTH + EntityId.LENGTH + SequenceNumber.LENGTH; } buffer.PutInt16(octetsToInlineQos); buffer.PutEntityId(obj.ReaderId); buffer.PutEntityId(obj.WriterId); buffer.PutSequenceNumber(obj.WriterSN); if (obj.HasInlineQosFlag) { buffer.PutParameterList(obj.InlineQos); } if (obj.HasDataFlag || obj.HasKeyFlag) { buffer.Align(4); buffer.Put(obj.SerializedPayload.DataEncapsulation.SerializedPayload); } }
public static void GetSubMessage(this IoBuffer buffer, ref SubMessage obj) { buffer.Align(4); int smhPosition = buffer.Position; SubMessageHeader header = buffer.GetSubMessageHeader(); int smStart = buffer.Position; switch (header.SubMessageKind) { // @see 9.4.5.1.1 case SubMessageKind.PAD: Pad smPad = new Pad(); smPad.Header = header; buffer.GetPad(ref smPad); obj = smPad; break; case SubMessageKind.ACKNACK: AckNack smAckNack = new AckNack(); smAckNack.Header = header; buffer.GetAckNack(ref smAckNack); obj = smAckNack; break; case SubMessageKind.HEARTBEAT: Heartbeat smHeartbeat = new Heartbeat(); smHeartbeat.Header = header; buffer.GetHeartbeat(ref smHeartbeat); obj = smHeartbeat; break; case SubMessageKind.GAP: Gap smgap = new Gap(); smgap.Header = header; buffer.GetGap(ref smgap); obj = smgap; break; case SubMessageKind.INFO_TS: InfoTimestamp sminfots = new InfoTimestamp(); sminfots.Header = header; buffer.GetInfoTimestamp(ref sminfots); obj = sminfots; break; case SubMessageKind.INFO_SRC: InfoSource smInfoSource = new InfoSource(); smInfoSource.Header = header; buffer.GetInfoSource(ref smInfoSource); obj = smInfoSource; break; case SubMessageKind.INFO_REPLY_IP4: InfoReplyIp4 smInfoReplyIp4 = new InfoReplyIp4(); smInfoReplyIp4.Header = header; buffer.GetInfoReplyIp4(ref smInfoReplyIp4); obj = smInfoReplyIp4; break; case SubMessageKind.INFO_DST: InfoDestination smInfoDestination = new InfoDestination(); smInfoDestination.Header = header; buffer.GetInfoDestination(ref smInfoDestination); obj = smInfoDestination; break; case SubMessageKind.INFO_REPLY: InfoReply smInfoReply = new InfoReply(); smInfoReply.Header = header; buffer.GetInfoReply(ref smInfoReply); obj = smInfoReply; break; case SubMessageKind.NACK_FRAG: NackFrag smNackFrag = new NackFrag(); smNackFrag.Header = header; buffer.GetNackFrag(ref smNackFrag); obj = smNackFrag; break; case SubMessageKind.HEARTBEAT_FRAG: HeartbeatFrag smHeartbeatFrag = new HeartbeatFrag(); smHeartbeatFrag.Header = header; buffer.GetHeartbeatFrag(ref smHeartbeatFrag); obj = smHeartbeatFrag; break; case SubMessageKind.DATA: Data smdata = new Data(); smdata.Header = header; buffer.GetDataSubMessage(ref smdata); obj = smdata; break; case SubMessageKind.DATA_FRAG: DataFrag smdDataFrag = new DataFrag(); smdDataFrag.Header = header; buffer.GetDataFrag(ref smdDataFrag); obj = smdDataFrag; break; default: throw new NotSupportedException(); } int smEnd = buffer.Position; int smLength = smEnd - smStart; if (smLength != header.SubMessageLength && header.SubMessageLength != 0) { log.WarnFormat("SubMessage length differs for {0} != {1} for {2}", smLength, header.SubMessageLength, obj); if (smLength < header.SubMessageLength) { byte[] unknownBytes = new byte[header.SubMessageLength - smLength]; log.DebugFormat("Trying to skip {0} bytes", unknownBytes.Length); buffer.Get(unknownBytes, 0, unknownBytes.Length); } } log.DebugFormat("SubMsg in: {0}", obj); }
public static void GetDataSubMessage(this IoBuffer buffer, ref Data obj) { if (obj.HasDataFlag && obj.HasKeyFlag) { // Should we just ignore this message instead throw new ApplicationException( "This version of protocol does not allow Data submessage to contain both serialized data and serialized key (9.4.5.3.1)"); } int start_count = buffer.Position; // start of bytes Read so far from the // beginning Flags flgs = new Flags(); flgs.Value = (byte)buffer.GetInt16(); obj.ExtraFlags = flgs; int octetsToInlineQos = buffer.GetInt16() & 0xffff; int currentCount = buffer.Position; // count bytes to inline qos obj.ReaderId = buffer.GetEntityId(); obj.WriterId = buffer.GetEntityId(); obj.WriterSN = buffer.GetSequenceNumber(); int bytesRead = buffer.Position - currentCount; int unknownOctets = octetsToInlineQos - bytesRead; for (int i = 0; i < unknownOctets; i++) { // TODO: Instead of looping, we should do just // newPos = bb.getBuffer.position() + unknownOctets or something // like that buffer.Get(); // Skip unknown octets, @see 9.4.5.3.3 // octetsToInlineQos } if (obj.HasInlineQosFlag) { obj.InlineQos = buffer.GetParameterList(); } if (obj.HasDataFlag || obj.HasKeyFlag) { buffer.Align(4); // Each submessage is aligned on 32-bit boundary, @see // 9.4.1 Overall Structure int end_count = buffer.Position; // end of bytes Read so far from the beginning int length; if (obj.Header.SubMessageLength != 0) { length = obj.Header.SubMessageLength - (end_count - start_count); } else { // SubMessage is the last one. Rest of the bytes are Read. // @see 8.3.3.2.3 length = buffer.Remaining; } obj.SerializedPayload = new SerializedPayload(); obj.SerializedPayload.DataEncapsulation = EncapsulationManager.Deserialize(buffer, length); } }
public static Data GetDataSubMessage(this IoBuffer buffer) { Data obj = new Data(); buffer.GetDataSubMessage(ref obj); return obj; }