Implemented: llSetText, llResetScript

Implemented: llHTTPRequest (queue, thread, etc -- but not actuall call)
afrisby
Tedd Hansen 2007-09-16 03:36:13 +00:00
parent 88968622ea
commit c654506b18
7 changed files with 330 additions and 188 deletions

View File

@ -612,8 +612,8 @@ namespace OpenSim.Region.ScriptEngine.Common
//wiki: integer llGetRegionFlags() //wiki: integer llGetRegionFlags()
int llGetRegionFlags(); int llGetRegionFlags();
//wiki: string llXorBase64StringsCorrect(string str1, string str2) //wiki: string llXorBase64StringsCorrect(string str1, string str2)
string llXorBase64StringsCorrect(string str1, string str2); string llXorBase64StringsCorrect(string str1, string str2);
void llHTTPRequest(); void llHTTPRequest(string url, List<string> parameters, string body);
//wiki: llResetLandBanList() //wiki: llResetLandBanList()
void llResetLandBanList(); void llResetLandBanList();
//wiki: llResetLandPassList() //wiki: llResetLandPassList()

View File

@ -96,13 +96,13 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine
AppDomainSetup ads = new AppDomainSetup(); AppDomainSetup ads = new AppDomainSetup();
ads.ApplicationBase = AppDomain.CurrentDomain.BaseDirectory; ads.ApplicationBase = AppDomain.CurrentDomain.BaseDirectory;
ads.DisallowBindingRedirects = false; ads.DisallowBindingRedirects = false;
ads.DisallowCodeDownload = true; ads.DisallowCodeDownload = true;
ads.LoaderOptimization = LoaderOptimization.MultiDomain; // Sounds good ;) ads.LoaderOptimization = LoaderOptimization.MultiDomain; // Sounds good ;)
ads.ShadowCopyFiles = "true"; // Enabled shadowing ads.ShadowCopyFiles = "true"; // Enabled shadowing
ads.ConfigurationFile = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile; ads.ConfigurationFile = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile;
AppDomain AD = AppDomain.CreateDomain("ScriptAppDomain_" + AppDomainNameCount, null, ads); AppDomain AD = AppDomain.CreateDomain("ScriptAppDomain_" + AppDomainNameCount, null, ads);
Console.WriteLine("Loading: " + AssemblyName.GetAssemblyName("OpenSim.Region.ScriptEngine.Common.dll").ToString()); Console.WriteLine("Loading: " + AssemblyName.GetAssemblyName("OpenSim.Region.ScriptEngine.Common.dll").ToString());
AD.Load(AssemblyName.GetAssemblyName("OpenSim.Region.ScriptEngine.Common.dll")); AD.Load(AssemblyName.GetAssemblyName("OpenSim.Region.ScriptEngine.Common.dll"));
// Return the new AppDomain // Return the new AppDomain

View File

@ -18,8 +18,8 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL
dataTypes.Add("integer", "int"); dataTypes.Add("integer", "int");
dataTypes.Add("float", "double"); dataTypes.Add("float", "double");
dataTypes.Add("string", "string"); dataTypes.Add("string", "string");
dataTypes.Add("key", "string"); dataTypes.Add("key", "string");
dataTypes.Add("vector", "LSL_Types.Vector3"); dataTypes.Add("vector", "LSL_Types.Vector3");
dataTypes.Add("rotation", "LSL_Types.Quaternion"); dataTypes.Add("rotation", "LSL_Types.Quaternion");
dataTypes.Add("list", "list"); dataTypes.Add("list", "list");
dataTypes.Add("null", "null"); dataTypes.Add("null", "null");
@ -225,9 +225,9 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL
} }
// Add namespace, class name and inheritance // Add namespace, class name and inheritance
Return = "" + Return = "" +
"using OpenSim.Region.ScriptEngine.Common;"; "using OpenSim.Region.ScriptEngine.Common;";
//"using System; " + //"using System; " +
//"using System.Collections.Generic; " + //"using System.Collections.Generic; " +

View File

