protected override void OnReceive(object message)
{
message.Match().With<ClientWrite>(w =>
{
if (!_writePending)
{
_writePending = true;
_connection.Tell(Tcp.Write.Create(w.Bytes, WriteAck.Instance));
}
else
_queuedWrites.Enqueue(w.Bytes);
}).With<WriteAck>(() =>
{
if (_queuedWrites.Count != 0)
{
var next = _queuedWrites.Dequeue();
_connection.Tell(Tcp.Write.Create(next, WriteAck.Instance));
}
else
{
_writePending = false;
if(_closeAfterWrite != null)
_connection.Tell(_closeAfterWrite);
}
}).With<ClientRead>(r =>
{
_readTo = r.ReadTo;
_toRead = r.Count;
_connection.Tell(Tcp.ResumeReading.Instance);
}).With<Tcp.Received>(r =>
{
_readBuffer += r.Data;
if (_readBuffer.Count >= _toRead)
{
_readTo.Tell(new ReadResult(_readBuffer));
_readBuffer = ByteString.Empty;
_toRead = 0;
_readTo = Context.System.DeadLetters;
}
else
_connection.Tell(Tcp.ResumeReading.Instance);
}).With<PingClose>(p =>
{
_readTo = p.Requester;
_connection.Tell(Tcp.ResumeReading.Instance);
}).With<Tcp.ConnectionClosed>(c =>
{
_readTo.Tell(c);
if(!c.IsPeerClosed)
Context.Stop(Self);
}).With<ClientClose>(c =>
{
if (!_writePending)
_connection.Tell(c.Cmd);
else
_closeAfterWrite = c.Cmd;
});
}
}