protected override void OnActorDataReceived(object sender, ActorDataReceivedEventArgs e) { ActorFrameHeader actorLookupRequestFrameHeader = null; bool isHeaderDecoded = this.ChannelConfiguration.FrameBuilder.TryDecodeFrameHeader( e.Data, e.DataOffset, e.DataLength, out actorLookupRequestFrameHeader); if (isHeaderDecoded && actorLookupRequestFrameHeader.OpCode == OpCode.Where) { byte[] payload; int payloadOffset; int payloadCount; this.ChannelConfiguration.FrameBuilder.DecodePayload( e.Data, e.DataOffset, actorLookupRequestFrameHeader, out payload, out payloadOffset, out payloadCount); var actorLookupRequestData = this.ChannelConfiguration .FrameBuilder .ControlFrameDataDecoder .DecodeFrameData <ActorIdentityLookup>(payload, payloadOffset, payloadCount); var lookupActorType = actorLookupRequestData != null ? actorLookupRequestData.Type : null; var actorCollection = new ActorIdentityCollection(); actorCollection.Items.AddRange(this.GetAllActors().Where(a => a.Type == lookupActorType).ToList()); var actorLookupResponseData = this.ChannelConfiguration.FrameBuilder.ControlFrameDataEncoder.EncodeFrameData(actorCollection); var actorLookupResponse = new HereFrame(actorLookupResponseData); var actorLookupRequestBuffer = this.ChannelConfiguration.FrameBuilder.EncodeFrame(actorLookupResponse); _log.InfoFormat("Lookup actors [{0}], RemoteActor[{1}].", actorCollection.Items.Count, e.RemoteActor); this.BeginSend(e.RemoteActor.Type, e.RemoteActor.Name, actorLookupRequestBuffer); } else { base.OnActorDataReceived(sender, e); } }
/// <summary> /// Translates a binary ZMQ message into the appropriate sub-class of <see cref="ClientMessage"/> /// </summary> /// <param name="message">A single ZMQ message consisting of 1 or more frames of 0 or more bytes</param> /// <returns>An instance of a sub-class of <see cref="ClientMessage"/></returns> public static ClientMessage Decode(byte[][] message) { var talk = new { target = "", details = "" }; switch (message?.Length) { case 4 when TryGetString(message[0], out string sender) && message[1]?.Length == 0 && TalkFrame.SequenceEqual(message[2]) && TryDecode(message[3], ref talk): return(new Talk(sender, talk.target, talk.details)); case 3 when TryGetString(message[0], out string sender) && message[1]?.Length == 0 && HereFrame.SequenceEqual(message[2]): return(new Here(sender)); default: return(None); } }