private void CopyType1Section(BsonStream inputStream, BsonStream outputStream) { var payloadType = (PayloadType)inputStream.ReadByte(); if (payloadType != PayloadType.Type1) { throw new FormatException("Expected subsequent sections to be of type 1."); } var sectionStartPosition = inputStream.Position; var sectionSize = inputStream.ReadInt32(); var sectionEndPosition = sectionStartPosition + sectionSize; var identifier = inputStream.ReadCString(Utf8Encodings.Lenient); outputStream.WriteByte((byte)BsonType.Array); outputStream.WriteCString(identifier); var arrayStartPosition = outputStream.Position; outputStream.WriteInt32(0); // array length will be backpatched var index = 0; while (inputStream.Position < sectionEndPosition) { outputStream.WriteByte((byte)BsonType.Document); outputStream.WriteCString(index.ToString()); CopyBsonDocument(inputStream, outputStream); index++; } outputStream.WriteByte(0); outputStream.BackpatchSize(arrayStartPosition); }
private long FindType0SectionPosition() { _stream.Position = _messageStartPosition; var messageLength = _stream.ReadInt32(); _stream.Position = _messageStartPosition + 20; var messageEndPosition = _messageStartPosition + messageLength; while (_stream.Position < messageEndPosition) { var sectionPosition = _stream.Position; var payloadType = (PayloadType)_stream.ReadByte(); if (payloadType == PayloadType.Type0) { return(sectionPosition); } else if (payloadType != PayloadType.Type1) { throw new FormatException($"Invalid payload type: {payloadType}."); } var sectionSize = _stream.ReadInt32(); _stream.Position = sectionPosition + 1 + sectionSize; } throw new InvalidOperationException("No type 0 section found."); }
private void CopyType0Section(BsonStream inputStream, BsonStream outputStream) { var payloadType = (PayloadType)inputStream.ReadByte(); if (payloadType != PayloadType.Type0) { throw new FormatException("Expected first section to be of type 0."); } CopyBsonDocument(inputStream, outputStream); }