/// <summary> /// Remove a specific script (and all its pending commands) /// </summary> /// <param name="localID"></param> /// <param name="itemID"></param> public static void RemoveScript(IScriptEngine engine, uint localID, UUID itemID) { // Remove a specific script // Remove dataserver events m_Dataserver[engine].RemoveEvents(localID, itemID); // Remove from: Timers m_Timer[engine].UnSetTimerEvents(localID, itemID); // Remove from: HttpRequest IHttpRequestModule iHttpReq = engine.World.RequestModuleInterface <IHttpRequestModule>(); iHttpReq.StopHttpRequest(localID, itemID); IWorldComm comms = engine.World.RequestModuleInterface <IWorldComm>(); if (comms != null) { comms.DeleteListener(itemID); } IXMLRPC xmlrpc = engine.World.RequestModuleInterface <IXMLRPC>(); xmlrpc.DeleteChannels(itemID); xmlrpc.CancelSRDRequests(itemID); // Remove Sensors m_SensorRepeat[engine].UnSetSenseRepeaterEvents(localID, itemID); }
public void CheckHttpRequests() { if (m_CmdManager.m_ScriptEngine.World == null) { return; } IHttpRequestModule iHttpReq = m_CmdManager.m_ScriptEngine.World.RequestModuleInterface <IHttpRequestModule>(); HttpRequestClass httpInfo = null; if (iHttpReq != null) { httpInfo = (HttpRequestClass)iHttpReq.GetNextCompletedRequest(); } while (httpInfo != null) { //m_log.Debug("[AsyncLSL]:" + httpInfo.response_body + httpInfo.status); // Deliver data to prim's remote_data handler // // TODO: Returning null for metadata, since the lsl function // only returns the byte for HTTP_BODY_TRUNCATED, which is not // implemented here yet anyway. Should be fixed if/when maxsize // is supported iHttpReq.RemoveCompletedRequest(httpInfo.ReqID); object[] resobj = new object[] { new LSL_Types.LSLString(httpInfo.ReqID.ToString()), new LSL_Types.LSLInteger(httpInfo.Status), new LSL_Types.list(), new LSL_Types.LSLString(httpInfo.ResponseBody) }; foreach (IScriptEngine e in m_CmdManager.ScriptEngines) { if (e.PostObjectEvent(httpInfo.LocalID, new EventParams("http_response", resobj, new DetectParams[0]))) { break; } } httpInfo = (HttpRequestClass)iHttpReq.GetNextCompletedRequest(); } }
/// <summary> /// Unregister a specific script from facilities (and all its pending commands) /// </summary> /// <param name="localID"></param> /// <param name="itemID"></param> public static void UnregisterScriptFacilities(IScriptEngine engine, uint localID, UUID itemID, bool resetScript) { // m_log.DebugFormat("[ASYNC COMMAND MANAGER]: Removing facilities for script {0}", itemID); staticLock.AcquireReaderLock(-1); try { // Remove dataserver events m_Dataserver[engine].RemoveEvents(localID, itemID); if (resetScript) { // Remove from: Timers m_Timer[engine].UnSetTimerEvents(localID, itemID); // Remove from: HttpRequest IHttpRequestModule iHttpReq = engine.World.RequestModuleInterface <IHttpRequestModule>(); if (iHttpReq != null) { iHttpReq.StopHttpRequestsForScript(itemID); } } IWorldComm comms = engine.World.RequestModuleInterface <IWorldComm>(); if (comms != null) { comms.DeleteListener(itemID); } IXMLRPC xmlrpc = engine.World.RequestModuleInterface <IXMLRPC>(); if (xmlrpc != null) { xmlrpc.DeleteChannels(itemID); xmlrpc.CancelSRDRequests(itemID); } // Remove Sensors m_SensorRepeat[engine].UnSetSenseRepeaterEvents(localID, itemID); } finally { staticLock.ReleaseReaderLock(); } }
/// <summary> /// Remove a specific script (and all its pending commands) /// </summary> /// <param name="localID"></param> /// <param name="itemID"></param> public static void RemoveScript(IScriptEngine engine, uint localID, UUID itemID) { // Remove a specific script // m_log.DebugFormat("[ASYNC COMMAND MANAGER]: Removing facilities for script {0}", itemID); lock (staticLock) { // Remove dataserver events m_Dataserver[engine].RemoveEvents(localID, itemID); // Remove from: Timers m_Timer[engine].UnSetTimerEvents(localID, itemID); if (engine.World != null) { // Remove from: HttpRequest IHttpRequestModule iHttpReq = engine.World.RequestModuleInterface <IHttpRequestModule>(); if (iHttpReq != null) { iHttpReq.StopHttpRequest(localID, itemID); } IWorldComm comms = engine.World.RequestModuleInterface <IWorldComm>(); if (comms != null) { comms.DeleteListener(itemID); } IXMLRPC xmlrpc = engine.World.RequestModuleInterface <IXMLRPC>(); if (xmlrpc != null) { xmlrpc.DeleteChannels(itemID); xmlrpc.CancelSRDRequests(itemID); } } // Remove Sensors m_SensorRepeat[engine].UnSetSenseRepeaterEvents(localID, itemID); } }
public void Initialize(ScriptEngine engine, Scene scene) { iHttpReq = scene.RequestModuleInterface<IHttpRequestModule>(); m_ScriptEngine = engine; }
public LSL_String llHTTPRequest(string url, LSL_List parameters, string body) { // Partial implementation: support for parameter flags needed // see http://wiki.secondlife.com/wiki/LlHTTPRequest // parameter flags support are implemented in ScriptsHttpRequests.cs // in StartHttpRequest if (!ScriptProtection.CheckThreatLevel(ThreatLevel.None, "LSL", m_host, "LSL", m_itemID)) { return(""); } IHttpRequestModule httpScriptMod = World.RequestModuleInterface <IHttpRequestModule>(); List <string> param = parameters.Data.Select(o => o.ToString()).ToList(); Vector3 position = m_host.AbsolutePosition; Vector3 velocity = m_host.Velocity; Quaternion rotation = m_host.GetRotationOffset(); string ownerName = string.Empty; IScenePresence scenePresence = World.GetScenePresence(m_host.OwnerID); ownerName = scenePresence == null?resolveName(m_host.OwnerID) : scenePresence.Name; RegionInfo regionInfo = World.RegionInfo; Dictionary <string, string> httpHeaders = new Dictionary <string, string>(); string shard = "OpenSim"; IConfigSource config = m_ScriptEngine.ConfigSource; if (config.Configs["LSLRemoting"] != null) { shard = config.Configs["LSLRemoting"].GetString("shard", shard); } httpHeaders["X-SecondLife-Shard"] = shard; httpHeaders["X-SecondLife-Object-Name"] = m_host.Name; httpHeaders["X-SecondLife-Object-Key"] = m_host.UUID.ToString(); httpHeaders["X-SecondLife-Region"] = string.Format("{0} ({1}, {2})", regionInfo.RegionName, regionInfo.RegionLocX, regionInfo.RegionLocY); httpHeaders["X-SecondLife-Local-Position"] = string.Format("({0:0.000000}, {1:0.000000}, {2:0.000000})", position.X, position.Y, position.Z); httpHeaders["X-SecondLife-Local-Velocity"] = string.Format("({0:0.000000}, {1:0.000000}, {2:0.000000})", velocity.X, velocity.Y, velocity.Z); httpHeaders["X-SecondLife-Local-Rotation"] = string.Format("({0:0.000000}, {1:0.000000}, {2:0.000000}, {3:0.000000})", rotation.X, rotation.Y, rotation.Z, rotation.W); httpHeaders["X-SecondLife-Owner-Name"] = ownerName; httpHeaders["X-SecondLife-Owner-Key"] = m_host.OwnerID.ToString(); string userAgent = ""; if (config.Configs["LSLRemoting"] != null) { userAgent = config.Configs["LSLRemoting"].GetString("user_agent", null); } if (userAgent != null) { httpHeaders["User-Agent"] = userAgent; } const string authregex = @"^(https?:\/\/)(\w+):(\w+)@(.*)$"; Regex r = new Regex(authregex); Match m = r.Match(url); if (m.Success) { //for (int i = 1; i < gnums.Length; i++) { // //System.Text.RegularExpressions.Group g = m.Groups[gnums[i]]; // //CaptureCollection cc = g.Captures; //} if (m.Groups.Count == 5) { httpHeaders["Authorization"] = string.Format("Basic {0}", Convert.ToBase64String(Encoding.ASCII.GetBytes(m.Groups[2] + ":" + m.Groups[3]))); url = m.Groups[1].ToString() + m.Groups[4]; } } UUID reqID = httpScriptMod. StartHttpRequest(m_host.UUID, m_itemID, url, param, httpHeaders, body); if (reqID != UUID.Zero) { return(reqID.ToString()); } else { return(new LSL_String("")); } }