예제 #1
0
        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);
            }
        }
예제 #2
0
        /// <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);
            }
        }