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