public override AckAndMessage DecodeMessage(ByteString raw, RemoteActorRefProvider provider, Address localAddress)
{
var ackAndEnvelope = AckAndEnvelopeContainer.ParseFrom(raw);
Ack ackOption = null;
if (ackAndEnvelope.HasAck)
{
ackOption = new Ack(new SeqNo((long)ackAndEnvelope.Ack.CumulativeAck), ackAndEnvelope.Ack.NacksList.Select(x => new SeqNo((long)x)));
}
Message messageOption = null;
if (ackAndEnvelope.HasEnvelope)
{
var envelopeContainer = ackAndEnvelope.Envelope;
if (envelopeContainer != null)
{
var recipient = provider.ResolveActorRefWithLocalAddress(envelopeContainer.Recipient.Path, localAddress);
Address recipientAddress;
ActorPath.TryParseAddress(envelopeContainer.Recipient.Path, out recipientAddress);
var serializedMessage = envelopeContainer.Message;
IActorRef senderOption = null;
if (envelopeContainer.HasSender)
{
senderOption = provider.ResolveActorRefWithLocalAddress(envelopeContainer.Sender.Path, localAddress);
}
SeqNo seqOption = null;
if (envelopeContainer.HasSeq)
{
unchecked
{
seqOption = new SeqNo((long)envelopeContainer.Seq); //proto takes a ulong
}
}
messageOption = new Message(recipient, recipientAddress, serializedMessage, senderOption, seqOption);
}
}
return new AckAndMessage(ackOption, messageOption);
}