/* * Copyright (c) Contributors, http://opensimulator.org/ * See CONTRIBUTORS.TXT for a full list of copyright holders. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the OpenSimulator Project nor the * names of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ using System; using System.Collections; using System.Collections.Generic; using System.Threading; using System.Diagnostics; using OpenMetaverse; using log4net; using OpenSim.Framework; using OpenSim.Region.Framework.Scenes; using OpenSim.Region.ScriptEngine.Shared; using OpenSim.Region.ScriptEngine.Interfaces; namespace OpenSim.Region.ScriptEngine.Interfaces { public enum StateSource { None = -1, RegionStart = 0, NewRez = 1, PrimCrossing = 2, ScriptedRez = 3, AttachedRez = 4, Teleporting = 5 } public interface IScriptWorkItem { bool Cancel(); bool Abort(); /// /// Wait for the work item to complete. /// /// The number of milliseconds to wait. Must be >= -1 (Timeout.Infinite). bool Wait(int t); } /// /// Interface for interaction with a particular script instance /// public interface IScriptInstance { /// /// Debug level for this script instance. /// /// /// Level == 0, no extra data is logged. /// Level >= 1, state changes are logged. /// Level >= 2, event firing is logged. /// /// The debug level. /// int DebugLevel { get; set; } /// /// Is the script currently running? /// bool Running { get; set; } /// /// Is the script suspended? /// bool Suspended { get; set; } /// /// Is the script shutting down? /// bool ShuttingDown { get; set; } /// /// When stopping the script: should it remain stopped permanently (i.e., save !Running in its state)? /// bool StayStopped { get; set; } /// /// Script state /// string State { get; set; } /// /// If true then the engine is responsible for persisted state. If false then some other component may /// persist state (e.g. attachments persisting in assets). /// bool StatePersistedHere { get; } /// /// Time the script was last started /// DateTime TimeStarted { get; } /// /// Collects information about how long the script was executed. /// MetricsCollectorTime ExecutionTime { get; } /// /// Scene part in which this script instance is contained. /// SceneObjectPart Part { get; } IScriptEngine Engine { get; } UUID AppDomain { get; set; } string PrimName { get; } string ScriptName { get; } UUID ItemID { get; } UUID ObjectID { get; } /// /// UUID of the root object for the linkset that the script is in. /// UUID RootObjectID { get; } /// /// Local id of the root object for the linkset that the script is in. /// uint RootLocalID { get; } uint LocalID { get; } UUID AssetID { get; } /// /// Inventory item containing the script used. /// TaskInventoryItem ScriptTask { get; } Queue EventQueue { get; } /// /// Number of events queued for processing. /// long EventsQueued { get; } /// /// Number of events processed by this script instance. /// long EventsProcessed { get; } void ClearQueue(); int StartParam { get; set; } WaitHandle CoopWaitHandle { get; } Stopwatch ExecutionTimer { get; } void RemoveState(); void Init(); void Start(); /// /// Stop the script instance. /// /// /// This must not be called by a thread that is in the process of handling an event for this script. Otherwise /// there is a danger that it will self-abort and not complete the reset. /// /// /// How many milliseconds we will wait for an existing script event to finish before /// forcibly aborting that event. /// If true then the event queue is also cleared /// true if the script was successfully stopped, false otherwise bool Stop(int timeout, bool clearEventQueue = false); void SetState(string state); /// /// Post an event to this script instance. /// /// void PostEvent(EventParams data); void Suspend(); void Resume(); /// /// Process the next event queued for this script instance. /// /// void EventProcessor(); int EventTime(); /// /// Reset the script. /// /// /// This must not be called by a thread that is in the process of handling an event for this script. Otherwise /// there is a danger that it will self-abort and not complete the reset. Such a thread must call /// ApiResetScript() instead. /// /// /// How many milliseconds we will wait for an existing script event to finish before /// forcibly aborting that event prior to script reset. /// void ResetScript(int timeout); /// /// Reset the script. /// /// /// This must not be called by any thread other than the one executing the scripts current event. This is /// because there is no wait or abort logic if another thread is in the middle of processing a script event. /// Such an external thread should use ResetScript() instead. /// void ApiResetScript(); Dictionary GetVars(); void SetVars(Dictionary vars); DetectParams GetDetectParams(int idx); UUID GetDetectID(int idx); void SaveState(); void DestroyScriptInstance(); IScriptApi GetApi(string name); Dictionary, KeyValuePair> LineMap { get; set; } string GetAssemblyName(); string GetXMLState(); double MinEventDelay { set; } UUID RegionID { get; } } }