public override ReturnCode Execute( Interpreter interpreter, IClientData clientData, ArgumentList arguments, ref Result result ) { ReturnCode code = ReturnCode.Ok; if (interpreter != null) { if (arguments != null) { if ((arguments.Count == 1) || (arguments.Count == 2)) { bool idleTasks = false; if (arguments.Count == 2) { if (String.Compare(arguments[1], "idletasks", StringOps.SystemStringComparisonType) == 0) { idleTasks = true; } else { result = String.Format( "bad option \"{0}\": must be idletasks", arguments[1]); code = ReturnCode.Error; } } if ((code == ReturnCode.Ok) && idleTasks) { code = EventOps.Wait(interpreter, 0, true, false, ref result); } if (code == ReturnCode.Ok) { code = EventOps.ProcessEvents( interpreter, interpreter.UpdateEventFlags, EventPriority.Update, 0, true, false, ref result); } if ((code == ReturnCode.Ok) && !idleTasks) { code = EventOps.Wait(interpreter, 0, true, false, ref result); } } else { result = "wrong # args: should be \"update ?idletasks?\""; code = ReturnCode.Error; } } else { result = "invalid argument list"; code = ReturnCode.Error; } } else { result = "invalid interpreter"; code = ReturnCode.Error; } return(code); }
public ManagedObject(object obj) { // Console.WriteLine ("new ManagedObject created wrapping object of type {0}, handle == {1}", obj.GetType(), Handle); managed = obj; lock (cachedObjects) cachedObjects[obj] = new WeakReference(this); Type type = obj.GetType(); bool isScriptable = type.IsDefined(typeof(ScriptableTypeAttribute), true); // add properties TypeOps typeOps = null; foreach (PropertyInfo pi in type.GetProperties()) { if (!isScriptable && !pi.IsDefined(typeof(ScriptableMemberAttribute), true)) { continue; } RegisterScriptableProperty(pi); if (IsCreateable(pi.PropertyType)) { typeOps = typeOps ?? new TypeOps(); typeOps.RegisterCreateableType(pi.PropertyType); } } // add events foreach (EventInfo ei in type.GetEvents()) { if (!isScriptable && !ei.IsDefined(typeof(ScriptableMemberAttribute), true)) { continue; } RegisterScriptableEvent(ei); HasEvents = true; // XXX toshok - do we need to RegisterCreateableTypes for parameters on the delegate? } // add functions foreach (MethodInfo mi in type.GetMethods()) { if (!isScriptable && !mi.IsDefined(typeof(ScriptableMemberAttribute), true)) { continue; } RegisterScriptableMethod(mi); if (IsCreateable(mi)) { typeOps = typeOps ?? new TypeOps(); typeOps.RegisterCreateableTypes(mi); } } if (typeOps != null) { RegisterBuiltinScriptableMethod(typeof(TypeOps).GetMethod("CreateManagedObject"), "createManagedObject", typeOps); } if (HasEvents) { EventOps eventOps = new EventOps(this); Type eventOpsType = typeof(EventOps); RegisterBuiltinScriptableMethod(eventOpsType.GetMethod("AddEventListener"), "addEventListener", eventOps); RegisterBuiltinScriptableMethod(eventOpsType.GetMethod("RemoveEventListener"), "removeEventListener", eventOps); } RegisterScriptableMethod(type.GetMethod("ToString", Type.EmptyTypes), "toString"); if (ManagedObject is IList) { if (type.GetProperty("Length") != null) { RegisterScriptableProperty(type.GetProperty("Length"), "length"); } else if (type.GetProperty("Count") != null) { RegisterScriptableProperty(type.GetProperty("Count"), "length"); } foreach (MethodInfo mi in type.GetMethods()) { switch (mi.Name) { case "IndexOf": RegisterScriptableMethod(mi, "indexOf"); break; case "LastIndexOf": RegisterScriptableMethod(mi, "lastIndexOf"); break; case "ToArray": RegisterScriptableMethod(mi, "toArray"); break; } } Type listType = typeof(object); if (type.IsArray) { listType = type.GetElementType(); } else { foreach (Type t in type.GetInterfaces()) { if (t.IsGenericType && t.GetGenericTypeDefinition() == typeof(IList <>)) { listType = t.GetGenericArguments()[0]; break; } } } var listOps = CreateListOpsInstance(listType); Type listOpsType = listOps.GetType(); if (type.GetProperty("Item") != null) { RegisterScriptableProperty(type.GetProperty("Item"), "item"); } else { RegisterScriptableProperty(listOpsType.GetProperty("Item"), "item", listOps); } RegisterScriptableMethod(listOpsType.GetMethod("Pop"), "pop", listOps); RegisterScriptableMethod(listOpsType.GetMethod("Push"), "push", listOps); RegisterScriptableMethod(listOpsType.GetMethod("Reverse"), "reverse", listOps); RegisterScriptableMethod(listOpsType.GetMethod("Shift"), "shift", listOps); RegisterScriptableMethod(listOpsType.GetMethod("Unshift"), "unshift", listOps); RegisterScriptableMethod(listOpsType.GetMethod("Splice"), "splice", listOps); } else if (ManagedObject is IDictionary) { DictOps dictOps = new DictOps((IDictionary)ManagedObject); Type dictOpsType = typeof(DictOps); RegisterScriptableProperty(dictOpsType.GetProperty("Item"), "item", dictOps); } }
public override ReturnCode Execute( Interpreter interpreter, IClientData clientData, ArgumentList arguments, ref Result result ) { ReturnCode code = ReturnCode.Ok; if (interpreter != null) { if (arguments != null) { if (arguments.Count >= 2) { string subCommand = arguments[1]; bool tried = false; code = ScriptOps.TryExecuteSubCommandFromEnsemble( interpreter, this, clientData, arguments, false, false, ref subCommand, ref tried, ref result); if ((code == ReturnCode.Ok) && !tried) { switch (subCommand) { case "active": { if (arguments.Count == 2) { IEventManager eventManager = interpreter.EventManager; if (EventOps.ManagerIsOk(eventManager)) { result = eventManager.Active; code = ReturnCode.Ok; } else { result = "event manager not available"; code = ReturnCode.Error; } } else { result = "wrong # args: should be \"after active\""; code = ReturnCode.Error; } break; } case "cancel": { if (arguments.Count >= 3) { string text; if (arguments.Count == 3) { text = arguments[2]; } else { text = ListOps.Concat(arguments, 2); } IEventManager eventManager = interpreter.EventManager; if (EventOps.ManagerIsOk(eventManager)) { code = eventManager.CancelEvents( text, false, false, ref result); } else { result = "event manager not available"; code = ReturnCode.Error; } } else { result = "wrong # args: should be \"after cancel arg ?arg ...?\""; code = ReturnCode.Error; } break; } case "clear": { if (arguments.Count == 2) { IEventManager eventManager = interpreter.EventManager; if (EventOps.ManagerIsOk(eventManager)) { code = eventManager.ClearEvents(ref result); if (code == ReturnCode.Ok) { result = String.Empty; } } else { result = "event manager not available"; code = ReturnCode.Error; } } else { result = "wrong # args: should be \"after clear\""; code = ReturnCode.Error; } break; } case "counts": { if (arguments.Count == 2) { IEventManager eventManager = interpreter.EventManager; if (EventOps.ManagerIsOk(eventManager)) { result = StringList.MakeList( "enabled", eventManager.Enabled, "active", eventManager.Active, "createEventCount", Event.CreateCount, "disposeEventCount", Event.DisposeCount, "queueEventCount", eventManager.QueueEventCount, "queueIdleEventCount", eventManager.QueueIdleEventCount, "eventCount", eventManager.EventCount, "idleEventCount", eventManager.IdleEventCount, "totalEventCount", eventManager.TotalEventCount, "maximumEventCount", eventManager.MaximumEventCount, "maximumIdleEventCount", eventManager.MaximumIdleEventCount, "maybeDisposeEventCount", eventManager.MaybeDisposeEventCount, "reallyDisposeEventCount", eventManager.ReallyDisposeEventCount, "interpreterEventCount", interpreter.EventCount, #if NATIVE && TCL "interpreterTclEventCount", interpreter.TclEventCount, #endif "interpreterWaitCount", interpreter.WaitCount, "interpreterWaitSpinCount", interpreter.WaitSpinCount); code = ReturnCode.Ok; } else { result = "event manager not available"; code = ReturnCode.Error; } } else { result = "wrong # args: should be \"after counts\""; code = ReturnCode.Error; } break; } case "dump": { if (arguments.Count == 2) { IEventManager eventManager = interpreter.EventManager; if (EventOps.ManagerIsOk(eventManager)) { code = eventManager.Dump(ref result); } else { result = "event manager not available"; code = ReturnCode.Error; } } else { result = "wrong # args: should be \"after dump\""; code = ReturnCode.Error; } break; } case "enable": { if ((arguments.Count == 2) || (arguments.Count == 3)) { IEventManager eventManager = interpreter.EventManager; if (EventOps.ManagerIsOk(eventManager)) { if (arguments.Count == 3) { bool enabled = false; code = Value.GetBoolean2( arguments[2], ValueFlags.AnyBoolean, interpreter.CultureInfo, ref enabled, ref result); if (code == ReturnCode.Ok) { eventManager.Enabled = enabled; } } if (code == ReturnCode.Ok) { result = eventManager.Enabled; } } else { result = "event manager not available"; code = ReturnCode.Error; } } else { result = "wrong # args: should be \"after enable ?enabled?\""; code = ReturnCode.Error; } break; } case "flags": { if ((arguments.Count == 2) || (arguments.Count == 3)) { lock (interpreter.SyncRoot) /* TRANSACTIONAL */ { if (arguments.Count == 3) { object enumValue = EnumOps.TryParseFlagsEnum( interpreter, typeof(EventFlags), interpreter.AfterEventFlags.ToString(), arguments[2], interpreter.CultureInfo, true, true, true, ref result); if (enumValue is EventFlags) { interpreter.AfterEventFlags = (EventFlags)enumValue; } else { code = ReturnCode.Error; } } if (code == ReturnCode.Ok) { result = interpreter.AfterEventFlags; } } } else { result = "wrong # args: should be \"after flags ?flags?\""; code = ReturnCode.Error; } break; } case "idle": { if (arguments.Count >= 3) { IEventManager eventManager = interpreter.EventManager; if (EventOps.ManagerIsOk(eventManager)) { // // FIXME: PRI 5: Somewhat arbitrary, we cannot be "idle" with no // windows message loop. // string name = FormatOps.Id(this.Name, null, interpreter.NextId()); DateTime now = TimeOps.GetUtcNow(); DateTime dateTime = now.AddMilliseconds(EventManager.MinimumIdleWaitTime); string text; if (arguments.Count == 3) { text = arguments[2]; } else { text = ListOps.Concat(arguments, 2); } IScript script = interpreter.CreateAfterScript( name, null, null, ScriptTypes.Idle, text, now, EngineMode.EvaluateScript, ScriptFlags.None, clientData, true); code = eventManager.QueueScript( name, dateTime, script, script.EventFlags, EventPriority.Idle, ref result); if (code == ReturnCode.Ok) { result = name; } } else { result = "event manager not available"; code = ReturnCode.Error; } } else { result = "wrong # args: should be \"after idle arg ?arg ...?\""; code = ReturnCode.Error; } break; } case "info": { if ((arguments.Count == 2) || (arguments.Count == 3)) { IEventManager eventManager = interpreter.EventManager; if (EventOps.ManagerIsOk(eventManager)) { if (arguments.Count == 3) { IEvent @event = null; code = eventManager.GetEvent( arguments[2], ref @event, ref result); if (code == ReturnCode.Ok) { if (EventManager.IsScriptEvent(@event)) { if (@event.ClientData != null) { IScript script = @event.ClientData.Data as IScript; if (script != null) { result = script.ToString(); } else { result = String.Format( "event \"{0}\" clientData is not a script", arguments[2]); code = ReturnCode.Error; } } else { result = String.Format( "event \"{0}\" has invalid clientData", arguments[2]); code = ReturnCode.Error; } } else { result = String.Format( "event \"{0}\" is not an after event", arguments[2]); code = ReturnCode.Error; } } } else { StringList list = null; code = eventManager.ListEvents(null, false, ref list, ref result); if (code == ReturnCode.Ok) { result = list; } } } else { result = "event manager not available"; code = ReturnCode.Error; } } else { result = "wrong # args: should be \"after info ?id?\""; code = ReturnCode.Error; } break; } default: { long milliseconds = 0; // for idle, execute the script right now. code = Value.GetWideInteger2( subCommand, ValueFlags.AnyWideInteger, interpreter.CultureInfo, ref milliseconds, ref result); if (code == ReturnCode.Ok) { if (arguments.Count == 2) { // // BUGBUG: This call will never timeout if we cannot obtain // the interpreter lock. // code = EventOps.Wait( interpreter, PerformanceOps.GetMicroseconds(milliseconds), false, false, ref result); if (code == ReturnCode.Ok) { result = String.Empty; } } else if (arguments.Count >= 3) { IEventManager eventManager = interpreter.EventManager; if (EventOps.ManagerIsOk(eventManager)) { string name = FormatOps.Id(this.Name, null, interpreter.NextId()); DateTime now = TimeOps.GetUtcNow(); DateTime dateTime = now.AddMilliseconds(milliseconds); string text; if (arguments.Count == 3) { text = arguments[2]; } else { text = ListOps.Concat(arguments, 2); } IScript script = interpreter.CreateAfterScript( name, null, null, ScriptTypes.Timer, text, now, EngineMode.EvaluateScript, ScriptFlags.None, clientData, false); code = eventManager.QueueScript( name, dateTime, script, script.EventFlags, EventPriority.After, ref result); if (code == ReturnCode.Ok) { result = name; } } else { result = "event manager not available"; code = ReturnCode.Error; } } else { result = "wrong # args: should be \"after milliseconds arg ?arg ...?\""; code = ReturnCode.Error; } } else { result = ScriptOps.BadSubCommand( interpreter, null, "argument", subCommand, this, null, ", or a number"); } break; } } } } else { result = "wrong # args: should be \"after option ?arg ...?\""; code = ReturnCode.Error; } } else { result = "invalid argument list"; code = ReturnCode.Error; } } else { result = "invalid interpreter"; code = ReturnCode.Error; } return(code); }
public ManagedObject (object obj) { // Console.WriteLine ("new ManagedObject created wrapping object of type {0}, handle == {1}", obj.GetType(), Handle); managed = obj; Type type = obj.GetType (); bool isScriptable = type.IsDefined (typeof(ScriptableTypeAttribute), true); // add properties foreach (PropertyInfo pi in type.GetProperties ()) { if (!isScriptable && !pi.IsDefined (typeof(ScriptableMemberAttribute), true)) continue; RegisterScriptableProperty (pi); if (RegisterScriptableTypes (pi)) HasTypes = true; } // add events foreach (EventInfo ei in type.GetEvents ()) { if (!isScriptable && !ei.IsDefined (typeof(ScriptableMemberAttribute), true)) continue; RegisterScriptableEvent (ei); HasEvents = true; // XXX toshok - do we need to RegisterScriptableTypes for parameters on the delegate? } // add functions foreach (MethodInfo mi in type.GetMethods ()) { if (!isScriptable && !mi.IsDefined (typeof(ScriptableMemberAttribute), true)) continue; RegisterScriptableMethod (mi); if (RegisterScriptableTypes (mi)) HasTypes = true; } if (HasTypes) { TypeOps typeOps = new TypeOps (); Type typeOpsType = typeof (TypeOps); RegisterBuiltinScriptableMethod (typeOpsType.GetMethod ("CreateManagedObject"), "createManagedObject", typeOps); } if (HasEvents) { EventOps eventOps = new EventOps (this); Type eventOpsType = typeof (EventOps); RegisterBuiltinScriptableMethod (eventOpsType.GetMethod ("AddEventListener"), "addEventListener", eventOps); RegisterBuiltinScriptableMethod (eventOpsType.GetMethod ("RemoveEventListener"), "removeEventListener", eventOps); } RegisterScriptableMethod (type.GetMethod ("ToString"), "toString"); if (ManagedObject is IList) { if (type.GetProperty ("Length") != null) RegisterScriptableProperty (type.GetProperty ("Length"), "length"); else if (type.GetProperty ("Count") != null) RegisterScriptableProperty (type.GetProperty ("Count"), "length"); foreach (MethodInfo mi in type.GetMethods ()) { switch (mi.Name) { case "IndexOf": RegisterScriptableMethod (mi, "indexOf"); break; case "LastIndexOf": RegisterScriptableMethod (mi, "lastIndexOf"); break; case "ToArray": RegisterScriptableMethod (mi, "toArray"); break; } } ListOps listOps = new ListOps ((IList)ManagedObject); Type listOpsType = typeof (ListOps); if (type.GetProperty ("Item") != null) RegisterScriptableProperty (type.GetProperty ("Item"), "item"); else RegisterScriptableProperty (listOpsType.GetProperty ("Item"), "item", listOps); RegisterScriptableMethod (listOpsType.GetMethod ("Pop"), "pop", listOps); RegisterScriptableMethod (listOpsType.GetMethod ("Push"), "push", listOps); RegisterScriptableMethod (listOpsType.GetMethod ("Reverse"), "reverse", listOps); RegisterScriptableMethod (listOpsType.GetMethod ("Shift"), "shift", listOps); RegisterScriptableMethod (listOpsType.GetMethod ("Unshift"), "unshift", listOps); RegisterScriptableMethod (listOpsType.GetMethod ("Splice"), "splice", listOps); } else if (ManagedObject is IDictionary) { DictOps dictOps = new DictOps ((IDictionary)ManagedObject); Type dictOpsType = typeof (DictOps); RegisterScriptableProperty (dictOpsType.GetProperty ("Item"), "item", dictOps); } }