private void OnActorChannelDataReceived(object sender, ActorChannelDataReceivedEventArgs e) { if (ChannelDataReceived != null) { ChannelDataReceived(sender, e); } }
protected virtual void OnActorChannelDataReceived(object sender, ActorChannelDataReceivedEventArgs e) { if (DataReceived != null) { DataReceived(sender, new ActorDataReceivedEventArgs(e.ChannelIdentifier, e.RemoteActor, e.Data, e.DataOffset, e.DataLength)); } }
private void OnCenterChannelDataReceived(object sender, ActorChannelDataReceivedEventArgs e) { ActorFrameHeader actorChangeNotificationFrameHeader = null; bool isHeaderDecoded = this.ChannelConfiguration.FrameBuilder.TryDecodeFrameHeader( e.Data, e.DataOffset, e.DataLength, out actorChangeNotificationFrameHeader); if (isHeaderDecoded && actorChangeNotificationFrameHeader.OpCode == OpCode.Change) { byte[] payload; int payloadOffset; int payloadCount; this.ChannelConfiguration.FrameBuilder.DecodePayload( e.Data, e.DataOffset, actorChangeNotificationFrameHeader, out payload, out payloadOffset, out payloadCount); var actorChangeNotificationData = this.ChannelConfiguration.FrameBuilder.ControlFrameDataDecoder.DecodeFrameData <ActorIdentityCollection>( payload, payloadOffset, payloadCount); var actors = actorChangeNotificationData != null ? actorChangeNotificationData.Items : null; if (actors != null && actors.Any()) { _log.DebugFormat("Actor changed, ActorType[{0}], AvailableCount[{1}].", actors.First().Type, actors.Count); RaiseActorsChanged(actors); } } }
private IEnumerable <ActorIdentity> LookupRemoteActors(string actorType, Func <IEnumerable <ActorIdentity>, IEnumerable <ActorIdentity> > matchActorFunc) { var actorLookupCondition = new ActorIdentityLookup() { Type = actorType, }; var actorLookupRequestData = this.ChannelConfiguration.FrameBuilder.ControlFrameDataEncoder.EncodeFrameData(actorLookupCondition); var actorLookupRequest = new WhereFrame(actorLookupRequestData); var actorLookupRequestBuffer = this.ChannelConfiguration.FrameBuilder.EncodeFrame(actorLookupRequest); ManualResetEventSlim waitingResponse = new ManualResetEventSlim(false); ActorChannelDataReceivedEventArgs lookupResponseEvent = null; EventHandler <ActorChannelDataReceivedEventArgs> onDataReceived = (s, e) => { lookupResponseEvent = e; waitingResponse.Set(); }; _centerChannel.ChannelDataReceived += onDataReceived; _centerChannel.BeginSend(_centerChannel.Identifier, actorLookupRequestBuffer); bool lookedup = waitingResponse.Wait(TimeSpan.FromSeconds(15)); _centerChannel.ChannelDataReceived -= onDataReceived; waitingResponse.Dispose(); if (lookedup && lookupResponseEvent != null) { ActorFrameHeader actorLookupResponseFrameHeader = null; bool isHeaderDecoded = this.ChannelConfiguration.FrameBuilder.TryDecodeFrameHeader( lookupResponseEvent.Data, lookupResponseEvent.DataOffset, lookupResponseEvent.DataLength, out actorLookupResponseFrameHeader); if (isHeaderDecoded && actorLookupResponseFrameHeader.OpCode == OpCode.Here) { byte[] payload; int payloadOffset; int payloadCount; this.ChannelConfiguration.FrameBuilder.DecodePayload( lookupResponseEvent.Data, lookupResponseEvent.DataOffset, actorLookupResponseFrameHeader, out payload, out payloadOffset, out payloadCount); var actorLookupResponseData = this.ChannelConfiguration.FrameBuilder.ControlFrameDataDecoder.DecodeFrameData <ActorIdentityCollection>( payload, payloadOffset, payloadCount); var actors = actorLookupResponseData != null ? actorLookupResponseData.Items : null; if (actors != null) { _log.DebugFormat("Lookup actors, ActorType[{0}], Count[{1}].", actorType, actors.Count); var matchedActors = matchActorFunc(actors); if (matchedActors != null && matchedActors.Any()) { _log.DebugFormat("Resolve actors, ActorType[{0}], Count[{1}].", actorType, matchedActors.Count()); return(matchedActors); } } } } return(null); }
protected override void OnActorChannelDataReceived(object sender, ActorChannelDataReceivedEventArgs 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.DebugFormat("Lookup actors, ActorType[{0}], Count[{1}], RemoteActor[{2}].", lookupActorType, actorCollection.Items.Count, e.RemoteActor); this.Send(e.RemoteActor, actorLookupRequestBuffer); } else { base.OnActorChannelDataReceived(sender, e); } }