public unsafe void ProcessAttachmentStream(DocumentsOperationContext context, BlittableJsonReaderObject data, ref DocumentItem.AttachmentStream attachment) { if (data.TryGet(nameof(AttachmentName.Hash), out LazyStringValue hash) == false || data.TryGet(nameof(AttachmentName.Size), out long size) == false || data.TryGet(nameof(DocumentItem.AttachmentStream.Tag), out LazyStringValue tag) == false) { throw new ArgumentException($"Data of attachment stream is not valid: {data}"); } if (_writeBuffer == null) { _returnWriteBuffer = _context.GetManagedBuffer(out _writeBuffer); } attachment.Data = data; attachment.Base64HashDispose = Slice.External(context.Allocator, hash, out attachment.Base64Hash); attachment.TagDispose = Slice.External(context.Allocator, tag, out attachment.Tag); while (size > 0) { var sizeToRead = (int)Math.Min(_writeBuffer.Length, size); var read = _parser.Copy(_writeBuffer.Pointer, sizeToRead); attachment.Stream.Write(_writeBuffer.Buffer.Array, _writeBuffer.Buffer.Offset, read.BytesRead); if (read.Done == false) { var read2 = _peepingTomStream.Read(_buffer.Buffer.Array, _buffer.Buffer.Offset, _buffer.Length); if (read2 == 0) { throw new EndOfStreamException("Stream ended without reaching end of stream content"); } _parser.SetBuffer(_buffer, 0, read2); } size -= read.BytesRead; } attachment.Stream.Flush(); }