public void BroadcastEvent(string url, object[] data, Func <IOnPresenterBroadcast, bool> validater, bool needReceiver = false) { List <Component> list; if (!_registedEvents.TryGetValue(url, out list)) { if (needReceiver) { throw new Exception("can not find registed event " + url); } else { return; } } list.RemoveAll(linker => linker == null); var toBroadCastEvent = validater == null ? list : list.Where(e => validater((IOnPresenterBroadcast)e)).ToList(); if (toBroadCastEvent.Count() == 0) { if (needReceiver) { throw new Exception("can not find registed event " + url); } else { return; } } var toSendArgs = new List <MToken>(); for (var i = 0; i < data.Length; i++) { var d = data[i]; var arg = d is MToken ? (MToken)d : MToken.FromObject(d); toSendArgs.Add(arg); } for (var i = 0; i < toBroadCastEvent.Count; i++) { var target = toBroadCastEvent[i] as IOnPresenterBroadcast; target.OnEvent(toSendArgs.ToArray()); } }
public IPresenterResponse RequestWithMTokens(string url, params MToken[] args) { PresenterActionInfo action; if (!_actionMapping.TryGetValue(url, out action)) { Debug.LogErrorFormat("Can not find requested url : {0} ", url); return(new PresenterResponse() { StatusCode = 404, ErrorMessage = "Can not find requested url : " + url }); } var parameters = action.Method.GetParameters(); if (parameters.Length != args.Length) { return(new PresenterResponse() { StatusCode = 500, ErrorMessage = string.Format("request parameter count {0} is not equal with action method parameter count {1}", parameters.Length, args.Length) }); } try { var pList = new List <object>(); for (var i = 0; i < args.Length; i++) { var parameterType = parameters[i].ParameterType; if (parameterType != typeof(MToken) && !parameterType.IsSubclassOf(typeof(MToken))) { var temp = args[i].ToObject(parameterType); pList.Add(temp); } else { pList.Add(args[i]); } } var returnValue = action.Method.Invoke(null, pList.ToArray()); if (returnValue is IPresenterResponse) { return((IPresenterResponse)returnValue); } var data = returnValue is MToken ? (MToken)returnValue : MToken.FromObject(returnValue); return(new PresenterResponse() { StatusCode = 200, Data = new MToken[] { data } }); } catch (Exception e) { Debug.LogException(e); return(new PresenterResponse() { StatusCode = 500, ErrorMessage = e.Message }); } }
void Update() { lock (_asyncActionTasks) { for (var i = 0; i < _asyncActionTasks.Count; i++) { var task = _asyncActionTasks[i]; if (task.Completed) { if (task.CallLinker == null) { Debug.LogWarningFormat("liner {0} is already destroyed", task.CallerName); } else { var responseArgs = task.Data.Select(a => a is MToken ? (MToken)a : MToken.FromObject(a)).ToArray(); task.OnResponse(new PresenterResponse() { StatusCode = 200, Data = responseArgs }); } } } _asyncActionTasks.RemoveAll(a => a.Completed); } }