using System; using System.Linq; using System.Collections.Generic; using Crestron.SimplSharp.CrestronIO; using PepperDash.Core.Intersystem.Serialization; using PepperDash.Core.Intersystem.Tokens; namespace PepperDash.Core.Intersystem { /// /// XSigToken stream writer. /// public sealed class XSigTokenStreamWriter : IDisposable { private readonly Stream _stream; private readonly bool _leaveOpen; /// /// /// XSigToken stream writer constructor. /// /// Input stream to write to. /// Stream is null. /// Stream cannot be written to. public XSigTokenStreamWriter(Stream stream) : this(stream, false) { } /// /// XSigToken stream writer constructor. /// /// Input stream to write to. /// Determines whether to leave the stream open or not. /// Stream is null. /// Stream cannot be written to. public XSigTokenStreamWriter(Stream stream, bool leaveOpen) { if (stream == null) throw new ArgumentNullException("stream"); if (!stream.CanWrite) throw new ArgumentException("The specified stream cannot be written to."); _stream = stream; _leaveOpen = leaveOpen; } /// /// Write XSig data gathered from an IXSigStateResolver to the stream. /// /// IXSigStateResolver object. /// /// WriteXSigData method /// public void WriteXSigData(IXSigSerialization xSigSerialization) { WriteXSigData(xSigSerialization, 0); } /// /// Write XSig data gathered from an IXSigStateResolver to the stream. /// /// IXSigStateResolver object. /// Index offset for each XSigToken. /// /// WriteXSigData method /// public void WriteXSigData(IXSigSerialization xSigSerialization, int offset) { if (xSigSerialization == null) throw new ArgumentNullException("xSigSerialization"); var tokens = xSigSerialization.Serialize(); WriteXSigData(tokens, offset); } /// /// Write XSigToken to the stream. /// /// XSigToken object. /// /// WriteXSigData method /// public void WriteXSigData(XSigToken token) { WriteXSigData(token, 0); } /// /// Write XSigToken to the stream. /// /// XSigToken object. /// Index offset for each XSigToken. /// /// WriteXSigData method /// public void WriteXSigData(XSigToken token, int offset) { WriteXSigData(new[] { token }, offset); } /// /// Writes an array of XSigTokens to the stream. /// /// XSigToken objects. public void WriteXSigData(XSigToken[] tokens) { WriteXSigData(tokens.AsEnumerable()); } /// /// Write an enumerable collection of XSigTokens to the stream. /// /// XSigToken objects. public void WriteXSigData(IEnumerable tokens) { WriteXSigData(tokens, 0); } /// /// Write an enumerable collection of XSigTokens to the stream. /// /// XSigToken objects. /// Index offset for each XSigToken. /// /// WriteXSigData method /// public void WriteXSigData(IEnumerable tokens, int offset) { if (offset < 0) throw new ArgumentOutOfRangeException("offset", "Offset must be greater than or equal to 0."); if (tokens != null) { foreach (var token in tokens) { if (token == null) continue; var bytes = token.GetTokenWithOffset(offset).GetBytes(); _stream.Write(bytes, 0, bytes.Length); } } } /// /// Dispose method /// public void Dispose() { if (!_leaveOpen) _stream.Dispose(); } } }