Exemple #1
0
        public override IMessage Invoke(IMessage myIMessage)
        {
            IMethodCallMessage calldata = myIMessage as IMethodCallMessage;
            object             oret     = null;
            string             mtdname  = myIMessage.Properties["__MethodName"].ToString();

            if ((mtdname.StartsWith("add_") || mtdname.StartsWith("remove_")) && calldata.InArgs.Length == 1 && calldata.InArgs[0] is Delegate)
            {
                string callname      = "";
                string arg           = "";
                string eventname     = "";
                string callermtdname = ((Delegate)calldata.InArgs[0]).Method.Name;
                if (mtdname.StartsWith("add_"))
                {
                    eventname = mtdname.Substring(4);
                    eventmgr.AddEvent(eventname, (Delegate)calldata.InArgs[0]);
                    callname = "add_event";
                    arg      = string.Format("{0}/{1}/{2}", eventname, eventserver.Name, callermtdname);
                }
                else if (mtdname.StartsWith("remove_"))
                {
                    callname  = "remove_event";
                    eventname = mtdname.Substring(7);
                    eventmgr.RemoveEvent(eventname, callermtdname);
                    arg = string.Format("{0}/{1}/{2}", eventname, eventserver.Name, callermtdname);
                }
                Exception ex;
                if (InvokeMember(callname, new object[] { arg }, out oret, out ex))
                {
                    return(new ReturnMessage(oret, null, 0, null, null));
                }
                return(new ReturnMessage(ex, calldata));
            }

            object[] newargs = new object[calldata.Args.Length];
            Array.Copy(calldata.Args, newargs, calldata.Args.Length);
            if (callmode == Callmode.sync || !basynccall)
            {
                Exception ex;
                if (!InvokeMember(calldata.MethodName, newargs, out oret, out ex))
                {
                    return(new ReturnMessage(ex, calldata));
                }
            }
            else
            {
                APIData apidata = new APIData();
                apidata.calldata = calldata;
                apidata.retargs  = newargs;
                asynccallserver.AddItem(new object[] { apidata });
            }
            return(new ReturnMessage(oret, newargs, newargs.Length, null, null));
        }
Exemple #2
0
        void InvokeAsync(object apidata)
        {
            APIData   apicalldata = (APIData)apidata;
            Exception ex;
            bool      bret = InvokeMember(apicalldata.calldata.MethodName, apicalldata.retargs, out apicalldata.retval, out ex);

            if (basynccallback || callback != null)
            {
                callbackserver.DoAction = callback;
                callbackserver.AddItem((bret)?(new object[] { apicalldata }):new object[] { ex });
            }
        }