using System;
using System.Threading.Tasks;
using Windows.Storage.Streams;
namespace Plane.Communication
{
internal class UdpServerConnection : UdpConnectionBase
{
private bool _disposed;
private IOutputStream _outputStream;
private DataWriter _writer;
///
/// 初始化 的实例,并指定输出流。
///
/// 用于发送数据的输出流。
public UdpServerConnection(IOutputStream outputStream)
{
_outputStream = outputStream;
_writer = new DataWriter(_outputStream);
}
public bool NeedNewOutputStream { get; private set; }
public override void Close()
{
NeedNewOutputStream = false;
IsOpen = false;
_outputStream?.Dispose();
_writer?.Dispose();
_disposed = true;
}
public override Task OpenAsync()
{
if (_disposed)
{
NeedNewOutputStream = true;
}
IsOpen = true;
return TaskUtils.CompletedTask;
}
public void SetOutputStream(IOutputStream outputStream)
{
_outputStream?.Dispose();
_writer?.Dispose();
_outputStream = outputStream;
_writer = new DataWriter(_outputStream);
NeedNewOutputStream = false;
_disposed = false;
}
protected override async Task SendAsync(byte[] datagram, int bytes)
{
if (datagram.Length != bytes)
{
Array.Resize(ref datagram, bytes);
}
try
{
_writer.WriteBytes(datagram);
await _writer.StoreAsync();
}
catch (Exception ex)
{
Close();
RaiseExceptionThrown(ex);
}
}
}
}