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); } }
private void NotifyActorChanged(ActorIdentity changedActor) { var actorCollection = new ActorIdentityCollection(); actorCollection.Items.AddRange(this.GetAllActors().Where(a => a.Type == changedActor.Type).ToList()); var actorChangedNotificationData = this.ChannelConfiguration.FrameBuilder.ControlFrameDataEncoder.EncodeFrameData(actorCollection); var actorChangedNotification = new ChangeFrame(actorChangedNotificationData); var actorChangedNotificationBuffer = this.ChannelConfiguration.FrameBuilder.EncodeFrame(actorChangedNotification); _log.DebugFormat("Broadcast actors changes, ActorType[{0}], RemainCount[{1}].", changedActor.Type, actorCollection.Items.Count); this.BeginBroadcast(this.GetAllActors().Where(a => a.Type != changedActor.Type).Select(a => a.Type).Distinct(), actorChangedNotificationBuffer); }