@ -45,7 +45,8 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL
} }
} }
public LSL_BuiltIn_Commands_Interface m_LSL_Functions; public LSL_BuiltIn_Commands_Interface m_LSL_Functions;
public string SourceCode = "";
public LSL_BaseClass() public LSL_BaseClass()
{ {
@ -452,8 +453,8 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL
public int llGetUnixTime() { return m_LSL_Functions.llGetUnixTime(); } public int llGetUnixTime() { return m_LSL_Functions.llGetUnixTime(); }
public int llGetParcelFlags(LSL_Types.Vector3 pos) { return m_LSL_Functions.llGetParcelFlags(pos); } public int llGetParcelFlags(LSL_Types.Vector3 pos) { return m_LSL_Functions.llGetParcelFlags(pos); }
public int llGetRegionFlags() { return m_LSL_Functions.llGetRegionFlags(); } public int llGetRegionFlags() { return m_LSL_Functions.llGetRegionFlags(); }
public string llXorBase64StringsCorrect(string str1, string str2) { return m_LSL_Functions.llXorBase64StringsCorrect(str1, str2); } public string llXorBase64StringsCorrect(string str1, string str2) { return m_LSL_Functions.llXorBase64StringsCorrect(str1, str2); }
public void llHTTPRequest() { m_LSL_Functions.llHTTPRequest(); } public void llHTTPRequest(string url, List<string> parameters, string body) { m_LSL_Functions.llHTTPRequest(url, parameters, body); }
public void llResetLandBanList() { m_LSL_Functions.llResetLandBanList(); } public void llResetLandBanList() { m_LSL_Functions.llResetLandBanList(); }
public void llResetLandPassList() { m_LSL_Functions.llResetLandPassList(); } public void llResetLandPassList() { m_LSL_Functions.llResetLandPassList(); }
public int llGetParcelPrimCount(LSL_Types.Vector3 pos, int category, int sim_wide) { return m_LSL_Functions.llGetParcelPrimCount(pos, category, sim_wide); } public int llGetParcelPrimCount(LSL_Types.Vector3 pos, int category, int sim_wide) { return m_LSL_Functions.llGetParcelPrimCount(pos, category, sim_wide); }

View File

@ -327,7 +327,7 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler
return src.Substring(start, end); return src.Substring(start, end);
} }
public string llDeleteSubString(string src, int start, int end) public string llDeleteSubString(string src, int start, int end)
{ {
return src.Remove(start, end - start); return src.Remove(start, end - start);
} }
@ -431,7 +431,12 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler
public void llGiveInventory(string destination, string inventory) { NotImplemented("llGiveInventory"); } public void llGiveInventory(string destination, string inventory) { NotImplemented("llGiveInventory"); }
public void llRemoveInventory(string item) { NotImplemented("llRemoveInventory"); } public void llRemoveInventory(string item) { NotImplemented("llRemoveInventory"); }
public void llSetText(string text, LSL_Types.Vector3 color, double alpha) { NotImplemented("llSetText"); } public void llSetText(string text, LSL_Types.Vector3 color, double alpha)
{
Axiom.Math.Vector3 av3 = new Axiom.Math.Vector3((float)color.X, (float)color.Y, (float)color.Z);
m_host.SetText(text, av3, alpha);
}
public double llWater(LSL_Types.Vector3 offset) { NotImplemented("llWater"); return 0; } public double llWater(LSL_Types.Vector3 offset) { NotImplemented("llWater"); return 0; }
public void llPassTouches(int pass) { NotImplemented("llPassTouches"); } public void llPassTouches(int pass) { NotImplemented("llPassTouches"); }
@ -443,7 +448,10 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler
public void llCollisionSound(string impact_sound, double impact_volume) { NotImplemented("llCollisionSound"); } public void llCollisionSound(string impact_sound, double impact_volume) { NotImplemented("llCollisionSound"); }
public void llCollisionSprite(string impact_sprite) { NotImplemented("llCollisionSprite"); } public void llCollisionSprite(string impact_sprite) { NotImplemented("llCollisionSprite"); }
public string llGetAnimation(string id) { NotImplemented("llGetAnimation"); return ""; } public string llGetAnimation(string id) { NotImplemented("llGetAnimation"); return ""; }
public void llResetScript() { } public void llResetScript()
{
m_ScriptEngine.m_ScriptManager.ResetScript(m_localID, m_itemID);
}
public void llMessageLinked(int linknum, int num, string str, string id) { } public void llMessageLinked(int linknum, int num, string str, string id) { }
public void llPushObject(string target, LSL_Types.Vector3 impulse, LSL_Types.Vector3 ang_impulse, int local) { } public void llPushObject(string target, LSL_Types.Vector3 impulse, LSL_Types.Vector3 ang_impulse, int local) { }
public void llPassCollisions(int pass) { } public void llPassCollisions(int pass) { }
@ -482,7 +490,8 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler
public LSL_Types.Vector3 llGetCenterOfMass() { NotImplemented("llGetCenterOfMass"); return new LSL_Types.Vector3(); } public LSL_Types.Vector3 llGetCenterOfMass() { NotImplemented("llGetCenterOfMass"); return new LSL_Types.Vector3(); }
public List<string> llListSort(List<string> src, int stride, int ascending) { public List<string> llListSort(List<string> src, int stride, int ascending)
{
SortedList<string, List<string>> sorted = new SortedList<string, List<string>>(); SortedList<string, List<string>> sorted = new SortedList<string, List<string>>();
// Add chunks to an array // Add chunks to an array
int s = stride; int s = stride;
@ -497,7 +506,7 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler
if (c > s) if (c > s)
{ {
sorted.Add(chunkString, chunk); sorted.Add(chunkString, chunk);
chunkString = ""; chunkString = "";
chunk = new List<string>(); chunk = new List<string>();
c = 0; c = 0;
} }
@ -554,7 +563,8 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler
{ {
return new LSL_Types.Vector3(double.Parse(src[index]), double.Parse(src[index + 1]), double.Parse(src[index + 2])); return new LSL_Types.Vector3(double.Parse(src[index]), double.Parse(src[index + 1]), double.Parse(src[index + 2]));
} }
public LSL_Types.Quaternion llList2Rot(List<string> src, int index) { public LSL_Types.Quaternion llList2Rot(List<string> src, int index)
{
return new LSL_Types.Quaternion(double.Parse(src[index]), double.Parse(src[index + 1]), double.Parse(src[index + 2]), double.Parse(src[index + 3])); return new LSL_Types.Quaternion(double.Parse(src[index]), double.Parse(src[index + 1]), double.Parse(src[index + 2]), double.Parse(src[index + 3]));
} }
public List<string> llList2List(List<string> src, int start, int end) public List<string> llList2List(List<string> src, int start, int end)
@ -632,7 +642,7 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler
if (chunk.Count > 0) if (chunk.Count > 0)
tmp.Add(chunk); tmp.Add(chunk);
// Decreate array back into a list // Decreate (<- what kind of word is that? :D ) array back into a list
int rnd; int rnd;
List<string> ret = new List<string>(); List<string> ret = new List<string>();
while (tmp.Count > 0) while (tmp.Count > 0)
@ -649,7 +659,7 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler
} }
public List<string> llList2ListStrided(List<string> src, int start, int end, int stride) public List<string> llList2ListStrided(List<string> src, int start, int end, int stride)
{ {
List<string> ret = new List<string>(); List<string> ret = new List<string>();
int s = stride; int s = stride;
@ -657,9 +667,11 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler
s = 1; s = 1;
int sc = s; int sc = s;
for (int i = start; i < src.Count; i++) { for (int i = start; i < src.Count; i++)
{
sc--; sc--;
if (sc ==0) { if (sc == 0)
{
sc = s; sc = s;
// Addthis // Addthis
ret.Add(src[i]); ret.Add(src[i]);
@ -795,7 +807,8 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler
} }
public void llSetPrimitiveParams(List<string> rules) { NotImplemented("llSetPrimitiveParams"); } public void llSetPrimitiveParams(List<string> rules) { NotImplemented("llSetPrimitiveParams"); }
public string llStringToBase64(string str) { public string llStringToBase64(string str)
{
try try
{ {
@ -808,14 +821,15 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler
{ {
throw new Exception("Error in base64Encode" + e.Message); throw new Exception("Error in base64Encode" + e.Message);
} }
} }
public string llBase64ToString(string str) { public string llBase64ToString(string str)
{
System.Text.UTF8Encoding encoder = new System.Text.UTF8Encoding(); System.Text.UTF8Encoding encoder = new System.Text.UTF8Encoding();
System.Text.Decoder utf8Decode = encoder.GetDecoder(); System.Text.Decoder utf8Decode = encoder.GetDecoder();
try try
{ {
byte[] todecode_byte = Convert.FromBase64String(str); byte[] todecode_byte = Convert.FromBase64String(str);
int charCount = utf8Decode.GetCharCount(todecode_byte, 0, todecode_byte.Length); int charCount = utf8Decode.GetCharCount(todecode_byte, 0, todecode_byte.Length);
char[] decoded_char = new char[charCount]; char[] decoded_char = new char[charCount];
@ -861,11 +875,13 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler
public List<string> llGetBoundingBox(string obj) { NotImplemented("llGetBoundingBox"); return new List<string>(); } public List<string> llGetBoundingBox(string obj) { NotImplemented("llGetBoundingBox"); return new List<string>(); }
public LSL_Types.Vector3 llGetGeometricCenter() { NotImplemented("llGetGeometricCenter"); return new LSL_Types.Vector3(); } public LSL_Types.Vector3 llGetGeometricCenter() { NotImplemented("llGetGeometricCenter"); return new LSL_Types.Vector3(); }
public void llGetPrimitiveParams() { NotImplemented("llGetPrimitiveParams"); } public void llGetPrimitiveParams() { NotImplemented("llGetPrimitiveParams"); }
public string llIntegerToBase64(int number) { public string llIntegerToBase64(int number)
NotImplemented("llIntegerToBase64"); return ""; {
NotImplemented("llIntegerToBase64"); return "";
} }
public int llBase64ToInteger(string str) { public int llBase64ToInteger(string str)
NotImplemented("llBase64ToInteger"); return 0; {
NotImplemented("llBase64ToInteger"); return 0;
} }
public double llGetGMTclock() public double llGetGMTclock()
@ -957,7 +973,8 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler
public int llGetParcelFlags(LSL_Types.Vector3 pos) { NotImplemented("llGetParcelFlags"); return 0; } public int llGetParcelFlags(LSL_Types.Vector3 pos) { NotImplemented("llGetParcelFlags"); return 0; }
public int llGetRegionFlags() { NotImplemented("llGetRegionFlags"); return 0; } public int llGetRegionFlags() { NotImplemented("llGetRegionFlags"); return 0; }
public string llXorBase64StringsCorrect(string str1, string str2) { public string llXorBase64StringsCorrect(string str1, string str2)
{
string ret = ""; string ret = "";
string src1 = llBase64ToString(str1); string src1 = llBase64ToString(str1);
string src2 = llBase64ToString(str2); string src2 = llBase64ToString(str2);
@ -972,7 +989,10 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler
} }
return llStringToBase64(ret); return llStringToBase64(ret);
} }
public void llHTTPRequest() { NotImplemented("llHTTPRequest"); } public void llHTTPRequest(string url, List<string> parameters, string body)
{
m_ScriptEngine.m_LSLLongCmdHandler.StartHttpRequest(m_localID, m_itemID, url, parameters, body);
}
public void llResetLandBanList() { NotImplemented("llResetLandBanList"); } public void llResetLandBanList() { NotImplemented("llResetLandBanList"); }
public void llResetLandPassList() { NotImplemented("llResetLandPassList"); } public void llResetLandPassList() { NotImplemented("llResetLandPassList"); }
public int llGetParcelPrimCount(LSL_Types.Vector3 pos, int category, int sim_wide) { NotImplemented("llGetParcelPrimCount"); return 0; } public int llGetParcelPrimCount(LSL_Types.Vector3 pos, int category, int sim_wide) { NotImplemented("llGetParcelPrimCount"); return 0; }

View File

@ -1,148 +1,262 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Text; using System.Text;
using System.Threading; using System.Threading;
using libsecondlife; using libsecondlife;
using OpenSim.Region.ScriptEngine.Common;
namespace OpenSim.Region.ScriptEngine.DotNetEngine
{ namespace OpenSim.Region.ScriptEngine.DotNetEngine
/// <summary> {
/// Handles LSL commands that takes long time and returns an event, for example timers, HTTP requests, etc. /// <summary>
/// </summary> /// Handles LSL commands that takes long time and returns an event, for example timers, HTTP requests, etc.
class LSLLongCmdHandler /// </summary>
{ class LSLLongCmdHandler
private Thread cmdHandlerThread; {
private int cmdHandlerThreadCycleSleepms = 100; private Thread cmdHandlerThread;
private int cmdHandlerThreadCycleSleepms = 100;
private ScriptEngine m_ScriptEngine;
public LSLLongCmdHandler(ScriptEngine _ScriptEngine) private ScriptEngine m_ScriptEngine;
{ public LSLLongCmdHandler(ScriptEngine _ScriptEngine)
m_ScriptEngine = _ScriptEngine; {
m_ScriptEngine = _ScriptEngine;
// Start the thread that will be doing the work
cmdHandlerThread = new Thread(CmdHandlerThreadLoop); // Start the thread that will be doing the work
cmdHandlerThread.Name = "CmdHandlerThread"; cmdHandlerThread = new Thread(CmdHandlerThreadLoop);
cmdHandlerThread.Priority = ThreadPriority.BelowNormal; cmdHandlerThread.Name = "CmdHandlerThread";
cmdHandlerThread.IsBackground = true; cmdHandlerThread.Priority = ThreadPriority.BelowNormal;
cmdHandlerThread.Start(); cmdHandlerThread.IsBackground = true;
} cmdHandlerThread.Start();
~LSLLongCmdHandler() }
{ ~LSLLongCmdHandler()
// Shut down thread {
try // Shut down thread
{ try
if (cmdHandlerThread != null) {
{ if (cmdHandlerThread != null)
if (cmdHandlerThread.IsAlive == true) {
{ if (cmdHandlerThread.IsAlive == true)
cmdHandlerThread.Abort(); {
cmdHandlerThread.Join(); cmdHandlerThread.Abort();
} cmdHandlerThread.Join();
} }
} }
catch { } }
} catch { }
}
private void CmdHandlerThreadLoop()
{ private void CmdHandlerThreadLoop()
while (true) {
{ while (true)
// Check timers {
CheckTimerEvents(); // Check timers
CheckTimerEvents();
// Sleep before next cycle // Check HttpRequests
Thread.Sleep(cmdHandlerThreadCycleSleepms); CheckHttpRequests();
}
} // Sleep before next cycle
Thread.Sleep(cmdHandlerThreadCycleSleepms);
/// <summary> }
/// Remove a specific script (and all its pending commands) }
/// </summary>
/// <param name="m_localID"></param> /// <summary>
/// <param name="m_itemID"></param> /// Remove a specific script (and all its pending commands)
public void RemoveScript(uint m_localID, LLUUID m_itemID) /// </summary>
{ /// <param name="m_localID"></param>
// Remove a specific script /// <param name="m_itemID"></param>
public void RemoveScript(uint localID, LLUUID itemID)
// Remove from: Timers {
UnSetTimerEvents(m_localID, m_itemID); // Remove a specific script
}
// Remove from: Timers
UnSetTimerEvents(localID, itemID);
// // Remove from: HttpRequest
// TIMER StopHttpRequest(localID, itemID);
// }
private class TimerClass
{ #region TIMER
public uint localID;
public LLUUID itemID; //
public double interval; // TIMER
public DateTime next; //
} private class TimerClass
private List<TimerClass> Timers = new List<TimerClass>(); {
private object ListLock = new object(); public uint localID;
public void SetTimerEvent(uint m_localID, LLUUID m_itemID, double sec) public LLUUID itemID;
{ public double interval;
Console.WriteLine("SetTimerEvent"); public DateTime next;
}
// Always remove first, in case this is a re-set private List<TimerClass> Timers = new List<TimerClass>();
UnSetTimerEvents(m_localID, m_itemID); private object TimerListLock = new object();
if (sec == 0) // Disabling timer public void SetTimerEvent(uint m_localID, LLUUID m_itemID, double sec)
return; {
Console.WriteLine("SetTimerEvent");
// Add to timer
TimerClass ts = new TimerClass(); // Always remove first, in case this is a re-set
ts.localID = m_localID; UnSetTimerEvents(m_localID, m_itemID);
ts.itemID = m_itemID; if (sec == 0) // Disabling timer
ts.interval = sec; return;
ts.next = DateTime.Now.ToUniversalTime().AddSeconds(ts.interval);
lock (ListLock) // Add to timer
{ TimerClass ts = new TimerClass();
Timers.Add(ts); ts.localID = m_localID;
} ts.itemID = m_itemID;
} ts.interval = sec;
public void UnSetTimerEvents(uint m_localID, LLUUID m_itemID) ts.next = DateTime.Now.ToUniversalTime().AddSeconds(ts.interval);
{ lock (TimerListLock)
// Remove from timer {
lock (ListLock) Timers.Add(ts);
{ }
List<TimerClass> NewTimers = new List<TimerClass>(); }
foreach (TimerClass ts in Timers) public void UnSetTimerEvents(uint m_localID, LLUUID m_itemID)
{ {
if (ts.localID != m_localID && ts.itemID != m_itemID) // Remove from timer
{ lock (TimerListLock)
NewTimers.Add(ts); {
} List<TimerClass> NewTimers = new List<TimerClass>();
} foreach (TimerClass ts in Timers)
Timers.Clear(); {
Timers = NewTimers; if (ts.localID != m_localID && ts.itemID != m_itemID)
} {
} NewTimers.Add(ts);
public void CheckTimerEvents() }
{ }
// Nothing to do here? Timers.Clear();
if (Timers.Count == 0) Timers = NewTimers;
return; }
}
lock (ListLock) public void CheckTimerEvents()
{ {
// Nothing to do here?
// Go through all timers if (Timers.Count == 0)
foreach (TimerClass ts in Timers) return;
{
// Time has passed? lock (TimerListLock)
if (ts.next.ToUniversalTime() < DateTime.Now.ToUniversalTime()) {
{
// Add it to queue // Go through all timers
m_ScriptEngine.m_EventQueueManager.AddToScriptQueue(ts.localID, ts.itemID, "timer", new object[] { }); foreach (TimerClass ts in Timers)
// set next interval {
// Time has passed?
if (ts.next.ToUniversalTime() < DateTime.Now.ToUniversalTime())
ts.next = DateTime.Now.ToUniversalTime().AddSeconds(ts.interval); {
} // Add it to queue
} m_ScriptEngine.m_EventQueueManager.AddToScriptQueue(ts.localID, ts.itemID, "timer", new object[] { });
} // lock // set next interval
}
} ts.next = DateTime.Now.ToUniversalTime().AddSeconds(ts.interval);
} }
}
} // lock
}
#endregion
#region HTTP REQUEST
//
// HTTP REAQUEST
//
private class HttpClass
{
public uint localID;
public LLUUID itemID;
public string url;
public List<string> parameters;
public string body;
public DateTime next;
public string response_request_id;
public int response_status;
public List<string> response_metadata;
public string response_body;
public void SendRequest()
{
// TODO: SEND REQUEST!!!
}
public void Stop()
{
// TODO: Cancel any ongoing request
}
public bool CheckResponse()
{
// TODO: Check if we got a response yet, return true if so -- false if not
return true;
// TODO: If we got a response, set the following then return true
//response_request_id
//response_status
//response_metadata
//response_body
}
}
private List<HttpClass> HttpRequests = new List<HttpClass>();
private object HttpListLock = new object();
public void StartHttpRequest(uint localID, LLUUID itemID, string url, List<string> parameters, string body)
{
Console.WriteLine("StartHttpRequest");
HttpClass htc = new HttpClass();
htc.localID = localID;
htc.itemID = itemID;
htc.url = url;
htc.parameters = parameters;
htc.body = body;
lock (HttpListLock)
{
//ADD REQUEST
HttpRequests.Add(htc);
}
}
public void StopHttpRequest(uint m_localID, LLUUID m_itemID)
{
// Remove from list
lock (HttpListLock)
{
List<HttpClass> NewHttpList = new List<HttpClass>();
foreach (HttpClass ts in HttpRequests)
{
if (ts.localID != m_localID && ts.itemID != m_itemID)
{
// Keeping this one
NewHttpList.Add(ts);
}
else
{
// Shutting this one down
ts.Stop();
}
}
HttpRequests.Clear();
HttpRequests = NewHttpList;
}
}
public void CheckHttpRequests()
{
// Nothing to do here?
if (HttpRequests.Count == 0)
return;
lock (HttpListLock)
{
foreach (HttpClass ts in HttpRequests)
{
if (ts.CheckResponse() == true)
{
// Add it to event queue
//key request_id, integer status, list metadata, string body
object[] resobj = new object[] { ts.response_request_id, ts.response_status, ts.response_metadata, ts.response_body };
m_ScriptEngine.m_EventQueueManager.AddToScriptQueue(ts.localID, ts.itemID, "http_response", resobj);
// Now stop it
StopHttpRequest(ts.localID, ts.itemID);
}
}
} // lock
}
#endregion
}
}

View File

@ -221,7 +221,7 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine
} }
#endregion #endregion
#region Start/Stop script #region Start/Stop/Reset script
/// <summary> /// <summary>
/// Fetches, loads and hooks up a script to an objects events /// Fetches, loads and hooks up a script to an objects events
/// </summary> /// </summary>
@ -246,6 +246,12 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine
ls.localID = localID; ls.localID = localID;
ls.itemID = itemID; ls.itemID = itemID;
unloadQueue.Enqueue(ls); unloadQueue.Enqueue(ls);
}
public void ResetScript(uint localID, LLUUID itemID)
{
string script = GetScript(localID, itemID).SourceCode;
StopScript(localID, itemID);
StartScript(localID, itemID, script);
} }
private void _StartScript(uint localID, LLUUID itemID, string Script) private void _StartScript(uint localID, LLUUID itemID, string Script)
@ -255,7 +261,7 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine
// We will initialize and start the script. // We will initialize and start the script.
// It will be up to the script itself to hook up the correct events. // It will be up to the script itself to hook up the correct events.
string FileName = ""; string ScriptSource = "";
SceneObjectPart m_host = World.GetSceneObjectPart(localID); SceneObjectPart m_host = World.GetSceneObjectPart(localID);
@ -268,10 +274,10 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine
// Create a new instance of the compiler (currently we don't want reuse) // Create a new instance of the compiler (currently we don't want reuse)
OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL.Compiler LSLCompiler = new OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL.Compiler(); OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL.Compiler LSLCompiler = new OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL.Compiler();
// Compile (We assume LSL) // Compile (We assume LSL)
FileName = LSLCompiler.CompileFromLSLText(Script); ScriptSource = LSLCompiler.CompileFromLSLText(Script);
//Console.WriteLine("Compilation of " + FileName + " done"); //Console.WriteLine("Compilation of " + FileName + " done");
// * Insert yield into code // * Insert yield into code
FileName = ProcessYield(FileName); ScriptSource = ProcessYield(ScriptSource);
#if DEBUG #if DEBUG
@ -279,11 +285,12 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine
before = GC.GetTotalMemory(true); before = GC.GetTotalMemory(true);
#endif #endif
LSL_BaseClass CompiledScript; LSL_BaseClass CompiledScript;
CompiledScript = m_scriptEngine.m_AppDomainManager.LoadScript(FileName); CompiledScript = m_scriptEngine.m_AppDomainManager.LoadScript(ScriptSource);
#if DEBUG #if DEBUG
Console.WriteLine("Script " + itemID + " occupies {0} bytes", GC.GetTotalMemory(true) - before); Console.WriteLine("Script " + itemID + " occupies {0} bytes", GC.GetTotalMemory(true) - before);
#endif #endif
CompiledScript.SourceCode = ScriptSource;
// Add it to our script memstruct // Add it to our script memstruct
SetScript(localID, itemID, CompiledScript); SetScript(localID, itemID, CompiledScript);