void StreamData(IStreamReader streamReader) { var streamId = streamReader.ReadUint32(); var streamOffset = streamReader.ReadUint32(); var lastInStream = streamReader.ReadUint8(); var payloadInPacket = streamReader.ReadLength(); var octetCount = streamReader.RemainingOctetCount; if (octetCount != payloadInPacket) { var e = new Exception(string.Format("ERROR: {0} {1}", octetCount, payloadInPacket)); log.Exception(e); } // log.Debug("Stream id:{0:X} offset:{1} octetCount:{2}", streamId, streamOffset, octetCount); var alreadyWrittenOctetCount = streamStorage.FileSize(streamId); var streamDataOctets = streamReader.ReadOctets(octetCount); var startIndexInStreamDataOctets = alreadyWrittenOctetCount - streamOffset; if (startIndexInStreamDataOctets < 0) { log.Warning("We have been sent data with a 'gap'! Can not write."); return; } if (startIndexInStreamDataOctets >= streamDataOctets.Length) { log.Warning("This is old news and contains no new octets. Skipping..."); return; } var startWritePosition = (uint)startIndexInStreamDataOctets; var octetsToWrite = (uint)(streamDataOctets.Length - startIndexInStreamDataOctets); // log.Debug("Streamx id:{0:X} startIndexInData:{1} octetsToWrite:{2}", streamId, startIndexInStreamDataOctets, octetsToWrite); streamStorage.Append(streamId, streamDataOctets, startWritePosition, octetsToWrite); InternalOnStreamData(streamId, streamDataOctets, startWritePosition, octetsToWrite); }