public async Task <Stream> MediaCreatingAsync(MediaCreatingContext context, Stream inputStream)
        {
            var outStream = new MemoryStream();
            await inputStream.CopyToAsync(outStream);

            return(outStream);
        }
        public async Task DisposesMediaCreatingStreams()
        {
            var streams = new List <Stream>();
            var creatingEventHandlers = new List <IMediaCreatingEventHandler>()
            {
                new TestMediaEventHandler(),
                new TestMediaEventHandler()
            };

            Stream originalStream = null;

            var path = String.Empty;
            // This stream will be disposed by the creating stream, or the finally block.
            Stream inputStream = null;

            try
            {
                inputStream    = new MemoryStream();
                originalStream = inputStream;
                // Add original stream to streams to maintain reference to test disposal.
                streams.Add(originalStream);

                var outputStream = inputStream;
                try
                {
                    var context = new MediaCreatingContext
                    {
                        Path = path
                    };

                    foreach (var eventHandler in creatingEventHandlers)
                    {
                        // Creating stream disposed by using.
                        using (var creatingStream = outputStream)
                        {
                            // Add to streams to maintain reference to test disposal.
                            streams.Add(creatingStream);
                            inputStream  = null;
                            outputStream = null;
                            outputStream = await eventHandler.MediaCreatingAsync(context, creatingStream);
                        }
                    }
                }
                finally
                {
                    // This disposes the final outputStream.
                    outputStream?.Dispose();
                }
            }
            finally
            {
                inputStream?.Dispose();
            }

            foreach (var stream in streams)
            {
                Assert.Throws <ObjectDisposedException>(() => stream.ReadByte());
            }
        }
        public async Task <Stream> MediaCreatingAsync(MediaCreatingContext context, Stream creatingStream)
        {
            var newStream = new MemoryStream();
            await creatingStream.CopyToAsync(newStream);

            newStream.Position = 0;
            return(creatingStream);
        }
        public virtual async Task <string> CreateFileFromStreamAsync(string path, Stream inputStream, bool overwrite = false)
        {
            if (_mediaCreatingEventHandlers.Any())
            {
                // Follows https://rules.sonarsource.com/csharp/RSPEC-3966
                // Assumes that each stream should be disposed of only once by it's caller.
                var outputStream = inputStream;
                try
                {
                    var context = new MediaCreatingContext
                    {
                        Path = path
                    };

                    foreach (var mediaCreatingEventHandler in _mediaCreatingEventHandlers)
                    {
                        // Creating stream disposed by using.
                        using (var creatingStream = outputStream)
                        {
                            // Stop disposal of inputStream, as creating stream is the object to dispose.
                            inputStream = null;
                            // Outputstream must be created by event handler.
                            outputStream = null;

                            outputStream = await mediaCreatingEventHandler.MediaCreatingAsync(context, creatingStream);
                        }
                    }

                    return(await _fileStore.CreateFileFromStreamAsync(context.Path, outputStream, overwrite));
                }
                finally
                {
                    // This disposes the last outputStream.
                    outputStream?.Dispose();
                }
            }
            else
            {
                return(await _fileStore.CreateFileFromStreamAsync(path, inputStream, overwrite));
            }
        }