Пример #1
0
        private void XmrTestPev(string[] args, int indx)
        {
            bool flagAll    = false;
            int  numScripts = 0;

            XMRInstance[] instances;

            // Decode command line options.
            int           i, j;
            List <string> selargs = new List <string>(args.Length);

            MethodInfo[] eventmethods = typeof(IEventHandlers).GetMethods();
            MethodInfo   eventmethod;

            for (i = indx; i < args.Length; i++)
            {
                string arg = args[i];
                if (arg == "-all")
                {
                    flagAll = true;
                    continue;
                }
                if (arg == "-help")
                {
                    m_log.Info("[YEngine]: yeng pev -all | <part-of-script-name> <event-name> <params...>");
                    return;
                }
                if (arg[0] == '-')
                {
                    m_log.Error("[YEngine]: unknown option " + arg + ", try 'yeng pev -help'");
                    return;
                }
                for (j = 0; j < eventmethods.Length; j++)
                {
                    eventmethod = eventmethods[j];
                    if (eventmethod.Name == arg)
                    {
                        goto gotevent;
                    }
                }
                selargs.Add(arg);
            }
            m_log.Error("[YEngine]: missing <event-name> <params...>, try 'yeng pev -help'");
            return;

gotevent:
            string eventname = eventmethod.Name;
            StringBuilder sourcesb = new StringBuilder();

            while (++i < args.Length)
            {
                sourcesb.Append(' ');
                sourcesb.Append(args[i]);
            }
            string sourcest = sourcesb.ToString();
            string sourcehash;

            youveanerror = false;
            Token t = TokenBegin.Construct("", null, ErrorMsg, sourcest, out sourcehash);

            if (youveanerror)
            {
                return;
            }
            ParameterInfo[] paraminfos  = eventmethod.GetParameters();
            object[]        paramvalues = new object[paraminfos.Length];
            i = 0;
            while (!((t = t.nextToken) is TokenEnd))
            {
                if (i >= paramvalues.Length)
                {
                    ErrorMsg(t, "extra parameter(s)");
                    return;
                }
                paramvalues[i] = ParseParamValue(ref t);
                if (paramvalues[i] == null)
                {
                    return;
                }
                i++;
            }
            ScriptEngine.Shared.EventParams eps =
                new ScriptEngine.Shared.EventParams(eventname, paramvalues, zeroDetectParams);

            // Scan instance list to find those that match selection criteria.
            if (!Monitor.TryEnter(m_InstancesDict, 100))
            {
                m_log.Error("[YEngine]: deadlock m_LockedDict=" + m_LockedDict);
                return;
            }

            try
            {
                instances = new XMRInstance[m_InstancesDict.Count];
                foreach (XMRInstance ins in m_InstancesDict.Values)
                {
                    if (flagAll || InstanceMatchesArgs(ins, selargs.ToArray(), 0))
                    {
                        instances[numScripts++] = ins;
                    }
                }
            }
            finally
            {
                Monitor.Exit(m_InstancesDict);
            }

            // Post event to the matching instances.
            for (i = 0; i < numScripts; i++)
            {
                XMRInstance inst = instances[i];
                m_log.Info("[YEngine]: post " + eventname + " to " + inst.m_DescName);
                inst.PostEvent(eps);
            }
        }