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); } }