public void MessageReceived(AriesClient client, object message) { PendingDataRequest pendingRequest = null; lock (PendingCallbacks) { var dataPacket = message as DataServiceWrapperPDU; if (dataPacket == null) { return; } if (dataPacket.Body is cTSOTopicUpdateMessage) { this.ApplyUpdate((cTSOTopicUpdateMessage)dataPacket.Body, NullSecurityContext.INSTANCE); } if (PendingCallbacks.ContainsKey(dataPacket.SendingAvatarID)) { pendingRequest = PendingCallbacks[dataPacket.SendingAvatarID]; PendingCallbacks.Remove(dataPacket.SendingAvatarID); } } if (pendingRequest != null) { pendingRequest.Resolve(); } }
public Task <object> Request(MaskedStruct mask, uint id) { var messageId = NextMessageId(); var request = new DataServiceWrapperPDU() { RequestTypeID = mask.GetID(), SendingAvatarID = messageId, //Reusing this field for easier callbacks rather than scoping them Body = new cTSONetMessageStandard() { DataServiceType = mask.GetID(), Parameter = id } }; CityClient.Write(request); //TODO: Add timeouts var result = new PendingDataRequest(messageId, this, Get(mask, id)); lock (PendingCallbacks) PendingCallbacks.Add(messageId, result); return(result.Task); }