private static void HandleResponders(IEnumerable <Responder> responders, AsyncToken token) { foreach (Responder responder in responders) { token.AddResponder(responder); } }
/// <summary> /// Sends a request /// This method is always called when calling any of Send overrides /// </summary> /// <param name="request"></param> /// <returns></returns> public AsyncToken Send(WebRequest request) { if (string.IsNullOrEmpty(request.Url)) { throw new Exception("URL not set"); } if (CacheBuster) { request.CacheBuster = true; } #region Handling relative ULRs string url = request.Url; if (url.StartsWith("~")) { url = Url + request.Url.TrimStart('~'); } request.Url = url; #endregion #if DEBUG if (DebugMode || LogCalls) { Debug.Log(string.Format(@"* {0} {1}", this, request)); } #endif // create token AsyncToken token = new AsyncToken { Request = request, Timeout = Timeout }; // add it to queue _queued.Add(token); if (!SystemManager.Instance.UpdateSignal.HasSlot(UpdateSlot)) { #if DEBUG if (DebugMode) { Debug.Log("Connecting to UpdateSignal"); } #endif SystemManager.Instance.UpdateSignal.Connect(UpdateSlot); } IsWorking = true; DispatchStatusEvent(); // return it to caller return(token); }
/// <summary> /// Cancels the request /// </summary> /// <param name="token"></param> public void Cancel(AsyncToken token) { // todo: execute responders! (we need this to remove progress bars etc.) token.Dispose(); _queued.Remove(token); _active.Remove(token); _finished.Remove(token); _synced.Remove(token); _forRemoval.Remove(token); DispatchStatusEvent(); }
///<summary> /// Sends a request ///</summary> ///<param name="responders"></param> ///<returns></returns> ///<exception cref="Exception"></exception> public AsyncToken Send(params Responder[] responders) { if (string.IsNullOrEmpty(Url)) { throw new Exception("Url not defined"); } AsyncToken token = Send(new WebRequest(Url)); HandleResponders(responders, token); return(token); }
/// <summary> /// Clones the token (without responders) /// Copies Data /// Sets this as original token /// </summary> /// <returns></returns> public object Clone() { AsyncToken original = Original ?? this; AsyncToken token = new AsyncToken { Original = original, Request = original.Request, Response = original.Response, StartTime = original.StartTime, Data = Data }; return(token); }
/// <summary> /// Clones the token (without responders) /// Copies Data /// Sets this as original token /// </summary> /// <returns></returns> public object Clone() { AsyncToken original = Original ?? this; AsyncToken token = new AsyncToken { Original = original, Request = original.Request, Response = original.Response, StartTime = original.StartTime, Data = Data }; return token; }
private void GenerateWww(AsyncToken token) { token.Response = token.Request.CreateWww(); // the WWW request is now alive! token.Timeout = Timeout; token.StartTime = DateTime.Now; }
private static void HandleResponders(IEnumerable<Responder> responders, AsyncToken token) { foreach (Responder responder in responders) { token.AddResponder(responder); } }
/// <summary> /// Sends a request /// This method is always called when calling any of Send overrides /// </summary> /// <param name="request"></param> /// <returns></returns> public AsyncToken Send(WebRequest request) { if (string.IsNullOrEmpty(request.Url)) throw new Exception("URL not set"); if (CacheBuster) request.CacheBuster = true; #region Handling relative ULRs string url = request.Url; if (url.StartsWith("~")) { url = Url + request.Url.TrimStart('~'); } request.Url = url; #endregion #if DEBUG if (DebugMode || LogCalls) Debug.Log(string.Format(@"* {0} {1}", this, request)); #endif // create token AsyncToken token = new AsyncToken {Request = request, Timeout = Timeout}; // add it to queue _queued.Add(token); if (!SystemManager.Instance.UpdateSignal.HasSlot(UpdateSlot)) { #if DEBUG if (DebugMode) { Debug.Log("Connecting to UpdateSignal"); } #endif SystemManager.Instance.UpdateSignal.Connect(UpdateSlot); } IsWorking = true; DispatchStatusEvent(); // return it to caller return token; }
private void QueuedToActive(AsyncToken token) { #if DEBUG if (DebugMode) Debug.Log(GetInfo()); #endif // create WWW GenerateWww(token); _active.Add(token); // in Sync and SyncAll modes add it to synced list also if (ProcessingMode.Async != ProcessingMode) _synced.Add(token); // remove from queued _queued.Remove(token); #if DEBUG if (DebugMode || LogCalls) { Debug.Log(string.Format(@"{0} queued --1--> {1} active", _queued.Count, _active.Count)); } #endif DispatchStatusEvent(); }
private void ProcessResponders(AsyncToken token) { if (token.IsTimeout){ DispatchEvent(new Event(TIMEOUT)); token.Response.Dispose(); } /* Timeout */ if (token.IsTimeout /*|| !token.Response.isDone*/) // response never returned, timeout expired { #if DEBUG if (DebugMode) { Debug.Log("1 request timeout"); } #endif token.Responders.ForEach(delegate(Responder responder) { // If no fault handler defined for the responder, // and one is defined globally // reference that handler if (null == responder.FaultHandler) { responder.FaultHandler = FaultHandler ?? DefaultFaultHandler; } responder.Fault("Request timeout"); }); } /* Error */ else if (!string.IsNullOrEmpty(token.Response.error)) // NOTE: Response could have isDone == true and still have and error! { #if DEBUG if (DebugMode) { Debug.Log("Error: " + token.Response.error); } #endif token.Responders.ForEach(delegate(Responder responder) { // If no fault handler defined for the responder, // and one is defined globally // reference that handler if (null == responder.FaultHandler) { responder.FaultHandler = FaultHandler ?? DefaultFaultHandler; } responder.Fault(token.Response.error); }); } /* OK */ else { //token.Result = token.Response; // add result to token (for alternative processing) //Debug.Log(1); token.Responders.ForEach(delegate(Responder responder) { try { //if (DebugMode) // Debug.Log("ProcessResponders: token.Response.isDone: " + token.Response.isDone); //Debug.Log(2); switch (ResponseMode) { case ResponseMode.Token: responder.Result(token); break; case ResponseMode.WWW: responder.Result(token.Response); break; } //responder.Result((ResponseMode == ResponseMode.Token) ? token : token.Response); } catch (Exception ex) { Debug.Log("Error executing result responder: " + ex); // NOTE: Silent fail } }); } // clear responders token.ClearResponders(); }
//public void DisposeAllResponses() //{ // _active.ForEach(delegate(AsyncToken token) // { // DisposeResources(token.Response); // }); //} #endregion #region Helper private void GenerateWww(AsyncToken token) { token.Response = token.Request.CreateWww(); // the WWW request is now alive! token.Timeout = Timeout; token.StartTime = DateTime.Now; }
//private void HandleTimeouts() //{ // List<AsyncToken> timeoutRequests = _finished.FindAll(delegate(AsyncToken token) { return !token.Response.isDone; }); // timeoutRequests.ForEach(delegate(AsyncToken token) // { // token.Responders.ForEach(delegate(Responder responder) // { // responder.Fault("Request timeout"); // }); // }); // if (timeoutRequests.Count > 0) // DispatchEvent(new Event(TIMEOUT)); // // remove responses that have time out // _finished.RemoveAll(delegate(AsyncToken token) // { // return !token.Response.isDone; // }); //} #endregion private void ProcessResponders(AsyncToken token) { if (token.IsTimeout) { DispatchEvent(new Event(TIMEOUT)); token.Response.Dispose(); } /* Timeout */ if (token.IsTimeout /*|| !token.Response.isDone*/) // response never returned, timeout expired { #if DEBUG if (DebugMode) { Debug.Log("1 request timeout"); } #endif token.Responders.ForEach(delegate(Responder responder) { // If no fault handler defined for the responder, // and one is defined globally // reference that handler if (null == responder.FaultHandler) { responder.FaultHandler = FaultHandler ?? DefaultFaultHandler; } responder.Fault("Request timeout"); }); } /* Error */ else if (!string.IsNullOrEmpty(token.Response.error)) // NOTE: Response could have isDone == true and still have and error! { #if DEBUG if (DebugMode) { Debug.Log("Error: " + token.Response.error); } #endif token.Responders.ForEach(delegate(Responder responder) { // If no fault handler defined for the responder, // and one is defined globally // reference that handler if (null == responder.FaultHandler) { responder.FaultHandler = FaultHandler ?? DefaultFaultHandler; } responder.Fault(token.Response.error); }); } /* OK */ else { //token.Result = token.Response; // add result to token (for alternative processing) //Debug.Log(1); token.Responders.ForEach(delegate(Responder responder) { try { //if (DebugMode) // Debug.Log("ProcessResponders: token.Response.isDone: " + token.Response.isDone); //Debug.Log(2); switch (ResponseMode) { case ResponseMode.Token: responder.Result(token); break; case ResponseMode.WWW: responder.Result(token.Response); break; } //responder.Result((ResponseMode == ResponseMode.Token) ? token : token.Response); } catch (Exception ex) { Debug.Log("Error executing result responder: " + ex); // NOTE: Silent fail } }); } // clear responders token.ClearResponders(); }