// private static methods private byte[] CombineCommandMessageSectionsIntoSingleDocument(Stream stream) { using (var inputStream = new BsonStreamAdapter(stream, ownsStream: false)) using (var memoryStream = new MemoryStream()) using (var outputStream = new BsonStreamAdapter(memoryStream, ownsStream: false)) { var messageStartPosition = inputStream.Position; var messageLength = inputStream.ReadInt32(); var messageEndPosition = messageStartPosition + messageLength; var requestId = inputStream.ReadInt32(); var responseTo = inputStream.ReadInt32(); var opcode = inputStream.ReadInt32(); var flags = (OpMsgFlags)inputStream.ReadInt32(); if (flags.HasFlag(OpMsgFlags.ChecksumPresent)) { messageEndPosition -= 4; // ignore checksum } CopyType0Section(inputStream, outputStream); outputStream.Position -= 1; while (inputStream.Position < messageEndPosition) { CopyType1Section(inputStream, outputStream); } outputStream.WriteByte(0); outputStream.BackpatchSize(0); return(memoryStream.ToArray()); } }
private byte[] CreateType1SectionBytes(Type1CommandMessageSection <BsonDocument> section) { using (var memoryStream = new MemoryStream()) using (var stream = new BsonStreamAdapter(memoryStream)) using (var writer = new BsonBinaryWriter(stream)) { stream.WriteByte(1); var payloadStartPosition = stream.Position; stream.WriteInt32(0); // size stream.WriteCString(section.Identifier); var context = BsonSerializationContext.CreateRoot(writer); var batch = section.Documents; for (var i = 0; i < batch.Count; i++) { var document = batch.Items[batch.Offset + i]; BsonDocumentSerializer.Instance.Serialize(context, document); } stream.BackpatchSize(payloadStartPosition); return(memoryStream.ToArray()); } }