/// <summary> /// Calls all waiters waiting on the given asset UUID /// </summary> /// <param name="message"></param> private void CallGetWaiters(ServerResponseMsg message, Asset asset) { List <ResponseWaiter> getWaitList = _getResponseWaiters[message.AssetUUID]; foreach (ResponseWaiter waiter in getWaitList) { waiter.response = message; waiter.asset = asset; waiter.waitEvent.Set(); this.HandleAsyncResponse(waiter); } //remove the list, everyone has been notified _getResponseWaiters.Remove(message.AssetUUID); }
private Asset TryConstructAsset(ServerResponseMsg message, ResponseWaiter topWaiter) { if (topWaiter.type == ClientRequestMsg.RequestType.GET) { if (message.Status == ServerResponseMsg.Result.FOUND) { return new Asset(message.Data); } } return null; }
/// <summary> /// Loop that receives traffic on the wire and dispatches results /// </summary> private void ReceiveLoop() { //wait for packets on the wire while (! _stopping) { try { ServerResponseMsg message = new ServerResponseMsg(_conn); //we should have a fully formed message //pop the oldest request ResponseWaiter topWaiter; lock (_waitingRequests) { topWaiter = _waitingRequests.Dequeue(); } //test if this is a successful GET and construct an asset Asset asset = this.TryConstructAsset(message, topWaiter); //notify the root waiter topWaiter.response = message; topWaiter.asset = asset; topWaiter.waitEvent.Set(); //if this is a get request, also notify all the waiters and pull the entry if (topWaiter.type == ClientRequestMsg.RequestType.GET) { lock (_getResponseWaiters) { if (_getResponseWaiters.ContainsKey(message.AssetUUID)) { this.CallGetWaiters(message, asset); } } } } catch (SocketException e) { this.HandleReceiveError(e); } catch (AssetServerError e) { this.HandleReceiveError(e); } catch (AssetProtocolError e) { _conn.Disconnect(false); this.HandleReceiveError(e); } } //end while }
private AssetServerError DetermineErrorFromStatus(ServerResponseMsg response) { if (response.Status == ServerResponseMsg.Result.ERROR) { return new AssetServerError(response.ErrorMessage); } if (response.Status == ServerResponseMsg.Result.NOT_FOUND) { return new AssetServerError("Asset " + response.AssetUUID + " was not found"); } return null; }
/// <summary> /// Calls all waiters waiting on the given asset UUID /// </summary> /// <param name="message"></param> private void CallGetWaiters(ServerResponseMsg message, Asset asset) { List<ResponseWaiter> getWaitList = _getResponseWaiters[message.AssetUUID]; foreach (ResponseWaiter waiter in getWaitList) { waiter.response = message; waiter.asset = asset; waiter.waitEvent.Set(); this.HandleAsyncResponse(waiter); } //remove the list, everyone has been notified _getResponseWaiters.Remove(message.AssetUUID); }