diff options
| author | Luke Pulverenti <luke.pulverenti@gmail.com> | 2016-11-03 21:18:51 -0400 |
|---|---|---|
| committer | Luke Pulverenti <luke.pulverenti@gmail.com> | 2016-11-03 21:18:51 -0400 |
| commit | 46efa464d851d3f78b74ac02d061388115cf6d66 (patch) | |
| tree | 56b95c1ff2dd71e2b75b27e059da9173b7d915b5 /Emby.Server.Implementations/HttpServer/StreamWriter.cs | |
| parent | 70e146a0b2b96129da80476a01bb794936419242 (diff) | |
move classes
Diffstat (limited to 'Emby.Server.Implementations/HttpServer/StreamWriter.cs')
| -rw-r--r-- | Emby.Server.Implementations/HttpServer/StreamWriter.cs | 127 |
1 files changed, 127 insertions, 0 deletions
diff --git a/Emby.Server.Implementations/HttpServer/StreamWriter.cs b/Emby.Server.Implementations/HttpServer/StreamWriter.cs new file mode 100644 index 000000000..15488abaa --- /dev/null +++ b/Emby.Server.Implementations/HttpServer/StreamWriter.cs @@ -0,0 +1,127 @@ +using MediaBrowser.Model.Logging; +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Threading; +using System.Threading.Tasks; +using MediaBrowser.Common.IO; +using MediaBrowser.Model.Services; + +namespace Emby.Server.Implementations.HttpServer +{ + /// <summary> + /// Class StreamWriter + /// </summary> + public class StreamWriter : IAsyncStreamWriter, IHasHeaders + { + private ILogger Logger { get; set; } + + private static readonly CultureInfo UsCulture = new CultureInfo("en-US"); + + /// <summary> + /// Gets or sets the source stream. + /// </summary> + /// <value>The source stream.</value> + private Stream SourceStream { get; set; } + + /// <summary> + /// The _options + /// </summary> + private readonly IDictionary<string, string> _options = new Dictionary<string, string>(); + /// <summary> + /// Gets the options. + /// </summary> + /// <value>The options.</value> + public IDictionary<string, string> Headers + { + get { return _options; } + } + + public Action OnComplete { get; set; } + public Action OnError { get; set; } + private readonly byte[] _bytes; + + /// <summary> + /// Initializes a new instance of the <see cref="StreamWriter" /> class. + /// </summary> + /// <param name="source">The source.</param> + /// <param name="contentType">Type of the content.</param> + /// <param name="logger">The logger.</param> + public StreamWriter(Stream source, string contentType, ILogger logger) + { + if (string.IsNullOrEmpty(contentType)) + { + throw new ArgumentNullException("contentType"); + } + + SourceStream = source; + Logger = logger; + + Headers["Content-Type"] = contentType; + + if (source.CanSeek) + { + Headers["Content-Length"] = source.Length.ToString(UsCulture); + } + } + + /// <summary> + /// Initializes a new instance of the <see cref="StreamWriter"/> class. + /// </summary> + /// <param name="source">The source.</param> + /// <param name="contentType">Type of the content.</param> + /// <param name="logger">The logger.</param> + public StreamWriter(byte[] source, string contentType, ILogger logger) + : this(new MemoryStream(source), contentType, logger) + { + if (string.IsNullOrEmpty(contentType)) + { + throw new ArgumentNullException("contentType"); + } + + _bytes = source; + Logger = logger; + + Headers["Content-Type"] = contentType; + + Headers["Content-Length"] = source.Length.ToString(UsCulture); + } + + public async Task WriteToAsync(Stream responseStream, CancellationToken cancellationToken) + { + try + { + if (_bytes != null) + { + await responseStream.WriteAsync(_bytes, 0, _bytes.Length); + } + else + { + using (var src = SourceStream) + { + await src.CopyToAsync(responseStream).ConfigureAwait(false); + } + } + } + catch (Exception ex) + { + Logger.ErrorException("Error streaming data", ex); + + if (OnError != null) + { + OnError(); + } + + throw; + } + finally + { + if (OnComplete != null) + { + OnComplete(); + } + } + } + } +} |
