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();
}
}
}