예제 #1
0
        public IAsyncResult <object> Invoke(RemoteProcedureInfo procedure, params object[] arguments)
        {
            var request = new List <string>();

            request.Add(procedure.Name);
            if (arguments != null && arguments.Length > 0)
            {
                foreach (var a in arguments)
                {
                    request.Add(ArgumentToCommandString(a));
                }
            }
            var command = new CommandData(null, String.Join(" ", request), CommandResponseTimeout, procedure.ReturnType);

            return(EnqueueCommand(command));
        }
예제 #2
0
        public IAsyncResult <object> Invoke(string procedure, params object[] arguments)
        {
            var cmd = new RemoteProcedureInfo(procedure);

            return(Invoke(cmd, arguments));
        }
예제 #3
0
        internal static RemoteProcedureInfo DecodeRemoteProcedureInfo(string command, int id, List <string> responseLines)
        {
            string helpPrefix       = "Help: ";
            string parametersPrefix = "Parameters: ";
            string returnTypePrefix = "Return type: ";
            string lisSBPrefix      = "Lists: ";

            var    returnType = typeof(void);
            string help       = null;
            var    parameters = new List <Tuple <string, Type> >();
            string lists      = null;
            string error      = null;

            foreach (var line in responseLines)
            {
                if (line.StartsWith(helpPrefix))
                {
                    help = line.Substring(helpPrefix.Length);
                }
                else
                {
                    if (line.StartsWith(parametersPrefix, StringComparison.InvariantCulture))
                    {
                        var endIndex         = line.IndexOf('.');
                        var parametersString = line.Substring(parametersPrefix.Length, ((endIndex > 0) ? endIndex : line.Length) - parametersPrefix.Length);
                        var parametersTexts  = parametersString.Split(new string[] { ", " }, StringSplitOptions.RemoveEmptyEntries);
                        foreach (var parameter in parametersTexts)
                        {
                            var    parts = parameter.Split(' ');
                            Type   type  = null;
                            string name  = "";
                            switch (parts.Length)
                            {
                            case 1:
                                name = parameter;
                                type = typeof(object);
                                break;

                            case 2:
                                name = parts[1];
                                type = DecodeTypeString(parts[0]);
                                break;

                            default:
                                break;
                            }
                            if (type == null)
                            {
                                error = "Error decoding parameters.";
                            }
                            else
                            {
                                parameters.Add(new Tuple <string, Type>(name, type));
                            }
                        }
                    }
                    else if (line.StartsWith(lisSBPrefix, StringComparison.InvariantCulture))
                    {
                        lists = line.Substring(lisSBPrefix.Length);
                    }
                    int i = line.IndexOf(returnTypePrefix, StringComparison.InvariantCulture);
                    if (i >= 0)
                    {
                        var typeString = line.Substring(i + returnTypePrefix.Length);
                        returnType = DecodeTypeString(typeString);
                    }
                }
            }
            var procInfo = new RemoteProcedureInfo(command, id, help, returnType, lists, error);

            foreach (var p in parameters)
            {
                procInfo.AddParameter(p.Item1, "", p.Item2);
            }
            return(procInfo);
        }