aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Grid/ScriptEngine/DotNetEngine
diff options
context:
space:
mode:
authorTedd Hansen2007-10-05 19:56:44 +0000
committerTedd Hansen2007-10-05 19:56:44 +0000
commit6dd923b01d6864ffcb17030c9de17224f45b4c2a (patch)
tree83d00d90a13f6803b38988049096296caf9f4c17 /OpenSim/Grid/ScriptEngine/DotNetEngine
parentCode from Illumious Beltran (IBM) implementing more LSL (diff)
downloadopensim-SC_OLD-6dd923b01d6864ffcb17030c9de17224f45b4c2a.zip
opensim-SC_OLD-6dd923b01d6864ffcb17030c9de17224f45b4c2a.tar.gz
opensim-SC_OLD-6dd923b01d6864ffcb17030c9de17224f45b4c2a.tar.bz2
opensim-SC_OLD-6dd923b01d6864ffcb17030c9de17224f45b4c2a.tar.xz
Some more work on new ScriptEngine.
Diffstat (limited to 'OpenSim/Grid/ScriptEngine/DotNetEngine')
-rw-r--r--OpenSim/Grid/ScriptEngine/DotNetEngine/AppDomainManager.cs200
-rw-r--r--OpenSim/Grid/ScriptEngine/DotNetEngine/Common.cs59
-rw-r--r--OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/LSL/Compiler.cs120
-rw-r--r--OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/LSL/LSL2CSConverter.cs266
-rw-r--r--OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/LSL/LSL_BaseClass.cs784
-rw-r--r--OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/LSO/Common.cs84
-rw-r--r--OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/LSO/Engine.cs300
-rw-r--r--OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/LSO/IL_common_functions.cs56
-rw-r--r--OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/LSO/LSL_BaseClass.cs60
-rw-r--r--OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/LSO/LSL_BaseClass_Builtins.cs373
-rw-r--r--OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/LSO/LSL_BaseClass_OPCODES.cs350
-rw-r--r--OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/LSO/LSL_CLRInterface.cs79
-rw-r--r--OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/LSO/LSL_OPCODE_IL_processor.cs436
-rw-r--r--OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/LSO/LSO_Enums.cs557
-rw-r--r--OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/LSO/LSO_Parser.cs722
-rw-r--r--OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/LSO/LSO_Struct.cs135
-rw-r--r--OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/Server_API/LSL_BuiltIn_Commands.cs1161
-rw-r--r--OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/c_sharp_example.txt12
-rw-r--r--OpenSim/Grid/ScriptEngine/DotNetEngine/EventManager.cs131
-rw-r--r--OpenSim/Grid/ScriptEngine/DotNetEngine/EventQueueManager.cs321
-rw-r--r--OpenSim/Grid/ScriptEngine/DotNetEngine/LSLLongCmdHandler.cs321
-rw-r--r--OpenSim/Grid/ScriptEngine/DotNetEngine/Properties/AssemblyInfo.cs35
-rw-r--r--OpenSim/Grid/ScriptEngine/DotNetEngine/ScriptEngine.cs132
-rw-r--r--OpenSim/Grid/ScriptEngine/DotNetEngine/ScriptManager.cs417
-rw-r--r--OpenSim/Grid/ScriptEngine/DotNetEngine/TempDotNetMicroThreadingCodeInjector.cs45
25 files changed, 7156 insertions, 0 deletions
diff --git a/OpenSim/Grid/ScriptEngine/DotNetEngine/AppDomainManager.cs b/OpenSim/Grid/ScriptEngine/DotNetEngine/AppDomainManager.cs
new file mode 100644
index 0000000..9829c1d
--- /dev/null
+++ b/OpenSim/Grid/ScriptEngine/DotNetEngine/AppDomainManager.cs
@@ -0,0 +1,200 @@
1using System;
2using System.Collections.Generic;
3using System.Text;
4using System.Reflection;
5using System.Threading;
6using System.Runtime.Remoting;
7using System.IO;
8using OpenSim.Region.Environment.Scenes;
9using OpenSim.Region.Environment.Scenes.Scripting;
10using OpenSim.Grid.ScriptEngine.DotNetEngine.Compiler.LSL;
11using OpenSim.Region.ScriptEngine.Common;
12using libsecondlife;
13
14namespace OpenSim.Grid.ScriptEngine.DotNetEngine
15{
16 public class AppDomainManager
17 {
18 private int maxScriptsPerAppDomain = 1;
19 /// <summary>
20 /// Internal list of all AppDomains
21 /// </summary>
22 private List<AppDomainStructure> appDomains = new List<AppDomainStructure>();
23 /// <summary>
24 /// Structure to keep track of data around AppDomain
25 /// </summary>
26 private class AppDomainStructure
27 {
28 /// <summary>
29 /// The AppDomain itself
30 /// </summary>
31 public AppDomain CurrentAppDomain;
32 /// <summary>
33 /// Number of scripts loaded into AppDomain
34 /// </summary>
35 public int ScriptsLoaded;
36 /// <summary>
37 /// Number of dead scripts
38 /// </summary>
39 public int ScriptsWaitingUnload;
40 }
41 /// <summary>
42 /// Current AppDomain
43 /// </summary>
44 private AppDomainStructure currentAD;
45 private object getLock = new object(); // Mutex
46 private object freeLock = new object(); // Mutex
47
48 //private ScriptEngine m_scriptEngine;
49 //public AppDomainManager(ScriptEngine scriptEngine)
50 public AppDomainManager()
51 {
52 //m_scriptEngine = scriptEngine;
53 }
54
55 /// <summary>
56 /// Find a free AppDomain, creating one if necessary
57 /// </summary>
58 /// <returns>Free AppDomain</returns>
59 private AppDomainStructure GetFreeAppDomain()
60 {
61 Console.WriteLine("Finding free AppDomain");
62 lock (getLock)
63 {
64 // Current full?
65 if (currentAD != null && currentAD.ScriptsLoaded >= maxScriptsPerAppDomain)
66 {
67 // Add it to AppDomains list and empty current
68 appDomains.Add(currentAD);
69 currentAD = null;
70 }
71 // No current
72 if (currentAD == null)
73 {
74 // Create a new current AppDomain
75 currentAD = new AppDomainStructure();
76 currentAD.CurrentAppDomain = PrepareNewAppDomain();
77 }
78
79 Console.WriteLine("Scripts loaded in this Appdomain: " + currentAD.ScriptsLoaded);
80 return currentAD;
81 } // lock
82 }
83
84 private int AppDomainNameCount;
85 /// <summary>
86 /// Create and prepare a new AppDomain for scripts
87 /// </summary>
88 /// <returns>The new AppDomain</returns>
89 private AppDomain PrepareNewAppDomain()
90 {
91 // Create and prepare a new AppDomain
92 AppDomainNameCount++;
93 // TODO: Currently security match current appdomain
94
95 // Construct and initialize settings for a second AppDomain.
96 AppDomainSetup ads = new AppDomainSetup();
97 ads.ApplicationBase = AppDomain.CurrentDomain.BaseDirectory;
98 ads.DisallowBindingRedirects = false;
99 ads.DisallowCodeDownload = true;
100 ads.LoaderOptimization = LoaderOptimization.MultiDomain; // Sounds good ;)
101 ads.ShadowCopyFiles = "true"; // Enabled shadowing
102 ads.ConfigurationFile = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile;
103
104 AppDomain AD = AppDomain.CreateDomain("ScriptAppDomain_" + AppDomainNameCount, null, ads);
105 Console.WriteLine("Loading: " + AssemblyName.GetAssemblyName("OpenSim.Region.ScriptEngine.Common.dll").ToString());
106 AD.Load(AssemblyName.GetAssemblyName("OpenSim.Region.ScriptEngine.Common.dll"));
107
108 // Return the new AppDomain
109 return AD;
110
111 }
112
113 /// <summary>
114 /// Unload appdomains that are full and have only dead scripts
115 /// </summary>
116 private void UnloadAppDomains()
117 {
118 lock (freeLock)
119 {
120 // Go through all
121 foreach (AppDomainStructure ads in new System.Collections.ArrayList(appDomains))
122 {
123 // Don't process current AppDomain
124 if (ads.CurrentAppDomain != currentAD.CurrentAppDomain)
125 {
126 // Not current AppDomain
127 // Is number of unloaded bigger or equal to number of loaded?
128 if (ads.ScriptsLoaded <= ads.ScriptsWaitingUnload)
129 {
130 Console.WriteLine("Found empty AppDomain, unloading");
131 // Remove from internal list
132 appDomains.Remove(ads);
133#if DEBUG
134 long m = GC.GetTotalMemory(true);
135#endif
136 // Unload
137 AppDomain.Unload(ads.CurrentAppDomain);
138#if DEBUG
139 Console.WriteLine("AppDomain unload freed " + (m - GC.GetTotalMemory(true)) + " bytes of memory");
140#endif
141 }
142 }
143 } // foreach
144 } // lock
145 }
146
147
148
149 public OpenSim.Grid.ScriptEngine.DotNetEngine.Compiler.LSL.LSL_BaseClass LoadScript(string FileName)
150 {
151 // Find next available AppDomain to put it in
152 AppDomainStructure FreeAppDomain = GetFreeAppDomain();
153
154 Console.WriteLine("Loading into AppDomain: " + FileName);
155 LSL_BaseClass mbrt = (LSL_BaseClass)FreeAppDomain.CurrentAppDomain.CreateInstanceFromAndUnwrap(FileName, "SecondLife.Script");
156 //Console.WriteLine("ScriptEngine AppDomainManager: is proxy={0}", RemotingServices.IsTransparentProxy(mbrt));
157 FreeAppDomain.ScriptsLoaded++;
158
159 return mbrt;
160 }
161
162
163 /// <summary>
164 /// Increase "dead script" counter for an AppDomain
165 /// </summary>
166 /// <param name="ad"></param>
167 //[Obsolete("Needs fixing, needs a real purpose in life!!!")]
168 public void StopScript(AppDomain ad)
169 {
170 lock (freeLock)
171 {
172 Console.WriteLine("Stopping script in AppDomain");
173 // Check if it is current AppDomain
174 if (currentAD.CurrentAppDomain == ad)
175 {
176 // Yes - increase
177 currentAD.ScriptsWaitingUnload++;
178 return;
179 }
180
181 // Lopp through all AppDomains
182 foreach (AppDomainStructure ads in new System.Collections.ArrayList(appDomains))
183 {
184 if (ads.CurrentAppDomain == ad)
185 {
186 // Found it
187 ads.ScriptsWaitingUnload++;
188 break;
189 }
190 } // foreach
191 } // lock
192
193 UnloadAppDomains(); // Outsite lock, has its own GetLock
194
195
196 }
197
198
199 }
200}
diff --git a/OpenSim/Grid/ScriptEngine/DotNetEngine/Common.cs b/OpenSim/Grid/ScriptEngine/DotNetEngine/Common.cs
new file mode 100644
index 0000000..af5c675
--- /dev/null
+++ b/OpenSim/Grid/ScriptEngine/DotNetEngine/Common.cs
@@ -0,0 +1,59 @@
1/*
2* Copyright (c) Contributors, http://opensimulator.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28/* Original code: Tedd Hansen */
29using System;
30using System.Collections.Generic;
31using System.Text;
32
33namespace OpenSim.Grid.ScriptEngine.DotNetEngine
34{
35 public static class Common
36 {
37 static public bool debug = true;
38 static public ScriptEngine mySE;
39
40 //public delegate void SendToDebugEventDelegate(string Message);
41 //public delegate void SendToLogEventDelegate(string Message);
42 //static public event SendToDebugEventDelegate SendToDebugEvent;
43 //static public event SendToLogEventDelegate SendToLogEvent;
44
45 static public void SendToDebug(string Message)
46 {
47 //if (Debug == true)
48 mySE.Log.Verbose("ScriptEngine", "Debug: " + Message);
49 //SendToDebugEvent("\r\n" + DateTime.Now.ToString("[HH:mm:ss] ") + Message);
50 }
51 static public void SendToLog(string Message)
52 {
53 //if (Debug == true)
54 mySE.Log.Verbose("ScriptEngine", "LOG: " + Message);
55 //SendToLogEvent("\r\n" + DateTime.Now.ToString("[HH:mm:ss] ") + Message);
56 }
57 }
58
59}
diff --git a/OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/LSL/Compiler.cs b/OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/LSL/Compiler.cs
new file mode 100644
index 0000000..e2e1cad
--- /dev/null
+++ b/OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/LSL/Compiler.cs
@@ -0,0 +1,120 @@
1using System;
2using System.Collections.Generic;
3using System.Text;
4using System.IO;
5using Microsoft.CSharp;
6using System.CodeDom.Compiler;
7using System.Reflection;
8
9namespace OpenSim.Grid.ScriptEngine.DotNetEngine.Compiler.LSL
10{
11
12 public class Compiler
13 {
14 private LSL2CSConverter LSL_Converter = new LSL2CSConverter();
15 private CSharpCodeProvider codeProvider = new CSharpCodeProvider();
16 private static UInt64 scriptCompileCounter = 0;
17 //private ICodeCompiler icc = codeProvider.CreateCompiler();
18 public string CompileFromFile(string LSOFileName)
19 {
20 switch (System.IO.Path.GetExtension(LSOFileName).ToLower())
21 {
22 case ".txt":
23 case ".lsl":
24 Common.SendToDebug("Source code is LSL, converting to CS");
25 return CompileFromLSLText(File.ReadAllText(LSOFileName));
26 case ".cs":
27 Common.SendToDebug("Source code is CS");
28 return CompileFromCSText(File.ReadAllText(LSOFileName));
29 default:
30 throw new Exception("Unknown script type.");
31 }
32 }
33 /// <summary>
34 /// Converts script from LSL to CS and calls CompileFromCSText
35 /// </summary>
36 /// <param name="Script">LSL script</param>
37 /// <returns>Filename to .dll assembly</returns>
38 public string CompileFromLSLText(string Script)
39 {
40 if (Script.Substring(0, 4).ToLower() == "//c#")
41 {
42 return CompileFromCSText( Script );
43 }
44 else
45 {
46 return CompileFromCSText(LSL_Converter.Convert(Script));
47 }
48 }
49 /// <summary>
50 /// Compile CS script to .Net assembly (.dll)
51 /// </summary>
52 /// <param name="Script">CS script</param>
53 /// <returns>Filename to .dll assembly</returns>
54 public string CompileFromCSText(string Script)
55 {
56
57
58 // Output assembly name
59 scriptCompileCounter++;
60 string OutFile = Path.Combine("ScriptEngines", "Script_" + scriptCompileCounter + ".dll");
61 try
62 {
63 System.IO.File.Delete(OutFile);
64 }
65 catch (Exception e)
66 {
67 Console.WriteLine("Exception attempting to delete old compiled script: " + e.ToString());
68 }
69 //string OutFile = Path.Combine("ScriptEngines", "SecondLife.Script.dll");
70
71 // DEBUG - write source to disk
72 try
73 {
74 File.WriteAllText(Path.Combine("ScriptEngines", "debug_" + Path.GetFileNameWithoutExtension(OutFile) + ".cs"), Script);
75 }
76 catch { }
77
78 // Do actual compile
79 System.CodeDom.Compiler.CompilerParameters parameters = new CompilerParameters();
80 parameters.IncludeDebugInformation = true;
81 // Add all available assemblies
82 foreach (Assembly asm in AppDomain.CurrentDomain.GetAssemblies())
83 {
84 //Console.WriteLine("Adding assembly: " + asm.Location);
85 //parameters.ReferencedAssemblies.Add(asm.Location);
86 }
87
88 string rootPath = Path.GetDirectoryName(AppDomain.CurrentDomain.BaseDirectory);
89 string rootPathSE = Path.GetDirectoryName(this.GetType().Assembly.Location);
90 //Console.WriteLine("Assembly location: " + rootPath);
91 parameters.ReferencedAssemblies.Add(Path.Combine(rootPath, "OpenSim.Region.ScriptEngine.Common.dll"));
92 parameters.ReferencedAssemblies.Add(Path.Combine(rootPathSE, "OpenSim.Grid.ScriptEngine.DotNetEngine.dll"));
93
94 //parameters.ReferencedAssemblies.Add("OpenSim.Region.Environment");
95 parameters.GenerateExecutable = false;
96 parameters.OutputAssembly = OutFile;
97 parameters.IncludeDebugInformation = false;
98 CompilerResults results = codeProvider.CompileAssemblyFromSource(parameters, Script);
99
100 // Go through errors
101 // TODO: Return errors to user somehow
102 if (results.Errors.Count > 0)
103 {
104
105 string errtext = "";
106 foreach (CompilerError CompErr in results.Errors)
107 {
108 errtext += "Line number " + (CompErr.Line - 1) +
109 ", Error Number: " + CompErr.ErrorNumber +
110 ", '" + CompErr.ErrorText + "'\r\n";
111 }
112 throw new Exception(errtext);
113 }
114
115
116 return OutFile;
117 }
118
119 }
120}
diff --git a/OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/LSL/LSL2CSConverter.cs b/OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/LSL/LSL2CSConverter.cs
new file mode 100644
index 0000000..61a87d4
--- /dev/null
+++ b/OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/LSL/LSL2CSConverter.cs
@@ -0,0 +1,266 @@
1using System;
2using System.Collections.Generic;
3using System.Text;
4using System.Text.RegularExpressions;
5
6namespace OpenSim.Grid.ScriptEngine.DotNetEngine.Compiler.LSL
7{
8 public class LSL2CSConverter
9 {
10 //private Regex rnw = new Regex(@"[a-zA-Z0-9_\-]", RegexOptions.Compiled);
11 private Dictionary<string, string> dataTypes = new Dictionary<string, string>();
12 private Dictionary<string, string> quotes = new Dictionary<string, string>();
13
14 public LSL2CSConverter()
15 {
16 // Only the types we need to convert
17 dataTypes.Add("void", "void");
18 dataTypes.Add("integer", "int");
19 dataTypes.Add("float", "double");
20 dataTypes.Add("string", "string");
21 dataTypes.Add("key", "string");
22 dataTypes.Add("vector", "LSL_Types.Vector3");
23 dataTypes.Add("rotation", "LSL_Types.Quaternion");
24 dataTypes.Add("list", "list");
25 dataTypes.Add("null", "null");
26
27 }
28
29 public string Convert(string Script)
30 {
31 string Return = "";
32 Script = " \r\n" + Script;
33
34 //
35 // Prepare script for processing
36 //
37
38 // Clean up linebreaks
39 Script = Regex.Replace(Script, @"\r\n", "\n");
40 Script = Regex.Replace(Script, @"\n", "\r\n");
41
42
43 // QUOTE REPLACEMENT
44 // temporarily replace quotes so we can work our magic on the script without
45 // always considering if we are inside our outside ""'s
46 string _Script = "";
47 string C;
48 bool in_quote = false;
49 bool quote_replaced = false;
50 string quote_replacement_string = "Q_U_O_T_E_REPLACEMENT_";
51 string quote = "";
52 bool last_was_escape = false;
53 int quote_replaced_count = 0;
54 for (int p = 0; p < Script.Length; p++)
55 {
56
57 C = Script.Substring(p, 1);
58 while (true)
59 {
60 // found " and last was not \ so this is not an escaped \"
61 if (C == "\"" && last_was_escape == false)
62 {
63 // Toggle inside/outside quote
64 in_quote = !in_quote;
65 if (in_quote)
66 {
67 quote_replaced_count++;
68 }
69 else
70 {
71 if (quote == "")
72 {
73 // We didn't replace quote, probably because of empty string?
74 _Script += quote_replacement_string + quote_replaced_count.ToString().PadLeft(5, "0".ToCharArray()[0]);
75 }
76 // We just left a quote
77 quotes.Add(quote_replacement_string + quote_replaced_count.ToString().PadLeft(5, "0".ToCharArray()[0]), quote);
78 quote = "";
79 }
80 break;
81 }
82
83 if (!in_quote)
84 {
85 // We are not inside a quote
86 quote_replaced = false;
87
88 }
89 else
90 {
91 // We are inside a quote
92 if (!quote_replaced)
93 {
94 // Replace quote
95 _Script += quote_replacement_string + quote_replaced_count.ToString().PadLeft(5, "0".ToCharArray()[0]);
96 quote_replaced = true;
97 }
98 quote += C;
99 break;
100 }
101 _Script += C;
102 break;
103 }
104 last_was_escape = false;
105 if (C == @"\")
106 {
107 last_was_escape = true;
108 }
109 }
110 Script = _Script;
111 //
112 // END OF QUOTE REPLACEMENT
113 //
114
115
116
117 //
118 // PROCESS STATES
119 // Remove state definitions and add state names to start of each event within state
120 //
121 int ilevel = 0;
122 int lastlevel = 0;
123 string ret = "";
124 string cache = "";
125 bool in_state = false;
126 string current_statename = "";
127 for (int p = 0; p < Script.Length; p++)
128 {
129 C = Script.Substring(p, 1);
130 while (true)
131 {
132 // inc / dec level
133 if (C == @"{")
134 ilevel++;
135 if (C == @"}")
136 ilevel--;
137 if (ilevel < 0)
138 ilevel = 0;
139 cache += C;
140
141 // if level == 0, add to return
142 if (ilevel == 1 && lastlevel == 0)
143 {
144 // 0 => 1: Get last
145 Match m = Regex.Match(cache, @"(?![a-zA-Z_]+)\s*([a-zA-Z_]+)[^a-zA-Z_\(\)]*{", RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.Singleline);
146
147 in_state = false;
148 if (m.Success)
149 {
150 // Go back to level 0, this is not a state
151 in_state = true;
152 current_statename = m.Groups[1].Captures[0].Value;
153 //Console.WriteLine("Current statename: " + current_statename);
154 cache = Regex.Replace(cache, @"(?<s1>(?![a-zA-Z_]+)\s*)" + @"([a-zA-Z_]+)(?<s2>[^a-zA-Z_\(\)]*){", "${s1}${s2}", RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.Singleline);
155 }
156 ret += cache;
157 cache = "";
158 }
159 if (ilevel == 0 && lastlevel == 1)
160 {
161 // 1 => 0: Remove last }
162 if (in_state == true)
163 {
164 cache = cache.Remove(cache.Length - 1, 1);
165 //cache = Regex.Replace(cache, "}$", "", RegexOptions.Multiline | RegexOptions.Singleline);
166
167 //Replace function names
168 // void dataserver(key query_id, string data) {
169 //cache = Regex.Replace(cache, @"([^a-zA-Z_]\s*)((?!if|switch|for)[a-zA-Z_]+\s*\([^\)]*\)[^{]*{)", "$1" + "<STATE>" + "$2", RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.Singleline);
170 //Console.WriteLine("Replacing using statename: " + current_statename);
171 cache = Regex.Replace(cache, @"^(\s*)((?!(if|switch|for)[^a-zA-Z0-9_])[a-zA-Z0-9_]*\s*\([^\)]*\)[^;]*\{)", @"$1public " + current_statename + "_event_$2", RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.Singleline);
172 }
173
174 ret += cache;
175 cache = "";
176 in_state = true;
177 current_statename = "";
178 }
179
180 break;
181 }
182 lastlevel = ilevel;
183 }
184 ret += cache;
185 cache = "";
186
187 Script = ret;
188 ret = "";
189
190
191
192 foreach (string key in dataTypes.Keys)
193 {
194 string val;
195 dataTypes.TryGetValue(key, out val);
196
197 // Replace CAST - (integer) with (int)
198 Script = Regex.Replace(Script, @"\(" + key + @"\)", @"(" + val + ")", RegexOptions.Compiled | RegexOptions.Multiline);
199 // Replace return types and function variables - integer a() and f(integer a, integer a)
200 Script = Regex.Replace(Script, @"(^|;|}|[\(,])(\s*)" + key + @"(\s*)", @"$1$2" + val + "$3", RegexOptions.Compiled | RegexOptions.Multiline);
201 }
202
203 // Add "void" in front of functions that needs it
204 Script = Regex.Replace(Script, @"^(\s*public\s+)((?!(if|switch|for)[^a-zA-Z0-9_])[a-zA-Z0-9_]*\s*\([^\)]*\)[^;]*\{)", @"$1void $2", RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.Singleline);
205
206 // Replace <x,y,z> and <x,y,z,r>
207 Script = Regex.Replace(Script, @"<([^,>]*,[^,>]*,[^,>]*,[^,>]*)>", @"new LSL_Types.Quaternion($1)", RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.Singleline);
208 Script = Regex.Replace(Script, @"<([^,>]*,[^,>]*,[^,>]*)>", @"new LSL_Types.Vector3($1)", RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.Singleline);
209
210 // Replace List []'s
211 Script = Regex.Replace(Script, @"\[([^\]]*)\]", @"List.Parse($1)", RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.Singleline);
212
213
214 // Replace (string) to .ToString() //
215 Script = Regex.Replace(Script, @"\(string\)\s*([a-zA-Z0-9_]+(\s*\([^\)]*\))?)", @"$1.ToString()", RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.Singleline);
216 Script = Regex.Replace(Script, @"\((float|int)\)\s*([a-zA-Z0-9_]+(\s*\([^\)]*\))?)", @"$1.Parse($2)", RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.Singleline);
217
218
219 // REPLACE BACK QUOTES
220 foreach (string key in quotes.Keys)
221 {
222 string val;
223 quotes.TryGetValue(key, out val);
224 Script = Script.Replace(key, "\"" + val + "\"");
225 }
226
227
228 // Add namespace, class name and inheritance
229
230 Return = "" +
231 "using OpenSim.Region.ScriptEngine.Common;";
232 //"using System; " +
233 //"using System.Collections.Generic; " +
234 //"using System.Text; " +
235 //"using OpenSim.Region.ScriptEngine.Common; " +
236 //"using integer = System.Int32; " +
237 //"using key = System.String; ";
238
239 //// Make a Using out of DataTypes
240 //// Using integer = System.Int32;
241 //string _val;
242 //foreach (string key in DataTypes.Keys)
243 //{
244 // DataTypes.TryGetValue(key, out _val);
245 // if (key != _val)
246 // {
247 // Return += "using " + key + " = " + _val + "; ";
248 // }
249 //}
250
251
252 Return += "" +
253 "namespace SecondLife { ";
254 Return += "" +
255 //"[Serializable] " +
256 "public class Script : OpenSim.Grid.ScriptEngine.DotNetEngine.Compiler.LSL.LSL_BaseClass { ";
257 Return += @"public Script() { } ";
258 Return += Script;
259 Return += "} }\r\n";
260
261 return Return;
262 }
263
264
265 }
266}
diff --git a/OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/LSL/LSL_BaseClass.cs b/OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/LSL/LSL_BaseClass.cs
new file mode 100644
index 0000000..a3011f5
--- /dev/null
+++ b/OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/LSL/LSL_BaseClass.cs
@@ -0,0 +1,784 @@
1using System;
2using System.Collections.Generic;
3using System.Text;
4using OpenSim.Grid.ScriptEngine.DotNetEngine.Compiler;
5using OpenSim.Region.ScriptEngine.Common;
6using System.Threading;
7using System.Reflection;
8using System.Runtime.Remoting.Lifetime;
9using integer = System.Int32;
10using key = System.String;
11using vector = OpenSim.Region.ScriptEngine.Common.LSL_Types.Vector3;
12using rotation = OpenSim.Region.ScriptEngine.Common.LSL_Types.Quaternion;
13
14namespace OpenSim.Grid.ScriptEngine.DotNetEngine.Compiler.LSL
15{
16 //[Serializable]
17 public class LSL_BaseClass : MarshalByRefObject, LSL_BuiltIn_Commands_Interface, IScript
18 {
19
20 // Object never expires
21 public override Object InitializeLifetimeService()
22 {
23 //Console.WriteLine("LSL_BaseClass: InitializeLifetimeService()");
24 // return null;
25 ILease lease = (ILease)base.InitializeLifetimeService();
26
27 if (lease.CurrentState == LeaseState.Initial)
28 {
29 lease.InitialLeaseTime = TimeSpan.Zero; // TimeSpan.FromMinutes(1);
30 //lease.SponsorshipTimeout = TimeSpan.FromMinutes(2);
31 //lease.RenewOnCallTime = TimeSpan.FromSeconds(2);
32 }
33 return lease;
34 }
35
36
37 private Executor m_Exec;
38 public Executor Exec
39 {
40 get
41 {
42 if (m_Exec == null)
43 m_Exec = new Executor(this);
44 return m_Exec;
45 }
46 }
47
48 public LSL_BuiltIn_Commands_Interface m_LSL_Functions;
49 public string SourceCode = "";
50
51 public LSL_BaseClass()
52 {
53 }
54 public string State()
55 {
56 return m_LSL_Functions.State();
57 }
58
59
60 public void Start(LSL_BuiltIn_Commands_Interface LSL_Functions)
61 {
62 m_LSL_Functions = LSL_Functions;
63
64 //MainLog.Instance.Notice("ScriptEngine", "LSL_BaseClass.Start() called.");
65
66 // Get this AppDomain's settings and display some of them.
67 AppDomainSetup ads = AppDomain.CurrentDomain.SetupInformation;
68 Console.WriteLine("AppName={0}, AppBase={1}, ConfigFile={2}",
69 ads.ApplicationName,
70 ads.ApplicationBase,
71 ads.ConfigurationFile
72 );
73
74 // Display the name of the calling AppDomain and the name
75 // of the second domain.
76 // NOTE: The application's thread has transitioned between
77 // AppDomains.
78 Console.WriteLine("Calling to '{0}'.",
79 Thread.GetDomain().FriendlyName
80 );
81
82 return;
83 }
84
85
86
87 //
88 // DO NOT MODIFY HERE: MODIFY IN LSL_BuiltIn_Commands.cs
89 //
90 // They are only forwarders to LSL_BuiltIn_Commands.cs
91 //
92 public double llSin(double f) { return m_LSL_Functions.llSin(f); }
93 public double llCos(double f) { return m_LSL_Functions.llCos(f); }
94 public double llTan(double f) { return m_LSL_Functions.llTan(f); }
95 public double llAtan2(double x, double y) { return m_LSL_Functions.llAtan2(x, y); }
96 public double llSqrt(double f) { return m_LSL_Functions.llSqrt(f); }
97 public double llPow(double fbase, double fexponent) { return m_LSL_Functions.llPow(fbase, fexponent); }
98 public int llAbs(int i) { return m_LSL_Functions.llAbs(i); }
99 public double llFabs(double f) { return m_LSL_Functions.llFabs(f); }
100 public double llFrand(double mag) { return m_LSL_Functions.llFrand(mag); }
101 public int llFloor(double f) { return m_LSL_Functions.llFloor(f); }
102 public int llCeil(double f) { return m_LSL_Functions.llCeil(f); }
103 public int llRound(double f) { return m_LSL_Functions.llRound(f); }
104 public double llVecMag(LSL_Types.Vector3 v) { return m_LSL_Functions.llVecMag(v); }
105 public LSL_Types.Vector3 llVecNorm(LSL_Types.Vector3 v) { return m_LSL_Functions.llVecNorm(v); }
106 public double llVecDist(LSL_Types.Vector3 a, LSL_Types.Vector3 b) { return m_LSL_Functions.llVecDist(a, b); }
107 public LSL_Types.Vector3 llRot2Euler(LSL_Types.Quaternion r) { return m_LSL_Functions.llRot2Euler(r); }
108 public LSL_Types.Quaternion llEuler2Rot(LSL_Types.Vector3 v) { return m_LSL_Functions.llEuler2Rot(v); }
109 public LSL_Types.Quaternion llAxes2Rot(LSL_Types.Vector3 fwd, LSL_Types.Vector3 left, LSL_Types.Vector3 up) { return m_LSL_Functions.llAxes2Rot(fwd, left, up); }
110 public LSL_Types.Vector3 llRot2Fwd(LSL_Types.Quaternion r) { return m_LSL_Functions.llRot2Fwd(r); }
111 public LSL_Types.Vector3 llRot2Left(LSL_Types.Quaternion r) { return m_LSL_Functions.llRot2Left(r); }
112 public LSL_Types.Vector3 llRot2Up(LSL_Types.Quaternion r) { return m_LSL_Functions.llRot2Up(r); }
113 public LSL_Types.Quaternion llRotBetween(LSL_Types.Vector3 start, LSL_Types.Vector3 end) { return m_LSL_Functions.llRotBetween(start, end); }
114 public void llWhisper(int channelID, string text) { m_LSL_Functions.llWhisper(channelID, text); }
115 public void llSay(int channelID, string text) { m_LSL_Functions.llSay(channelID, text); }
116 //
117 // DO NOT MODIFY HERE: MODIFY IN LSL_BuiltIn_Commands.cs
118 //
119 public void llShout(int channelID, string text) { m_LSL_Functions.llShout(channelID, text); }
120 public int llListen(int channelID, string name, string ID, string msg) { return m_LSL_Functions.llListen(channelID, name, ID, msg); }
121 public void llListenControl(int number, int active) { m_LSL_Functions.llListenControl(number, active); }
122 public void llListenRemove(int number) { m_LSL_Functions.llListenRemove(number); }
123 public void llSensor(string name, string id, int type, double range, double arc) { m_LSL_Functions.llSensor(name, id, type, range, arc); }
124 public void llSensorRepeat(string name, string id, int type, double range, double arc, double rate) { m_LSL_Functions.llSensorRepeat(name, id, type, range, arc, rate); }
125 public void llSensorRemove() { m_LSL_Functions.llSensorRemove(); }
126 public string llDetectedName(int number) { return m_LSL_Functions.llDetectedName(number); }
127 public string llDetectedKey(int number) { return m_LSL_Functions.llDetectedKey(number); }
128 public string llDetectedOwner(int number) { return m_LSL_Functions.llDetectedOwner(number); }
129 public int llDetectedType(int number) { return m_LSL_Functions.llDetectedType(number); }
130 public LSL_Types.Vector3 llDetectedPos(int number) { return m_LSL_Functions.llDetectedPos(number); }
131 public LSL_Types.Vector3 llDetectedVel(int number) { return m_LSL_Functions.llDetectedVel(number); }
132 public LSL_Types.Vector3 llDetectedGrab(int number) { return m_LSL_Functions.llDetectedGrab(number); }
133 public LSL_Types.Quaternion llDetectedRot(int number) { return m_LSL_Functions.llDetectedRot(number); }
134 public int llDetectedGroup(int number) { return m_LSL_Functions.llDetectedGroup(number); }
135 public int llDetectedLinkNumber(int number) { return m_LSL_Functions.llDetectedLinkNumber(number); }
136 //
137 // DO NOT MODIFY HERE: MODIFY IN LSL_BuiltIn_Commands.cs
138 //
139 public void llDie() { m_LSL_Functions.llDie(); }
140 public double llGround(LSL_Types.Vector3 offset) { return m_LSL_Functions.llGround(offset); }
141 public double llCloud(LSL_Types.Vector3 offset) { return m_LSL_Functions.llCloud(offset); }
142 public LSL_Types.Vector3 llWind(LSL_Types.Vector3 offset) { return m_LSL_Functions.llWind(offset); }
143 public void llSetStatus(int status, int value) { m_LSL_Functions.llSetStatus(status, value); }
144 public int llGetStatus(int status) { return m_LSL_Functions.llGetStatus(status); }
145 public void llSetScale(LSL_Types.Vector3 scale) { m_LSL_Functions.llSetScale(scale); }
146 public LSL_Types.Vector3 llGetScale() { return m_LSL_Functions.llGetScale(); }
147 public void llSetColor(LSL_Types.Vector3 color, int face) { m_LSL_Functions.llSetColor(color, face); }
148 public double llGetAlpha(int face) { return m_LSL_Functions.llGetAlpha(face); }
149 public void llSetAlpha(double alpha, int face) { m_LSL_Functions.llSetAlpha(alpha, face); }
150 public LSL_Types.Vector3 llGetColor(int face) { return m_LSL_Functions.llGetColor(face); }
151 public void llSetTexture(string texture, int face) { m_LSL_Functions.llSetTexture(texture, face); }
152 public void llScaleTexture(double u, double v, int face) { m_LSL_Functions.llScaleTexture(u, v, face); }
153 public void llOffsetTexture(double u, double v, int face) { m_LSL_Functions.llOffsetTexture(u, v, face); }
154 public void llRotateTexture(double rotation, int face) { m_LSL_Functions.llRotateTexture(rotation, face); }
155 public string llGetTexture(int face) { return m_LSL_Functions.llGetTexture(face); }
156 //
157 // DO NOT MODIFY HERE: MODIFY IN LSL_BuiltIn_Commands.cs
158 //
159 public void llSetPos(LSL_Types.Vector3 pos) { m_LSL_Functions.llSetPos(pos); }
160 public LSL_Types.Vector3 llGetPos() { return m_LSL_Functions.llGetPos(); }
161 public LSL_Types.Vector3 llGetLocalPos() { return m_LSL_Functions.llGetLocalPos(); }
162 public void llSetRot(LSL_Types.Quaternion rot) { m_LSL_Functions.llSetRot(rot); }
163 public LSL_Types.Quaternion llGetRot() { return m_LSL_Functions.llGetRot(); }
164 public LSL_Types.Quaternion llGetLocalRot() { return m_LSL_Functions.llGetLocalRot(); }
165 public void llSetForce(LSL_Types.Vector3 force, int local) { m_LSL_Functions.llSetForce(force, local); }
166 public LSL_Types.Vector3 llGetForce() { return m_LSL_Functions.llGetForce(); }
167 public int llTarget(LSL_Types.Vector3 position, double range) { return m_LSL_Functions.llTarget(position, range); }
168 public void llTargetRemove(int number) { m_LSL_Functions.llTargetRemove(number); }
169 public int llRotTarget(LSL_Types.Quaternion rot, double error) { return m_LSL_Functions.llRotTarget(rot, error); }
170 public void llRotTargetRemove(int number) { m_LSL_Functions.llRotTargetRemove(number); }
171 public void llMoveToTarget(LSL_Types.Vector3 target, double tau) { m_LSL_Functions.llMoveToTarget(target, tau); }
172 public void llStopMoveToTarget() { m_LSL_Functions.llStopMoveToTarget(); }
173 public void llApplyImpulse(LSL_Types.Vector3 force, int local) { m_LSL_Functions.llApplyImpulse(force, local); }
174 //
175 // DO NOT MODIFY HERE: MODIFY IN LSL_BuiltIn_Commands.cs
176 //
177 public void llApplyRotationalImpulse(LSL_Types.Vector3 force, int local) { m_LSL_Functions.llApplyRotationalImpulse(force, local); }
178 public void llSetTorque(LSL_Types.Vector3 torque, int local) { m_LSL_Functions.llSetTorque(torque, local); }
179 public LSL_Types.Vector3 llGetTorque() { return m_LSL_Functions.llGetTorque(); }
180 public void llSetForceAndTorque(LSL_Types.Vector3 force, LSL_Types.Vector3 torque, int local) { m_LSL_Functions.llSetForceAndTorque(force, torque, local); }
181 public LSL_Types.Vector3 llGetVel() { return m_LSL_Functions.llGetVel(); }
182 public LSL_Types.Vector3 llGetAccel() { return m_LSL_Functions.llGetAccel(); }
183 public LSL_Types.Vector3 llGetOmega() { return m_LSL_Functions.llGetOmega(); }
184 public double llGetTimeOfDay() { return m_LSL_Functions.llGetTimeOfDay(); }
185 public double llGetWallclock() { return m_LSL_Functions.llGetWallclock(); }
186 public double llGetTime() { return m_LSL_Functions.llGetTime(); }
187 public void llResetTime() { m_LSL_Functions.llResetTime(); }
188 public double llGetAndResetTime() { return m_LSL_Functions.llGetAndResetTime(); }
189 public void llSound() { m_LSL_Functions.llSound(); }
190 public void llPlaySound(string sound, double volume) { m_LSL_Functions.llPlaySound(sound, volume); }
191 public void llLoopSound(string sound, double volume) { m_LSL_Functions.llLoopSound(sound, volume); }
192 public void llLoopSoundMaster(string sound, double volume) { m_LSL_Functions.llLoopSoundMaster(sound, volume); }
193 public void llLoopSoundSlave(string sound, double volume) { m_LSL_Functions.llLoopSoundSlave(sound, volume); }
194 public void llPlaySoundSlave(string sound, double volume) { m_LSL_Functions.llPlaySoundSlave(sound, volume); }
195 //
196 // DO NOT MODIFY HERE: MODIFY IN LSL_BuiltIn_Commands.cs
197 //
198 public void llTriggerSound(string sound, double volume) { m_LSL_Functions.llTriggerSound(sound, volume); }
199 public void llStopSound() { m_LSL_Functions.llStopSound(); }
200 public void llPreloadSound(string sound) { m_LSL_Functions.llPreloadSound(sound); }
201 public string llGetSubString(string src, int start, int end) { return m_LSL_Functions.llGetSubString(src, start, end); }
202 public string llDeleteSubString(string src, int start, int end) { return m_LSL_Functions.llDeleteSubString(src, start, end); }
203 public string llInsertString(string dst, int position, string src) { return m_LSL_Functions.llInsertString(dst, position, src); }
204 public string llToUpper(string source) { return m_LSL_Functions.llToUpper(source); }
205 public string llToLower(string source) { return m_LSL_Functions.llToLower(source); }
206 public int llGiveMoney(string destination, int amount) { return m_LSL_Functions.llGiveMoney(destination, amount); }
207 public void llMakeExplosion() { m_LSL_Functions.llMakeExplosion(); }
208 public void llMakeFountain() { m_LSL_Functions.llMakeFountain(); }
209 public void llMakeSmoke() { m_LSL_Functions.llMakeSmoke(); }
210 public void llMakeFire() { m_LSL_Functions.llMakeFire(); }
211 public void llRezObject(string inventory, LSL_Types.Vector3 pos, LSL_Types.Quaternion rot, int param) { m_LSL_Functions.llRezObject(inventory, pos, rot, param); }
212 public void llLookAt(LSL_Types.Vector3 target, double strength, double damping) { m_LSL_Functions.llLookAt(target, strength, damping); }
213 public void llStopLookAt() { m_LSL_Functions.llStopLookAt(); }
214 public void llSetTimerEvent(double sec) { m_LSL_Functions.llSetTimerEvent(sec); }
215 public void llSleep(double sec) { m_LSL_Functions.llSleep(sec); }
216 //
217 // DO NOT MODIFY HERE: MODIFY IN LSL_BuiltIn_Commands.cs
218 //
219 public double llGetMass() { return m_LSL_Functions.llGetMass(); }
220 public void llCollisionFilter(string name, string id, int accept) { m_LSL_Functions.llCollisionFilter(name, id, accept); }
221 public void llTakeControls(int controls, int accept, int pass_on) { m_LSL_Functions.llTakeControls(controls, accept, pass_on); }
222 public void llReleaseControls() { m_LSL_Functions.llReleaseControls(); }
223 public void llAttachToAvatar(int attachment) { m_LSL_Functions.llAttachToAvatar(attachment); }
224 public void llDetachFromAvatar() { m_LSL_Functions.llDetachFromAvatar(); }
225 public void llTakeCamera() { m_LSL_Functions.llTakeCamera(); }
226 public void llReleaseCamera() { m_LSL_Functions.llReleaseCamera(); }
227 public string llGetOwner() { return m_LSL_Functions.llGetOwner(); }
228 public void llInstantMessage(string user, string message) { m_LSL_Functions.llInstantMessage(user, message); }
229 public void llEmail(string address, string subject, string message) { m_LSL_Functions.llEmail(address, subject, message); }
230 public void llGetNextEmail(string address, string subject) { m_LSL_Functions.llGetNextEmail(address, subject); }
231 public string llGetKey() { return m_LSL_Functions.llGetKey(); }
232 public void llSetBuoyancy(double buoyancy) { m_LSL_Functions.llSetBuoyancy(buoyancy); }
233 public void llSetHoverHeight(double height, int water, double tau) { m_LSL_Functions.llSetHoverHeight(height, water, tau); }
234 public void llStopHover() { m_LSL_Functions.llStopHover(); }
235 public void llMinEventDelay(double delay) { m_LSL_Functions.llMinEventDelay(delay); }
236 public void llSoundPreload() { m_LSL_Functions.llSoundPreload(); }
237 public void llRotLookAt(LSL_Types.Quaternion target, double strength, double damping) { m_LSL_Functions.llRotLookAt(target, strength, damping); }
238 //
239 // DO NOT MODIFY HERE: MODIFY IN LSL_BuiltIn_Commands.cs
240 //
241 public int llStringLength(string str) { return m_LSL_Functions.llStringLength(str); }
242 public void llStartAnimation(string anim) { m_LSL_Functions.llStartAnimation(anim); }
243 public void llStopAnimation(string anim) { m_LSL_Functions.llStopAnimation(anim); }
244 public void llPointAt() { m_LSL_Functions.llPointAt(); }
245 public void llStopPointAt() { m_LSL_Functions.llStopPointAt(); }
246 public void llTargetOmega(LSL_Types.Vector3 axis, double spinrate, double gain) { m_LSL_Functions.llTargetOmega(axis, spinrate, gain); }
247 public int llGetStartParameter() { return m_LSL_Functions.llGetStartParameter(); }
248 public void llGodLikeRezObject(string inventory, LSL_Types.Vector3 pos) { m_LSL_Functions.llGodLikeRezObject(inventory, pos); }
249 public void llRequestPermissions(string agent, int perm) { m_LSL_Functions.llRequestPermissions(agent, perm); }
250 public string llGetPermissionsKey() { return m_LSL_Functions.llGetPermissionsKey(); }
251 public int llGetPermissions() { return m_LSL_Functions.llGetPermissions(); }
252 public int llGetLinkNumber() { return m_LSL_Functions.llGetLinkNumber(); }
253 public void llSetLinkColor(int linknumber, LSL_Types.Vector3 color, int face) { m_LSL_Functions.llSetLinkColor(linknumber, color, face); }
254 public void llCreateLink(string target, int parent) { m_LSL_Functions.llCreateLink(target, parent); }
255 public void llBreakLink(int linknum) { m_LSL_Functions.llBreakLink(linknum); }
256 public void llBreakAllLinks() { m_LSL_Functions.llBreakAllLinks(); }
257 public string llGetLinkKey(int linknum) { return m_LSL_Functions.llGetLinkKey(linknum); }
258 public void llGetLinkName(int linknum) { m_LSL_Functions.llGetLinkName(linknum); }
259 public int llGetInventoryNumber(int type) { return m_LSL_Functions.llGetInventoryNumber(type); }
260 public string llGetInventoryName(int type, int number) { return m_LSL_Functions.llGetInventoryName(type, number); }
261 //
262 // DO NOT MODIFY HERE: MODIFY IN LSL_BuiltIn_Commands.cs
263 //
264 public void llSetScriptState(string name, int run) { m_LSL_Functions.llSetScriptState(name, run); }
265 public double llGetEnergy() { return m_LSL_Functions.llGetEnergy(); }
266 public void llGiveInventory(string destination, string inventory) { m_LSL_Functions.llGiveInventory(destination, inventory); }
267 public void llRemoveInventory(string item) { m_LSL_Functions.llRemoveInventory(item); }
268 public void llSetText(string text, LSL_Types.Vector3 color, double alpha) { m_LSL_Functions.llSetText(text, color, alpha); }
269 public double llWater(LSL_Types.Vector3 offset) { return m_LSL_Functions.llWater(offset); }
270 public void llPassTouches(int pass) { m_LSL_Functions.llPassTouches(pass); }
271 public string llRequestAgentData(string id, int data) { return m_LSL_Functions.llRequestAgentData(id, data); }
272 public string llRequestInventoryData(string name) { return m_LSL_Functions.llRequestInventoryData(name); }
273 public void llSetDamage(double damage) { m_LSL_Functions.llSetDamage(damage); }
274 public void llTeleportAgentHome(string agent) { m_LSL_Functions.llTeleportAgentHome(agent); }
275 public void llModifyLand(int action, int brush) { m_LSL_Functions.llModifyLand(action, brush); }
276 public void llCollisionSound(string impact_sound, double impact_volume) { m_LSL_Functions.llCollisionSound(impact_sound, impact_volume); }
277 public void llCollisionSprite(string impact_sprite) { m_LSL_Functions.llCollisionSprite(impact_sprite); }
278 public string llGetAnimation(string id) { return m_LSL_Functions.llGetAnimation(id); }
279 public void llResetScript() { m_LSL_Functions.llResetScript(); }
280 public void llMessageLinked(int linknum, int num, string str, string id) { m_LSL_Functions.llMessageLinked(linknum, num, str, id); }
281 public void llPushObject(string target, LSL_Types.Vector3 impulse, LSL_Types.Vector3 ang_impulse, int local) { m_LSL_Functions.llPushObject(target, impulse, ang_impulse, local); }
282 public void llPassCollisions(int pass) { m_LSL_Functions.llPassCollisions(pass); }
283 public string llGetScriptName() { return m_LSL_Functions.llGetScriptName(); }
284 public int llGetNumberOfSides() { return m_LSL_Functions.llGetNumberOfSides(); }
285 //
286 // DO NOT MODIFY HERE: MODIFY IN LSL_BuiltIn_Commands.cs
287 //
288 public LSL_Types.Quaternion llAxisAngle2Rot(LSL_Types.Vector3 axis, double angle) { return m_LSL_Functions.llAxisAngle2Rot(axis, angle); }
289 public LSL_Types.Vector3 llRot2Axis(LSL_Types.Quaternion rot) { return m_LSL_Functions.llRot2Axis(rot); }
290 public void llRot2Angle() { m_LSL_Functions.llRot2Angle(); }
291 public double llAcos(double val) { return m_LSL_Functions.llAcos(val); }
292 public double llAsin(double val) { return m_LSL_Functions.llAsin(val); }
293 public double llAngleBetween(LSL_Types.Quaternion a, LSL_Types.Quaternion b) { return m_LSL_Functions.llAngleBetween(a, b); }
294 public string llGetInventoryKey(string name) { return m_LSL_Functions.llGetInventoryKey(name); }
295 public void llAllowInventoryDrop(int add) { m_LSL_Functions.llAllowInventoryDrop(add); }
296 public LSL_Types.Vector3 llGetSunDirection() { return m_LSL_Functions.llGetSunDirection(); }
297 public LSL_Types.Vector3 llGetTextureOffset(int face) { return m_LSL_Functions.llGetTextureOffset(face); }
298 public LSL_Types.Vector3 llGetTextureScale(int side) { return m_LSL_Functions.llGetTextureScale(side); }
299 public double llGetTextureRot(int side) { return m_LSL_Functions.llGetTextureRot(side); }
300 public int llSubStringIndex(string source, string pattern) { return m_LSL_Functions.llSubStringIndex(source, pattern); }
301 public string llGetOwnerKey(string id) { return m_LSL_Functions.llGetOwnerKey(id); }
302 public LSL_Types.Vector3 llGetCenterOfMass() { return m_LSL_Functions.llGetCenterOfMass(); }
303 public List<string> llListSort(List<string> src, int stride, int ascending) { return m_LSL_Functions.llListSort(src, stride, ascending); }
304 public int llGetListLength(List<string> src) { return m_LSL_Functions.llGetListLength(src); }
305 //
306 // DO NOT MODIFY HERE: MODIFY IN LSL_BuiltIn_Commands.cs
307 //
308 public int llList2Integer(List<string> src, int index) { return m_LSL_Functions.llList2Integer(src, index); }
309 public double llList2double(List<string> src, int index) { return m_LSL_Functions.llList2double(src, index); }
310 public string llList2String(List<string> src, int index) { return m_LSL_Functions.llList2String(src, index); }
311 public string llList2Key(List<string> src, int index) { return m_LSL_Functions.llList2Key(src, index); }
312 public LSL_Types.Vector3 llList2Vector(List<string> src, int index) { return m_LSL_Functions.llList2Vector(src, index); }
313 public LSL_Types.Quaternion llList2Rot(List<string> src, int index) { return m_LSL_Functions.llList2Rot(src, index); }
314 public List<string> llList2List(List<string> src, int start, int end) { return m_LSL_Functions.llList2List(src, start, end); }
315 public List<string> llDeleteSubList(List<string> src, int start, int end) { return m_LSL_Functions.llDeleteSubList(src, start, end); }
316 public int llGetListEntryType(List<string> src, int index) { return m_LSL_Functions.llGetListEntryType(src, index); }
317 public string llList2CSV(List<string> src) { return m_LSL_Functions.llList2CSV(src); }
318 public List<string> llCSV2List(string src) { return m_LSL_Functions.llCSV2List(src); }
319 public List<string> llListRandomize(List<string> src, int stride) { return m_LSL_Functions.llListRandomize(src, stride); }
320 public List<string> llList2ListStrided(List<string> src, int start, int end, int stride) { return m_LSL_Functions.llList2ListStrided(src, start, end, stride); }
321 public LSL_Types.Vector3 llGetRegionCorner() { return m_LSL_Functions.llGetRegionCorner(); }
322 public List<string> llListInsertList(List<string> dest, List<string> src, int start) { return m_LSL_Functions.llListInsertList(dest, src, start); }
323 public int llListFindList(List<string> src, List<string> test) { return m_LSL_Functions.llListFindList(src, test); }
324 public string llGetObjectName() { return m_LSL_Functions.llGetObjectName(); }
325 public void llSetObjectName(string name) { m_LSL_Functions.llSetObjectName(name); }
326 public string llGetDate() { return m_LSL_Functions.llGetDate(); }
327 public int llEdgeOfWorld(LSL_Types.Vector3 pos, LSL_Types.Vector3 dir) { return m_LSL_Functions.llEdgeOfWorld(pos, dir); }
328 public int llGetAgentInfo(string id) { return m_LSL_Functions.llGetAgentInfo(id); }
329 //
330 // DO NOT MODIFY HERE: MODIFY IN LSL_BuiltIn_Commands.cs
331 //
332 public void llAdjustSoundVolume(double volume) { m_LSL_Functions.llAdjustSoundVolume(volume); }
333 public void llSetSoundQueueing(int queue) { m_LSL_Functions.llSetSoundQueueing(queue); }
334 public void llSetSoundRadius(double radius) { m_LSL_Functions.llSetSoundRadius(radius); }
335 public string llKey2Name(string id) { return m_LSL_Functions.llKey2Name(id); }
336 public void llSetTextureAnim(int mode, int face, int sizex, int sizey, double start, double length, double rate) { m_LSL_Functions.llSetTextureAnim(mode, face, sizex, sizey, start, length, rate); }
337 public void llTriggerSoundLimited(string sound, double volume, LSL_Types.Vector3 top_north_east, LSL_Types.Vector3 bottom_south_west) { m_LSL_Functions.llTriggerSoundLimited(sound, volume, top_north_east, bottom_south_west); }
338 public void llEjectFromLand(string pest) { m_LSL_Functions.llEjectFromLand(pest); }
339 public void llParseString2List() { m_LSL_Functions.llParseString2List(); }
340 public int llOverMyLand(string id) { return m_LSL_Functions.llOverMyLand(id); }
341 public string llGetLandOwnerAt(LSL_Types.Vector3 pos) { return m_LSL_Functions.llGetLandOwnerAt(pos); }
342 public string llGetNotecardLine(string name, int line) { return m_LSL_Functions.llGetNotecardLine(name, line); }
343 public LSL_Types.Vector3 llGetAgentSize(string id) { return m_LSL_Functions.llGetAgentSize(id); }
344 public int llSameGroup(string agent) { return m_LSL_Functions.llSameGroup(agent); }
345 public void llUnSit(string id) { m_LSL_Functions.llUnSit(id); }
346 public LSL_Types.Vector3 llGroundSlope(LSL_Types.Vector3 offset) { return m_LSL_Functions.llGroundSlope(offset); }
347 public LSL_Types.Vector3 llGroundNormal(LSL_Types.Vector3 offset) { return m_LSL_Functions.llGroundNormal(offset); }
348 public LSL_Types.Vector3 llGroundContour(LSL_Types.Vector3 offset) { return m_LSL_Functions.llGroundContour(offset); }
349 public int llGetAttached() { return m_LSL_Functions.llGetAttached(); }
350 public int llGetFreeMemory() { return m_LSL_Functions.llGetFreeMemory(); }
351 public string llGetRegionName() { return m_LSL_Functions.llGetRegionName(); }
352 public double llGetRegionTimeDilation() { return m_LSL_Functions.llGetRegionTimeDilation(); }
353 public double llGetRegionFPS() { return m_LSL_Functions.llGetRegionFPS(); }
354 //
355 // DO NOT MODIFY HERE: MODIFY IN LSL_BuiltIn_Commands.cs
356 //
357 public void llParticleSystem(List<Object> rules) { m_LSL_Functions.llParticleSystem(rules); }
358 public void llGroundRepel(double height, int water, double tau) { m_LSL_Functions.llGroundRepel(height, water, tau); }
359 public void llGiveInventoryList() { m_LSL_Functions.llGiveInventoryList(); }
360 public void llSetVehicleType(int type) { m_LSL_Functions.llSetVehicleType(type); }
361 public void llSetVehicledoubleParam(int param, double value) { m_LSL_Functions.llSetVehicledoubleParam(param, value); }
362 public void llSetVehicleVectorParam(int param, LSL_Types.Vector3 vec) { m_LSL_Functions.llSetVehicleVectorParam(param, vec); }
363 public void llSetVehicleRotationParam(int param, LSL_Types.Quaternion rot) { m_LSL_Functions.llSetVehicleRotationParam(param, rot); }
364 public void llSetVehicleFlags(int flags) { m_LSL_Functions.llSetVehicleFlags(flags); }
365 public void llRemoveVehicleFlags(int flags) { m_LSL_Functions.llRemoveVehicleFlags(flags); }
366 public void llSitTarget(LSL_Types.Vector3 offset, LSL_Types.Quaternion rot) { m_LSL_Functions.llSitTarget(offset, rot); }
367 public string llAvatarOnSitTarget() { return m_LSL_Functions.llAvatarOnSitTarget(); }
368 public void llAddToLandPassList(string avatar, double hours) { m_LSL_Functions.llAddToLandPassList(avatar, hours); }
369 public void llSetTouchText(string text) { m_LSL_Functions.llSetTouchText(text); }
370 public void llSetSitText(string text) { m_LSL_Functions.llSetSitText(text); }
371 public void llSetCameraEyeOffset(LSL_Types.Vector3 offset) { m_LSL_Functions.llSetCameraEyeOffset(offset); }
372 public void llSetCameraAtOffset(LSL_Types.Vector3 offset) { m_LSL_Functions.llSetCameraAtOffset(offset); }
373 public void llDumpList2String() { m_LSL_Functions.llDumpList2String(); }
374 public void llScriptDanger(LSL_Types.Vector3 pos) { m_LSL_Functions.llScriptDanger(pos); }
375 public void llDialog(string avatar, string message, List<string> buttons, int chat_channel) { m_LSL_Functions.llDialog(avatar, message, buttons, chat_channel); }
376 public void llVolumeDetect(int detect) { m_LSL_Functions.llVolumeDetect(detect); }
377 public void llResetOtherScript(string name) { m_LSL_Functions.llResetOtherScript(name); }
378 public int llGetScriptState(string name) { return m_LSL_Functions.llGetScriptState(name); }
379 public void llRemoteLoadScript() { m_LSL_Functions.llRemoteLoadScript(); }
380 public void llSetRemoteScriptAccessPin(int pin) { m_LSL_Functions.llSetRemoteScriptAccessPin(pin); }
381 public void llRemoteLoadScriptPin(string target, string name, int pin, int running, int start_param) { m_LSL_Functions.llRemoteLoadScriptPin(target, name, pin, running, start_param); }
382 //
383 // DO NOT MODIFY HERE: MODIFY IN LSL_BuiltIn_Commands.cs
384 //
385 public void llOpenRemoteDataChannel() { m_LSL_Functions.llOpenRemoteDataChannel(); }
386 public string llSendRemoteData(string channel, string dest, int idata, string sdata) { return m_LSL_Functions.llSendRemoteData(channel, dest, idata, sdata); }
387 public void llRemoteDataReply(string channel, string message_id, string sdata, int idata) { m_LSL_Functions.llRemoteDataReply(channel, message_id, sdata, idata); }
388 public void llCloseRemoteDataChannel(string channel) { m_LSL_Functions.llCloseRemoteDataChannel(channel); }
389 public string llMD5String(string src, int nonce) { return m_LSL_Functions.llMD5String(src, nonce); }
390 public void llSetPrimitiveParams(List<string> rules) { m_LSL_Functions.llSetPrimitiveParams(rules); }
391 public string llStringToBase64(string str) { return m_LSL_Functions.llStringToBase64(str); }
392 public string llBase64ToString(string str) { return m_LSL_Functions.llBase64ToString(str); }
393 public void llXorBase64Strings() { m_LSL_Functions.llXorBase64Strings(); }
394 public void llRemoteDataSetRegion() { m_LSL_Functions.llRemoteDataSetRegion(); }
395 public double llLog10(double val) { return m_LSL_Functions.llLog10(val); }
396 public double llLog(double val) { return m_LSL_Functions.llLog(val); }
397 public List<string> llGetAnimationList(string id) { return m_LSL_Functions.llGetAnimationList(id); }
398 public void llSetParcelMusicURL(string url) { m_LSL_Functions.llSetParcelMusicURL(url); }
399 public LSL_Types.Vector3 llGetRootPosition() { return m_LSL_Functions.llGetRootPosition(); }
400 public LSL_Types.Quaternion llGetRootRotation() { return m_LSL_Functions.llGetRootRotation(); }
401 public string llGetObjectDesc() { return m_LSL_Functions.llGetObjectDesc(); }
402 public void llSetObjectDesc(string desc) { m_LSL_Functions.llSetObjectDesc(desc); }
403 public string llGetCreator() { return m_LSL_Functions.llGetCreator(); }
404 public string llGetTimestamp() { return m_LSL_Functions.llGetTimestamp(); }
405 public void llSetLinkAlpha(int linknumber, double alpha, int face) { m_LSL_Functions.llSetLinkAlpha(linknumber, alpha, face); }
406 public int llGetNumberOfPrims() { return m_LSL_Functions.llGetNumberOfPrims(); }
407 public string llGetNumberOfNotecardLines(string name) { return m_LSL_Functions.llGetNumberOfNotecardLines(name); }
408 public List<string> llGetBoundingBox(string obj) { return m_LSL_Functions.llGetBoundingBox(obj); }
409 public LSL_Types.Vector3 llGetGeometricCenter() { return m_LSL_Functions.llGetGeometricCenter(); }
410 public void llGetPrimitiveParams() { m_LSL_Functions.llGetPrimitiveParams(); }
411 //
412 // DO NOT MODIFY HERE: MODIFY IN LSL_BuiltIn_Commands.cs
413 //
414 public string llIntegerToBase64(int number) { return m_LSL_Functions.llIntegerToBase64(number); }
415 public int llBase64ToInteger(string str) { return m_LSL_Functions.llBase64ToInteger(str); }
416 public double llGetGMTclock() { return m_LSL_Functions.llGetGMTclock(); }
417 public string llGetSimulatorHostname() { return m_LSL_Functions.llGetSimulatorHostname(); }
418 public void llSetLocalRot(LSL_Types.Quaternion rot) { m_LSL_Functions.llSetLocalRot(rot); }
419 public List<string> llParseStringKeepNulls(string src, List<string> seperators, List<string> spacers) { return m_LSL_Functions.llParseStringKeepNulls(src, seperators, spacers); }
420 public void llRezAtRoot(string inventory, LSL_Types.Vector3 position, LSL_Types.Vector3 velocity, LSL_Types.Quaternion rot, int param) { m_LSL_Functions.llRezAtRoot(inventory, position, velocity, rot, param); }
421 public int llGetObjectPermMask(int mask) { return m_LSL_Functions.llGetObjectPermMask(mask); }
422 public void llSetObjectPermMask(int mask, int value) { m_LSL_Functions.llSetObjectPermMask(mask, value); }
423 public void llGetInventoryPermMask(string item, int mask) { m_LSL_Functions.llGetInventoryPermMask(item, mask); }
424 public void llSetInventoryPermMask(string item, int mask, int value) { m_LSL_Functions.llSetInventoryPermMask(item, mask, value); }
425 public string llGetInventoryCreator(string item) { return m_LSL_Functions.llGetInventoryCreator(item); }
426 public void llOwnerSay(string msg) { m_LSL_Functions.llOwnerSay(msg); }
427 public void llRequestSimulatorData(string simulator, int data) { m_LSL_Functions.llRequestSimulatorData(simulator, data); }
428 public void llForceMouselook(int mouselook) { m_LSL_Functions.llForceMouselook(mouselook); }
429 public double llGetObjectMass(string id) { return m_LSL_Functions.llGetObjectMass(id); }
430 public void llListReplaceList() { m_LSL_Functions.llListReplaceList(); }
431 public void llLoadURL(string avatar_id, string message, string url) { m_LSL_Functions.llLoadURL(avatar_id, message, url); }
432 public void llParcelMediaCommandList(List<string> commandList) { m_LSL_Functions.llParcelMediaCommandList(commandList); }
433 public void llParcelMediaQuery() { m_LSL_Functions.llParcelMediaQuery(); }
434 public int llModPow(int a, int b, int c) { return m_LSL_Functions.llModPow(a, b, c); }
435 //
436 // DO NOT MODIFY HERE: MODIFY IN LSL_BuiltIn_Commands.cs
437 //
438 public int llGetInventoryType(string name) { return m_LSL_Functions.llGetInventoryType(name); }
439 public void llSetPayPrice(int price, List<string> quick_pay_buttons) { m_LSL_Functions.llSetPayPrice(price, quick_pay_buttons); }
440 public LSL_Types.Vector3 llGetCameraPos() { return m_LSL_Functions.llGetCameraPos(); }
441 public LSL_Types.Quaternion llGetCameraRot() { return m_LSL_Functions.llGetCameraRot(); }
442 public void llSetPrimURL() { m_LSL_Functions.llSetPrimURL(); }
443 public void llRefreshPrimURL() { m_LSL_Functions.llRefreshPrimURL(); }
444 public string llEscapeURL(string url) { return m_LSL_Functions.llEscapeURL(url); }
445 public string llUnescapeURL(string url) { return m_LSL_Functions.llUnescapeURL(url); }
446 public void llMapDestination(string simname, LSL_Types.Vector3 pos, LSL_Types.Vector3 look_at) { m_LSL_Functions.llMapDestination(simname, pos, look_at); }
447 public void llAddToLandBanList(string avatar, double hours) { m_LSL_Functions.llAddToLandBanList(avatar, hours); }
448 public void llRemoveFromLandPassList(string avatar) { m_LSL_Functions.llRemoveFromLandPassList(avatar); }
449 public void llRemoveFromLandBanList(string avatar) { m_LSL_Functions.llRemoveFromLandBanList(avatar); }
450 public void llSetCameraParams(List<string> rules) { m_LSL_Functions.llSetCameraParams(rules); }
451 public void llClearCameraParams() { m_LSL_Functions.llClearCameraParams(); }
452 public double llListStatistics(int operation, List<string> src) { return m_LSL_Functions.llListStatistics(operation, src); }
453 public int llGetUnixTime() { return m_LSL_Functions.llGetUnixTime(); }
454 public int llGetParcelFlags(LSL_Types.Vector3 pos) { return m_LSL_Functions.llGetParcelFlags(pos); }
455 public int llGetRegionFlags() { return m_LSL_Functions.llGetRegionFlags(); }
456 public string llXorBase64StringsCorrect(string str1, string str2) { return m_LSL_Functions.llXorBase64StringsCorrect(str1, str2); }
457 public void llHTTPRequest(string url, List<string> parameters, string body) { m_LSL_Functions.llHTTPRequest(url, parameters, body); }
458 public void llResetLandBanList() { m_LSL_Functions.llResetLandBanList(); }
459 public void llResetLandPassList() { m_LSL_Functions.llResetLandPassList(); }
460 public int llGetParcelPrimCount(LSL_Types.Vector3 pos, int category, int sim_wide) { return m_LSL_Functions.llGetParcelPrimCount(pos, category, sim_wide); }
461 public List<string> llGetParcelPrimOwners(LSL_Types.Vector3 pos) { return m_LSL_Functions.llGetParcelPrimOwners(pos); }
462 public int llGetObjectPrimCount(string object_id) { return m_LSL_Functions.llGetObjectPrimCount(object_id); }
463 //
464 // DO NOT MODIFY HERE: MODIFY IN LSL_BuiltIn_Commands.cs
465 //
466 public int llGetParcelMaxPrims(LSL_Types.Vector3 pos, int sim_wide) { return m_LSL_Functions.llGetParcelMaxPrims(pos, sim_wide); }
467 public List<string> llGetParcelDetails(LSL_Types.Vector3 pos, List<string> param) { return m_LSL_Functions.llGetParcelDetails(pos, param); }
468
469 //
470 // OpenSim Functions
471 //
472 public string osSetDynamicTextureURL(string dynamicID, string contentType, string url, string extraParams, int timer) { return m_LSL_Functions.osSetDynamicTextureURL(dynamicID, contentType, url, extraParams, timer); }
473
474 // LSL CONSTANTS
475 public const int TRUE = 1;
476 public const int FALSE = 0;
477 public const int STATUS_PHYSICS = 1;
478 public const int STATUS_ROTATE_X = 2;
479 public const int STATUS_ROTATE_Y = 4;
480 public const int STATUS_ROTATE_Z = 8;
481 public const int STATUS_PHANTOM = 16;
482 public const int STATUS_SANDBOX = 32;
483 public const int STATUS_BLOCK_GRAB = 64;
484 public const int STATUS_DIE_AT_EDGE = 128;
485 public const int STATUS_RETURN_AT_EDGE = 256;
486 public const int AGENT = 1;
487 public const int ACTIVE = 2;
488 public const int PASSIVE = 4;
489 public const int SCRIPTED = 8;
490 public const int CONTROL_FWD = 1;
491 public const int CONTROL_BACK = 2;
492 public const int CONTROL_LEFT = 4;
493 public const int CONTROL_RIGHT = 8;
494 public const int CONTROL_UP = 16;
495 public const int CONTROL_DOWN = 32;
496 public const int CONTROL_ROT_LEFT = 256;
497 public const int CONTROL_ROT_RIGHT = 512;
498 public const int CONTROL_LBUTTON = 268435456;
499 public const int CONTROL_ML_LBUTTON = 1073741824;
500 public const int PERMISSION_DEBIT = 2;
501 public const int PERMISSION_TAKE_CONTROLS = 4;
502 public const int PERMISSION_REMAP_CONTROLS = 8;
503 public const int PERMISSION_TRIGGER_ANIMATION = 16;
504 public const int PERMISSION_ATTACH = 32;
505 public const int PERMISSION_RELEASE_OWNERSHIP = 64;
506 public const int PERMISSION_CHANGE_LINKS = 128;
507 public const int PERMISSION_CHANGE_JOINTS = 256;
508 public const int PERMISSION_CHANGE_PERMISSIONS = 512;
509 public const int PERMISSION_TRACK_CAMERA = 1024;
510 public const int AGENT_FLYING = 1;
511 public const int AGENT_ATTACHMENTS = 2;
512 public const int AGENT_SCRIPTED = 4;
513 public const int AGENT_MOUSELOOK = 8;
514 public const int AGENT_SITTING = 16;
515 public const int AGENT_ON_OBJECT = 32;
516 public const int AGENT_AWAY = 64;
517 public const int AGENT_WALKING = 128;
518 public const int AGENT_IN_AIR = 256;
519 public const int AGENT_TYPING = 512;
520 public const int AGENT_CROUCHING = 1024;
521 public const int AGENT_BUSY = 2048;
522 public const int AGENT_ALWAYS_RUN = 4096;
523 public const int PSYS_PART_INTERP_COLOR_MASK = 1;
524 public const int PSYS_PART_INTERP_SCALE_MASK = 2;
525 public const int PSYS_PART_BOUNCE_MASK = 4;
526 public const int PSYS_PART_WIND_MASK = 8;
527 public const int PSYS_PART_FOLLOW_SRC_MASK = 16;
528 public const int PSYS_PART_FOLLOW_VELOCITY_MASK = 32;
529 public const int PSYS_PART_TARGET_POS_MASK = 64;
530 public const int PSYS_PART_TARGET_LINEAR_MASK = 128;
531 public const int PSYS_PART_EMISSIVE_MASK = 256;
532 public const int PSYS_PART_FLAGS = 0;
533 public const int PSYS_PART_START_COLOR = 1;
534 public const int PSYS_PART_START_ALPHA = 2;
535 public const int PSYS_PART_END_COLOR = 3;
536 public const int PSYS_PART_END_ALPHA = 4;
537 public const int PSYS_PART_START_SCALE = 5;
538 public const int PSYS_PART_END_SCALE = 6;
539 public const int PSYS_PART_MAX_AGE = 7;
540 public const int PSYS_SRC_ACCEL = 8;
541 public const int PSYS_SRC_PATTERN = 9;
542 public const int PSYS_SRC_INNERANGLE = 10;
543 public const int PSYS_SRC_OUTERANGLE = 11;
544 public const int PSYS_SRC_TEXTURE = 12;
545 public const int PSYS_SRC_BURST_RATE = 13;
546 public const int PSYS_SRC_BURST_PART_COUNT = 15;
547 public const int PSYS_SRC_BURST_RADIUS = 16;
548 public const int PSYS_SRC_BURST_SPEED_MIN = 17;
549 public const int PSYS_SRC_BURST_SPEED_MAX = 18;
550 public const int PSYS_SRC_MAX_AGE = 19;
551 public const int PSYS_SRC_TARGET_KEY = 20;
552 public const int PSYS_SRC_OMEGA = 21;
553 public const int PSYS_SRC_ANGLE_BEGIN = 22;
554 public const int PSYS_SRC_ANGLE_END = 23;
555 public const int PSYS_SRC_PATTERN_DROP = 1;
556 public const int PSYS_SRC_PATTERN_EXPLODE = 2;
557 public const int PSYS_SRC_PATTERN_ANGLE = 4;
558 public const int PSYS_SRC_PATTERN_ANGLE_CONE = 8;
559 public const int PSYS_SRC_PATTERN_ANGLE_CONE_EMPTY = 16;
560 public const int VEHICLE_TYPE_NONE = 0;
561 public const int VEHICLE_TYPE_SLED = 1;
562 public const int VEHICLE_TYPE_CAR = 2;
563 public const int VEHICLE_TYPE_BOAT = 3;
564 public const int VEHICLE_TYPE_AIRPLANE = 4;
565 public const int VEHICLE_TYPE_BALLOON = 5;
566 public const int VEHICLE_LINEAR_FRICTION_TIMESCALE = 16;
567 public const int VEHICLE_ANGULAR_FRICTION_TIMESCALE = 17;
568 public const int VEHICLE_LINEAR_MOTOR_DIRECTION = 18;
569 public const int VEHICLE_LINEAR_MOTOR_OFFSET = 20;
570 public const int VEHICLE_ANGULAR_MOTOR_DIRECTION = 19;
571 public const int VEHICLE_HOVER_HEIGHT = 24;
572 public const int VEHICLE_HOVER_EFFICIENCY = 25;
573 public const int VEHICLE_HOVER_TIMESCALE = 26;
574 public const int VEHICLE_BUOYANCY = 27;
575 public const int VEHICLE_LINEAR_DEFLECTION_EFFICIENCY = 28;
576 public const int VEHICLE_LINEAR_DEFLECTION_TIMESCALE = 29;
577 public const int VEHICLE_LINEAR_MOTOR_TIMESCALE = 30;
578 public const int VEHICLE_LINEAR_MOTOR_DECAY_TIMESCALE = 31;
579 public const int VEHICLE_ANGULAR_DEFLECTION_EFFICIENCY = 32;
580 public const int VEHICLE_ANGULAR_DEFLECTION_TIMESCALE = 33;
581 public const int VEHICLE_ANGULAR_MOTOR_TIMESCALE = 34;
582 public const int VEHICLE_ANGULAR_MOTOR_DECAY_TIMESCALE = 35;
583 public const int VEHICLE_VERTICAL_ATTRACTION_EFFICIENCY = 36;
584 public const int VEHICLE_VERTICAL_ATTRACTION_TIMESCALE = 37;
585 public const int VEHICLE_BANKING_EFFICIENCY = 38;
586 public const int VEHICLE_BANKING_MIX = 39;
587 public const int VEHICLE_BANKING_TIMESCALE = 40;
588 public const int VEHICLE_REFERENCE_FRAME = 44;
589 public const int VEHICLE_FLAG_NO_DEFLECTION_UP = 1;
590 public const int VEHICLE_FLAG_LIMIT_ROLL_ONLY = 2;
591 public const int VEHICLE_FLAG_HOVER_WATER_ONLY = 4;
592 public const int VEHICLE_FLAG_HOVER_TERRAIN_ONLY = 8;
593 public const int VEHICLE_FLAG_HOVER_GLOBAL_HEIGHT = 16;
594 public const int VEHICLE_FLAG_HOVER_UP_ONLY = 32;
595 public const int VEHICLE_FLAG_LIMIT_MOTOR_UP = 64;
596 public const int VEHICLE_FLAG_MOUSELOOK_STEER = 128;
597 public const int VEHICLE_FLAG_MOUSELOOK_BANK = 256;
598 public const int VEHICLE_FLAG_CAMERA_DECOUPLED = 512;
599 public const int INVENTORY_ALL = -1;
600 public const int INVENTORY_NONE = -1;
601 public const int INVENTORY_TEXTURE = 0;
602 public const int INVENTORY_SOUND = 1;
603 public const int INVENTORY_LANDMARK = 3;
604 public const int INVENTORY_CLOTHING = 5;
605 public const int INVENTORY_OBJECT = 6;
606 public const int INVENTORY_NOTECARD = 7;
607 public const int INVENTORY_SCRIPT = 10;
608 public const int INVENTORY_BODYPART = 13;
609 public const int INVENTORY_ANIMATION = 20;
610 public const int INVENTORY_GESTURE = 21;
611 public const int ATTACH_CHEST = 1;
612 public const int ATTACH_HEAD = 2;
613 public const int ATTACH_LSHOULDER = 3;
614 public const int ATTACH_RSHOULDER = 4;
615 public const int ATTACH_LHAND = 5;
616 public const int ATTACH_RHAND = 6;
617 public const int ATTACH_LFOOT = 7;
618 public const int ATTACH_RFOOT = 8;
619 public const int ATTACH_BACK = 9;
620 public const int ATTACH_PELVIS = 10;
621 public const int ATTACH_MOUTH = 11;
622 public const int ATTACH_CHIN = 12;
623 public const int ATTACH_LEAR = 13;
624 public const int ATTACH_REAR = 14;
625 public const int ATTACH_LEYE = 15;
626 public const int ATTACH_REYE = 16;
627 public const int ATTACH_NOSE = 17;
628 public const int ATTACH_RUARM = 18;
629 public const int ATTACH_RLARM = 19;
630 public const int ATTACH_LUARM = 20;
631 public const int ATTACH_LLARM = 21;
632 public const int ATTACH_RHIP = 22;
633 public const int ATTACH_RULEG = 23;
634 public const int ATTACH_RLLEG = 24;
635 public const int ATTACH_LHIP = 25;
636 public const int ATTACH_LULEG = 26;
637 public const int ATTACH_LLLEG = 27;
638 public const int ATTACH_BELLY = 28;
639 public const int ATTACH_RPEC = 29;
640 public const int ATTACH_LPEC = 30;
641 public const int LAND_LEVEL = 0;
642 public const int LAND_RAISE = 1;
643 public const int LAND_LOWER = 2;
644 public const int LAND_SMOOTH = 3;
645 public const int LAND_NOISE = 4;
646 public const int LAND_REVERT = 5;
647 public const int LAND_SMALL_BRUSH = 1;
648 public const int LAND_MEDIUM_BRUSH = 2;
649 public const int LAND_LARGE_BRUSH = 3;
650 public const int DATA_ONLINE = 1;
651 public const int DATA_NAME = 2;
652 public const int DATA_BORN = 3;
653 public const int DATA_RATING = 4;
654 public const int DATA_SIM_POS = 5;
655 public const int DATA_SIM_STATUS = 6;
656 public const int DATA_SIM_RATING = 7;
657 public const int ANIM_ON = 1;
658 public const int LOOP = 2;
659 public const int REVERSE = 4;
660 public const int PING_PONG = 8;
661 public const int SMOOTH = 16;
662 public const int ROTATE = 32;
663 public const int SCALE = 64;
664 public const int ALL_SIDES = -1;
665 public const int LINK_SET = -1;
666 public const int LINK_ROOT = 1;
667 public const int LINK_ALL_OTHERS = -2;
668 public const int LINK_ALL_CHILDREN = -3;
669 public const int LINK_THIS = -4;
670 public const int CHANGED_INVENTORY = 1;
671 public const int CHANGED_COLOR = 2;
672 public const int CHANGED_SHAPE = 4;
673 public const int CHANGED_SCALE = 8;
674 public const int CHANGED_TEXTURE = 16;
675 public const int CHANGED_LINK = 32;
676 public const int CHANGED_ALLOWED_DROP = 64;
677 public const int CHANGED_OWNER = 128;
678 public const int TYPE_INVALID = 0;
679 public const int TYPE_INTEGER = 1;
680 public const int TYPE_double = 2;
681 public const int TYPE_STRING = 3;
682 public const int TYPE_KEY = 4;
683 public const int TYPE_VECTOR = 5;
684 public const int TYPE_ROTATION = 6;
685 public const int REMOTE_DATA_CHANNEL = 1;
686 public const int REMOTE_DATA_REQUEST = 2;
687 public const int REMOTE_DATA_REPLY = 3;
688 //public const int PRIM_TYPE = 1;
689 public const int PRIM_MATERIAL = 2;
690 public const int PRIM_PHYSICS = 3;
691 public const int PRIM_TEMP_ON_REZ = 4;
692 public const int PRIM_PHANTOM = 5;
693 public const int PRIM_POSITION = 6;
694 public const int PRIM_SIZE = 7;
695 public const int PRIM_ROTATION = 8;
696 public const int PRIM_TYPE = 9;
697 public const int PRIM_TEXTURE = 17;
698 public const int PRIM_COLOR = 18;
699 public const int PRIM_BUMP_SHINY = 19;
700 public const int PRIM_FULLBRIGHT = 20;
701 public const int PRIM_FLEXIBLE = 21;
702 public const int PRIM_TEXGEN = 22;
703 public const int PRIM_TEXGEN_DEFAULT = 0;
704 public const int PRIM_TEXGEN_PLANAR = 1;
705 public const int PRIM_TYPE_BOX = 0;
706 public const int PRIM_TYPE_CYLINDER = 1;
707 public const int PRIM_TYPE_PRISM = 2;
708 public const int PRIM_TYPE_SPHERE = 3;
709 public const int PRIM_TYPE_TORUS = 4;
710 public const int PRIM_TYPE_TUBE = 5;
711 public const int PRIM_TYPE_RING = 6;
712 public const int PRIM_HOLE_DEFAULT = 0;
713 public const int PRIM_HOLE_CIRCLE = 16;
714 public const int PRIM_HOLE_SQUARE = 32;
715 public const int PRIM_HOLE_TRIANGLE = 48;
716 public const int PRIM_MATERIAL_STONE = 0;
717 public const int PRIM_MATERIAL_METAL = 1;
718 public const int PRIM_MATERIAL_GLASS = 2;
719 public const int PRIM_MATERIAL_WOOD = 3;
720 public const int PRIM_MATERIAL_FLESH = 4;
721 public const int PRIM_MATERIAL_PLASTIC = 5;
722 public const int PRIM_MATERIAL_RUBBER = 6;
723 public const int PRIM_MATERIAL_LIGHT = 7;
724 public const int PRIM_SHINY_NONE = 0;
725 public const int PRIM_SHINY_LOW = 1;
726 public const int PRIM_SHINY_MEDIUM = 2;
727 public const int PRIM_SHINY_HIGH = 3;
728 public const int PRIM_BUMP_NONE = 0;
729 public const int PRIM_BUMP_BRIGHT = 1;
730 public const int PRIM_BUMP_DARK = 2;
731 public const int PRIM_BUMP_WOOD = 3;
732 public const int PRIM_BUMP_BARK = 4;
733 public const int PRIM_BUMP_BRICKS = 5;
734 public const int PRIM_BUMP_CHECKER = 6;
735 public const int PRIM_BUMP_CONCRETE = 7;
736 public const int PRIM_BUMP_TILE = 8;
737 public const int PRIM_BUMP_STONE = 9;
738 public const int PRIM_BUMP_DISKS = 10;
739 public const int PRIM_BUMP_GRAVEL = 11;
740 public const int PRIM_BUMP_BLOBS = 12;
741 public const int PRIM_BUMP_SIDING = 13;
742 public const int PRIM_BUMP_LARGETILE = 14;
743 public const int PRIM_BUMP_STUCCO = 15;
744 public const int PRIM_BUMP_SUCTION = 16;
745 public const int PRIM_BUMP_WEAVE = 17;
746 public const int MASK_BASE = 0;
747 public const int MASK_OWNER = 1;
748 public const int MASK_GROUP = 2;
749 public const int MASK_EVERYONE = 3;
750 public const int MASK_NEXT = 4;
751 public const int PERM_TRANSFER = 8192;
752 public const int PERM_MODIFY = 16384;
753 public const int PERM_COPY = 32768;
754 public const int PERM_MOVE = 524288;
755 public const int PERM_ALL = 2147483647;
756 public const int PARCEL_MEDIA_COMMAND_STOP = 0;
757 public const int PARCEL_MEDIA_COMMAND_PAUSE = 1;
758 public const int PARCEL_MEDIA_COMMAND_PLAY = 2;
759 public const int PARCEL_MEDIA_COMMAND_LOOP = 3;
760 public const int PARCEL_MEDIA_COMMAND_TEXTURE = 4;
761 public const int PARCEL_MEDIA_COMMAND_URL = 5;
762 public const int PARCEL_MEDIA_COMMAND_TIME = 6;
763 public const int PARCEL_MEDIA_COMMAND_AGENT = 7;
764 public const int PARCEL_MEDIA_COMMAND_UNLOAD = 8;
765 public const int PARCEL_MEDIA_COMMAND_AUTO_ALIGN = 9;
766 public const int PAY_HIDE = -1;
767 public const int PAY_DEFAULT = -2;
768 public const string NULL_KEY = "00000000-0000-0000-0000-000000000000";
769 public const string EOF = "\n\n\n";
770 public const double PI = 3.14159274f;
771 public const double TWO_PI = 6.28318548f;
772 public const double PI_BY_TWO = 1.57079637f;
773 public const double DEG_TO_RAD = 0.01745329238f;
774 public const double RAD_TO_DEG = 57.29578f;
775 public const double SQRT2 = 1.414213538f;
776
777 // Can not be public const?
778 public LSL_Types.Vector3 ZERO_VECTOR = new LSL_Types.Vector3(0, 0, 0);
779 public LSL_Types.Quaternion ZERO_ROTATION = new LSL_Types.Quaternion(0, 0, 0, 0);
780
781
782
783 }
784}
diff --git a/OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/LSO/Common.cs b/OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/LSO/Common.cs
new file mode 100644
index 0000000..e1ea916
--- /dev/null
+++ b/OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/LSO/Common.cs
@@ -0,0 +1,84 @@
1/*
2* Copyright (c) Contributors, http://opensimulator.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28/* Original code: Tedd Hansen */
29using System;
30using System.Collections.Generic;
31using System.Text;
32
33namespace OpenSim.Grid.ScriptEngine.DotNetEngine.Compiler.LSO
34{
35 public static class Common
36 {
37 static public bool Debug = true;
38 static public bool IL_UseTryCatch = true;
39 static public bool IL_CreateConstructor = true;
40 static public bool IL_CreateFunctionList = true;
41 static public bool IL_ProcessCodeChunks = true;
42
43 public delegate void SendToDebugEventDelegate(string Message);
44 public delegate void SendToLogEventDelegate(string Message);
45 static public event SendToDebugEventDelegate SendToDebugEvent;
46 static public event SendToLogEventDelegate SendToLogEvent;
47
48 static public void SendToDebug(string Message)
49 {
50 //if (Debug == true)
51 Console.WriteLine("COMPILER:Debug: " + Message);
52 SendToDebugEvent("\r\n" + DateTime.Now.ToString("[HH:mm:ss] ") + Message);
53 }
54 static public void SendToLog(string Message)
55 {
56 //if (Debug == true)
57 Console.WriteLine("COMPILER:LOG: " + Message);
58 SendToLogEvent("\r\n" + DateTime.Now.ToString("[HH:mm:ss] ") + Message);
59 }
60 }
61
62 // TEMPORARY TEST THINGIES
63 public static class IL_Helper
64 {
65 public static string ReverseFormatString(string text1, string format)
66 {
67 Common.SendToDebug("ReverseFormatString text1: " + text1);
68 Common.SendToDebug("ReverseFormatString format: " + format);
69 return string.Format(format, text1);
70 }
71 public static string ReverseFormatString(string text1, UInt32 text2, string format)
72 {
73 Common.SendToDebug("ReverseFormatString text1: " + text1);
74 Common.SendToDebug("ReverseFormatString text2: " + text2.ToString());
75 Common.SendToDebug("ReverseFormatString format: " + format);
76 return string.Format(format, text1, text2.ToString());
77 }
78 public static string Cast_ToString(object obj)
79 {
80 Common.SendToDebug("OBJECT TO BE CASTED: " + obj.GetType().ToString());
81 return "ABCDEFGIHJKLMNOPQ123";
82 }
83 }
84}
diff --git a/OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/LSO/Engine.cs b/OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/LSO/Engine.cs
new file mode 100644
index 0000000..cfae2c5
--- /dev/null
+++ b/OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/LSO/Engine.cs
@@ -0,0 +1,300 @@
1/*
2* Copyright (c) Contributors, http://opensimulator.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28/* Original code: Tedd Hansen */
29using System;
30using System.Reflection;
31using System.Reflection.Emit;
32using System.Threading;
33
34
35namespace OpenSim.Grid.ScriptEngine.DotNetEngine.Compiler.LSO
36{
37
38
39 public class Engine
40 {
41 //private string LSO_FileName = @"LSO\AdditionTest.lso";
42 private string LSO_FileName;// = @"LSO\CloseToDefault.lso";
43 AppDomain appDomain;
44
45 public string Compile(string LSOFileName)
46 {
47 LSO_FileName = LSOFileName;
48
49
50 //appDomain = AppDomain.CreateDomain("AlternateAppDomain");
51 appDomain = Thread.GetDomain();
52
53 // Create Assembly Name
54 AssemblyName asmName = new AssemblyName();
55 asmName.Name = System.IO.Path.GetFileNameWithoutExtension(LSO_FileName);
56 //asmName.Name = "TestAssembly";
57
58 string DLL_FileName = asmName.Name + ".dll";
59 string DLL_FileName_WithPath = System.IO.Path.GetDirectoryName(LSO_FileName) + @"\" + DLL_FileName;
60
61 Common.SendToLog("LSO File Name: " + System.IO.Path.GetFileName(LSO_FileName));
62 Common.SendToLog("Assembly name: " + asmName.Name);
63 Common.SendToLog("Assembly File Name: " + asmName.Name + ".dll");
64 Common.SendToLog("Starting processing of LSL ByteCode...");
65 Common.SendToLog("");
66
67
68
69 // Create Assembly
70 AssemblyBuilder asmBuilder = appDomain.DefineDynamicAssembly(
71 asmName,
72 AssemblyBuilderAccess.RunAndSave
73 );
74 //// Create Assembly
75 //AssemblyBuilder asmBuilder =
76 // Thread.GetDomain().DefineDynamicAssembly
77 //(asmName, AssemblyBuilderAccess.RunAndSave);
78
79 // Create a module (and save to disk)
80 ModuleBuilder modBuilder = asmBuilder.DefineDynamicModule
81 (asmName.Name,
82 DLL_FileName);
83
84 //Common.SendToDebug("asmName.Name is still \"" + asmName.Name + "\"");
85 // Create a Class (/Type)
86 TypeBuilder typeBuilder = modBuilder.DefineType(
87 "LSL_ScriptObject",
88 TypeAttributes.Public | TypeAttributes.BeforeFieldInit,
89 typeof(OpenSim.Grid.ScriptEngine.DotNetEngine.Compiler.LSO.LSL_BaseClass));
90 //,
91 // typeof());
92 //, typeof(LSL_BuiltIn_Commands_Interface));
93 //,
94 // typeof(object),
95 // new Type[] { typeof(LSL_CLRInterface.LSLScript) });
96
97
98
99 /*
100 * Generate the IL itself
101 */
102
103 LSO_Parser LSOP = new LSO_Parser(LSO_FileName, typeBuilder);
104 LSOP.OpenFile();
105 LSOP.Parse();
106
107 // Constructor has to be created AFTER LSO_Parser because of accumulated variables
108 if (Common.IL_CreateConstructor)
109 IL_CREATE_CONSTRUCTOR(typeBuilder, LSOP);
110
111 LSOP.CloseFile();
112 /*
113 * Done generating. Create a type and run it.
114 */
115
116
117 Common.SendToLog("Attempting to compile assembly...");
118 // Compile it
119 Type type = typeBuilder.CreateType();
120 Common.SendToLog("Compilation successful!");
121
122 Common.SendToLog("Saving assembly: " + DLL_FileName);
123 asmBuilder.Save(DLL_FileName);
124
125 Common.SendToLog("Returning assembly filename: " + DLL_FileName);
126
127
128 return DLL_FileName;
129
130
131 //Common.SendToLog("Creating an instance of new assembly...");
132 //// Create an instance we can play with
133 ////LSLScript hello = (LSLScript)Activator.CreateInstance(type);
134 ////LSL_CLRInterface.LSLScript MyScript = (LSL_CLRInterface.LSLScript)Activator.CreateInstance(type);
135 //object MyScript = (object)Activator.CreateInstance(type);
136
137
138
139
140
141 //System.Reflection.MemberInfo[] Members = type.GetMembers();
142
143 //Common.SendToLog("Members of assembly " + type.ToString() + ":");
144 //foreach (MemberInfo member in Members)
145 // Common.SendToLog(member.ToString());
146
147
148 //// Play with it
149 ////MyScript.event_state_entry("Test");
150 //object[] args = { null };
151 ////System.Collections.Generic.List<string> Functions = (System.Collections.Generic.List<string>)type.InvokeMember("GetFunctions", BindingFlags.InvokeMethod, null, MyScript, null);
152
153 //string[] ret = { };
154 //if (Common.IL_CreateFunctionList)
155 // ret = (string[])type.InvokeMember("GetFunctions", BindingFlags.InvokeMethod, null, MyScript, null);
156
157 //foreach (string s in ret)
158 //{
159 // Common.SendToLog("");
160 // Common.SendToLog("*** Executing LSL Server Event: " + s);
161 // //object test = type.GetMember(s);
162 // //object runner = type.InvokeMember(s, BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Instance, null, MyScript, args);
163 // //runner();
164 // //objBooks_Late = type.InvokeMember(s, BindingFlags.CreateInstance, null, objApp_Late, null);
165 // type.InvokeMember(s, BindingFlags.InvokeMethod, null, MyScript, new object[] { "Test" });
166
167 //}
168
169
170 }
171
172
173 private static void IL_CREATE_CONSTRUCTOR(TypeBuilder typeBuilder, LSO_Parser LSOP)
174 {
175
176
177 Common.SendToDebug("IL_CREATE_CONSTRUCTOR()");
178 //ConstructorBuilder constructor = typeBuilder.DefineConstructor(
179 // MethodAttributes.Public,
180 // CallingConventions.Standard,
181 // new Type[0]);
182 ConstructorBuilder constructor = typeBuilder.DefineConstructor(
183 MethodAttributes.Public |
184 MethodAttributes.SpecialName |
185 MethodAttributes.RTSpecialName,
186 CallingConventions.Standard,
187 new Type[0]);
188
189 //Define the reflection ConstructorInfor for System.Object
190 ConstructorInfo conObj = typeof(LSL_BaseClass).GetConstructor(new Type[0]);
191
192 //call constructor of base object
193 ILGenerator il = constructor.GetILGenerator();
194
195 il.Emit(OpCodes.Ldarg_0);
196 il.Emit(OpCodes.Call, conObj);
197
198
199 //Common.SendToDebug("IL_CREATE_CONSTRUCTOR: Creating global: UInt32 State = 0;");
200 //string FieldName;
201 //// Create state object
202 //FieldName = "State";
203 //FieldBuilder State_fb = typeBuilder.DefineField(
204 // FieldName,
205 // typeof(UInt32),
206 // FieldAttributes.Public);
207 //il.Emit(OpCodes.Ldarg_0);
208 //il.Emit(OpCodes.Ldc_I4, 0);
209 //il.Emit(OpCodes.Stfld, State_fb);
210
211
212 //Common.SendToDebug("IL_CREATE_CONSTRUCTOR: Creating global: LSL_BuiltIn_Commands_TestImplementation LSL_BuiltIns = New LSL_BuiltIn_Commands_TestImplementation();");
213 ////Type objType1 = typeof(object);
214 //Type objType1 = typeof(LSL_BuiltIn_Commands_TestImplementation);
215
216 //FieldName = "LSL_BuiltIns";
217 //FieldBuilder LSL_BuiltIns_fb = typeBuilder.DefineField(
218 // FieldName,
219 // objType1,
220 // FieldAttributes.Public);
221
222 ////LSL_BuiltIn_Commands_TestImplementation _ti = new LSL_BuiltIn_Commands_TestImplementation();
223 //il.Emit(OpCodes.Ldarg_0);
224 ////il.Emit(OpCodes.Ldstr, "Test 123");
225 //il.Emit(OpCodes.Newobj, objType1.GetConstructor(new Type[] { }));
226 //il.Emit(OpCodes.Stfld, LSL_BuiltIns_fb);
227
228 foreach (UInt32 pos in LSOP.StaticBlocks.Keys)
229 {
230 LSO_Struct.StaticBlock sb;
231 LSOP.StaticBlocks.TryGetValue(pos, out sb);
232
233 if (sb.ObjectType > 0 && sb.ObjectType < 8) { // We don't want void or null's
234
235 il.Emit(OpCodes.Ldarg_0);
236 // Push position to stack
237 il.Emit(OpCodes.Ldc_I4, pos);
238 //il.Emit(OpCodes.Box, typeof(UInt32));
239
240
241 Type datatype = null;
242
243 // Push data to stack
244 Common.SendToDebug("Adding to static (" + pos + ") type: " + ((LSO_Enums.Variable_Type_Codes)sb.ObjectType).ToString() + " (" + sb.ObjectType + ")");
245 switch ((LSO_Enums.Variable_Type_Codes)sb.ObjectType)
246 {
247 case LSO_Enums.Variable_Type_Codes.Float:
248 case LSO_Enums.Variable_Type_Codes.Integer:
249 //UInt32
250 il.Emit(OpCodes.Ldc_I4, BitConverter.ToUInt32(sb.BlockVariable, 0));
251 datatype = typeof(UInt32);
252 il.Emit(OpCodes.Box, datatype);
253 break;
254 case LSO_Enums.Variable_Type_Codes.String:
255 case LSO_Enums.Variable_Type_Codes.Key:
256 //String
257 LSO_Struct.HeapBlock hb = LSOP.GetHeap(LSOP.myHeader.HR + BitConverter.ToUInt32(sb.BlockVariable, 0) - 1);
258 il.Emit(OpCodes.Ldstr, System.Text.Encoding.UTF8.GetString(hb.Data));
259 datatype = typeof(string);
260 break;
261 case LSO_Enums.Variable_Type_Codes.Vector:
262 datatype = typeof(LSO_Enums.Vector);
263 //TODO: Not implemented
264 break;
265 case LSO_Enums.Variable_Type_Codes.Rotation:
266 //Object
267 //TODO: Not implemented
268 datatype = typeof(LSO_Enums.Rotation);
269 break;
270 default:
271 datatype = typeof(object);
272 break;
273 }
274
275
276 // Make call
277 il.Emit(OpCodes.Call, typeof(LSL_BaseClass).GetMethod("AddToStatic", new Type[] { typeof(UInt32), datatype }));
278 }
279
280 }
281
282
283
284
285 ////il.Emit(OpCodes.Newobj, typeof(UInt32));
286 //il.Emit(OpCodes.Starg_0);
287 //// Create LSL function library
288 //FieldBuilder LSL_BuiltIns_fb = typeBuilder.DefineField("LSL_BuiltIns", typeof(LSL_BuiltIn_Commands_Interface), FieldAttributes.Public);
289 //il.Emit(OpCodes.Newobj, typeof(LSL_BuiltIn_Commands_Interface));
290 //il.Emit(OpCodes.Stloc_1);
291
292 il.Emit(OpCodes.Ret);
293 }
294
295
296
297
298 // End of class
299 }
300}
diff --git a/OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/LSO/IL_common_functions.cs b/OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/LSO/IL_common_functions.cs
new file mode 100644
index 0000000..eef9d20
--- /dev/null
+++ b/OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/LSO/IL_common_functions.cs
@@ -0,0 +1,56 @@
1/*
2* Copyright (c) Contributors, http://opensimulator.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28/* Original code: Tedd Hansen */
29using System;
30using System.Collections.Generic;
31using System.Text;
32using System.Reflection;
33using System.Reflection.Emit;
34
35namespace OpenSim.Grid.ScriptEngine.DotNetEngine.Compiler.LSO
36{
37 partial class LSO_Parser
38 {
39 private static TypeBuilder CreateType(ModuleBuilder modBuilder, string typeName)
40 {
41 TypeBuilder typeBuilder = modBuilder.DefineType(typeName,
42 TypeAttributes.Public |
43 TypeAttributes.Class |
44 TypeAttributes.AutoClass |
45 TypeAttributes.AnsiClass |
46 TypeAttributes.BeforeFieldInit |
47 TypeAttributes.AutoLayout,
48 typeof(object),
49 new Type[] { typeof(object) });
50 return typeBuilder;
51
52 }
53
54
55 }
56}
diff --git a/OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/LSO/LSL_BaseClass.cs b/OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/LSO/LSL_BaseClass.cs
new file mode 100644
index 0000000..89efa6a
--- /dev/null
+++ b/OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/LSO/LSL_BaseClass.cs
@@ -0,0 +1,60 @@
1using System;
2using System.Collections.Generic;
3using System.Text;
4using System.IO;
5using OpenSim.Grid.ScriptEngine.DotNetEngine.Compiler;
6using OpenSim.Region.ScriptEngine.Common;
7
8namespace OpenSim.Grid.ScriptEngine.DotNetEngine.Compiler.LSO
9{
10 public partial class LSL_BaseClass
11 {
12 //public MemoryStream LSLStack = new MemoryStream();
13 public Stack<object> LSLStack = new Stack<object>();
14 public Dictionary<UInt32, object> StaticVariables = new Dictionary<UInt32, object>();
15 public Dictionary<UInt32, object> GlobalVariables = new Dictionary<UInt32, object>();
16 public Dictionary<UInt32, object> LocalVariables = new Dictionary<UInt32, object>();
17 //public System.Collections.Generic.List<string> FunctionList = new System.Collections.Generic.List<string>();
18 //public void AddFunction(String x) {
19 // FunctionList.Add(x);
20 //}
21 //public Stack<StackItemStruct> LSLStack = new Stack<StackItemStruct>;
22 //public struct StackItemStruct
23 //{
24 // public LSO_Enums.Variable_Type_Codes ItemType;
25 // public object Data;
26 //}
27 public UInt32 State = 0;
28 public LSL_BuiltIn_Commands_Interface LSL_Builtins;
29 public LSL_BuiltIn_Commands_Interface GetLSL_BuiltIn()
30 {
31 return LSL_Builtins;
32 }
33
34
35 public LSL_BaseClass() { }
36
37
38 public virtual int OverrideMe()
39 {
40 return 0;
41 }
42 public void Start(LSL_BuiltIn_Commands_Interface LSLBuiltins)
43 {
44 LSL_Builtins = LSLBuiltins;
45
46 Common.SendToLog("OpenSim.Grid.ScriptEngine.DotNetEngine.Compiler.LSO.LSL_BaseClass.Start() called");
47 //LSL_Builtins.llSay(0, "Test");
48 return;
49 }
50
51 public void AddToStatic(UInt32 index, object obj)
52 {
53 Common.SendToDebug("AddToStatic: " + index + " type: " + obj.GetType());
54 StaticVariables.Add(index, obj);
55 }
56
57
58
59 }
60}
diff --git a/OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/LSO/LSL_BaseClass_Builtins.cs b/OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/LSO/LSL_BaseClass_Builtins.cs
new file mode 100644
index 0000000..3782494
--- /dev/null
+++ b/OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/LSO/LSL_BaseClass_Builtins.cs
@@ -0,0 +1,373 @@
1//using System;
2//using System.Collections.Generic;
3//using System.Text;
4
5//namespace OpenSim.Grid.ScriptEngine.DotNetEngine.Compiler.LSO
6//{
7// public partial class LSL_BaseClass
8// {
9
10
11// public float llSin() {
12// float f = (float)LSLStack.Pop();
13// return LSL_Builtins.llSin(f);
14// }
15// public float llCos() {
16// float f = (float)LSLStack.Pop();
17// return LSL_Builtins.llCos(f);
18// }
19// public float llTan() {
20// float f = (float)LSLStack.Pop();
21// return LSL_Builtins.llTan(f);
22// }
23// public float llAtan2() {
24// float x = (float)LSLStack.Pop();
25// float y = (float)LSLStack.Pop();
26// return LSL_Builtins.llAtan2(x, y);
27// }
28// public float llSqrt() {
29// float f = (float)LSLStack.Pop();
30// return LSL_Builtins.llSqrt(f);
31// }
32// float llPow()
33// {
34// float fexponent = (float)LSLStack.Pop();
35// float fbase = (float)LSLStack.Pop();
36// return LSL_Builtins.llPow(fbase, fexponent);
37// }
38// //UInt32 llAbs(UInt32 i){ return; }
39// //float llFabs(float f){ return; }
40// //float llFrand(float mag){ return; }
41// //UInt32 llFloor(float f){ return; }
42// //UInt32 llCeil(float f){ return; }
43// //UInt32 llRound(float f){ return; }
44// //float llVecMag(LSO_Enums.Vector v){ return; }
45// //LSO_Enums.Vector llVecNorm(LSO_Enums.Vector v){ return; }
46// //float llVecDist(LSO_Enums.Vector a, LSO_Enums.Vector b){ return; }
47// //LSO_Enums.Vector llRot2Euler(LSO_Enums.Rotation r){ return; }
48// //LSO_Enums.Rotation llEuler2Rot(LSO_Enums.Vector v){ return; }
49// //LSO_Enums.Rotation llAxes2Rot(LSO_Enums.Vector fwd, LSO_Enums.Vector left, LSO_Enums.Vector up){ return; }
50// //LSO_Enums.Vector llRot2Fwd(LSO_Enums.Rotation r){ return; }
51// //LSO_Enums.Vector llRot2Left(LSO_Enums.Rotation r){ return; }
52// //LSO_Enums.Vector llRot2Up(LSO_Enums.Rotation r){ return; }
53// //LSO_Enums.Rotation llRotBetween(LSO_Enums.Vector start, LSO_Enums.Vector end){ return; }
54// public void llWhisper()
55// {
56// UInt16 i = (UInt16)LSLStack.Pop();
57// string s = (string)LSLStack.Pop();
58// LSL_Builtins.llWhisper(i, s);
59// }
60// public void llSay()
61// {
62// UInt16 i = (UInt16)LSLStack.Pop();
63// string s = (string)LSLStack.Pop();
64// LSL_Builtins.llSay(i, s);
65// }
66// //void llShout(UInt16 channelID, string text);
67// //UInt32 llListen(UInt16 channelID, string name, LSO_Enums.Key ID, string msg);
68// //void llListenControl(UInt32 number, UInt32 active);
69// //void llListenRemove(UInt32 number);
70// //void llSensor(string name, LSO_Enums.Key id, UInt32 type, float range, float arc);
71// //void llSensorRepeat(string name, LSO_Enums.Key id, UInt32 type, float range, float arc, float rate);
72// //void llSensorRemove();
73// //string llDetectedName(UInt32 number);
74// //LSO_Enums.Key llDetectedKey(UInt32 number);
75// //LSO_Enums.Key llDetectedOwner(UInt32 number);
76// //UInt32 llDetectedType(UInt32 number);
77// //LSO_Enums.Vector llDetectedPos(UInt32 number);
78// //LSO_Enums.Vector llDetectedVel(UInt32 number);
79// //LSO_Enums.Vector llDetectedGrab(UInt32 number);
80// //LSO_Enums.Rotation llDetectedRot(UInt32 number);
81// //UInt32 llDetectedGroup(UInt32 number);
82// //UInt32 llDetectedLinkNumber(UInt32 number);
83// //void llDie();
84// //float llGround(LSO_Enums.Vector offset);
85// //float llCloud(LSO_Enums.Vector offset);
86// //LSO_Enums.Vector llWind(LSO_Enums.Vector offset);
87// //void llSetStatus(UInt32 status, UInt32 value);
88// //UInt32 llGetStatus(UInt32 status);
89// //void llSetScale(LSO_Enums.Vector scale);
90// //LSO_Enums.Vector llGetScale();
91// //void llSetColor();
92// //float llGetAlpha();
93// //void llSetAlpha();
94// //LSO_Enums.Vector llGetColor();
95// //void llSetTexture();
96// //void llScaleTexture();
97// //void llOffsetTexture();
98// //void llRotateTexture();
99// //string llGetTexture();
100// //void llSetPos();
101
102// public void llGetPos() { }
103// public void llGetLocalPos() { }
104// public void llSetRot() { }
105// public void llGetRot() { }
106// public void llGetLocalRot() { }
107// public void llSetForce() { }
108// public void llGetForce() { }
109// public void llTarget() { }
110// public void llTargetRemove() { }
111// public void llRotTarget() { }
112// public void llRotTargetRemove() { }
113// public void llMoveToTarget() { }
114// public void llStopMoveToTarget() { }
115// public void llApplyImpulse() { }
116// public void llApplyRotationalImpulse() { }
117// public void llSetTorque() { }
118// public void llGetTorque() { }
119// public void llSetForceAndTorque() { }
120// public void llGetVel() { }
121// public void llGetAccel() { }
122// public void llGetOmega() { }
123// public void llGetTimeOfDay() { }
124// public void llGetWallclock() { }
125// public void llGetTime() { }
126// public void llResetTime() { }
127// public void llGetAndResetTime() { }
128// public void llSound() { }
129// public void llPlaySound() { }
130// public void llLoopSound() { }
131// public void llLoopSoundMaster() { }
132// public void llLoopSoundSlave() { }
133// public void llPlaySoundSlave() { }
134// public void llTriggerSound() { }
135// public void llStopSound() { }
136// public void llPreloadSound() { }
137// public void llGetSubString() { }
138// public void llDeleteSubString() { }
139// public void llInsertString() { }
140// public void llToUpper() { }
141// public void llToLower() { }
142// public void llGiveMoney() { }
143// public void llMakeExplosion() { }
144// public void llMakeFountain() { }
145// public void llMakeSmoke() { }
146// public void llMakeFire() { }
147// public void llRezObject() { }
148// public void llLookAt() { }
149// public void llStopLookAt() { }
150// public void llSetTimerEvent() { }
151// public void llSleep() { }
152// public void llGetMass() { }
153// public void llCollisionFilter() { }
154// public void llTakeControls() { }
155// public void llReleaseControls() { }
156// public void llAttachToAvatar() { }
157// public void llDetachFromAvatar() { }
158// public void llTakeCamera() { }
159// public void llReleaseCamera() { }
160// public void llGetOwner() { }
161// public void llInstantMessage() { }
162// public void llEmail() { }
163// public void llGetNextEmail() { }
164// public void llGetKey() { }
165// public void llSetBuoyancy() { }
166// public void llSetHoverHeight() { }
167// public void llStopHover() { }
168// public void llMinEventDelay() { }
169// public void llSoundPreload() { }
170// public void llRotLookAt() { }
171// public void llStringLength() { }
172// public void llStartAnimation() { }
173// public void llStopAnimation() { }
174// public void llPointAt() { }
175// public void llStopPointAt() { }
176// public void llTargetOmega() { }
177// public void llGetStartParameter() { }
178// public void llGodLikeRezObject() { }
179// public void llRequestPermissions() { }
180// public void llGetPermissionsKey() { }
181// public void llGetPermissions() { }
182// public void llGetLinkNumber() { }
183// public void llSetLinkColor() { }
184// public void llCreateLink() { }
185// public void llBreakLink() { }
186// public void llBreakAllLinks() { }
187// public void llGetLinkKey() { }
188// public void llGetLinkName() { }
189// public void llGetInventoryNumber() { }
190// public void llGetInventoryName() { }
191// public void llSetScriptState() { }
192// public void llGetEnergy() { }
193// public void llGiveInventory() { }
194// public void llRemoveInventory() { }
195// public void llSetText() { }
196// public void llWater() { }
197// public void llPassTouches() { }
198// public void llRequestAgentData() { }
199// public void llRequestInventoryData() { }
200// public void llSetDamage() { }
201// public void llTeleportAgentHome() { }
202// public void llModifyLand() { }
203// public void llCollisionSound() { }
204// public void llCollisionSprite() { }
205// public void llGetAnimation() { }
206// public void llResetScript() { }
207// public void llMessageLinked() { }
208// public void llPushObject() { }
209// public void llPassCollisions() { }
210// public void llGetScriptName() { }
211// public void llGetNumberOfSides() { }
212// public void llAxisAngle2Rot() { }
213// public void llRot2Axis() { }
214// public void llRot2Angle() { }
215// public void llAcos() { }
216// public void llAsin() { }
217// public void llAngleBetween() { }
218// public void llGetInventoryKey() { }
219// public void llAllowInventoryDrop() { }
220// public void llGetSunDirection() { }
221// public void llGetTextureOffset() { }
222// public void llGetTextureScale() { }
223// public void llGetTextureRot() { }
224// public void llSubStringIndex() { }
225// public void llGetOwnerKey() { }
226// public void llGetCenterOfMass() { }
227// public void llListSort() { }
228// public void llGetListLength() { }
229// public void llList2Integer() { }
230// public void llList2Float() { }
231// public void llList2String() { }
232// public void llList2Key() { }
233// public void llList2Vector() { }
234// public void llList2Rot() { }
235// public void llList2List() { }
236// public void llDeleteSubList() { }
237// public void llGetListEntryType() { }
238// public void llList2CSV() { }
239// public void llCSV2List() { }
240// public void llListRandomize() { }
241// public void llList2ListStrided() { }
242// public void llGetRegionCorner() { }
243// public void llListInsertList() { }
244// public void llListFindList() { }
245// public void llGetObjectName() { }
246// public void llSetObjectName() { }
247// public void llGetDate() { }
248// public void llEdgeOfWorld() { }
249// public void llGetAgentInfo() { }
250// public void llAdjustSoundVolume() { }
251// public void llSetSoundQueueing() { }
252// public void llSetSoundRadius() { }
253// public void llKey2Name() { }
254// public void llSetTextureAnim() { }
255// public void llTriggerSoundLimited() { }
256// public void llEjectFromLand() { }
257// public void llParseString2List() { }
258// public void llOverMyLand() { }
259// public void llGetLandOwnerAt() { }
260// public void llGetNotecardLine() { }
261// public void llGetAgentSize() { }
262// public void llSameGroup() { }
263// public void llUnSit() { }
264// public void llGroundSlope() { }
265// public void llGroundNormal() { }
266// public void llGroundContour() { }
267// public void llGetAttached() { }
268// public void llGetFreeMemory() { }
269// public void llGetRegionName() { }
270// public void llGetRegionTimeDilation() { }
271// public void llGetRegionFPS() { }
272// public void llParticleSystem() { }
273// public void llGroundRepel() { }
274// public void llGiveInventoryList() { }
275// public void llSetVehicleType() { }
276// public void llSetVehicleFloatParam() { }
277// public void llSetVehicleVectorParam() { }
278// public void llSetVehicleRotationParam() { }
279// public void llSetVehicleFlags() { }
280// public void llRemoveVehicleFlags() { }
281// public void llSitTarget() { }
282// public void llAvatarOnSitTarget() { }
283// public void llAddToLandPassList() { }
284// public void llSetTouchText() { }
285// public void llSetSitText() { }
286// public void llSetCameraEyeOffset() { }
287// public void llSetCameraAtOffset() { }
288// public void llDumpList2String() { }
289// public void llScriptDanger() { }
290// public void llDialog() { }
291// public void llVolumeDetect() { }
292// public void llResetOtherScript() { }
293// public void llGetScriptState() { }
294// public void llRemoteLoadScript() { }
295// public void llSetRemoteScriptAccessPin() { }
296// public void llRemoteLoadScriptPin() { }
297// public void llOpenRemoteDataChannel() { }
298// public void llSendRemoteData() { }
299// public void llRemoteDataReply() { }
300// public void llCloseRemoteDataChannel() { }
301// public void llMD5String() { }
302// public void llSetPrimitiveParams() { }
303// public void llStringToBase64() { }
304// public void llBase64ToString() { }
305// public void llXorBase64Strings() { }
306// public void llRemoteDataSetRegion() { }
307// public void llLog10() { }
308// public void llLog() { }
309// public void llGetAnimationList() { }
310// public void llSetParcelMusicURL() { }
311// public void llGetRootPosition() { }
312// public void llGetRootRotation() { }
313// public void llGetObjectDesc() { }
314// public void llSetObjectDesc() { }
315// public void llGetCreator() { }
316// public void llGetTimestamp() { }
317// public void llSetLinkAlpha() { }
318// public void llGetNumberOfPrims() { }
319// public void llGetNumberOfNotecardLines() { }
320// public void llGetBoundingBox() { }
321// public void llGetGeometricCenter() { }
322// public void llGetPrimitiveParams() { }
323// public void llIntegerToBase64() { }
324// public void llBase64ToInteger() { }
325// public void llGetGMTclock() { }
326// public void llGetSimulatorHostname() { }
327// public void llSetLocalRot() { }
328// public void llParseStringKeepNulls() { }
329// public void llRezAtRoot() { }
330// public void llGetObjectPermMask() { }
331// public void llSetObjectPermMask() { }
332// public void llGetInventoryPermMask() { }
333// public void llSetInventoryPermMask() { }
334// public void llGetInventoryCreator() { }
335// public void llOwnerSay() { }
336// public void llRequestSimulatorData() { }
337// public void llForceMouselook() { }
338// public void llGetObjectMass() { }
339// public void llListReplaceList() { }
340// public void llLoadURL() { }
341// public void llParcelMediaCommandList() { }
342// public void llParcelMediaQuery() { }
343// public void llModPow() { }
344// public void llGetInventoryType() { }
345// public void llSetPayPrice() { }
346// public void llGetCameraPos() { }
347// public void llGetCameraRot() { }
348// public void llSetPrimURL() { }
349// public void llRefreshPrimURL() { }
350// public void llEscapeURL() { }
351// public void llUnescapeURL() { }
352// public void llMapDestination() { }
353// public void llAddToLandBanList() { }
354// public void llRemoveFromLandPassList() { }
355// public void llRemoveFromLandBanList() { }
356// public void llSetCameraParams() { }
357// public void llClearCameraParams() { }
358// public void llListStatistics() { }
359// public void llGetUnixTime() { }
360// public void llGetParcelFlags() { }
361// public void llGetRegionFlags() { }
362// public void llXorBase64StringsCorrect() { }
363// public void llHTTPRequest() { }
364// public void llResetLandBanList() { }
365// public void llResetLandPassList() { }
366// public void llGetParcelPrimCount() { }
367// public void llGetParcelPrimOwners() { }
368// public void llGetObjectPrimCount() { }
369// public void llGetParcelMaxPrims() { }
370// public void llGetParcelDetails() { }
371
372// }
373//}
diff --git a/OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/LSO/LSL_BaseClass_OPCODES.cs b/OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/LSO/LSL_BaseClass_OPCODES.cs
new file mode 100644
index 0000000..5a2f9be
--- /dev/null
+++ b/OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/LSO/LSL_BaseClass_OPCODES.cs
@@ -0,0 +1,350 @@
1using System;
2using System.Collections.Generic;
3using System.Text;
4
5namespace OpenSim.Grid.ScriptEngine.DotNetEngine.Compiler.LSO
6{
7 public partial class LSL_BaseClass
8 {
9 /*
10 * OPCODES
11 *
12 * These are internal "assembly" commands,
13 * basic operators like "ADD", "PUSH" and "POP"
14 *
15 * It also contains managed stack and keeps track of internal variables, etc.
16 *
17 */
18
19
20 public void StoreToLocal(UInt32 index)
21 {
22 // TODO: How to determine local?
23 Common.SendToDebug("::StoreToLocal " + index);
24 if (LocalVariables.ContainsKey(index))
25 LocalVariables.Remove(index);
26 LocalVariables.Add(index, LSLStack.Peek());
27 }
28 public void StoreToGlobal(UInt32 index)
29 {
30 Common.SendToDebug("::StoreToGlobal " + index);
31 if (GlobalVariables.ContainsKey(index))
32 GlobalVariables.Remove(index);
33 GlobalVariables.Add(index, LSLStack.Peek());
34 }
35 public void StoreToStatic(UInt32 index)
36 {
37 Common.SendToDebug("::StoreToStatic " + index);
38 //if (StaticVariables.ContainsKey(index))
39 // StaticVariables.Remove(index);
40 StaticVariables.Add(index, LSLStack.Peek());
41 }
42 public void GetFromLocal(UInt32 index)
43 {
44 // TODO: How to determine local?
45 Common.SendToDebug("::GetFromLocal " + index);
46 object ret;
47 LocalVariables.TryGetValue(index, out ret);
48 LSLStack.Push(ret);
49 //return ret;
50 }
51 public void GetFromGlobal(UInt32 index)
52 {
53 Common.SendToDebug("::GetFromGlobal " + index);
54 object ret;
55 GlobalVariables.TryGetValue(index, out ret);
56 LSLStack.Push(ret);
57 //return ret;
58 }
59 public void GetFromStatic(UInt32 index)
60 {
61 Common.SendToDebug("::GetFromStatic " + index);
62 object ret;
63 StaticVariables.TryGetValue(index, out ret);
64 Common.SendToDebug("::GetFromStatic - ObjectType: " + ret.GetType().ToString());
65 LSLStack.Push(ret);
66 //return ret;
67 }
68
69 public object POPToStack()
70 {
71 Common.SendToDebug("::POPToStack");
72 //return LSLStack.Pop();
73 object p = LSLStack.Pop();
74 if (p.GetType() == typeof(UInt32))
75 return (UInt32)p;
76 if (p.GetType() == typeof(string))
77 return (string)p;
78 if (p.GetType() == typeof(Int32))
79 return (Int32)p;
80 if (p.GetType() == typeof(UInt16))
81 return (UInt16)p;
82 if (p.GetType() == typeof(float))
83 return (float)p;
84 if (p.GetType() == typeof(LSO_Enums.Vector))
85 return (LSO_Enums.Vector)p;
86 if (p.GetType() == typeof(LSO_Enums.Rotation))
87 return (LSO_Enums.Rotation)p;
88 if (p.GetType() == typeof(LSO_Enums.Key))
89 return (LSO_Enums.Key)p;
90
91 return p;
92 }
93
94 //public object POPToStack(UInt32 count)
95 //{
96 // // POP NUMBER FROM TOP OF STACK
97 // //LSLStack.SetLength(LSLStack.Length - 4);
98 // Common.SendToDebug("::POPToStack " + count);
99 // if (count < 2)
100 // return LSLStack.Pop();
101
102 // Stack<object> s = new Stack<object>();
103 // for (int i = 0; i < count; i++)
104 // {
105 // s.Push(LSLStack.Pop);
106
107 // }
108
109 //}
110
111 public void POP()
112 {
113 // POP NUMBER FROM TOP OF STACK
114 //LSLStack.SetLength(LSLStack.Length - 4);
115 Common.SendToDebug("::POP");
116 if (LSLStack.Count < 1)
117 {
118 //TODO: Temporary fix
119 Common.SendToDebug("ERROR: TRYING TO POP EMPTY STACK!");
120 }
121 else
122 {
123 LSLStack.Pop();
124 }
125 }
126 public void PUSH(object Param)
127 {
128 if (Param == null)
129 {
130 Common.SendToDebug("::PUSH: <null>");
131 }
132 else
133 {
134
135 //Common.SendToDebug("::PUSH: " + Param.GetType());
136 }
137
138 LSLStack.Push(Param);
139 }
140 public void ADD(UInt32 Param)
141 {
142 Common.SendToDebug("::ADD: " + Param);
143 object o2 = LSLStack.Pop();
144 object o1 = LSLStack.Pop();
145 Common.SendToDebug("::ADD: Debug: o1: " + o1.GetType() + " (" + o1.ToString() + "), o2: " + o2.GetType() + " (" + o2.ToString() + ")");
146 if (o2.GetType() == typeof(string))
147 {
148 LSLStack.Push((string)o1 + (string)o2);
149 return;
150 }
151 if (o2.GetType() == typeof(UInt32))
152 {
153 LSLStack.Push((UInt32)o1 + (UInt32)o2);
154 return;
155 }
156
157 }
158 public void SUB(UInt32 Param)
159 {
160 Common.SendToDebug("::SUB: " + Param);
161 UInt32 i2 = (UInt32)LSLStack.Pop();
162 UInt32 i1 = (UInt32)LSLStack.Pop();
163 LSLStack.Push((UInt32)(i1 - i2));
164 }
165 public void MUL(UInt32 Param)
166 {
167 Common.SendToDebug("::SUB: " + Param);
168 UInt32 i2 = (UInt32)LSLStack.Pop();
169 UInt32 i1 = (UInt32)LSLStack.Pop();
170 LSLStack.Push((UInt32)(i1 * i2));
171 }
172 public void DIV(UInt32 Param)
173 {
174 Common.SendToDebug("::DIV: " + Param);
175 UInt32 i2 = (UInt32)LSLStack.Pop();
176 UInt32 i1 = (UInt32)LSLStack.Pop();
177 LSLStack.Push((UInt32)(i1 / i2));
178 }
179
180
181 public void MOD(UInt32 Param)
182 {
183 Common.SendToDebug("::MOD: " + Param);
184 UInt32 i2 = (UInt32)LSLStack.Pop();
185 UInt32 i1 = (UInt32)LSLStack.Pop();
186 LSLStack.Push((UInt32)(i1 % i2));
187 }
188 public void EQ(UInt32 Param)
189 {
190 Common.SendToDebug("::EQ: " + Param);
191 UInt32 i2 = (UInt32)LSLStack.Pop();
192 UInt32 i1 = (UInt32)LSLStack.Pop();
193 if (i1 == i2)
194 {
195 LSLStack.Push((UInt32)1);
196 }
197 else
198 {
199 LSLStack.Push((UInt32)0);
200 }
201 }
202 public void NEQ(UInt32 Param)
203 {
204 Common.SendToDebug("::NEQ: " + Param);
205 UInt32 i2 = (UInt32)LSLStack.Pop();
206 UInt32 i1 = (UInt32)LSLStack.Pop();
207 if (i1 != i2)
208 {
209 LSLStack.Push((UInt32)1);
210 }
211 else
212 {
213 LSLStack.Push((UInt32)0);
214 }
215 }
216 public void LEQ(UInt32 Param)
217 {
218 Common.SendToDebug("::LEQ: " + Param);
219 UInt32 i2 = (UInt32)LSLStack.Pop();
220 UInt32 i1 = (UInt32)LSLStack.Pop();
221 if (i1 <= i2)
222 {
223 LSLStack.Push((UInt32)1);
224 }
225 else
226 {
227 LSLStack.Push((UInt32)0);
228 }
229 }
230 public void GEQ(UInt32 Param)
231 {
232 Common.SendToDebug("::GEQ: " + Param);
233 UInt32 i2 = (UInt32)LSLStack.Pop();
234 UInt32 i1 = (UInt32)LSLStack.Pop();
235 if (i1 >= i2)
236 {
237 LSLStack.Push((UInt32)1);
238 }
239 else
240 {
241 LSLStack.Push((UInt32)0);
242 }
243 }
244 public void LESS(UInt32 Param)
245 {
246 Common.SendToDebug("::LESS: " + Param);
247 UInt32 i2 = (UInt32)LSLStack.Pop();
248 UInt32 i1 = (UInt32)LSLStack.Pop();
249 if (i1 < i2)
250 {
251 LSLStack.Push((UInt32)1);
252 }
253 else
254 {
255 LSLStack.Push((UInt32)0);
256 }
257 }
258 public void GREATER(UInt32 Param)
259 {
260 Common.SendToDebug("::GREATER: " + Param);
261 UInt32 i2 = (UInt32)LSLStack.Pop();
262 UInt32 i1 = (UInt32)LSLStack.Pop();
263 if (i1 > i2)
264 {
265 LSLStack.Push((UInt32)1);
266 }
267 else
268 {
269 LSLStack.Push((UInt32)0);
270 }
271 }
272
273
274
275 public void BITAND()
276 {
277 Common.SendToDebug("::BITAND");
278 UInt32 i2 = (UInt32)LSLStack.Pop();
279 UInt32 i1 = (UInt32)LSLStack.Pop();
280 LSLStack.Push((UInt32)(i1 & i2));
281 }
282 public void BITOR()
283 {
284 Common.SendToDebug("::BITOR");
285 UInt32 i2 = (UInt32)LSLStack.Pop();
286 UInt32 i1 = (UInt32)LSLStack.Pop();
287 LSLStack.Push((UInt32)(i1 | i2));
288 }
289 public void BITXOR()
290 {
291 Common.SendToDebug("::BITXOR");
292 UInt32 i2 = (UInt32)LSLStack.Pop();
293 UInt32 i1 = (UInt32)LSLStack.Pop();
294 LSLStack.Push((UInt32)(i1 ^ i2));
295 }
296 public void BOOLAND()
297 {
298 Common.SendToDebug("::BOOLAND");
299 bool b2 = bool.Parse((string)LSLStack.Pop());
300 bool b1 = bool.Parse((string)LSLStack.Pop());
301 if (b1 && b2)
302 {
303 LSLStack.Push((UInt32)1);
304 }
305 else
306 {
307 LSLStack.Push((UInt32)0);
308 }
309 }
310 public void BOOLOR()
311 {
312 Common.SendToDebug("::BOOLOR");
313 bool b2 = bool.Parse((string)LSLStack.Pop());
314 bool b1 = bool.Parse((string)LSLStack.Pop());
315
316 if (b1 || b2)
317 {
318 LSLStack.Push((UInt32)1);
319 }
320 else
321 {
322 LSLStack.Push((UInt32)0);
323 }
324
325 }
326 public void NEG(UInt32 Param)
327 {
328 Common.SendToDebug("::NEG: " + Param);
329 //UInt32 i2 = (UInt32)LSLStack.Pop();
330 UInt32 i1 = (UInt32)LSLStack.Pop();
331 LSLStack.Push((UInt32)(i1 * -1));
332 }
333 public void BITNOT()
334 {
335 //Common.SendToDebug("::BITNOT");
336 //UInt32 i2 = (UInt32)LSLStack.Pop();
337 //UInt32 i1 = (UInt32)LSLStack.Pop();
338 //LSLStack.Push((UInt32)(i1 / i2));
339 }
340 public void BOOLNOT()
341 {
342 //Common.SendToDebug("::BOOLNOT");
343 ////UInt32 i2 = (UInt32)LSLStack.Pop();
344 //UInt32 i1 = (UInt32)LSLStack.Pop();
345 //LSLStack.Push((UInt32)(i1));
346 }
347
348
349 }
350}
diff --git a/OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/LSO/LSL_CLRInterface.cs b/OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/LSO/LSL_CLRInterface.cs
new file mode 100644
index 0000000..5da1d71
--- /dev/null
+++ b/OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/LSO/LSL_CLRInterface.cs
@@ -0,0 +1,79 @@
1/*
2* Copyright (c) Contributors, http://opensimulator.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28/* Original code: Tedd Hansen */
29using System;
30using System.Collections.Generic;
31using System.Text;
32
33namespace OpenSim.Grid.ScriptEngine.DotNetEngine.Compiler.LSO
34{
35 public class LSL_CLRInterface
36 {
37 public interface LSLScript
38 {
39 //public virtual void Run(object arg)
40 //{
41 //}
42 //void Run(object arg);
43
44 //void event_state_entry(object arg);
45 //void event_state_exit();
46 //void event_touch_start(object arg);
47 //void event_touch();
48 //void event_touch_end();
49 //void event_collision_start();
50 //void event_collision();
51 //void event_collision_end();
52 //void event_land_collision_start();
53 //void event_land_collision();
54 //void event_land_collision_end();
55 //void event_timer();
56 //void event_listen();
57 //void event_on_rez();
58 //void event_sensor();
59 //void event_no_sensor();
60 //void event_control();
61 //void event_money();
62 //void event_email();
63 //void event_at_target();
64 //void event_not_at_target();
65 //void event_at_rot_target();
66 //void event_not_at_rot_target();
67 //void event_run_time_permissions();
68 //void event_changed();
69 //void event_attach();
70 //void event_dataserver();
71 //void event_link_message();
72 //void event_moving_start();
73 //void event_moving_end();
74 //void event_object_rez();
75 //void event_remote_data();
76 //void event_http_response();
77 }
78 }
79}
diff --git a/OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/LSO/LSL_OPCODE_IL_processor.cs b/OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/LSO/LSL_OPCODE_IL_processor.cs
new file mode 100644
index 0000000..45cca25
--- /dev/null
+++ b/OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/LSO/LSL_OPCODE_IL_processor.cs
@@ -0,0 +1,436 @@
1/*
2* Copyright (c) Contributors, http://opensimulator.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28/* Original code: Tedd Hansen */
29using System;
30using System.Collections.Generic;
31using System.Text;
32using System.Reflection;
33using System.Reflection.Emit;
34using OpenSim.Region.ScriptEngine.Common;
35
36namespace OpenSim.Grid.ScriptEngine.DotNetEngine.Compiler.LSO
37{
38 partial class LSO_Parser
39 {
40 //internal Stack<Type> ILStack = new Stack<Type>();
41 //LSO_Enums MyLSO_Enums = new LSO_Enums();
42
43 internal bool LSL_PROCESS_OPCODE(ILGenerator il)
44 {
45
46 byte bp1;
47 UInt32 u32p1;
48 float fp1;
49 UInt16 opcode = br_read(1)[0];
50 Common.SendToDebug("OPCODE: " + ((LSO_Enums.Operation_Table)opcode).ToString());
51 string idesc = ((LSO_Enums.Operation_Table)opcode).ToString();
52 switch ((LSO_Enums.Operation_Table)opcode)
53 {
54
55 /***************
56 * IMPLEMENTED *
57 ***************/
58 case LSO_Enums.Operation_Table.NOOP:
59 break;
60 case LSO_Enums.Operation_Table.PUSHSP:
61 // Push Stack Top (Memory Address) to stack
62 Common.SendToDebug("Instruction " + idesc);
63 Common.SendToDebug("Instruction " + idesc + ": Description: Pushing Stack Top (Memory Address from header) to stack");
64 IL_Push(il, (UInt32)myHeader.SP);
65 break;
66 // BYTE
67 case LSO_Enums.Operation_Table.PUSHARGB:
68 Common.SendToDebug("Param1: " + br_read(1)[0]);
69 break;
70 // INTEGER
71 case LSO_Enums.Operation_Table.PUSHARGI:
72 u32p1 = BitConverter.ToUInt32(br_read(4), 0);
73 Common.SendToDebug("Instruction " + idesc + ", Param1: " + u32p1);
74 IL_Push(il, u32p1);
75 break;
76 // FLOAT
77 case LSO_Enums.Operation_Table.PUSHARGF:
78 fp1 = BitConverter.ToUInt32(br_read(4), 0);
79 Common.SendToDebug("Instruction " + idesc + ", Param1: " + fp1);
80 IL_Push(il, fp1);
81 break;
82 // STRING
83 case LSO_Enums.Operation_Table.PUSHARGS:
84 string s = Read_String();
85 Common.SendToDebug("Instruction " + idesc + ", Param1: " + s);
86 IL_Debug(il, "OPCODE: " + idesc + ":" + s);
87 IL_Push(il, s);
88 break;
89 // VECTOR z,y,x
90 case LSO_Enums.Operation_Table.PUSHARGV:
91 LSO_Enums.Vector v = new LSO_Enums.Vector();
92 v.Z = BitConverter.ToUInt32(br_read(4), 0);
93 v.Y = BitConverter.ToUInt32(br_read(4), 0);
94 v.X = BitConverter.ToUInt32(br_read(4), 0);
95 Common.SendToDebug("Param1 Z: " + v.Z);
96 Common.SendToDebug("Param1 Y: " + v.Y);
97 Common.SendToDebug("Param1 X: " + v.X);
98 IL_Push(il, v);
99 break;
100 // ROTATION s,z,y,x
101 case LSO_Enums.Operation_Table.PUSHARGQ:
102 LSO_Enums.Rotation r = new LSO_Enums.Rotation();
103 r.S = BitConverter.ToUInt32(br_read(4), 0);
104 r.Z = BitConverter.ToUInt32(br_read(4), 0);
105 r.Y = BitConverter.ToUInt32(br_read(4), 0);
106 r.X = BitConverter.ToUInt32(br_read(4), 0);
107 Common.SendToDebug("Param1 S: " + r.S);
108 Common.SendToDebug("Param1 Z: " + r.Z);
109 Common.SendToDebug("Param1 Y: " + r.Y);
110 Common.SendToDebug("Param1 X: " + r.X);
111 IL_Push(il, r);
112 break;
113
114 case LSO_Enums.Operation_Table.PUSHE:
115 IL_Push(il, (UInt32)0);
116 break;
117
118 case LSO_Enums.Operation_Table.PUSHARGE:
119 u32p1 = BitConverter.ToUInt32(br_read(4), 0);
120 Common.SendToDebug("Param1: " + u32p1);
121 //IL_Push(il, new string(" ".ToCharArray()[0], Convert.ToInt32(u32p1)));
122 IL_Push(il, u32p1);
123 break;
124 // BYTE
125 case LSO_Enums.Operation_Table.ADD:
126 case LSO_Enums.Operation_Table.SUB:
127 case LSO_Enums.Operation_Table.MUL:
128 case LSO_Enums.Operation_Table.DIV:
129 case LSO_Enums.Operation_Table.EQ:
130 case LSO_Enums.Operation_Table.NEQ:
131 case LSO_Enums.Operation_Table.LEQ:
132 case LSO_Enums.Operation_Table.GEQ:
133 case LSO_Enums.Operation_Table.LESS:
134 case LSO_Enums.Operation_Table.GREATER:
135 case LSO_Enums.Operation_Table.NEG:
136 case LSO_Enums.Operation_Table.MOD:
137 bp1 = br_read(1)[0];
138 Common.SendToDebug("Param1: " + bp1);
139 IL_CallBaseFunction(il, idesc, (UInt32)bp1);
140 break;
141
142 // NO ARGUMENTS
143 case LSO_Enums.Operation_Table.BITAND:
144 case LSO_Enums.Operation_Table.BITOR:
145 case LSO_Enums.Operation_Table.BITXOR:
146 case LSO_Enums.Operation_Table.BOOLAND:
147 case LSO_Enums.Operation_Table.BOOLOR:
148 case LSO_Enums.Operation_Table.BITNOT:
149 case LSO_Enums.Operation_Table.BOOLNOT:
150 IL_CallBaseFunction(il, idesc);
151 break;
152 // SHORT
153 case LSO_Enums.Operation_Table.CALLLIB_TWO_BYTE:
154 // TODO: What is size of short?
155 UInt16 U16p1 = BitConverter.ToUInt16(br_read(2), 0);
156 Common.SendToDebug("Instruction " + idesc + ": Builtin Command: " + ((LSO_Enums.BuiltIn_Functions)U16p1).ToString());
157 //Common.SendToDebug("Param1: " + U16p1);
158 string fname = ((LSO_Enums.BuiltIn_Functions)U16p1).ToString();
159
160 bool cmdFound = false;
161 foreach (MethodInfo mi in typeof(LSL_BuiltIn_Commands_Interface).GetMethods())
162 {
163 // Found command
164 if (mi.Name == fname)
165 {
166 il.Emit(OpCodes.Ldarg_0);
167 il.Emit(OpCodes.Call, typeof(LSL_BaseClass).GetMethod("GetLSL_BuiltIn", new Type[] { }));
168 // Pop required number of items from my stack to .Net stack
169 IL_PopToStack(il, mi.GetParameters().Length);
170 il.Emit(OpCodes.Callvirt, mi);
171 cmdFound = true;
172 break;
173 }
174 }
175 if (cmdFound == false)
176 {
177 Common.SendToDebug("ERROR: UNABLE TO LOCATE OPCODE " + idesc + " IN BASECLASS");
178 }
179
180 break;
181
182 // RETURN
183 case LSO_Enums.Operation_Table.RETURN:
184
185 Common.SendToDebug("OPCODE: RETURN");
186 return true;
187
188 case LSO_Enums.Operation_Table.POP:
189 case LSO_Enums.Operation_Table.POPS:
190 case LSO_Enums.Operation_Table.POPL:
191 case LSO_Enums.Operation_Table.POPV:
192 case LSO_Enums.Operation_Table.POPQ:
193 // Pops a specific datatype from the stack
194 // We just ignore the datatype for now
195 IL_Pop(il);
196 break;
197
198 // LONG
199 case LSO_Enums.Operation_Table.STORE:
200 case LSO_Enums.Operation_Table.STORES:
201 case LSO_Enums.Operation_Table.STOREL:
202 case LSO_Enums.Operation_Table.STOREV:
203 case LSO_Enums.Operation_Table.STOREQ:
204 u32p1 = BitConverter.ToUInt32(br_read(4), 0);
205 Common.SendToDebug("Param1: " + u32p1.ToString());
206 IL_CallBaseFunction(il, "StoreToLocal", u32p1);
207 break;
208
209 case LSO_Enums.Operation_Table.STOREG:
210 case LSO_Enums.Operation_Table.STOREGS:
211 case LSO_Enums.Operation_Table.STOREGL:
212 case LSO_Enums.Operation_Table.STOREGV:
213 case LSO_Enums.Operation_Table.STOREGQ:
214 u32p1 = BitConverter.ToUInt32(br_read(4), 0);
215 Common.SendToDebug("Param1: " + u32p1.ToString());
216 IL_CallBaseFunction(il, "StoreToGlobal", u32p1);
217 break;
218
219 case LSO_Enums.Operation_Table.LOADP:
220 case LSO_Enums.Operation_Table.LOADSP:
221 case LSO_Enums.Operation_Table.LOADLP:
222 case LSO_Enums.Operation_Table.LOADVP:
223 case LSO_Enums.Operation_Table.LOADQP:
224 u32p1 = BitConverter.ToUInt32(br_read(4), 0);
225 Common.SendToDebug("Param1: " + u32p1.ToString());
226 IL_CallBaseFunction(il, "StoreToLocal", u32p1);
227 IL_Pop(il);
228 break;
229
230 case LSO_Enums.Operation_Table.LOADGP:
231 case LSO_Enums.Operation_Table.LOADGSP:
232 case LSO_Enums.Operation_Table.LOADGLP:
233 case LSO_Enums.Operation_Table.LOADGVP:
234 case LSO_Enums.Operation_Table.LOADGQP:
235 u32p1 = BitConverter.ToUInt32(br_read(4), 0);
236 Common.SendToDebug("Param1: " + u32p1.ToString());
237 IL_CallBaseFunction(il, "StoreToStatic", u32p1 - 6 + myHeader.GVR);
238 IL_Pop(il);
239 break;
240
241 // PUSH FROM LOCAL FRAME
242 case LSO_Enums.Operation_Table.PUSH:
243 case LSO_Enums.Operation_Table.PUSHS:
244 case LSO_Enums.Operation_Table.PUSHL:
245 case LSO_Enums.Operation_Table.PUSHV:
246 case LSO_Enums.Operation_Table.PUSHQ:
247 u32p1 = BitConverter.ToUInt32(br_read(4), 0);
248 Common.SendToDebug("Param1: " + u32p1.ToString());
249 IL_CallBaseFunction(il, "GetFromLocal", u32p1);
250
251 break;
252
253 // PUSH FROM STATIC FRAME
254 case LSO_Enums.Operation_Table.PUSHG:
255 case LSO_Enums.Operation_Table.PUSHGS:
256 case LSO_Enums.Operation_Table.PUSHGL:
257 case LSO_Enums.Operation_Table.PUSHGV:
258 case LSO_Enums.Operation_Table.PUSHGQ:
259 u32p1 = BitConverter.ToUInt32(br_read(4), 0);
260 Common.SendToDebug("Param1: " + u32p1.ToString());
261 IL_CallBaseFunction(il, "GetFromStatic", u32p1 - 6 + myHeader.GVR);
262 break;
263
264
265 /***********************
266 * NOT IMPLEMENTED YET *
267 ***********************/
268
269
270
271 case LSO_Enums.Operation_Table.POPIP:
272 case LSO_Enums.Operation_Table.POPSP:
273 case LSO_Enums.Operation_Table.POPSLR:
274 case LSO_Enums.Operation_Table.POPARG:
275 case LSO_Enums.Operation_Table.POPBP:
276 //Common.SendToDebug("Instruction " + idesc + ": Ignored");
277 Common.SendToDebug("Instruction " + idesc + ": Description: Drop x bytes from the stack (TODO: Only popping 1)");
278 //Common.SendToDebug("Param1: " + BitConverter.ToUInt32(br_read(4), 0));
279 IL_Pop(il);
280 break;
281
282
283
284 // None
285 case LSO_Enums.Operation_Table.PUSHIP:
286 // PUSH INSTRUCTION POINTER
287 break;
288 case LSO_Enums.Operation_Table.PUSHBP:
289
290 case LSO_Enums.Operation_Table.PUSHEV:
291 break;
292 case LSO_Enums.Operation_Table.PUSHEQ:
293 break;
294
295
296 // LONG
297 case LSO_Enums.Operation_Table.JUMP:
298 Common.SendToDebug("Param1: " + BitConverter.ToUInt32(br_read(4), 0));
299 break;
300 // BYTE, LONG
301 case LSO_Enums.Operation_Table.JUMPIF:
302 case LSO_Enums.Operation_Table.JUMPNIF:
303 Common.SendToDebug("Param1: " + br_read(1)[0]);
304 Common.SendToDebug("Param2: " + BitConverter.ToUInt32(br_read(4), 0));
305 break;
306 // LONG
307 case LSO_Enums.Operation_Table.STATE:
308 bp1 = br_read(1)[0];
309 //il.Emit(OpCodes.Ld); // Load local variable 0 onto stack
310 //il.Emit(OpCodes.Ldc_I4, 0); // Push index position
311 //il.Emit(OpCodes.Ldstr, EventList[p1]); // Push value
312 //il.Emit(OpCodes.Stelem_Ref); // Perform array[index] = value
313 break;
314 case LSO_Enums.Operation_Table.CALL:
315 Common.SendToDebug("Param1: " + BitConverter.ToUInt32(br_read(4), 0));
316 Common.SendToDebug("ERROR: Function CALL not implemented yet.");
317 break;
318 // BYTE
319 case LSO_Enums.Operation_Table.CAST:
320 bp1 = br_read(1)[0];
321 Common.SendToDebug("Instruction " + idesc + ": Cast to type: " + ((LSO_Enums.OpCode_Cast_TypeDefs)bp1));
322 Common.SendToDebug("Param1: " + bp1);
323 switch ((LSO_Enums.OpCode_Cast_TypeDefs)bp1)
324 {
325 case LSO_Enums.OpCode_Cast_TypeDefs.String:
326 Common.SendToDebug("Instruction " + idesc + ": il.Emit(OpCodes.Box, ILStack.Pop());");
327 break;
328 default:
329 Common.SendToDebug("Instruction " + idesc + ": Unknown cast type!");
330 break;
331 }
332 break;
333 // LONG
334 case LSO_Enums.Operation_Table.STACKTOS:
335 case LSO_Enums.Operation_Table.STACKTOL:
336 Common.SendToDebug("Param1: " + BitConverter.ToUInt32(br_read(4), 0));
337 break;
338 // BYTE
339 case LSO_Enums.Operation_Table.PRINT:
340 case LSO_Enums.Operation_Table.CALLLIB:
341 Common.SendToDebug("Param1: " + br_read(1)[0]);
342 break;
343 }
344 return false;
345 }
346
347 private void IL_PopToStack(ILGenerator il)
348 {
349 IL_PopToStack(il, 1);
350 }
351 private void IL_PopToStack(ILGenerator il, int count)
352 {
353 Common.SendToDebug("IL_PopToStack();");
354 for (int i = 0; i < count; i++)
355 {
356 IL_CallBaseFunction(il, "POPToStack");
357 //il.Emit(OpCodes.Ldarg_0);
358 //il.Emit(OpCodes.Call,
359 // typeof(LSL_BaseClass).GetMethod("POPToStack",
360 // new Type[] { }));
361 }
362 }
363 private void IL_Pop(ILGenerator il)
364 {
365 Common.SendToDebug("IL_Pop();");
366 IL_CallBaseFunction(il, "POP");
367 }
368 private void IL_Debug(ILGenerator il, string text)
369 {
370 il.Emit(OpCodes.Ldstr, text);
371 il.Emit(OpCodes.Call, typeof(Common).GetMethod("SendToDebug",
372 new Type[] { typeof(string) }
373 ));
374 }
375 private void IL_CallBaseFunction(ILGenerator il, string methodname)
376 {
377 il.Emit(OpCodes.Ldarg_0);
378 il.Emit(OpCodes.Call, typeof(LSL_BaseClass).GetMethod(methodname, new Type[] { }));
379 }
380 private void IL_CallBaseFunction(ILGenerator il, string methodname, object data)
381 {
382 il.Emit(OpCodes.Ldarg_0);
383 if (data.GetType() == typeof(string))
384 il.Emit(OpCodes.Ldstr, (string)data);
385 if (data.GetType() == typeof(UInt32))
386 il.Emit(OpCodes.Ldc_I4, (UInt32)data);
387 il.Emit(OpCodes.Call, typeof(LSL_BaseClass).GetMethod(methodname, new Type[] { data.GetType() }));
388 }
389
390 private void IL_Push(ILGenerator il, object data)
391 {
392 il.Emit(OpCodes.Ldarg_0);
393 Common.SendToDebug("PUSH datatype: " + data.GetType());
394
395 IL_PushDataTypeToILStack(il, data);
396
397 il.Emit(OpCodes.Call, typeof(LSL_BaseClass).GetMethod("PUSH", new Type[] { data.GetType() }));
398
399 }
400
401 private void IL_PushDataTypeToILStack(ILGenerator il, object data)
402 {
403 if (data.GetType() == typeof(UInt16))
404 {
405 il.Emit(OpCodes.Ldc_I4, (UInt16)data);
406 il.Emit(OpCodes.Box, data.GetType());
407 }
408 if (data.GetType() == typeof(UInt32))
409 {
410 il.Emit(OpCodes.Ldc_I4, (UInt32)data);
411 il.Emit(OpCodes.Box, data.GetType());
412 }
413 if (data.GetType() == typeof(Int32))
414 {
415 il.Emit(OpCodes.Ldc_I4, (Int32)data);
416 il.Emit(OpCodes.Box, data.GetType());
417 }
418 if (data.GetType() == typeof(float))
419 {
420 il.Emit(OpCodes.Ldc_I4, (float)data);
421 il.Emit(OpCodes.Box, data.GetType());
422 }
423 if (data.GetType() == typeof(string))
424 il.Emit(OpCodes.Ldstr, (string)data);
425 //if (data.GetType() == typeof(LSO_Enums.Rotation))
426 // il.Emit(OpCodes.Ldobj, (LSO_Enums.Rotation)data);
427 //if (data.GetType() == typeof(LSO_Enums.Vector))
428 // il.Emit(OpCodes.Ldobj, (LSO_Enums.Vector)data);
429 //if (data.GetType() == typeof(LSO_Enums.Key))
430 // il.Emit(OpCodes.Ldobj, (LSO_Enums.Key)data);
431
432 }
433
434
435 }
436}
diff --git a/OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/LSO/LSO_Enums.cs b/OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/LSO/LSO_Enums.cs
new file mode 100644
index 0000000..3de2a36
--- /dev/null
+++ b/OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/LSO/LSO_Enums.cs
@@ -0,0 +1,557 @@
1/*
2* Copyright (c) Contributors, http://opensimulator.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28/* Original code: Tedd Hansen */
29using System;
30using System.Collections.Generic;
31using System.Text;
32
33namespace OpenSim.Grid.ScriptEngine.DotNetEngine.Compiler.LSO
34{
35 public static class LSO_Enums
36 {
37 //public System.Collections.Generic.Dictionary<Byte, Type> OpCode_Add_Types;
38
39 //LSO_Enums() {
40 // OpCode_Add_Types.Add(51, typeof(String));
41 // OpCode_Add_Types.Add(17, typeof(UInt32));
42 //}
43
44 [Serializable]
45 public enum OpCode_Add_TypeDefs
46 {
47 String = 51,
48 UInt32 = 17
49 }
50 [Serializable]
51 public enum OpCode_Cast_TypeDefs
52 {
53 String = 19
54 }
55
56 [Serializable]
57 public struct Key
58 {
59 public string KeyString;
60 }
61
62 [Serializable]
63 public struct Vector
64 {
65 public UInt32 Z;
66 public UInt32 Y;
67 public UInt32 X;
68 }
69 [Serializable]
70 public struct Rotation
71 {
72 public UInt32 S;
73 public UInt32 Z;
74 public UInt32 Y;
75 public UInt32 X;
76 }
77 [Serializable]
78 public enum Variable_Type_Codes
79 {
80 Void = 0,
81 Integer = 1,
82 Float = 2,
83 String = 3,
84 Key = 4,
85 Vector = 5,
86 Rotation = 6,
87 List = 7,
88 Null = 8
89 }
90 [Serializable]
91 public enum Event_Mask_Values
92 {
93 state_entry = 0,
94 state_exit = 1,
95 touch_start = 2,
96 touch = 3,
97 touch_end = 4,
98 collision_start = 5,
99 collision = 6,
100 collision_end = 7,
101 land_collision_start = 8,
102 land_collision = 9,
103 land_collision_end = 10,
104 timer = 11,
105 listen = 12,
106 on_rez = 13,
107 sensor = 14,
108 no_sensor = 15,
109 control = 16,
110 money = 17,
111 email = 18,
112 at_target = 19,
113 not_at_target = 20,
114 at_rot_target = 21,
115 not_at_rot_target = 22,
116 run_time_permissions = 23,
117 changed = 24,
118 attach = 25,
119 dataserver = 26,
120 link_message = 27,
121 moving_start = 28,
122 moving_end = 29,
123 object_rez = 30,
124 remote_data = 31,
125 http_response = 32
126 }
127 [Serializable]
128 public enum Operation_Table
129 {
130 NOOP = 0x0,
131 POP = 0x1,
132 POPS = 0x2,
133 POPL = 0x3,
134 POPV = 0x4,
135 POPQ = 0x5,
136 POPARG = 0x6,
137 POPIP = 0x7,
138 POPBP = 0x8,
139 POPSP = 0x9,
140 POPSLR = 0xa,
141 DUP = 0x20,
142 DUPS = 0x21,
143 DUPL = 0x22,
144 DUPV = 0x23,
145 DUPQ = 0x24,
146 STORE = 0x30,
147 STORES = 0x31,
148 STOREL = 0x32,
149 STOREV = 0x33,
150 STOREQ = 0x34,
151 STOREG = 0x35,
152 STOREGS = 0x36,
153 STOREGL = 0x37,
154 STOREGV = 0x38,
155 STOREGQ = 0x39,
156 LOADP = 0x3a,
157 LOADSP = 0x3b,
158 LOADLP = 0x3c,
159 LOADVP = 0x3d,
160 LOADQP = 0x3e,
161 LOADGP = 0x3f,
162 LOADGSP = 0x40,
163 LOADGLP = 0x41,
164 LOADGVP = 0x42,
165 LOADGQP = 0x43,
166 PUSH = 0x50,
167 PUSHS = 0x51,
168 PUSHL = 0x52,
169 PUSHV = 0x53,
170 PUSHQ = 0x54,
171 PUSHG = 0x55,
172 PUSHGS = 0x56,
173 PUSHGL = 0x57,
174 PUSHGV = 0x58,
175 PUSHGQ = 0x59,
176 PUSHIP = 0x5a,
177 PUSHBP = 0x5b,
178 PUSHSP = 0x5c,
179 PUSHARGB = 0x5d,
180 PUSHARGI = 0x5e,
181 PUSHARGF = 0x5f,
182 PUSHARGS = 0x60,
183 PUSHARGV = 0x61,
184 PUSHARGQ = 0x62,
185 PUSHE = 0x63,
186 PUSHEV = 0x64,
187 PUSHEQ = 0x65,
188 PUSHARGE = 0x66,
189 ADD = 0x70,
190 SUB = 0x71,
191 MUL = 0x72,
192 DIV = 0x73,
193 MOD = 0x74,
194 EQ = 0x75,
195 NEQ = 0x76,
196 LEQ = 0x77,
197 GEQ = 0x78,
198 LESS = 0x79,
199 GREATER = 0x7a,
200 BITAND = 0x7b,
201 BITOR = 0x7c,
202 BITXOR = 0x7d,
203 BOOLAND = 0x7e,
204 BOOLOR = 0x7f,
205 NEG = 0x80,
206 BITNOT = 0x81,
207 BOOLNOT = 0x82,
208 JUMP = 0x90,
209 JUMPIF = 0x91,
210 JUMPNIF = 0x92,
211 STATE = 0x93,
212 CALL = 0x94,
213 RETURN = 0x95,
214 CAST = 0xa0,
215 STACKTOS = 0xb0,
216 STACKTOL = 0xb1,
217 PRINT = 0xc0,
218 CALLLIB = 0xd0,
219 CALLLIB_TWO_BYTE = 0xd1,
220 SHL = 0xe0,
221 SHR = 0xe1
222 }
223 [Serializable]
224 public enum BuiltIn_Functions
225 {
226 llSin = 0,
227 llCos = 1,
228 llTan = 2,
229 llAtan2 = 3,
230 llSqrt = 4,
231 llPow = 5,
232 llAbs = 6,
233 llFabs = 7,
234 llFrand = 8,
235 llFloor = 9,
236 llCeil = 10,
237 llRound = 11,
238 llVecMag = 12,
239 llVecNorm = 13,
240 llVecDist = 14,
241 llRot2Euler = 15,
242 llEuler2Rot = 16,
243 llAxes2Rot = 17,
244 llRot2Fwd = 18,
245 llRot2Left = 19,
246 llRot2Up = 20,
247 llRotBetween = 21,
248 llWhisper = 22,
249 llSay = 23,
250 llShout = 24,
251 llListen = 25,
252 llListenControl = 26,
253 llListenRemove = 27,
254 llSensor = 28,
255 llSensorRepeat = 29,
256 llSensorRemove = 30,
257 llDetectedName = 31,
258 llDetectedKey = 32,
259 llDetectedOwner = 33,
260 llDetectedType = 34,
261 llDetectedPos = 35,
262 llDetectedVel = 36,
263 llDetectedGrab = 37,
264 llDetectedRot = 38,
265 llDetectedGroup = 39,
266 llDetectedLinkNumber = 40,
267 llDie = 41,
268 llGround = 42,
269 llCloud = 43,
270 llWind = 44,
271 llSetStatus = 45,
272 llGetStatus = 46,
273 llSetScale = 47,
274 llGetScale = 48,
275 llSetColor = 49,
276 llGetAlpha = 50,
277 llSetAlpha = 51,
278 llGetColor = 52,
279 llSetTexture = 53,
280 llScaleTexture = 54,
281 llOffsetTexture = 55,
282 llRotateTexture = 56,
283 llGetTexture = 57,
284 llSetPos = 58,
285 llGetPos = 59,
286 llGetLocalPos = 60,
287 llSetRot = 61,
288 llGetRot = 62,
289 llGetLocalRot = 63,
290 llSetForce = 64,
291 llGetForce = 65,
292 llTarget = 66,
293 llTargetRemove = 67,
294 llRotTarget = 68,
295 llRotTargetRemove = 69,
296 llMoveToTarget = 70,
297 llStopMoveToTarget = 71,
298 llApplyImpulse = 72,
299 llApplyRotationalImpulse = 73,
300 llSetTorque = 74,
301 llGetTorque = 75,
302 llSetForceAndTorque = 76,
303 llGetVel = 77,
304 llGetAccel = 78,
305 llGetOmega = 79,
306 llGetTimeOfDay = 80,
307 llGetWallclock = 81,
308 llGetTime = 82,
309 llResetTime = 83,
310 llGetAndResetTime = 84,
311 llSound = 85,
312 llPlaySound = 86,
313 llLoopSound = 87,
314 llLoopSoundMaster = 88,
315 llLoopSoundSlave = 89,
316 llPlaySoundSlave = 90,
317 llTriggerSound = 91,
318 llStopSound = 92,
319 llPreloadSound = 93,
320 llGetSubString = 94,
321 llDeleteSubString = 95,
322 llInsertString = 96,
323 llToUpper = 97,
324 llToLower = 98,
325 llGiveMoney = 99,
326 llMakeExplosion = 100,
327 llMakeFountain = 101,
328 llMakeSmoke = 102,
329 llMakeFire = 103,
330 llRezObject = 104,
331 llLookAt = 105,
332 llStopLookAt = 106,
333 llSetTimerEvent = 107,
334 llSleep = 108,
335 llGetMass = 109,
336 llCollisionFilter = 110,
337 llTakeControls = 111,
338 llReleaseControls = 112,
339 llAttachToAvatar = 113,
340 llDetachFromAvatar = 114,
341 llTakeCamera = 115,
342 llReleaseCamera = 116,
343 llGetOwner = 117,
344 llInstantMessage = 118,
345 llEmail = 119,
346 llGetNextEmail = 120,
347 llGetKey = 121,
348 llSetBuoyancy = 122,
349 llSetHoverHeight = 123,
350 llStopHover = 124,
351 llMinEventDelay = 125,
352 llSoundPreload = 126,
353 llRotLookAt = 127,
354 llStringLength = 128,
355 llStartAnimation = 129,
356 llStopAnimation = 130,
357 llPointAt = 131,
358 llStopPointAt = 132,
359 llTargetOmega = 133,
360 llGetStartParameter = 134,
361 llGodLikeRezObject = 135,
362 llRequestPermissions = 136,
363 llGetPermissionsKey = 137,
364 llGetPermissions = 138,
365 llGetLinkNumber = 139,
366 llSetLinkColor = 140,
367 llCreateLink = 141,
368 llBreakLink = 142,
369 llBreakAllLinks = 143,
370 llGetLinkKey = 144,
371 llGetLinkName = 145,
372 llGetInventoryNumber = 146,
373 llGetInventoryName = 147,
374 llSetScriptState = 148,
375 llGetEnergy = 149,
376 llGiveInventory = 150,
377 llRemoveInventory = 151,
378 llSetText = 152,
379 llWater = 153,
380 llPassTouches = 154,
381 llRequestAgentData = 155,
382 llRequestInventoryData = 156,
383 llSetDamage = 157,
384 llTeleportAgentHome = 158,
385 llModifyLand = 159,
386 llCollisionSound = 160,
387 llCollisionSprite = 161,
388 llGetAnimation = 162,
389 llResetScript = 163,
390 llMessageLinked = 164,
391 llPushObject = 165,
392 llPassCollisions = 166,
393 llGetScriptName = 167,
394 llGetNumberOfSides = 168,
395 llAxisAngle2Rot = 169,
396 llRot2Axis = 170,
397 llRot2Angle = 171,
398 llAcos = 172,
399 llAsin = 173,
400 llAngleBetween = 174,
401 llGetInventoryKey = 175,
402 llAllowInventoryDrop = 176,
403 llGetSunDirection = 177,
404 llGetTextureOffset = 178,
405 llGetTextureScale = 179,
406 llGetTextureRot = 180,
407 llSubStringIndex = 181,
408 llGetOwnerKey = 182,
409 llGetCenterOfMass = 183,
410 llListSort = 184,
411 llGetListLength = 185,
412 llList2Integer = 186,
413 llList2Float = 187,
414 llList2String = 188,
415 llList2Key = 189,
416 llList2Vector = 190,
417 llList2Rot = 191,
418 llList2List = 192,
419 llDeleteSubList = 193,
420 llGetListEntryType = 194,
421 llList2CSV = 195,
422 llCSV2List = 196,
423 llListRandomize = 197,
424 llList2ListStrided = 198,
425 llGetRegionCorner = 199,
426 llListInsertList = 200,
427 llListFindList = 201,
428 llGetObjectName = 202,
429 llSetObjectName = 203,
430 llGetDate = 204,
431 llEdgeOfWorld = 205,
432 llGetAgentInfo = 206,
433 llAdjustSoundVolume = 207,
434 llSetSoundQueueing = 208,
435 llSetSoundRadius = 209,
436 llKey2Name = 210,
437 llSetTextureAnim = 211,
438 llTriggerSoundLimited = 212,
439 llEjectFromLand = 213,
440 llParseString2List = 214,
441 llOverMyLand = 215,
442 llGetLandOwnerAt = 216,
443 llGetNotecardLine = 217,
444 llGetAgentSize = 218,
445 llSameGroup = 219,
446 llUnSit = 220,
447 llGroundSlope = 221,
448 llGroundNormal = 222,
449 llGroundContour = 223,
450 llGetAttached = 224,
451 llGetFreeMemory = 225,
452 llGetRegionName = 226,
453 llGetRegionTimeDilation = 227,
454 llGetRegionFPS = 228,
455 llParticleSystem = 229,
456 llGroundRepel = 230,
457 llGiveInventoryList = 231,
458 llSetVehicleType = 232,
459 llSetVehicleFloatParam = 233,
460 llSetVehicleVectorParam = 234,
461 llSetVehicleRotationParam = 235,
462 llSetVehicleFlags = 236,
463 llRemoveVehicleFlags = 237,
464 llSitTarget = 238,
465 llAvatarOnSitTarget = 239,
466 llAddToLandPassList = 240,
467 llSetTouchText = 241,
468 llSetSitText = 242,
469 llSetCameraEyeOffset = 243,
470 llSetCameraAtOffset = 244,
471 llDumpList2String = 245,
472 llScriptDanger = 246,
473 llDialog = 247,
474 llVolumeDetect = 248,
475 llResetOtherScript = 249,
476 llGetScriptState = 250,
477 llRemoteLoadScript = 251,
478 llSetRemoteScriptAccessPin = 252,
479 llRemoteLoadScriptPin = 253,
480 llOpenRemoteDataChannel = 254,
481 llSendRemoteData = 255,
482 llRemoteDataReply = 256,
483 llCloseRemoteDataChannel = 257,
484 llMD5String = 258,
485 llSetPrimitiveParams = 259,
486 llStringToBase64 = 260,
487 llBase64ToString = 261,
488 llXorBase64Strings = 262,
489 llRemoteDataSetRegion = 263,
490 llLog10 = 264,
491 llLog = 265,
492 llGetAnimationList = 266,
493 llSetParcelMusicURL = 267,
494 llGetRootPosition = 268,
495 llGetRootRotation = 269,
496 llGetObjectDesc = 270,
497 llSetObjectDesc = 271,
498 llGetCreator = 272,
499 llGetTimestamp = 273,
500 llSetLinkAlpha = 274,
501 llGetNumberOfPrims = 275,
502 llGetNumberOfNotecardLines = 276,
503 llGetBoundingBox = 277,
504 llGetGeometricCenter = 278,
505 llGetPrimitiveParams = 279,
506 llIntegerToBase64 = 280,
507 llBase64ToInteger = 281,
508 llGetGMTclock = 282,
509 llGetSimulatorHostname = 283,
510 llSetLocalRot = 284,
511 llParseStringKeepNulls = 285,
512 llRezAtRoot = 286,
513 llGetObjectPermMask = 287,
514 llSetObjectPermMask = 288,
515 llGetInventoryPermMask = 289,
516 llSetInventoryPermMask = 290,
517 llGetInventoryCreator = 291,
518 llOwnerSay = 292,
519 llRequestSimulatorData = 293,
520 llForceMouselook = 294,
521 llGetObjectMass = 295,
522 llListReplaceList = 296,
523 llLoadURL = 297,
524 llParcelMediaCommandList = 298,
525 llParcelMediaQuery = 299,
526 llModPow = 300,
527 llGetInventoryType = 301,
528 llSetPayPrice = 302,
529 llGetCameraPos = 303,
530 llGetCameraRot = 304,
531 llSetPrimURL = 305,
532 llRefreshPrimURL = 306,
533 llEscapeURL = 307,
534 llUnescapeURL = 308,
535 llMapDestination = 309,
536 llAddToLandBanList = 310,
537 llRemoveFromLandPassList = 311,
538 llRemoveFromLandBanList = 312,
539 llSetCameraParams = 313,
540 llClearCameraParams = 314,
541 llListStatistics = 315,
542 llGetUnixTime = 316,
543 llGetParcelFlags = 317,
544 llGetRegionFlags = 318,
545 llXorBase64StringsCorrect = 319,
546 llHTTPRequest = 320,
547 llResetLandBanList = 321,
548 llResetLandPassList = 322,
549 llGetParcelPrimCount = 323,
550 llGetParcelPrimOwners = 324,
551 llGetObjectPrimCount = 325,
552 llGetParcelMaxPrims = 326,
553 llGetParcelDetails = 327
554 }
555
556 }
557}
diff --git a/OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/LSO/LSO_Parser.cs b/OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/LSO/LSO_Parser.cs
new file mode 100644
index 0000000..8b24e68
--- /dev/null
+++ b/OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/LSO/LSO_Parser.cs
@@ -0,0 +1,722 @@
1/*
2* Copyright (c) Contributors, http://opensimulator.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28/* Original code: Tedd Hansen */
29using System;
30using System.Collections.Generic;
31using System.Text;
32using System.IO;
33using System.Reflection;
34using System.Reflection.Emit;
35
36namespace OpenSim.Grid.ScriptEngine.DotNetEngine.Compiler.LSO
37{
38 partial class LSO_Parser
39 {
40 private string FileName;
41 private FileStream fs;
42 private BinaryReader br;
43 internal LSO_Struct.Header myHeader;
44 internal Dictionary<long, LSO_Struct.StaticBlock> StaticBlocks = new Dictionary<long, LSO_Struct.StaticBlock>();
45 //private System.Collections.Hashtable StaticBlocks = new System.Collections.Hashtable();
46
47 private TypeBuilder typeBuilder;
48 private System.Collections.Generic.List<string> EventList = new System.Collections.Generic.List<string>();
49
50 public LSO_Parser(string _FileName, TypeBuilder _typeBuilder)
51 {
52 FileName = _FileName;
53 typeBuilder = _typeBuilder;
54 }
55
56 internal void OpenFile()
57 {
58 // Open
59 Common.SendToDebug("Opening filename: " + FileName);
60 fs = File.Open(FileName, FileMode.Open, FileAccess.Read, FileShare.Read);
61 br = new BinaryReader(fs, Encoding.BigEndianUnicode);
62
63 }
64 internal void CloseFile()
65 {
66
67 // Close
68 br.Close();
69 fs.Close();
70 }
71
72
73 /// <summary>
74 /// Parse LSO file.
75 /// </summary>
76 public void Parse()
77 {
78
79
80
81 // The LSO Format consist of 6 major blocks: header, statics, functions, states, heap, and stack.
82
83
84 // HEADER BLOCK
85 Common.SendToDebug("Reading HEADER BLOCK at: 0");
86 fs.Seek(0, SeekOrigin.Begin);
87 myHeader = new LSO_Struct.Header();
88 myHeader.TM = BitConverter.ToUInt32(br_read(4), 0);
89 myHeader.IP = BitConverter.ToUInt32(br_read(4), 0);
90 myHeader.VN = BitConverter.ToUInt32(br_read(4), 0);
91 myHeader.BP = BitConverter.ToUInt32(br_read(4), 0);
92 myHeader.SP = BitConverter.ToUInt32(br_read(4), 0);
93 myHeader.HR = BitConverter.ToUInt32(br_read(4), 0);
94 myHeader.HP = BitConverter.ToUInt32(br_read(4), 0);
95 myHeader.CS = BitConverter.ToUInt32(br_read(4), 0);
96 myHeader.NS = BitConverter.ToUInt32(br_read(4), 0);
97 myHeader.CE = BitConverter.ToUInt32(br_read(4), 0);
98 myHeader.IE = BitConverter.ToUInt32(br_read(4), 0);
99 myHeader.ER = BitConverter.ToUInt32(br_read(4), 0);
100 myHeader.FR = BitConverter.ToUInt32(br_read(4), 0);
101 myHeader.SLR = BitConverter.ToUInt32(br_read(4), 0);
102 myHeader.GVR = BitConverter.ToUInt32(br_read(4), 0);
103 myHeader.GFR = BitConverter.ToUInt32(br_read(4), 0);
104 myHeader.PR = BitConverter.ToUInt32(br_read(4), 0);
105 myHeader.ESR = BitConverter.ToUInt32(br_read(4), 0);
106 myHeader.SR = BitConverter.ToUInt32(br_read(4), 0);
107 myHeader.NCE = BitConverter.ToUInt64(br_read(8), 0);
108 myHeader.NIE = BitConverter.ToUInt64(br_read(8), 0);
109 myHeader.NER = BitConverter.ToUInt64(br_read(8), 0);
110
111 // Print Header Block to debug
112 Common.SendToDebug("TM - Top of memory (size): " + myHeader.TM);
113 Common.SendToDebug("IP - Instruction Pointer (0=not running): " + myHeader.IP);
114 Common.SendToDebug("VN - Version number: " + myHeader.VN);
115 Common.SendToDebug("BP - Local Frame Pointer: " + myHeader.BP);
116 Common.SendToDebug("SP - Stack Pointer: " + myHeader.SP);
117 Common.SendToDebug("HR - Heap Register: " + myHeader.HR);
118 Common.SendToDebug("HP - Heap Pointer: " + myHeader.HP);
119 Common.SendToDebug("CS - Current State: " + myHeader.CS);
120 Common.SendToDebug("NS - Next State: " + myHeader.NS);
121 Common.SendToDebug("CE - Current Events: " + myHeader.CE);
122 Common.SendToDebug("IE - In Event: " + myHeader.IE);
123 Common.SendToDebug("ER - Event Register: " + myHeader.ER);
124 Common.SendToDebug("FR - Fault Register: " + myHeader.FR);
125 Common.SendToDebug("SLR - Sleep Register: " + myHeader.SLR);
126 Common.SendToDebug("GVR - Global Variable Register: " + myHeader.GVR);
127 Common.SendToDebug("GFR - Global Function Register: " + myHeader.GFR);
128 Common.SendToDebug("PR - Parameter Register: " + myHeader.PR);
129 Common.SendToDebug("ESR - Energy Supply Register: " + myHeader.ESR);
130 Common.SendToDebug("SR - State Register: " + myHeader.SR);
131 Common.SendToDebug("NCE - 64-bit Current Events: " + myHeader.NCE);
132 Common.SendToDebug("NIE - 64-bit In Events: " + myHeader.NIE);
133 Common.SendToDebug("NER - 64-bit Event Register: " + myHeader.NER);
134 Common.SendToDebug("Read position when exiting HEADER BLOCK: " + fs.Position);
135
136 // STATIC BLOCK
137 Common.SendToDebug("Reading STATIC BLOCK at: " + myHeader.GVR);
138 fs.Seek(myHeader.GVR, SeekOrigin.Begin);
139 int StaticBlockCount = 0;
140 // Read function blocks until we hit GFR
141 while (fs.Position < myHeader.GFR)
142 {
143 StaticBlockCount++;
144 long startReadPos = fs.Position;
145 Common.SendToDebug("Reading Static Block " + StaticBlockCount + " at: " + startReadPos);
146
147 //fs.Seek(myHeader.GVR, SeekOrigin.Begin);
148 LSO_Struct.StaticBlock myStaticBlock = new LSO_Struct.StaticBlock();
149 myStaticBlock.Static_Chunk_Header_Size = BitConverter.ToUInt32(br_read(4), 0);
150 myStaticBlock.ObjectType = br_read(1)[0];
151 Common.SendToDebug("Static Block ObjectType: " + ((LSO_Enums.Variable_Type_Codes)myStaticBlock.ObjectType).ToString());
152 myStaticBlock.Unknown = br_read(1)[0];
153 // Size of datatype varies -- what about strings?
154 if (myStaticBlock.ObjectType != 0)
155 myStaticBlock.BlockVariable = br_read(getObjectSize(myStaticBlock.ObjectType));
156
157 StaticBlocks.Add((UInt32)startReadPos, myStaticBlock);
158
159 }
160 Common.SendToDebug("Number of Static Blocks read: " + StaticBlockCount);
161
162
163 // FUNCTION BLOCK
164 // Always right after STATIC BLOCK
165 LSO_Struct.FunctionBlock myFunctionBlock = new LSO_Struct.FunctionBlock();
166 if (myHeader.GFR == myHeader.SR)
167 {
168 // If GFR and SR are at same position then there is no fuction block
169 Common.SendToDebug("No FUNCTION BLOCK found");
170 }
171 else
172 {
173 Common.SendToDebug("Reading FUNCTION BLOCK at: " + myHeader.GFR);
174 fs.Seek(myHeader.GFR, SeekOrigin.Begin);
175 myFunctionBlock.FunctionCount = BitConverter.ToUInt32(br_read(4), 0);
176 Common.SendToDebug("Number of functions in Fuction Block: " + myFunctionBlock.FunctionCount);
177 if (myFunctionBlock.FunctionCount > 0)
178 {
179 myFunctionBlock.CodeChunkPointer = new UInt32[myFunctionBlock.FunctionCount];
180 for (int i = 0; i < myFunctionBlock.FunctionCount; i++)
181 {
182 Common.SendToDebug("Reading function " + i + " at: " + fs.Position);
183 // TODO: ADD TO FUNCTION LIST (How do we identify it later?)
184 // Note! Absolute position
185 myFunctionBlock.CodeChunkPointer[i] = BitConverter.ToUInt32(br_read(4), 0) + myHeader.GFR;
186 Common.SendToDebug("Fuction " + i + " code chunk position: " + myFunctionBlock.CodeChunkPointer[i]);
187 }
188 }
189 }
190
191
192 // STATE FRAME BLOCK
193 // Always right after FUNCTION BLOCK
194 Common.SendToDebug("Reading STATE BLOCK at: " + myHeader.SR);
195 fs.Seek(myHeader.SR, SeekOrigin.Begin);
196 LSO_Struct.StateFrameBlock myStateFrameBlock = new LSO_Struct.StateFrameBlock();
197 myStateFrameBlock.StateCount = BitConverter.ToUInt32(br_read(4), 0);
198 if (myStateFrameBlock.StateCount > 0)
199 {
200 // Initialize array
201 myStateFrameBlock.StatePointer = new LSO_Struct.StatePointerBlock[myStateFrameBlock.StateCount];
202 for (int i = 0; i < myStateFrameBlock.StateCount; i++)
203 {
204 Common.SendToDebug("Reading STATE POINTER BLOCK " + (i + 1) + " at: " + fs.Position);
205 // Position is relative to state frame
206 myStateFrameBlock.StatePointer[i].Location = myHeader.SR + BitConverter.ToUInt32(br_read(4), 0);
207 myStateFrameBlock.StatePointer[i].EventMask = new System.Collections.BitArray(br_read(8));
208 Common.SendToDebug("Pointer: " + myStateFrameBlock.StatePointer[i].Location);
209 Common.SendToDebug("Total potential EventMask bits: " + myStateFrameBlock.StatePointer[i].EventMask.Count);
210
211 //// Read STATE BLOCK
212 //long CurPos = fs.Position;
213 //fs.Seek(CurPos, SeekOrigin.Begin);
214
215 }
216 }
217
218
219 // STATE BLOCK
220 // For each StateFrameBlock there is one StateBlock with multiple event handlers
221
222 if (myStateFrameBlock.StateCount > 0)
223 {
224 // Go through all State Frame Pointers found
225 for (int i = 0; i < myStateFrameBlock.StateCount; i++)
226 {
227
228 fs.Seek(myStateFrameBlock.StatePointer[i].Location, SeekOrigin.Begin);
229 Common.SendToDebug("Reading STATE BLOCK " + (i + 1) + " at: " + fs.Position);
230
231 // READ: STATE BLOCK HEADER
232 myStateFrameBlock.StatePointer[i].StateBlock = new LSO_Struct.StateBlock();
233 myStateFrameBlock.StatePointer[i].StateBlock.StartPos = (UInt32)fs.Position; // Note
234 myStateFrameBlock.StatePointer[i].StateBlock.HeaderSize = BitConverter.ToUInt32(br_read(4), 0);
235 myStateFrameBlock.StatePointer[i].StateBlock.Unknown = br_read(1)[0];
236 myStateFrameBlock.StatePointer[i].StateBlock.EndPos = (UInt32)fs.Position; // Note
237 Common.SendToDebug("State block Start Pos: " + myStateFrameBlock.StatePointer[i].StateBlock.StartPos);
238 Common.SendToDebug("State block Header Size: " + myStateFrameBlock.StatePointer[i].StateBlock.HeaderSize);
239 Common.SendToDebug("State block Header End Pos: " + myStateFrameBlock.StatePointer[i].StateBlock.EndPos);
240
241 // We need to count number of bits flagged in EventMask?
242
243
244 // for each bit in myStateFrameBlock.StatePointer[i].EventMask
245
246 // ADDING TO ALL RIGHT NOW, SHOULD LIMIT TO ONLY THE ONES IN USE
247 //TODO: Create event hooks
248 myStateFrameBlock.StatePointer[i].StateBlock.StateBlockHandlers = new LSO_Struct.StateBlockHandler[myStateFrameBlock.StatePointer[i].EventMask.Count - 1];
249 for (int ii = 0; ii < myStateFrameBlock.StatePointer[i].EventMask.Count - 1; ii++)
250 {
251
252 if (myStateFrameBlock.StatePointer[i].EventMask.Get(ii) == true)
253 {
254 // We got an event
255 // READ: STATE BLOCK HANDLER
256 Common.SendToDebug("Reading STATE BLOCK " + (i + 1) + " HANDLER matching EVENT MASK " + ii + " (" + ((LSO_Enums.Event_Mask_Values)ii).ToString() + ") at: " + fs.Position);
257 myStateFrameBlock.StatePointer[i].StateBlock.StateBlockHandlers[ii].CodeChunkPointer = myStateFrameBlock.StatePointer[i].StateBlock.EndPos + BitConverter.ToUInt32(br_read(4), 0);
258 myStateFrameBlock.StatePointer[i].StateBlock.StateBlockHandlers[ii].CallFrameSize = BitConverter.ToUInt32(br_read(4), 0);
259 Common.SendToDebug("Reading STATE BLOCK " + (i + 1) + " HANDLER EVENT MASK " + ii + " (" + ((LSO_Enums.Event_Mask_Values)ii).ToString() + ") Code Chunk Pointer: " + myStateFrameBlock.StatePointer[i].StateBlock.StateBlockHandlers[ii].CodeChunkPointer);
260 Common.SendToDebug("Reading STATE BLOCK " + (i + 1) + " HANDLER EVENT MASK " + ii + " (" + ((LSO_Enums.Event_Mask_Values)ii).ToString() + ") Call Frame Size: " + myStateFrameBlock.StatePointer[i].StateBlock.StateBlockHandlers[ii].CallFrameSize);
261 }
262 }
263 }
264 }
265
266
267
268
269 //// READ FUNCTION CODE CHUNKS
270 //// Functions + Function start pos (GFR)
271 //// TODO: Somehow be able to identify and reference this
272 //LSO_Struct.CodeChunk[] myFunctionCodeChunk;
273 //if (myFunctionBlock.FunctionCount > 0)
274 //{
275 // myFunctionCodeChunk = new LSO_Struct.CodeChunk[myFunctionBlock.FunctionCount];
276 // for (int i = 0; i < myFunctionBlock.FunctionCount; i++)
277 // {
278 // Common.SendToDebug("Reading Function Code Chunk " + i);
279 // myFunctionCodeChunk[i] = GetCodeChunk((UInt32)myFunctionBlock.CodeChunkPointer[i]);
280 // }
281
282 //}
283 // READ EVENT CODE CHUNKS
284 LSO_Struct.CodeChunk[] myEventCodeChunk;
285 if (myStateFrameBlock.StateCount > 0)
286 {
287 myEventCodeChunk = new LSO_Struct.CodeChunk[myStateFrameBlock.StateCount];
288 for (int i = 0; i < myStateFrameBlock.StateCount; i++)
289 {
290 // TODO: Somehow organize events and functions so they can be found again,
291 // two level search ain't no good
292 for (int ii = 0; ii < myStateFrameBlock.StatePointer[i].EventMask.Count - 1; ii++)
293 {
294
295
296 if (myStateFrameBlock.StatePointer[i].StateBlock.StateBlockHandlers[ii].CodeChunkPointer > 0)
297 {
298 Common.SendToDebug("Reading Event Code Chunk state " + i + ", event " + (LSO_Enums.Event_Mask_Values)ii);
299
300
301 // Override a Method / Function
302 string eventname = i + "_event_" + (LSO_Enums.Event_Mask_Values)ii;
303 Common.SendToDebug("Event Name: " + eventname);
304 if (Common.IL_ProcessCodeChunks)
305 {
306 EventList.Add(eventname);
307
308 // JUMP TO CODE PROCESSOR
309 ProcessCodeChunk(myStateFrameBlock.StatePointer[i].StateBlock.StateBlockHandlers[ii].CodeChunkPointer, typeBuilder, eventname);
310 }
311 }
312
313 }
314
315 }
316
317 }
318
319
320
321
322 if (Common.IL_CreateFunctionList)
323 IL_INSERT_FUNCTIONLIST();
324
325 }
326
327 internal LSO_Struct.HeapBlock GetHeap(UInt32 pos)
328 {
329 // HEAP BLOCK
330 // TODO:? Special read for strings/keys (null terminated) and lists (pointers to other HEAP entries)
331 Common.SendToDebug("Reading HEAP BLOCK at: " + pos);
332 fs.Seek(pos, SeekOrigin.Begin);
333
334 LSO_Struct.HeapBlock myHeapBlock = new LSO_Struct.HeapBlock();
335 myHeapBlock.DataBlockSize = BitConverter.ToInt32(br_read(4), 0);
336 myHeapBlock.ObjectType = br_read(1)[0];
337 myHeapBlock.ReferenceCount = BitConverter.ToUInt16(br_read(2), 0);
338 //myHeapBlock.Data = br_read(getObjectSize(myHeapBlock.ObjectType));
339 // Don't read it reversed
340 myHeapBlock.Data = new byte[myHeapBlock.DataBlockSize - 1];
341 br.Read(myHeapBlock.Data, 0, myHeapBlock.DataBlockSize - 1);
342
343
344 Common.SendToDebug("Heap Block Data Block Size: " + myHeapBlock.DataBlockSize);
345 Common.SendToDebug("Heap Block ObjectType: " + ((LSO_Enums.Variable_Type_Codes)myHeapBlock.ObjectType).ToString());
346 Common.SendToDebug("Heap Block Reference Count: " + myHeapBlock.ReferenceCount);
347
348 return myHeapBlock;
349 }
350 private byte[] br_read(int len)
351 {
352 if (len <= 0)
353 return null;
354
355 try
356 {
357 byte[] bytes = new byte[len];
358 for (int i = len - 1; i > -1; i--)
359 bytes[i] = br.ReadByte();
360 return bytes;
361 }
362 catch (Exception e)
363 {
364 Common.SendToDebug("Exception: " + e.ToString());
365 throw (e);
366 }
367 }
368 //private byte[] br_read_smallendian(int len)
369 //{
370 // byte[] bytes = new byte[len];
371 // br.Read(bytes,0, len);
372 // return bytes;
373 //}
374 private Type getLLObjectType(byte objectCode)
375 {
376 switch ((LSO_Enums.Variable_Type_Codes)objectCode)
377 {
378 case LSO_Enums.Variable_Type_Codes.Void: return typeof(void);
379 case LSO_Enums.Variable_Type_Codes.Integer: return typeof(UInt32);
380 case LSO_Enums.Variable_Type_Codes.Float: return typeof(float);
381 case LSO_Enums.Variable_Type_Codes.String: return typeof(string);
382 case LSO_Enums.Variable_Type_Codes.Key: return typeof(string);
383 case LSO_Enums.Variable_Type_Codes.Vector: return typeof(LSO_Enums.Vector);
384 case LSO_Enums.Variable_Type_Codes.Rotation: return typeof(LSO_Enums.Rotation);
385 case LSO_Enums.Variable_Type_Codes.List:
386 Common.SendToDebug("TODO: List datatype not implemented yet!");
387 return typeof(System.Collections.ArrayList);
388 case LSO_Enums.Variable_Type_Codes.Null:
389 Common.SendToDebug("TODO: Datatype null is not implemented, using string instead.!");
390 return typeof(string);
391 default:
392 Common.SendToDebug("Lookup of LSL datatype " + objectCode + " to .Net datatype failed: Unknown LSL datatype. Defaulting to object.");
393 return typeof(object);
394 }
395 }
396 private int getObjectSize(byte ObjectType)
397 {
398 switch ((LSO_Enums.Variable_Type_Codes)ObjectType)
399 {
400 case LSO_Enums.Variable_Type_Codes.Integer:
401 case LSO_Enums.Variable_Type_Codes.Float:
402 case LSO_Enums.Variable_Type_Codes.String:
403 case LSO_Enums.Variable_Type_Codes.Key:
404 case LSO_Enums.Variable_Type_Codes.List:
405 return 4;
406 case LSO_Enums.Variable_Type_Codes.Vector:
407 return 12;
408 case LSO_Enums.Variable_Type_Codes.Rotation:
409 return 16;
410 default:
411 return 0;
412 }
413 }
414 private string Read_String()
415 {
416 string ret = "";
417 byte reader = br_read(1)[0];
418 while (reader != 0x000)
419 {
420 ret += (char)reader;
421 reader = br_read(1)[0];
422 }
423 return ret;
424 }
425
426 /// <summary>
427 /// Reads a code chunk and creates IL
428 /// </summary>
429 /// <param name="pos">Absolute position in file. REMEMBER TO ADD myHeader.GFR!</param>
430 /// <param name="typeBuilder">TypeBuilder for assembly</param>
431 /// <param name="eventname">Name of event (function) to generate</param>
432 private void ProcessCodeChunk(UInt32 pos, TypeBuilder typeBuilder, string eventname)
433 {
434
435 LSO_Struct.CodeChunk myCodeChunk = new LSO_Struct.CodeChunk();
436
437 Common.SendToDebug("Reading Function Code Chunk at: " + pos);
438 fs.Seek(pos, SeekOrigin.Begin);
439 myCodeChunk.CodeChunkHeaderSize = BitConverter.ToUInt32(br_read(4), 0);
440 Common.SendToDebug("CodeChunk Header Size: " + myCodeChunk.CodeChunkHeaderSize);
441 // Read until null
442 myCodeChunk.Comment = Read_String();
443 Common.SendToDebug("Function comment: " + myCodeChunk.Comment);
444 myCodeChunk.ReturnTypePos = br_read(1)[0];
445 myCodeChunk.ReturnType = GetStaticBlock((long)myCodeChunk.ReturnTypePos + (long)myHeader.GVR);
446 Common.SendToDebug("Return type #" + myCodeChunk.ReturnType.ObjectType + ": " + ((LSO_Enums.Variable_Type_Codes)myCodeChunk.ReturnType.ObjectType).ToString());
447
448
449 // TODO: How to determine number of codechunks -- does this method work?
450 myCodeChunk.CodeChunkArguments = new System.Collections.Generic.List<LSO_Struct.CodeChunkArgument>();
451 byte reader = br_read(1)[0];
452 reader = br_read(1)[0];
453
454 // NOTE ON CODE CHUNK ARGUMENTS
455 // This determins type definition
456 int ccount = 0;
457 while (reader != 0x000)
458 {
459 ccount++;
460 Common.SendToDebug("Reading Code Chunk Argument " + ccount);
461 LSO_Struct.CodeChunkArgument CCA = new LSO_Struct.CodeChunkArgument();
462 CCA.FunctionReturnTypePos = reader;
463 reader = br_read(1)[0];
464 CCA.NullString = reader;
465 CCA.FunctionReturnType = GetStaticBlock(CCA.FunctionReturnTypePos + myHeader.GVR);
466 myCodeChunk.CodeChunkArguments.Add(CCA);
467 Common.SendToDebug("Code Chunk Argument " + ccount + " type #" + CCA.FunctionReturnType.ObjectType + ": " + (LSO_Enums.Variable_Type_Codes)CCA.FunctionReturnType.ObjectType);
468 }
469 // Create string array
470 Type[] MethodArgs = new Type[myCodeChunk.CodeChunkArguments.Count];
471 for (int _ic = 0; _ic < myCodeChunk.CodeChunkArguments.Count; _ic++)
472 {
473 MethodArgs[_ic] = getLLObjectType(myCodeChunk.CodeChunkArguments[_ic].FunctionReturnType.ObjectType);
474 Common.SendToDebug("Method argument " + _ic + ": " + getLLObjectType(myCodeChunk.CodeChunkArguments[_ic].FunctionReturnType.ObjectType).ToString());
475 }
476 // End marker is 0x000
477 myCodeChunk.EndMarker = reader;
478
479
480 //
481 // Emit: START OF METHOD (FUNCTION)
482 //
483
484 Common.SendToDebug("CLR:" + eventname + ":MethodBuilder methodBuilder = typeBuilder.DefineMethod...");
485 MethodBuilder methodBuilder = typeBuilder.DefineMethod(eventname,
486 MethodAttributes.Public,
487 typeof(void),
488 new Type[] { typeof(object) });
489 //MethodArgs);
490 //typeof(void), //getLLObjectType(myCodeChunk.ReturnType),
491 // new Type[] { typeof(object) }, //);
492
493 //Common.SendToDebug("CLR:" + eventname + ":typeBuilder.DefineMethodOverride(methodBuilder...");
494 //typeBuilder.DefineMethodOverride(methodBuilder,
495 // typeof(LSL_CLRInterface.LSLScript).GetMethod(eventname));
496
497 // Create the IL generator
498
499 Common.SendToDebug("CLR:" + eventname + ":ILGenerator il = methodBuilder.GetILGenerator();");
500 ILGenerator il = methodBuilder.GetILGenerator();
501
502
503 if (Common.IL_UseTryCatch)
504 IL_INSERT_TRY(il, eventname);
505
506
507
508 // Push Console.WriteLine command to stack ... Console.WriteLine("Hello World!");
509 //Common.SendToDebug("CLR:" + eventname + ":il.Emit(OpCodes.Call...");
510 //il.Emit(OpCodes.Call, typeof(Console).GetMethod
511 // ("WriteLine", new Type[] { typeof(string) }));
512
513 //Common.SendToDebug("STARTUP: il.Emit(OpCodes.Ldc_I4_S, 0);");
514
515 //il.Emit(OpCodes.Ldc_I4_S, 0);
516 for (int _ic = 0; _ic < myCodeChunk.CodeChunkArguments.Count; _ic++)
517 {
518 Common.SendToDebug("PARAMS: il.Emit(OpCodes.Ldarg, " + _ic + ");");
519 il.Emit(OpCodes.Ldarg, _ic);
520 }
521
522
523
524 //
525 // CALLING OPCODE PROCESSOR, one command at the time TO GENERATE IL
526 //
527 bool FoundRet = false;
528 while (FoundRet == false)
529 {
530 FoundRet = LSL_PROCESS_OPCODE(il);
531 }
532
533
534 if (Common.IL_UseTryCatch)
535 IL_INSERT_END_TRY(il, eventname);
536
537 // Emit: RETURN FROM METHOD
538 il.Emit(OpCodes.Ret);
539
540 return;
541
542 }
543
544 private void IL_INSERT_FUNCTIONLIST()
545 {
546
547 Common.SendToDebug("Creating function list");
548
549
550 string eventname = "GetFunctions";
551
552 Common.SendToDebug("Creating IL " + eventname);
553 // Define a private String field.
554 //FieldBuilder myField = myTypeBuilder.DefineField("EventList", typeof(String[]), FieldAttributes.Public);
555
556
557 //FieldBuilder mem = typeBuilder.DefineField("mem", typeof(Array), FieldAttributes.Private);
558
559
560
561 MethodBuilder methodBuilder = typeBuilder.DefineMethod(eventname,
562 MethodAttributes.Public,
563 typeof(string[]),
564 null);
565
566 //typeBuilder.DefineMethodOverride(methodBuilder,
567 // typeof(LSL_CLRInterface.LSLScript).GetMethod(eventname));
568
569 ILGenerator il = methodBuilder.GetILGenerator();
570
571
572
573
574 // IL_INSERT_TRY(il, eventname);
575
576 // // Push string to stack
577 // il.Emit(OpCodes.Ldstr, "Inside " + eventname);
578
579 //// Push Console.WriteLine command to stack ... Console.WriteLine("Hello World!");
580 //il.Emit(OpCodes.Call, typeof(Console).GetMethod
581 // ("WriteLine", new Type[] { typeof(string) }));
582
583 //initIL.Emit(OpCodes.Newobj, typeof(string[]));
584
585 //string[] MyArray = new string[2] { "TestItem1" , "TestItem2" };
586
587 ////il.Emit(OpCodes.Ldarg_0);
588
589 il.DeclareLocal(typeof(string[]));
590
591 ////il.Emit(OpCodes.Ldarg_0);
592 il.Emit(OpCodes.Ldc_I4, EventList.Count); // Specify array length
593 il.Emit(OpCodes.Newarr, typeof(String)); // create new string array
594 il.Emit(OpCodes.Stloc_0); // Store array as local variable 0 in stack
595 ////SetFunctionList
596
597 for (int lv = 0; lv < EventList.Count; lv++)
598 {
599 il.Emit(OpCodes.Ldloc_0); // Load local variable 0 onto stack
600 il.Emit(OpCodes.Ldc_I4, lv); // Push index position
601 il.Emit(OpCodes.Ldstr, EventList[lv]); // Push value
602 il.Emit(OpCodes.Stelem_Ref); // Perform array[index] = value
603
604 //il.Emit(OpCodes.Ldarg_0);
605 //il.Emit(OpCodes.Ldstr, EventList[lv]); // Push value
606 //il.Emit(OpCodes.Call, typeof(LSL_BaseClass).GetMethod("AddFunction", new Type[] { typeof(string) }));
607
608 }
609
610
611
612 // IL_INSERT_END_TRY(il, eventname);
613
614
615 il.Emit(OpCodes.Ldloc_0); // Load local variable 0 onto stack
616 // il.Emit(OpCodes.Call, typeof(LSL_BaseClass).GetMethod("SetFunctionList", new Type[] { typeof(Array) }));
617
618 il.Emit(OpCodes.Ret); // Return
619
620 }
621
622
623 private void IL_INSERT_TRY(ILGenerator il, string eventname)
624 {
625 /*
626 * CLR TRY
627 */
628 //Common.SendToDebug("CLR:" + eventname + ":il.BeginExceptionBlock()");
629 il.BeginExceptionBlock();
630
631 // Push "Hello World!" string to stack
632 //Common.SendToDebug("CLR:" + eventname + ":il.Emit(OpCodes.Ldstr...");
633 //il.Emit(OpCodes.Ldstr, "Starting CLR dynamic execution of: " + eventname);
634
635 }
636
637 private void IL_INSERT_END_TRY(ILGenerator il, string eventname)
638 {
639 /*
640 * CATCH
641 */
642 Common.SendToDebug("CLR:" + eventname + ":il.BeginCatchBlock(typeof(Exception));");
643 il.BeginCatchBlock(typeof(Exception));
644
645 // Push "Hello World!" string to stack
646 Common.SendToDebug("CLR:" + eventname + ":il.Emit(OpCodes.Ldstr...");
647 il.Emit(OpCodes.Ldstr, "Execption executing dynamic CLR function " + eventname + ": ");
648
649 //call void [mscorlib]System.Console::WriteLine(string)
650 Common.SendToDebug("CLR:" + eventname + ":il.Emit(OpCodes.Call...");
651 il.Emit(OpCodes.Call, typeof(Console).GetMethod
652 ("Write", new Type[] { typeof(string) }));
653
654 //callvirt instance string [mscorlib]System.Exception::get_Message()
655 Common.SendToDebug("CLR:" + eventname + ":il.Emit(OpCodes.Callvirt...");
656 il.Emit(OpCodes.Callvirt, typeof(Exception).GetMethod
657 ("get_Message"));
658
659 //call void [mscorlib]System.Console::WriteLine(string)
660 Common.SendToDebug("CLR:" + eventname + ":il.Emit(OpCodes.Call...");
661 il.Emit(OpCodes.Call, typeof(Console).GetMethod
662 ("WriteLine", new Type[] { typeof(string) }));
663
664 /*
665 * CLR END TRY
666 */
667 //Common.SendToDebug("CLR:" + eventname + ":il.EndExceptionBlock();");
668 il.EndExceptionBlock();
669 }
670
671 private LSO_Struct.StaticBlock GetStaticBlock(long pos)
672 {
673 long FirstPos = fs.Position;
674 try
675 {
676 UInt32 position = (UInt32)pos;
677 // STATIC BLOCK
678 Common.SendToDebug("Reading STATIC BLOCK at: " + position);
679 fs.Seek(position, SeekOrigin.Begin);
680
681 if (StaticBlocks.ContainsKey(position) == true)
682 {
683 Common.SendToDebug("Found cached STATIC BLOCK");
684
685
686
687 return StaticBlocks[pos];
688 }
689
690 //int StaticBlockCount = 0;
691 // Read function blocks until we hit GFR
692 //while (fs.Position < myHeader.GFR)
693 //{
694 //StaticBlockCount++;
695
696 //Common.SendToDebug("Reading Static Block at: " + position);
697
698 //fs.Seek(myHeader.GVR, SeekOrigin.Begin);
699 LSO_Struct.StaticBlock myStaticBlock = new LSO_Struct.StaticBlock();
700 myStaticBlock.Static_Chunk_Header_Size = BitConverter.ToUInt32(br_read(4), 0);
701 myStaticBlock.ObjectType = br_read(1)[0];
702 Common.SendToDebug("Static Block ObjectType: " + ((LSO_Enums.Variable_Type_Codes)myStaticBlock.ObjectType).ToString());
703 myStaticBlock.Unknown = br_read(1)[0];
704 // Size of datatype varies
705 if (myStaticBlock.ObjectType != 0)
706 myStaticBlock.BlockVariable = br_read(getObjectSize(myStaticBlock.ObjectType));
707
708 StaticBlocks.Add(position, myStaticBlock);
709 //}
710 Common.SendToDebug("Done reading Static Block.");
711 return myStaticBlock;
712 }
713 finally
714 {
715 // Go back to original read pos
716 fs.Seek(FirstPos, SeekOrigin.Begin);
717 }
718
719 }
720
721 }
722}
diff --git a/OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/LSO/LSO_Struct.cs b/OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/LSO/LSO_Struct.cs
new file mode 100644
index 0000000..f0203b3
--- /dev/null
+++ b/OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/LSO/LSO_Struct.cs
@@ -0,0 +1,135 @@
1/*
2* Copyright (c) Contributors, http://opensimulator.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28/* Original code: Tedd Hansen */
29
30using System;
31using System.Collections.Generic;
32using System.Text;
33
34namespace OpenSim.Grid.ScriptEngine.DotNetEngine.Compiler.LSO
35{
36 static class LSO_Struct
37 {
38
39 public struct Header
40 {
41 public UInt32 TM;
42 public UInt32 IP;
43 public UInt32 VN;
44 public UInt32 BP;
45 public UInt32 SP;
46 public UInt32 HR;
47 public UInt32 HP;
48 public UInt32 CS;
49 public UInt32 NS;
50 public UInt32 CE;
51 public UInt32 IE;
52 public UInt32 ER;
53 public UInt32 FR;
54 public UInt32 SLR;
55 public UInt32 GVR;
56 public UInt32 GFR;
57 public UInt32 PR;
58 public UInt32 ESR;
59 public UInt32 SR;
60 public UInt64 NCE;
61 public UInt64 NIE;
62 public UInt64 NER;
63 }
64
65 public struct StaticBlock
66 {
67 public UInt32 Static_Chunk_Header_Size;
68 public byte ObjectType;
69 public byte Unknown;
70 public byte[] BlockVariable;
71 }
72 /* Not actually a structure
73 public struct StaticBlockVariable
74 {
75 public UInt32 Integer1;
76 public UInt32 Float1;
77 public UInt32 HeapPointer_String;
78 public UInt32 HeapPointer_Key;
79 public byte[] Vector_12;
80 public byte[] Rotation_16;
81 public UInt32 Pointer_List_Structure;
82 } */
83 public struct HeapBlock
84 {
85 public Int32 DataBlockSize;
86 public byte ObjectType;
87 public UInt16 ReferenceCount;
88 public byte[] Data;
89 }
90 public struct StateFrameBlock
91 {
92 public UInt32 StateCount;
93 public StatePointerBlock[] StatePointer;
94 }
95 public struct StatePointerBlock
96 {
97 public UInt32 Location;
98 public System.Collections.BitArray EventMask;
99 public StateBlock StateBlock;
100 }
101 public struct StateBlock
102 {
103 public UInt32 StartPos;
104 public UInt32 EndPos;
105 public UInt32 HeaderSize;
106 public byte Unknown;
107 public StateBlockHandler[] StateBlockHandlers;
108 }
109 public struct StateBlockHandler
110 {
111 public UInt32 CodeChunkPointer;
112 public UInt32 CallFrameSize;
113 }
114 public struct FunctionBlock
115 {
116 public UInt32 FunctionCount;
117 public UInt32[] CodeChunkPointer;
118 }
119 public struct CodeChunk
120 {
121 public UInt32 CodeChunkHeaderSize;
122 public string Comment;
123 public System.Collections.Generic.List<CodeChunkArgument> CodeChunkArguments;
124 public byte EndMarker;
125 public byte ReturnTypePos;
126 public StaticBlock ReturnType;
127 }
128 public struct CodeChunkArgument
129 {
130 public byte FunctionReturnTypePos;
131 public byte NullString;
132 public StaticBlock FunctionReturnType;
133 }
134 }
135}
diff --git a/OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/Server_API/LSL_BuiltIn_Commands.cs b/OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/Server_API/LSL_BuiltIn_Commands.cs
new file mode 100644
index 0000000..a1f6c73
--- /dev/null
+++ b/OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/Server_API/LSL_BuiltIn_Commands.cs
@@ -0,0 +1,1161 @@
1using Axiom.Math;
2using System;
3using System.Collections.Generic;
4using System.Text;
5using libsecondlife;
6using OpenSim.Region.Environment.Scenes;
7using OpenSim.Region.Environment.Scenes.Scripting;
8using OpenSim.Region.Environment.Interfaces;
9using OpenSim.Grid.ScriptEngine.DotNetEngine.Compiler;
10using OpenSim.Region.ScriptEngine.Common;
11using OpenSim.Framework.Console;
12using OpenSim.Framework.Utilities;
13using System.Runtime.Remoting.Lifetime;
14
15namespace OpenSim.Grid.ScriptEngine.DotNetEngine.Compiler
16{
17 //
18 // !!!IMPORTANT!!!
19 //
20 // REMEMBER TO UPDATE http://opensimulator.org/wiki/LlFunction_implementation_status
21 //
22
23 /// <summary>
24 /// Contains all LSL ll-functions. This class will be in Default AppDomain.
25 /// </summary>
26 public class LSL_BuiltIn_Commands : MarshalByRefObject, LSL_BuiltIn_Commands_Interface
27 {
28
29 private System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();
30 private ScriptEngine m_ScriptEngine;
31 private SceneObjectPart m_host;
32 private uint m_localID;
33 private LLUUID m_itemID;
34 private bool throwErrorOnNotImplemented = true;
35
36
37 public LSL_BuiltIn_Commands(ScriptEngine ScriptEngine, SceneObjectPart host, uint localID, LLUUID itemID)
38 {
39 m_ScriptEngine = ScriptEngine;
40 m_host = host;
41 m_localID = localID;
42 m_itemID = itemID;
43
44
45 //MainLog.Instance.Notice("ScriptEngine", "LSL_BaseClass.Start() called. Hosted by [" + m_host.Name + ":" + m_host.UUID + "@" + m_host.AbsolutePosition + "]");
46 }
47
48
49 private string m_state = "default";
50
51 public string State()
52 {
53 return m_state;
54 }
55
56 // Object never expires
57 public override Object InitializeLifetimeService()
58 {
59 //Console.WriteLine("LSL_BuiltIn_Commands: InitializeLifetimeService()");
60 // return null;
61 ILease lease = (ILease)base.InitializeLifetimeService();
62
63 if (lease.CurrentState == LeaseState.Initial)
64 {
65 lease.InitialLeaseTime = TimeSpan.Zero; // TimeSpan.FromMinutes(1);
66 // lease.SponsorshipTimeout = TimeSpan.FromMinutes(2);
67 // lease.RenewOnCallTime = TimeSpan.FromSeconds(2);
68 }
69 return lease;
70 }
71
72
73 public Scene World
74 {
75 get { return m_ScriptEngine.World; }
76 }
77
78 //These are the implementations of the various ll-functions used by the LSL scripts.
79 //starting out, we use the System.Math library for trig functions. - ckrinke 8-14-07
80 public double llSin(double f) { return (double)Math.Sin(f); }
81 public double llCos(double f) { return (double)Math.Cos(f); }
82 public double llTan(double f) { return (double)Math.Tan(f); }
83 public double llAtan2(double x, double y) { return (double)Math.Atan2(y, x); }
84 public double llSqrt(double f) { return (double)Math.Sqrt(f); }
85 public double llPow(double fbase, double fexponent) { return (double)Math.Pow(fbase, fexponent); }
86 public int llAbs(int i) { return (int)Math.Abs(i); }
87 public double llFabs(double f) { return (double)Math.Abs(f); }
88
89 public double llFrand(double mag)
90 {
91 lock (Util.RandomClass)
92 {
93 return Util.RandomClass.Next((int)mag);
94 }
95 }
96
97 public int llFloor(double f) { return (int)Math.Floor(f); }
98 public int llCeil(double f) { return (int)Math.Ceiling(f); }
99 public int llRound(double f) { return (int)Math.Round(f, 3); }
100
101 //This next group are vector operations involving squaring and square root. ckrinke
102 public double llVecMag(LSL_Types.Vector3 v)
103 {
104 return (v.X * v.X + v.Y * v.Y + v.Z * v.Z);
105 }
106
107 public LSL_Types.Vector3 llVecNorm(LSL_Types.Vector3 v)
108 {
109 double mag = v.X * v.X + v.Y * v.Y + v.Z * v.Z;
110 LSL_Types.Vector3 nor = new LSL_Types.Vector3();
111 nor.X = v.X / mag; nor.Y = v.Y / mag; nor.Z = v.Z / mag;
112 return nor;
113 }
114
115 public double llVecDist(LSL_Types.Vector3 a, LSL_Types.Vector3 b)
116 {
117 double dx = a.X - b.X; double dy = a.Y - b.Y; double dz = a.Z - b.Z;
118 return Math.Sqrt(dx * dx + dy * dy + dz * dz);
119 }
120
121 //Now we start getting into quaternions which means sin/cos, matrices and vectors. ckrinke
122 public LSL_Types.Vector3 llRot2Euler(LSL_Types.Quaternion r)
123 {
124 //This implementation is from http://lslwiki.net/lslwiki/wakka.php?wakka=LibraryRotationFunctions. ckrinke
125 LSL_Types.Quaternion t = new LSL_Types.Quaternion(r.X * r.X, r.Y * r.Y, r.Z * r.Z, r.R * r.R);
126 double m = (t.X + t.Y + t.Z + t.R);
127 if (m == 0) return new LSL_Types.Vector3();
128 double n = 2 * (r.Y * r.R + r.X * r.Z);
129 double p = m * m - n * n;
130 if (p > 0)
131 return new LSL_Types.Vector3(Math.Atan2(2.0 * (r.X * r.R - r.Y * r.Z), (-t.X - t.Y + t.Z + t.R)),
132 Math.Atan2(n, Math.Sqrt(p)), Math.Atan2(2.0 * (r.Z * r.R - r.X * r.Y), (t.X - t.Y - t.Z + t.R)));
133 else if (n > 0)
134 return new LSL_Types.Vector3(0.0, Math.PI / 2, Math.Atan2((r.Z * r.R + r.X * r.Y), 0.5 - t.X - t.Z));
135 else
136 return new LSL_Types.Vector3(0.0, -Math.PI / 2, Math.Atan2((r.Z * r.R + r.X * r.Y), 0.5 - t.X - t.Z));
137 }
138
139 public LSL_Types.Quaternion llEuler2Rot(LSL_Types.Vector3 v)
140 {
141 //this comes from from http://lslwiki.net/lslwiki/wakka.php?wakka=LibraryRotationFunctions but is incomplete as of 8/19/07
142 float err = 0.00001f;
143 double ax = Math.Sin(v.X / 2); double aw = Math.Cos(v.X / 2);
144 double by = Math.Sin(v.Y / 2); double bw = Math.Cos(v.Y / 2);
145 double cz = Math.Sin(v.Z / 2); double cw = Math.Cos(v.Z / 2);
146 LSL_Types.Quaternion a1 = new LSL_Types.Quaternion(0.0, 0.0, cz, cw);
147 LSL_Types.Quaternion a2 = new LSL_Types.Quaternion(0.0, by, 0.0, bw);
148 LSL_Types.Quaternion a3 = new LSL_Types.Quaternion(ax, 0.0, 0.0, aw);
149 LSL_Types.Quaternion a = new LSL_Types.Quaternion();
150 //This multiplication doesnt compile, yet. a = a1 * a2 * a3;
151 LSL_Types.Quaternion b = new LSL_Types.Quaternion(ax * bw * cw + aw * by * cz,
152 aw * by * cw - ax * bw * cz, aw * bw * cz + ax * by * cw, aw * bw * cw - ax * by * cz);
153 LSL_Types.Quaternion c = new LSL_Types.Quaternion();
154 //This addition doesnt compile yet c = a + b;
155 LSL_Types.Quaternion d = new LSL_Types.Quaternion();
156 //This addition doesnt compile yet d = a - b;
157 if ((Math.Abs(c.X) > err && Math.Abs(d.X) > err) ||
158 (Math.Abs(c.Y) > err && Math.Abs(d.Y) > err) ||
159 (Math.Abs(c.Z) > err && Math.Abs(d.Z) > err) ||
160 (Math.Abs(c.R) > err && Math.Abs(d.R) > err))
161 {
162 //return a new Quaternion that is null until I figure this out
163 // return b;
164 // return a;
165 }
166 return new LSL_Types.Quaternion();
167 }
168
169 public LSL_Types.Quaternion llAxes2Rot(LSL_Types.Vector3 fwd, LSL_Types.Vector3 left, LSL_Types.Vector3 up) { return new LSL_Types.Quaternion(); }
170 public LSL_Types.Vector3 llRot2Fwd(LSL_Types.Quaternion r) { return new LSL_Types.Vector3(); }
171 public LSL_Types.Vector3 llRot2Left(LSL_Types.Quaternion r) { return new LSL_Types.Vector3(); }
172 public LSL_Types.Vector3 llRot2Up(LSL_Types.Quaternion r) { return new LSL_Types.Vector3(); }
173 public LSL_Types.Quaternion llRotBetween(LSL_Types.Vector3 start, LSL_Types.Vector3 end) { return new LSL_Types.Quaternion(); }
174
175 public void llWhisper(int channelID, string text)
176 {
177 //type for whisper is 0
178 World.SimChat(Helpers.StringToField(text),
179 0, channelID, m_host.AbsolutePosition, m_host.Name, m_host.UUID);
180 }
181
182 public void llSay(int channelID, string text)
183 {
184 //type for say is 1
185
186 World.SimChat(Helpers.StringToField(text),
187 1, channelID, m_host.AbsolutePosition, m_host.Name, m_host.UUID);
188 }
189
190 public void llShout(int channelID, string text)
191 {
192 //type for shout is 2
193 World.SimChat(Helpers.StringToField(text),
194 2, channelID, m_host.AbsolutePosition, m_host.Name, m_host.UUID);
195 }
196
197 public int llListen(int channelID, string name, string ID, string msg) { NotImplemented("llListen"); return 0; }
198 public void llListenControl(int number, int active) { NotImplemented("llListenControl"); return; }
199 public void llListenRemove(int number) { NotImplemented("llListenRemove"); return; }
200 public void llSensor(string name, string id, int type, double range, double arc) { NotImplemented("llSensor"); return; }
201 public void llSensorRepeat(string name, string id, int type, double range, double arc, double rate) { NotImplemented("llSensorRepeat"); return; }
202 public void llSensorRemove() { NotImplemented("llSensorRemove"); return; }
203 public string llDetectedName(int number) { NotImplemented("llDetectedName"); return ""; }
204 public string llDetectedKey(int number) { NotImplemented("llDetectedKey"); return ""; }
205 public string llDetectedOwner(int number) { NotImplemented("llDetectedOwner"); return ""; }
206 public int llDetectedType(int number) { NotImplemented("llDetectedType"); return 0; }
207 public LSL_Types.Vector3 llDetectedPos(int number) { NotImplemented("llDetectedPos"); return new LSL_Types.Vector3(); }
208 public LSL_Types.Vector3 llDetectedVel(int number) { NotImplemented("llDetectedVel"); return new LSL_Types.Vector3(); }
209 public LSL_Types.Vector3 llDetectedGrab(int number) { NotImplemented("llDetectedGrab"); return new LSL_Types.Vector3(); }
210 public LSL_Types.Quaternion llDetectedRot(int number) { NotImplemented("llDetectedRot"); return new LSL_Types.Quaternion(); }
211 public int llDetectedGroup(int number) { NotImplemented("llDetectedGroup"); return 0; }
212 public int llDetectedLinkNumber(int number) { NotImplemented("llDetectedLinkNumber"); return 0; }
213 public void llDie() { NotImplemented("llDie"); return; }
214 public double llGround(LSL_Types.Vector3 offset) { NotImplemented("llGround"); return 0; }
215 public double llCloud(LSL_Types.Vector3 offset) { NotImplemented("llCloud"); return 0; }
216 public LSL_Types.Vector3 llWind(LSL_Types.Vector3 offset) { NotImplemented("llWind"); return new LSL_Types.Vector3(); }
217 public void llSetStatus(int status, int value) { NotImplemented("llSetStatus"); return; }
218 public int llGetStatus(int status) { NotImplemented("llGetStatus"); return 0; }
219
220 public void llSetScale(LSL_Types.Vector3 scale)
221 {
222 // TODO: this needs to trigger a persistance save as well
223 LLVector3 tmp = m_host.Scale;
224 tmp.X = (float)scale.X;
225 tmp.Y = (float)scale.Y;
226 tmp.Z = (float)scale.Z;
227 m_host.Scale = tmp;
228 return;
229 }
230 public LSL_Types.Vector3 llGetScale()
231 {
232 return new LSL_Types.Vector3(m_host.Scale.X, m_host.Scale.Y, m_host.Scale.Z);
233 }
234
235 public void llSetColor(LSL_Types.Vector3 color, int face) { NotImplemented("llSetColor"); return; }
236 public double llGetAlpha(int face) { NotImplemented("llGetAlpha"); return 0; }
237 public void llSetAlpha(double alpha, int face) { NotImplemented("llSetAlpha"); return; }
238 public LSL_Types.Vector3 llGetColor(int face) { NotImplemented("llGetColor"); return new LSL_Types.Vector3(); }
239 public void llSetTexture(string texture, int face) { NotImplemented("llSetTexture"); return; }
240 public void llScaleTexture(double u, double v, int face) { NotImplemented("llScaleTexture"); return; }
241 public void llOffsetTexture(double u, double v, int face) { NotImplemented("llOffsetTexture"); return; }
242 public void llRotateTexture(double rotation, int face) { NotImplemented("llRotateTexture"); return; }
243
244 public string llGetTexture(int face) { NotImplemented("llGetTexture"); return ""; }
245
246 public void llSetPos(LSL_Types.Vector3 pos)
247 {
248 if (m_host.ParentID != 0)
249 {
250 m_host.UpdateOffSet(new LLVector3((float)pos.X, (float)pos.Y, (float)pos.Z));
251 }
252 else
253 {
254 m_host.UpdateGroupPosition(new LLVector3((float)pos.X, (float)pos.Y, (float)pos.Z));
255 }
256 }
257
258 public LSL_Types.Vector3 llGetPos()
259 {
260 return new LSL_Types.Vector3(m_host.AbsolutePosition.X,
261 m_host.AbsolutePosition.Y,
262 m_host.AbsolutePosition.Z);
263 }
264
265 public LSL_Types.Vector3 llGetLocalPos()
266 {
267 if (m_host.ParentID != 0)
268 {
269 return new LSL_Types.Vector3(m_host.OffsetPosition.X,
270 m_host.OffsetPosition.Y,
271 m_host.OffsetPosition.Z);
272 }
273 else
274 {
275 return new LSL_Types.Vector3(m_host.AbsolutePosition.X,
276 m_host.AbsolutePosition.Y,
277 m_host.AbsolutePosition.Z);
278 }
279 }
280 public void llSetRot(LSL_Types.Quaternion rot)
281 {
282 m_host.UpdateRotation(new LLQuaternion((float)rot.X, (float)rot.Y, (float)rot.Z, (float)rot.R));
283 }
284 public LSL_Types.Quaternion llGetRot()
285 {
286 LLQuaternion q = m_host.RotationOffset;
287 return new LSL_Types.Quaternion(q.X, q.Y, q.Z, q.W);
288 }
289 public LSL_Types.Quaternion llGetLocalRot() { NotImplemented("llGetLocalRot"); return new LSL_Types.Quaternion(); }
290 public void llSetForce(LSL_Types.Vector3 force, int local) { NotImplemented("llSetForce"); }
291 public LSL_Types.Vector3 llGetForce() { NotImplemented("llGetForce"); return new LSL_Types.Vector3(); }
292 public int llTarget(LSL_Types.Vector3 position, double range) { NotImplemented("llTarget"); return 0; }
293 public void llTargetRemove(int number) { NotImplemented("llTargetRemove"); }
294 public int llRotTarget(LSL_Types.Quaternion rot, double error) { NotImplemented("llRotTarget"); return 0; }
295 public void llRotTargetRemove(int number) { NotImplemented("llRotTargetRemove"); }
296 public void llMoveToTarget(LSL_Types.Vector3 target, double tau) { NotImplemented("llMoveToTarget"); }
297 public void llStopMoveToTarget() { NotImplemented("llStopMoveToTarget"); }
298 public void llApplyImpulse(LSL_Types.Vector3 force, int local) { NotImplemented("llApplyImpulse"); }
299 public void llApplyRotationalImpulse(LSL_Types.Vector3 force, int local) { NotImplemented("llApplyRotationalImpulse"); }
300 public void llSetTorque(LSL_Types.Vector3 torque, int local) { NotImplemented("llSetTorque"); }
301 public LSL_Types.Vector3 llGetTorque() { NotImplemented("llGetTorque"); return new LSL_Types.Vector3(); }
302 public void llSetForceAndTorque(LSL_Types.Vector3 force, LSL_Types.Vector3 torque, int local) { NotImplemented("llSetForceAndTorque"); }
303 public LSL_Types.Vector3 llGetVel() { NotImplemented("llGetVel"); return new LSL_Types.Vector3(); }
304 public LSL_Types.Vector3 llGetAccel() { NotImplemented("llGetAccel"); return new LSL_Types.Vector3(); }
305 public LSL_Types.Vector3 llGetOmega() { NotImplemented("llGetOmega"); return new LSL_Types.Vector3(); }
306 public double llGetTimeOfDay() { NotImplemented("llGetTimeOfDay"); return 0; }
307
308 public double llGetWallclock()
309 {
310 return DateTime.Now.TimeOfDay.TotalSeconds;
311 }
312
313 public double llGetTime() { NotImplemented("llGetTime"); return 0; }
314 public void llResetTime() { NotImplemented("llResetTime"); }
315 public double llGetAndResetTime() { NotImplemented("llGetAndResetTime"); return 0; }
316 public void llSound() { NotImplemented("llSound"); }
317 public void llPlaySound(string sound, double volume) { NotImplemented("llPlaySound"); }
318 public void llLoopSound(string sound, double volume) { NotImplemented("llLoopSound"); }
319 public void llLoopSoundMaster(string sound, double volume) { NotImplemented("llLoopSoundMaster"); }
320 public void llLoopSoundSlave(string sound, double volume) { NotImplemented("llLoopSoundSlave"); }
321 public void llPlaySoundSlave(string sound, double volume) { NotImplemented("llPlaySoundSlave"); }
322 public void llTriggerSound(string sound, double volume) { NotImplemented("llTriggerSound"); }
323 public void llStopSound() { NotImplemented("llStopSound"); }
324 public void llPreloadSound(string sound) { NotImplemented("llPreloadSound"); }
325
326 public string llGetSubString(string src, int start, int end)
327 {
328 return src.Substring(start, end);
329 }
330
331 public string llDeleteSubString(string src, int start, int end)
332 {
333 return src.Remove(start, end - start);
334 }
335 public string llInsertString(string dst, int position, string src)
336 {
337 return dst.Insert(position, src);
338 }
339 public string llToUpper(string src)
340 {
341 return src.ToUpper();
342 }
343
344 public string llToLower(string src)
345 {
346 return src.ToLower();
347 }
348
349 public int llGiveMoney(string destination, int amount) { NotImplemented("llGiveMoney"); return 0; }
350 public void llMakeExplosion() { NotImplemented("llMakeExplosion"); }
351 public void llMakeFountain() { NotImplemented("llMakeFountain"); }
352 public void llMakeSmoke() { NotImplemented("llMakeSmoke"); }
353 public void llMakeFire() { NotImplemented("llMakeFire"); }
354 public void llRezObject(string inventory, LSL_Types.Vector3 pos, LSL_Types.Quaternion rot, int param) { NotImplemented("llRezObject"); }
355 public void llLookAt(LSL_Types.Vector3 target, double strength, double damping) { NotImplemented("llLookAt"); }
356 public void llStopLookAt() { NotImplemented("llStopLookAt"); }
357
358 public void llSetTimerEvent(double sec)
359 {
360 // Setting timer repeat
361 m_ScriptEngine.m_LSLLongCmdHandler.SetTimerEvent(m_localID, m_itemID, sec);
362 }
363
364 public void llSleep(double sec)
365 {
366 System.Threading.Thread.Sleep((int)(sec * 1000));
367 }
368
369 public double llGetMass() { NotImplemented("llGetMass"); return 0; }
370 public void llCollisionFilter(string name, string id, int accept) { NotImplemented("llCollisionFilter"); }
371 public void llTakeControls(int controls, int accept, int pass_on) { NotImplemented("llTakeControls"); }
372 public void llReleaseControls() { NotImplemented("llReleaseControls"); }
373 public void llAttachToAvatar(int attachment) { NotImplemented("llAttachToAvatar"); }
374 public void llDetachFromAvatar() { NotImplemented("llDetachFromAvatar"); }
375 public void llTakeCamera() { NotImplemented("llTakeCamera"); }
376 public void llReleaseCamera() { NotImplemented("llReleaseCamera"); }
377
378 public string llGetOwner()
379 {
380 return m_host.ObjectOwner.ToStringHyphenated();
381 }
382
383 public void llInstantMessage(string user, string message) { NotImplemented("llInstantMessage"); }
384 public void llEmail(string address, string subject, string message) { NotImplemented("llEmail"); }
385 public void llGetNextEmail(string address, string subject) { NotImplemented("llGetNextEmail"); }
386
387 public string llGetKey()
388 {
389 return m_host.UUID.ToStringHyphenated();
390 }
391
392 public void llSetBuoyancy(double buoyancy) { NotImplemented("llSetBuoyancy"); }
393 public void llSetHoverHeight(double height, int water, double tau) { NotImplemented("llSetHoverHeight"); }
394 public void llStopHover() { NotImplemented("llStopHover"); }
395 public void llMinEventDelay(double delay) { NotImplemented("llMinEventDelay"); }
396 public void llSoundPreload() { NotImplemented("llSoundPreload"); }
397 public void llRotLookAt(LSL_Types.Quaternion target, double strength, double damping) { NotImplemented("llRotLookAt"); }
398
399 public int llStringLength(string str)
400 {
401 if (str.Length > 0)
402 {
403 return str.Length;
404 }
405 else
406 {
407 return 0;
408 }
409 }
410
411 public void llStartAnimation(string anim) { NotImplemented("llStartAnimation"); }
412 public void llStopAnimation(string anim) { NotImplemented("llStopAnimation"); }
413 public void llPointAt() { NotImplemented("llPointAt"); }
414 public void llStopPointAt() { NotImplemented("llStopPointAt"); }
415 public void llTargetOmega(LSL_Types.Vector3 axis, double spinrate, double gain) { NotImplemented("llTargetOmega"); }
416 public int llGetStartParameter() { NotImplemented("llGetStartParameter"); return 0; }
417 public void llGodLikeRezObject(string inventory, LSL_Types.Vector3 pos) { NotImplemented("llGodLikeRezObject"); }
418 public void llRequestPermissions(string agent, int perm) { NotImplemented("llRequestPermissions"); }
419 public string llGetPermissionsKey() { NotImplemented("llGetPermissionsKey"); return ""; }
420 public int llGetPermissions() { NotImplemented("llGetPermissions"); return 0; }
421 public int llGetLinkNumber() { NotImplemented("llGetLinkNumber"); return 0; }
422 public void llSetLinkColor(int linknumber, LSL_Types.Vector3 color, int face) { NotImplemented("llSetLinkColor"); }
423 public void llCreateLink(string target, int parent) { NotImplemented("llCreateLink"); }
424 public void llBreakLink(int linknum) { NotImplemented("llBreakLink"); }
425 public void llBreakAllLinks() { NotImplemented("llBreakAllLinks"); }
426 public string llGetLinkKey(int linknum) { NotImplemented("llGetLinkKey"); return ""; }
427 public void llGetLinkName(int linknum) { NotImplemented("llGetLinkName"); }
428 public int llGetInventoryNumber(int type) { NotImplemented("llGetInventoryNumber"); return 0; }
429 public string llGetInventoryName(int type, int number) { NotImplemented("llGetInventoryName"); return ""; }
430 public void llSetScriptState(string name, int run) { NotImplemented("llSetScriptState"); }
431 public double llGetEnergy() { return 1.0f; }
432 public void llGiveInventory(string destination, string inventory) { NotImplemented("llGiveInventory"); }
433 public void llRemoveInventory(string item) { NotImplemented("llRemoveInventory"); }
434
435 public void llSetText(string text, LSL_Types.Vector3 color, double alpha)
436 {
437 Axiom.Math.Vector3 av3 = new Axiom.Math.Vector3((float)color.X, (float)color.Y, (float)color.Z);
438 m_host.SetText(text, av3, alpha);
439 }
440
441
442 public double llWater(LSL_Types.Vector3 offset) { NotImplemented("llWater"); return 0; }
443 public void llPassTouches(int pass) { NotImplemented("llPassTouches"); }
444 public string llRequestAgentData(string id, int data) { NotImplemented("llRequestAgentData"); return ""; }
445 public string llRequestInventoryData(string name) { NotImplemented("llRequestInventoryData"); return ""; }
446 public void llSetDamage(double damage) { NotImplemented("llSetDamage"); }
447 public void llTeleportAgentHome(string agent) { NotImplemented("llTeleportAgentHome"); }
448 public void llModifyLand(int action, int brush) { }
449 public void llCollisionSound(string impact_sound, double impact_volume) { NotImplemented("llCollisionSound"); }
450 public void llCollisionSprite(string impact_sprite) { NotImplemented("llCollisionSprite"); }
451 public string llGetAnimation(string id) { NotImplemented("llGetAnimation"); return ""; }
452 public void llResetScript()
453 {
454 m_ScriptEngine.m_ScriptManager.ResetScript(m_localID, m_itemID);
455 }
456 public void llMessageLinked(int linknum, int num, string str, string id) { }
457 public void llPushObject(string target, LSL_Types.Vector3 impulse, LSL_Types.Vector3 ang_impulse, int local) { }
458 public void llPassCollisions(int pass) { }
459 public string llGetScriptName() { return ""; }
460
461 public int llGetNumberOfSides() { return 0; }
462
463 public LSL_Types.Quaternion llAxisAngle2Rot(LSL_Types.Vector3 axis, double angle) { return new LSL_Types.Quaternion(); }
464 public LSL_Types.Vector3 llRot2Axis(LSL_Types.Quaternion rot) { return new LSL_Types.Vector3(); }
465 public void llRot2Angle() { }
466
467 public double llAcos(double val)
468 {
469 return (double)Math.Acos(val);
470 }
471
472 public double llAsin(double val)
473 {
474 return (double)Math.Asin(val);
475 }
476
477 public double llAngleBetween(LSL_Types.Quaternion a, LSL_Types.Quaternion b) { return 0; }
478 public string llGetInventoryKey(string name) { return ""; }
479 public void llAllowInventoryDrop(int add) { }
480 public LSL_Types.Vector3 llGetSunDirection() { return new LSL_Types.Vector3(); }
481 public LSL_Types.Vector3 llGetTextureOffset(int face) { return new LSL_Types.Vector3(); }
482 public LSL_Types.Vector3 llGetTextureScale(int side) { return new LSL_Types.Vector3(); }
483 public double llGetTextureRot(int side) { return 0; }
484
485 public int llSubStringIndex(string source, string pattern)
486 {
487 return source.IndexOf(pattern);
488 }
489
490 public string llGetOwnerKey(string id) { NotImplemented("llGetOwnerKey"); return ""; }
491
492 public LSL_Types.Vector3 llGetCenterOfMass() { NotImplemented("llGetCenterOfMass"); return new LSL_Types.Vector3(); }
493
494 public List<string> llListSort(List<string> src, int stride, int ascending)
495 {
496 SortedList<string, List<string>> sorted = new SortedList<string, List<string>>();
497 // Add chunks to an array
498 int s = stride;
499 if (s < 1)
500 s = 1;
501 int c = 0;
502 List<string> chunk = new List<string>();
503 string chunkString = "";
504 foreach (string element in src)
505 {
506 c++;
507 if (c > s)
508 {
509 sorted.Add(chunkString, chunk);
510 chunkString = "";
511 chunk = new List<string>();
512 c = 0;
513 }
514 chunk.Add(element);
515 chunkString += element.ToString();
516 }
517 if (chunk.Count > 0)
518 sorted.Add(chunkString, chunk);
519
520 List<string> ret = new List<string>();
521 foreach (List<string> ls in sorted.Values)
522 {
523 ret.AddRange(ls);
524 }
525
526 if (ascending == LSL.LSL_BaseClass.TRUE)
527 return ret;
528 ret.Reverse();
529 return ret;
530 }
531
532 public int llGetListLength(List<string> src)
533 {
534 return src.Count;
535 }
536
537 public int llList2Integer(List<string> src, int index)
538 {
539 return Convert.ToInt32(src[index]);
540 }
541
542 public double llList2double(List<string> src, int index)
543 {
544 return Convert.ToDouble(src[index]);
545 }
546
547 public float llList2Float(List<string> src, int index)
548 {
549 return Convert.ToSingle(src[index]);
550 }
551
552 public string llList2String(List<string> src, int index)
553 {
554 return src[index];
555 }
556
557 public string llList2Key(List<string> src, int index)
558 {
559 //return OpenSim.Framework.Types.ToStringHyphenated(src[index]);
560 return src[index].ToString();
561 }
562
563 public LSL_Types.Vector3 llList2Vector(List<string> src, int index)
564 {
565 return new LSL_Types.Vector3(double.Parse(src[index]), double.Parse(src[index + 1]), double.Parse(src[index + 2]));
566 }
567 public LSL_Types.Quaternion llList2Rot(List<string> src, int index)
568 {
569 return new LSL_Types.Quaternion(double.Parse(src[index]), double.Parse(src[index + 1]), double.Parse(src[index + 2]), double.Parse(src[index + 3]));
570 }
571 public List<string> llList2List(List<string> src, int start, int end)
572 {
573 if (end > start)
574 {
575 // Simple straight forward chunk
576 return src.GetRange(start, end - start);
577 }
578 else
579 {
580 // Some of the end + some of the beginning
581 // First chunk
582 List<string> ret = new List<string>();
583 ret.AddRange(src.GetRange(start, src.Count - start));
584 ret.AddRange(src.GetRange(0, end));
585 return ret;
586 }
587
588
589
590
591 }
592 public List<string> llDeleteSubList(List<string> src, int start, int end)
593 {
594 List<string> ret = new List<string>(src);
595 ret.RemoveRange(start, end - start);
596 return ret;
597 }
598 public int llGetListEntryType(List<string> src, int index) { NotImplemented("llGetListEntryType"); return 0; }
599 public string llList2CSV(List<string> src)
600 {
601 string ret = "";
602 foreach (string s in src)
603 {
604 if (s.Length > 0)
605 ret += ",";
606 ret += s;
607 }
608 return ret;
609 }
610 public List<string> llCSV2List(string src)
611 {
612 List<string> ret = new List<string>();
613 foreach (string s in src.Split(",".ToCharArray()))
614 {
615 ret.Add(s);
616 }
617 return ret;
618 }
619 public List<string> llListRandomize(List<string> src, int stride)
620 {
621 int s = stride;
622 if (s < 1)
623 s = 1;
624
625 // This is a cowardly way of doing it ;)
626 // TODO: Instead, randomize and check if random is mod stride or if it can not be, then array.removerange
627 List<List<string>> tmp = new List<List<string>>();
628
629 // Add chunks to an array
630 int c = 0;
631 List<string> chunk = new List<string>();
632 foreach (string element in src)
633 {
634 c++;
635 if (c > s)
636 {
637 tmp.Add(chunk);
638 chunk = new List<string>();
639 c = 0;
640 }
641 chunk.Add(element);
642 }
643 if (chunk.Count > 0)
644 tmp.Add(chunk);
645
646 // Decreate (<- what kind of word is that? :D ) array back into a list
647 int rnd;
648 List<string> ret = new List<string>();
649 while (tmp.Count > 0)
650 {
651 rnd = Util.RandomClass.Next(tmp.Count);
652 foreach (string str in tmp[rnd])
653 {
654 ret.Add(str);
655 }
656 tmp.RemoveAt(rnd);
657 }
658
659 return ret;
660
661
662 }
663 public List<string> llList2ListStrided(List<string> src, int start, int end, int stride)
664 {
665 List<string> ret = new List<string>();
666 int s = stride;
667 if (s < 1)
668 s = 1;
669
670 int sc = s;
671 for (int i = start; i < src.Count; i++)
672 {
673 sc--;
674 if (sc == 0)
675 {
676 sc = s;
677 // Addthis
678 ret.Add(src[i]);
679 }
680 if (i == end)
681 break;
682 }
683 return ret;
684 }
685
686 public LSL_Types.Vector3 llGetRegionCorner()
687 {
688 return new LSL_Types.Vector3(World.RegionInfo.RegionLocX * 256, World.RegionInfo.RegionLocY * 256, 0);
689 }
690
691 public List<string> llListInsertList(List<string> dest, List<string> src, int start)
692 {
693
694 List<string> ret = new List<string>(dest);
695 //foreach (string s in src.Reverse())
696 for (int ci = src.Count - 1; ci > -1; ci--)
697 {
698 ret.Insert(start, src[ci]);
699 }
700 return ret;
701 }
702 public int llListFindList(List<string> src, List<string> test)
703 {
704 foreach (string s in test)
705 {
706 for (int ci = 0; ci < src.Count; ci++)
707 {
708
709 if (s == src[ci])
710 return ci;
711 }
712 }
713 return -1;
714 }
715
716 public string llGetObjectName()
717 {
718 return m_host.Name;
719 }
720
721 public void llSetObjectName(string name)
722 {
723 m_host.Name = name;
724 }
725
726 public string llGetDate()
727 {
728 DateTime date = DateTime.Now.ToUniversalTime();
729 string result = date.ToString("yyyy-MM-dd");
730 return result;
731 }
732
733 public int llEdgeOfWorld(LSL_Types.Vector3 pos, LSL_Types.Vector3 dir) { NotImplemented("llEdgeOfWorld"); return 0; }
734 public int llGetAgentInfo(string id) { NotImplemented("llGetAgentInfo"); return 0; }
735 public void llAdjustSoundVolume(double volume) { NotImplemented("llAdjustSoundVolume"); }
736 public void llSetSoundQueueing(int queue) { NotImplemented("llSetSoundQueueing"); }
737 public void llSetSoundRadius(double radius) { NotImplemented("llSetSoundRadius"); }
738 public string llKey2Name(string id) { NotImplemented("llKey2Name"); return ""; }
739 public void llSetTextureAnim(int mode, int face, int sizex, int sizey, double start, double length, double rate) { NotImplemented("llSetTextureAnim"); }
740 public void llTriggerSoundLimited(string sound, double volume, LSL_Types.Vector3 top_north_east, LSL_Types.Vector3 bottom_south_west) { NotImplemented("llTriggerSoundLimited"); }
741 public void llEjectFromLand(string pest) { NotImplemented("llEjectFromLand"); }
742
743 public void llParseString2List() { NotImplemented("llParseString2List"); }
744
745 public int llOverMyLand(string id) { NotImplemented("llOverMyLand"); return 0; }
746 public string llGetLandOwnerAt(LSL_Types.Vector3 pos) { NotImplemented("llGetLandOwnerAt"); return ""; }
747 public string llGetNotecardLine(string name, int line) { NotImplemented("llGetNotecardLine"); return ""; }
748 public LSL_Types.Vector3 llGetAgentSize(string id) { NotImplemented("llGetAgentSize"); return new LSL_Types.Vector3(); }
749 public int llSameGroup(string agent) { NotImplemented("llSameGroup"); return 0; }
750 public void llUnSit(string id) { NotImplemented("llUnSit"); }
751 public LSL_Types.Vector3 llGroundSlope(LSL_Types.Vector3 offset) { NotImplemented("llGroundSlope"); return new LSL_Types.Vector3(); }
752 public LSL_Types.Vector3 llGroundNormal(LSL_Types.Vector3 offset) { NotImplemented("llGroundNormal"); return new LSL_Types.Vector3(); }
753 public LSL_Types.Vector3 llGroundContour(LSL_Types.Vector3 offset) { NotImplemented("llGroundContour"); return new LSL_Types.Vector3(); }
754 public int llGetAttached() { NotImplemented("llGetAttached"); return 0; }
755 public int llGetFreeMemory() { NotImplemented("llGetFreeMemory"); return 0; }
756
757 public string llGetRegionName()
758 {
759 return World.RegionInfo.RegionName;
760 }
761
762 public double llGetRegionTimeDilation() { return 1.0f; }
763 public double llGetRegionFPS() { return 10.0f; }
764
765 /* particle system rules should be coming into this routine as doubles, that is
766 rule[0] should be an integer from this list and rule[1] should be the arg
767 for the same integer. wiki.secondlife.com has most of this mapping, but some
768 came from http://www.caligari-designs.com/p4u2
769
770 We iterate through the list for 'Count' elements, incrementing by two for each
771 iteration and set the members of Primitive.ParticleSystem, one at a time.
772 */
773 public enum PrimitiveRule : int
774 {
775 PSYS_PART_FLAGS = 0,
776 PSYS_PART_START_COLOR = 1,
777 PSYS_PART_START_ALPHA = 2,
778 PSYS_PART_END_COLOR = 3,
779 PSYS_PART_END_ALPHA = 4,
780 PSYS_PART_START_SCALE = 5,
781 PSYS_PART_END_SCALE = 6,
782 PSYS_PART_MAX_AGE = 7,
783 PSYS_SRC_ACCEL = 8,
784 PSYS_SRC_PATTERN = 9,
785 PSYS_SRC_TEXTURE = 12,
786 PSYS_SRC_BURST_RATE = 13,
787 PSYS_SRC_BURST_PART_COUNT = 15,
788 PSYS_SRC_BURST_RADIUS = 16,
789 PSYS_SRC_BURST_SPEED_MIN = 17,
790 PSYS_SRC_BURST_SPEED_MAX = 18,
791 PSYS_SRC_MAX_AGE = 19,
792 PSYS_SRC_TARGET_KEY = 20,
793 PSYS_SRC_OMEGA = 21,
794 PSYS_SRC_ANGLE_BEGIN = 22,
795 PSYS_SRC_ANGLE_END = 23
796 }
797
798 public void llParticleSystem(List<Object> rules)
799 {
800 Primitive.ParticleSystem prules = new Primitive.ParticleSystem();
801 for (int i = 0; i < rules.Count; i += 2)
802 {
803 switch ((int)rules[i])
804 {
805 case (int)PrimitiveRule.PSYS_PART_FLAGS:
806 prules.PartFlags = (uint)rules[i + 1];
807 break;
808
809 case (int)PrimitiveRule.PSYS_PART_START_COLOR:
810 prules.PartStartColor = (LLColor)rules[i + 1];
811 break;
812
813 case (int)PrimitiveRule.PSYS_PART_START_ALPHA:
814 //what is the cast? prules.PartStartColor = (LLColor)rules[i + 1];
815 break;
816
817 case (int)PrimitiveRule.PSYS_PART_END_COLOR:
818 prules.PartEndColor = (LLColor)rules[i + 1];
819 break;
820
821 case (int)PrimitiveRule.PSYS_PART_END_ALPHA:
822 //what is the cast? prules.PartStartColor = (LLColor)rules[i + 1];
823 break;
824
825 case (int)PrimitiveRule.PSYS_PART_START_SCALE:
826 //what is the cast? prules.PartStartColor = (LLColor)rules[i + 1];
827 break;
828
829 case (int)PrimitiveRule.PSYS_PART_END_SCALE:
830 //what is the cast? prules.PartStartColor = (LLColor)rules[i + 1];
831 break;
832
833 case (int)PrimitiveRule.PSYS_PART_MAX_AGE:
834 prules.MaxAge = (float)rules[i + 1];
835 break;
836
837 case (int)PrimitiveRule.PSYS_SRC_ACCEL:
838 //what is the cast? prules.PartStartColor = (LLColor)rules[i + 1];
839 break;
840
841 case (int)PrimitiveRule.PSYS_SRC_PATTERN:
842 //what is the cast? prules.PartStartColor = (LLColor)rules[i + 1];
843 break;
844
845 case (int)PrimitiveRule.PSYS_SRC_TEXTURE:
846 prules.Texture = (LLUUID)rules[i + 1];
847 break;
848
849 case (int)PrimitiveRule.PSYS_SRC_BURST_RATE:
850 prules.BurstRate = (float)rules[i + 1];
851 break;
852
853 case (int)PrimitiveRule.PSYS_SRC_BURST_PART_COUNT:
854 prules.BurstPartCount = (byte)rules[i + 1];
855 break;
856
857 case (int)PrimitiveRule.PSYS_SRC_BURST_RADIUS:
858 prules.BurstRadius = (float)rules[i + 1];
859 break;
860
861 case (int)PrimitiveRule.PSYS_SRC_BURST_SPEED_MIN:
862 prules.BurstSpeedMin = (float)rules[i + 1];
863 break;
864
865 case (int)PrimitiveRule.PSYS_SRC_BURST_SPEED_MAX:
866 prules.BurstSpeedMax = (float)rules[i + 1];
867 break;
868
869 case (int)PrimitiveRule.PSYS_SRC_MAX_AGE:
870 prules.MaxAge = (float)rules[i + 1];
871 break;
872
873 case (int)PrimitiveRule.PSYS_SRC_TARGET_KEY:
874 prules.Target = (LLUUID)rules[i + 1];
875 break;
876
877 case (int)PrimitiveRule.PSYS_SRC_OMEGA:
878 //cast?? prules.MaxAge = (float)rules[i + 1];
879 break;
880
881 case (int)PrimitiveRule.PSYS_SRC_ANGLE_BEGIN:
882 prules.InnerAngle = (float)rules[i + 1];
883 break;
884
885 case (int)PrimitiveRule.PSYS_SRC_ANGLE_END:
886 prules.OuterAngle = (float)rules[i + 1];
887 break;
888
889 }
890 }
891
892 m_host.AddNewParticleSystem(prules);
893 }
894
895 public void llGroundRepel(double height, int water, double tau) { NotImplemented("llGroundRepel"); }
896 public void llGiveInventoryList() { NotImplemented("llGiveInventoryList"); }
897 public void llSetVehicleType(int type) { NotImplemented("llSetVehicleType"); }
898 public void llSetVehicledoubleParam(int param, double value) { NotImplemented("llSetVehicledoubleParam"); }
899 public void llSetVehicleVectorParam(int param, LSL_Types.Vector3 vec) { NotImplemented("llSetVehicleVectorParam"); }
900 public void llSetVehicleRotationParam(int param, LSL_Types.Quaternion rot) { NotImplemented("llSetVehicleRotationParam"); }
901 public void llSetVehicleFlags(int flags) { NotImplemented("llSetVehicleFlags"); }
902 public void llRemoveVehicleFlags(int flags) { NotImplemented("llRemoveVehicleFlags"); }
903 public void llSitTarget(LSL_Types.Vector3 offset, LSL_Types.Quaternion rot) { NotImplemented("llSitTarget"); }
904 public string llAvatarOnSitTarget() { NotImplemented("llAvatarOnSitTarget"); return ""; }
905 public void llAddToLandPassList(string avatar, double hours) { NotImplemented("llAddToLandPassList"); }
906
907 public void llSetTouchText(string text)
908 {
909 m_host.TouchName = text;
910 }
911
912 public void llSetSitText(string text)
913 {
914 m_host.SitName = text;
915 }
916
917 public void llSetCameraEyeOffset(LSL_Types.Vector3 offset) { NotImplemented("llSetCameraEyeOffset"); }
918 public void llSetCameraAtOffset(LSL_Types.Vector3 offset) { NotImplemented("llSetCameraAtOffset"); }
919 public void llDumpList2String() { NotImplemented("llDumpList2String"); }
920 public void llScriptDanger(LSL_Types.Vector3 pos) { NotImplemented("llScriptDanger"); }
921 public void llDialog(string avatar, string message, List<string> buttons, int chat_channel) { NotImplemented("llDialog"); }
922 public void llVolumeDetect(int detect) { NotImplemented("llVolumeDetect"); }
923 public void llResetOtherScript(string name) { NotImplemented("llResetOtherScript"); }
924
925 public int llGetScriptState(string name) { NotImplemented("llGetScriptState"); return 0; }
926
927 public void llRemoteLoadScript() { NotImplemented("llRemoteLoadScript"); }
928 public void llSetRemoteScriptAccessPin(int pin) { NotImplemented("llSetRemoteScriptAccessPin"); }
929 public void llRemoteLoadScriptPin(string target, string name, int pin, int running, int start_param) { NotImplemented("llRemoteLoadScriptPin"); }
930 public void llOpenRemoteDataChannel() { NotImplemented("llOpenRemoteDataChannel"); }
931 public string llSendRemoteData(string channel, string dest, int idata, string sdata) { NotImplemented("llSendRemoteData"); return ""; }
932 public void llRemoteDataReply(string channel, string message_id, string sdata, int idata) { NotImplemented("llRemoteDataReply"); }
933 public void llCloseRemoteDataChannel(string channel) { NotImplemented("llCloseRemoteDataChannel"); }
934
935 public string llMD5String(string src, int nonce)
936 {
937 return Util.Md5Hash(src + ":" + nonce.ToString());
938 }
939
940 public void llSetPrimitiveParams(List<string> rules) { NotImplemented("llSetPrimitiveParams"); }
941 public string llStringToBase64(string str)
942 {
943
944 try
945 {
946 byte[] encData_byte = new byte[str.Length];
947 encData_byte = System.Text.Encoding.UTF8.GetBytes(str);
948 string encodedData = Convert.ToBase64String(encData_byte);
949 return encodedData;
950 }
951 catch (Exception e)
952 {
953 throw new Exception("Error in base64Encode" + e.Message);
954 }
955 }
956
957 public string llBase64ToString(string str)
958 {
959 System.Text.UTF8Encoding encoder = new System.Text.UTF8Encoding();
960 System.Text.Decoder utf8Decode = encoder.GetDecoder();
961 try
962 {
963
964 byte[] todecode_byte = Convert.FromBase64String(str);
965 int charCount = utf8Decode.GetCharCount(todecode_byte, 0, todecode_byte.Length);
966 char[] decoded_char = new char[charCount];
967 utf8Decode.GetChars(todecode_byte, 0, todecode_byte.Length, decoded_char, 0);
968 string result = new String(decoded_char);
969 return result;
970 }
971 catch (Exception e)
972 {
973 throw new Exception("Error in base64Decode" + e.Message);
974 }
975 }
976 public void llXorBase64Strings() { throw new Exception("Command deprecated! Use llXorBase64StringsCorrect instead."); }
977 public void llRemoteDataSetRegion() { NotImplemented("llRemoteDataSetRegion"); }
978 public double llLog10(double val) { return (double)Math.Log10(val); }
979 public double llLog(double val) { return (double)Math.Log(val); }
980 public List<string> llGetAnimationList(string id) { NotImplemented("llGetAnimationList"); return new List<string>(); }
981 public void llSetParcelMusicURL(string url) { NotImplemented("llSetParcelMusicURL"); }
982
983 public LSL_Types.Vector3 llGetRootPosition() { NotImplemented("llGetRootPosition"); return new LSL_Types.Vector3(); }
984
985 public LSL_Types.Quaternion llGetRootRotation() { NotImplemented("llGetRootRotation"); return new LSL_Types.Quaternion(); }
986
987 public string llGetObjectDesc()
988 {
989 return m_host.Description;
990 }
991
992 public void llSetObjectDesc(string desc)
993 {
994 m_host.Description = desc;
995 }
996
997 public string llGetCreator()
998 {
999 return m_host.ObjectCreator.ToStringHyphenated();
1000 }
1001
1002 public string llGetTimestamp() { return DateTime.Now.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ss.fffffffZ"); }
1003 public void llSetLinkAlpha(int linknumber, double alpha, int face) { NotImplemented("llSetLinkAlpha"); }
1004 public int llGetNumberOfPrims() { NotImplemented("llGetNumberOfPrims"); return 0; }
1005 public string llGetNumberOfNotecardLines(string name) { NotImplemented("llGetNumberOfNotecardLines"); return ""; }
1006 public List<string> llGetBoundingBox(string obj) { NotImplemented("llGetBoundingBox"); return new List<string>(); }
1007 public LSL_Types.Vector3 llGetGeometricCenter() { NotImplemented("llGetGeometricCenter"); return new LSL_Types.Vector3(); }
1008 public void llGetPrimitiveParams() { NotImplemented("llGetPrimitiveParams"); }
1009 public string llIntegerToBase64(int number)
1010 {
1011 NotImplemented("llIntegerToBase64"); return "";
1012 }
1013 public int llBase64ToInteger(string str)
1014 {
1015 NotImplemented("llBase64ToInteger"); return 0;
1016 }
1017
1018 public double llGetGMTclock()
1019 {
1020 return DateTime.UtcNow.TimeOfDay.TotalSeconds;
1021 }
1022
1023 public string llGetSimulatorHostname()
1024 {
1025 return System.Environment.MachineName;
1026 }
1027
1028 public void llSetLocalRot(LSL_Types.Quaternion rot) { NotImplemented("llSetLocalRot"); }
1029 public List<string> llParseStringKeepNulls(string src, List<string> seperators, List<string> spacers) { NotImplemented("llParseStringKeepNulls"); return new List<string>(); }
1030 public void llRezAtRoot(string inventory, LSL_Types.Vector3 position, LSL_Types.Vector3 velocity, LSL_Types.Quaternion rot, int param) { NotImplemented("llRezAtRoot"); }
1031
1032 public int llGetObjectPermMask(int mask) { NotImplemented("llGetObjectPermMask"); return 0; }
1033
1034 public void llSetObjectPermMask(int mask, int value) { NotImplemented("llSetObjectPermMask"); }
1035
1036 public void llGetInventoryPermMask(string item, int mask) { NotImplemented("llGetInventoryPermMask"); }
1037 public void llSetInventoryPermMask(string item, int mask, int value) { NotImplemented("llSetInventoryPermMask"); }
1038 public string llGetInventoryCreator(string item) { NotImplemented("llGetInventoryCreator"); return ""; }
1039 public void llOwnerSay(string msg) { NotImplemented("llOwnerSay"); }
1040 public void llRequestSimulatorData(string simulator, int data) { NotImplemented("llRequestSimulatorData"); }
1041 public void llForceMouselook(int mouselook) { NotImplemented("llForceMouselook"); }
1042 public double llGetObjectMass(string id) { NotImplemented("llGetObjectMass"); return 0; }
1043 public void llListReplaceList() { NotImplemented("llListReplaceList"); }
1044
1045 public void llLoadURL(string avatar_id, string message, string url)
1046 {
1047 LLUUID avatarId = new LLUUID(avatar_id);
1048 m_ScriptEngine.World.SendUrlToUser(avatarId, m_host.Name, m_host.UUID, m_host.ObjectOwner, false, message, url);
1049 }
1050
1051 public void llParcelMediaCommandList(List<string> commandList) { NotImplemented("llParcelMediaCommandList"); }
1052 public void llParcelMediaQuery() { NotImplemented("llParcelMediaQuery"); }
1053
1054 public int llModPow(int a, int b, int c)
1055 {
1056 Int64 tmp = 0;
1057 Int64 val = Math.DivRem(Convert.ToInt64(Math.Pow(a, b)), c, out tmp);
1058 return Convert.ToInt32(tmp);
1059 }
1060
1061 public int llGetInventoryType(string name) { NotImplemented("llGetInventoryType"); return 0; }
1062
1063 public void llSetPayPrice(int price, List<string> quick_pay_buttons) { NotImplemented("llSetPayPrice"); }
1064 public LSL_Types.Vector3 llGetCameraPos() { NotImplemented("llGetCameraPos"); return new LSL_Types.Vector3(); }
1065 public LSL_Types.Quaternion llGetCameraRot() { NotImplemented("llGetCameraRot"); return new LSL_Types.Quaternion(); }
1066 public void llSetPrimURL() { NotImplemented("llSetPrimURL"); }
1067 public void llRefreshPrimURL() { NotImplemented("llRefreshPrimURL"); }
1068
1069 public string llEscapeURL(string url)
1070 {
1071 try
1072 {
1073 return Uri.EscapeUriString(url);
1074 }
1075 catch (Exception ex)
1076 {
1077 return "llEscapeURL: " + ex.ToString();
1078 }
1079 }
1080
1081 public string llUnescapeURL(string url)
1082 {
1083 try
1084 {
1085 return Uri.UnescapeDataString(url);
1086 }
1087 catch (Exception ex)
1088 {
1089 return "llUnescapeURL: " + ex.ToString();
1090 }
1091 }
1092 public void llMapDestination(string simname, LSL_Types.Vector3 pos, LSL_Types.Vector3 look_at) { NotImplemented("llMapDestination"); }
1093 public void llAddToLandBanList(string avatar, double hours) { NotImplemented("llAddToLandBanList"); }
1094 public void llRemoveFromLandPassList(string avatar) { NotImplemented("llRemoveFromLandPassList"); }
1095 public void llRemoveFromLandBanList(string avatar) { NotImplemented("llRemoveFromLandBanList"); }
1096 public void llSetCameraParams(List<string> rules) { NotImplemented("llSetCameraParams"); }
1097 public void llClearCameraParams() { NotImplemented("llClearCameraParams"); }
1098 public double llListStatistics(int operation, List<string> src) { NotImplemented("llListStatistics"); return 0; }
1099
1100 public int llGetUnixTime()
1101 {
1102 return Util.UnixTimeSinceEpoch();
1103 }
1104
1105 public int llGetParcelFlags(LSL_Types.Vector3 pos) { NotImplemented("llGetParcelFlags"); return 0; }
1106 public int llGetRegionFlags() { NotImplemented("llGetRegionFlags"); return 0; }
1107 public string llXorBase64StringsCorrect(string str1, string str2)
1108 {
1109 string ret = "";
1110 string src1 = llBase64ToString(str1);
1111 string src2 = llBase64ToString(str2);
1112 int c = 0;
1113 for (int i = 0; i < src1.Length; i++)
1114 {
1115 ret += src1[i] ^ src2[c];
1116
1117 c++;
1118 if (c > src2.Length)
1119 c = 0;
1120 }
1121 return llStringToBase64(ret);
1122 }
1123 public void llHTTPRequest(string url, List<string> parameters, string body)
1124 {
1125 m_ScriptEngine.m_LSLLongCmdHandler.StartHttpRequest(m_localID, m_itemID, url, parameters, body);
1126 }
1127 public void llResetLandBanList() { NotImplemented("llResetLandBanList"); }
1128 public void llResetLandPassList() { NotImplemented("llResetLandPassList"); }
1129 public int llGetParcelPrimCount(LSL_Types.Vector3 pos, int category, int sim_wide) { NotImplemented("llGetParcelPrimCount"); return 0; }
1130 public List<string> llGetParcelPrimOwners(LSL_Types.Vector3 pos) { NotImplemented("llGetParcelPrimOwners"); return new List<string>(); }
1131 public int llGetObjectPrimCount(string object_id) { NotImplemented("llGetObjectPrimCount"); return 0; }
1132 public int llGetParcelMaxPrims(LSL_Types.Vector3 pos, int sim_wide) { NotImplemented("llGetParcelMaxPrims"); return 0; }
1133 public List<string> llGetParcelDetails(LSL_Types.Vector3 pos, List<string> param) { NotImplemented("llGetParcelDetails"); return new List<string>(); }
1134
1135 //
1136 // OpenSim functions
1137 //
1138 public string osSetDynamicTextureURL(string dynamicID, string contentType, string url, string extraParams, int timer)
1139 {
1140 if (dynamicID == "")
1141 {
1142 IDynamicTextureManager textureManager = this.World.RequestModuleInterface<IDynamicTextureManager>();
1143 LLUUID createdTexture = textureManager.AddDynamicTextureURL(World.RegionInfo.SimUUID, this.m_host.UUID, contentType, url, extraParams, timer);
1144 return createdTexture.ToStringHyphenated();
1145 }
1146 else
1147 {
1148 //TODO update existing dynamic textures
1149 }
1150
1151 return LLUUID.Zero.ToStringHyphenated();
1152 }
1153
1154 private void NotImplemented(string Command)
1155 {
1156 if (throwErrorOnNotImplemented)
1157 throw new NotImplementedException("Command not implemented: " + Command);
1158 }
1159
1160 }
1161}
diff --git a/OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/c_sharp_example.txt b/OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/c_sharp_example.txt
new file mode 100644
index 0000000..a39d1db
--- /dev/null
+++ b/OpenSim/Grid/ScriptEngine/DotNetEngine/Compiler/c_sharp_example.txt
@@ -0,0 +1,12 @@
1//c#
2namespace SecondLife {
3 public class Script : OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL.LSL_BaseClass
4{
5 public Script() { }
6
7 public void default_event_state_entry( )
8 {
9 llSay(0, "testing, I've been touched");
10 }
11
12}} \ No newline at end of file
diff --git a/OpenSim/Grid/ScriptEngine/DotNetEngine/EventManager.cs b/OpenSim/Grid/ScriptEngine/DotNetEngine/EventManager.cs
new file mode 100644
index 0000000..9f18f7c
--- /dev/null
+++ b/OpenSim/Grid/ScriptEngine/DotNetEngine/EventManager.cs
@@ -0,0 +1,131 @@
1/*
2* Copyright (c) Contributors, http://opensimulator.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28/* Original code: Tedd Hansen */
29using System;
30using System.Collections.Generic;
31using System.Text;
32using libsecondlife;
33using OpenSim.Framework.Interfaces;
34using OpenSim.Region.Environment.Scenes.Scripting;
35
36namespace OpenSim.Grid.ScriptEngine.DotNetEngine
37{
38 /// <summary>
39 /// Prepares events so they can be directly executed upon a script by EventQueueManager, then queues it.
40 /// </summary>
41 [Serializable]
42 class EventManager
43 {
44 private ScriptEngine myScriptEngine;
45 //public IScriptHost TEMP_OBJECT_ID;
46 public EventManager(ScriptEngine _ScriptEngine)
47 {
48 myScriptEngine = _ScriptEngine;
49 // TODO: HOOK EVENTS UP TO SERVER!
50 //myScriptEngine.m_logger.Verbose("ScriptEngine", "EventManager Start");
51 // TODO: ADD SERVER HOOK TO LOAD A SCRIPT THROUGH myScriptEngine.ScriptManager
52
53 // Hook up a test event to our test form
54 myScriptEngine.Log.Verbose("ScriptEngine", "Hooking up to server events");
55 myScriptEngine.World.EventManager.OnObjectGrab += touch_start;
56 myScriptEngine.World.EventManager.OnRezScript += OnRezScript;
57 myScriptEngine.World.EventManager.OnRemoveScript += OnRemoveScript;
58
59 }
60
61 public void touch_start(uint localID, LLVector3 offsetPos, IClientAPI remoteClient)
62 {
63 // Add to queue for all scripts in ObjectID object
64 //myScriptEngine.m_logger.Verbose("ScriptEngine", "EventManager Event: touch_start");
65 //Console.WriteLine("touch_start localID: " + localID);
66 myScriptEngine.m_EventQueueManager.AddToObjectQueue(localID, "touch_start", new object[] { (int)1 });
67 }
68 public void OnRezScript(uint localID, LLUUID itemID, string script)
69 {
70 //myScriptEngine.myScriptManager.StartScript(
71 // Path.Combine("ScriptEngines", "Default.lsl"),
72 // new OpenSim.Region.Environment.Scenes.Scripting.NullScriptHost()
73 //);
74 Console.WriteLine("OnRezScript localID: " + localID + " LLUID: " + itemID.ToString() + " Size: " + script.Length);
75 myScriptEngine.m_ScriptManager.StartScript(localID, itemID, script);
76 }
77 public void OnRemoveScript(uint localID, LLUUID itemID)
78 {
79 //myScriptEngine.myScriptManager.StartScript(
80 // Path.Combine("ScriptEngines", "Default.lsl"),
81 // new OpenSim.Region.Environment.Scenes.Scripting.NullScriptHost()
82 //);
83 Console.WriteLine("OnRemoveScript localID: " + localID + " LLUID: " + itemID.ToString());
84 myScriptEngine.m_ScriptManager.StopScript(
85 localID,
86 itemID
87 );
88
89 }
90
91 // TODO: Replace placeholders below
92 // These needs to be hooked up to OpenSim during init of this class
93 // then queued in EventQueueManager.
94 // When queued in EventQueueManager they need to be LSL compatible (name and params)
95
96 //public void state_entry() { } //
97 public void state_exit() { }
98 //public void touch_start() { }
99 public void touch() { }
100 public void touch_end() { }
101 public void collision_start() { }
102 public void collision() { }
103 public void collision_end() { }
104 public void land_collision_start() { }
105 public void land_collision() { }
106 public void land_collision_end() { }
107 public void timer() { }
108 public void listen() { }
109 public void on_rez() { }
110 public void sensor() { }
111 public void no_sensor() { }
112 public void control() { }
113 public void money() { }
114 public void email() { }
115 public void at_target() { }
116 public void not_at_target() { }
117 public void at_rot_target() { }
118 public void not_at_rot_target() { }
119 public void run_time_permissions() { }
120 public void changed() { }
121 public void attach() { }
122 public void dataserver() { }
123 public void link_message() { }
124 public void moving_start() { }
125 public void moving_end() { }
126 public void object_rez() { }
127 public void remote_data() { }
128 public void http_response() { }
129
130 }
131}
diff --git a/OpenSim/Grid/ScriptEngine/DotNetEngine/EventQueueManager.cs b/OpenSim/Grid/ScriptEngine/DotNetEngine/EventQueueManager.cs
new file mode 100644
index 0000000..8ee005a
--- /dev/null
+++ b/OpenSim/Grid/ScriptEngine/DotNetEngine/EventQueueManager.cs
@@ -0,0 +1,321 @@
1/*
2* Copyright (c) Contributors, http://opensimulator.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28/* Original code: Tedd Hansen */
29using System;
30using System.Collections.Generic;
31using System.Text;
32using System.Threading;
33using System.Reflection;
34using OpenSim.Region.Environment.Scenes.Scripting;
35using libsecondlife;
36using OpenSim.Grid.ScriptEngine.DotNetEngine.Compiler.LSL;
37
38namespace OpenSim.Grid.ScriptEngine.DotNetEngine
39{
40 /// <summary>
41 /// EventQueueManager handles event queues
42 /// Events are queued and executed in separate thread
43 /// </summary>
44 [Serializable]
45 class EventQueueManager
46 {
47 /// <summary>
48 /// List of threads processing event queue
49 /// </summary>
50 private List<Thread> eventQueueThreads = new List<Thread>();
51 private object queueLock = new object(); // Mutex lock object
52 /// <summary>
53 /// How many ms to sleep if queue is empty
54 /// </summary>
55 private int nothingToDoSleepms = 50;
56 /// <summary>
57 /// How many threads to process queue with
58 /// </summary>
59 private int numberOfThreads = 2;
60 /// <summary>
61 /// Queue containing events waiting to be executed
62 /// </summary>
63 private Queue<QueueItemStruct> eventQueue = new Queue<QueueItemStruct>();
64 /// <summary>
65 /// Queue item structure
66 /// </summary>
67 private struct QueueItemStruct
68 {
69 public uint localID;
70 public LLUUID itemID;
71 public string functionName;
72 public object[] param;
73 }
74
75 /// <summary>
76 /// List of localID locks for mutex processing of script events
77 /// </summary>
78 private List<uint> objectLocks = new List<uint>();
79 private object tryLockLock = new object(); // Mutex lock object
80
81 private ScriptEngine m_ScriptEngine;
82 public EventQueueManager(ScriptEngine _ScriptEngine)
83 {
84 m_ScriptEngine = _ScriptEngine;
85
86 //
87 // Start event queue processing threads (worker threads)
88 //
89 for (int ThreadCount = 0; ThreadCount <= numberOfThreads; ThreadCount++)
90 {
91 Thread EventQueueThread = new Thread(EventQueueThreadLoop);
92 eventQueueThreads.Add(EventQueueThread);
93 EventQueueThread.IsBackground = true;
94 EventQueueThread.Priority = ThreadPriority.BelowNormal;
95 EventQueueThread.Name = "EventQueueManagerThread_" + ThreadCount;
96 EventQueueThread.Start();
97 }
98 }
99 ~EventQueueManager()
100 {
101
102 // Kill worker threads
103 foreach (Thread EventQueueThread in new System.Collections.ArrayList(eventQueueThreads))
104 {
105 if (EventQueueThread != null && EventQueueThread.IsAlive == true)
106 {
107 try
108 {
109 EventQueueThread.Abort();
110 EventQueueThread.Join();
111 }
112 catch (Exception)
113 {
114 //myScriptEngine.Log.Verbose("ScriptEngine", "EventQueueManager Exception killing worker thread: " + e.ToString());
115 }
116 }
117 }
118 eventQueueThreads.Clear();
119 // Todo: Clean up our queues
120 eventQueue.Clear();
121
122 }
123
124 /// <summary>
125 /// Queue processing thread loop
126 /// </summary>
127 private void EventQueueThreadLoop()
128 {
129 //myScriptEngine.m_logger.Verbose("ScriptEngine", "EventQueueManager Worker thread spawned");
130 try
131 {
132 QueueItemStruct BlankQIS = new QueueItemStruct();
133 while (true)
134 {
135 try
136 {
137 QueueItemStruct QIS = BlankQIS;
138 bool GotItem = false;
139
140 if (eventQueue.Count == 0)
141 {
142 // Nothing to do? Sleep a bit waiting for something to do
143 Thread.Sleep(nothingToDoSleepms);
144 }
145 else
146 {
147 // Something in queue, process
148 //myScriptEngine.m_logger.Verbose("ScriptEngine", "Processing event for localID: " + QIS.localID + ", itemID: " + QIS.itemID + ", FunctionName: " + QIS.FunctionName);
149
150 // OBJECT BASED LOCK - TWO THREADS WORKING ON SAME OBJECT IS NOT GOOD
151 lock (queueLock)
152 {
153 GotItem = false;
154 for (int qc = 0; qc < eventQueue.Count; qc++)
155 {
156 // Get queue item
157 QIS = eventQueue.Dequeue();
158
159 // Check if object is being processed by someone else
160 if (TryLock(QIS.localID) == false)
161 {
162 // Object is already being processed, requeue it
163 eventQueue.Enqueue(QIS);
164 }
165 else
166 {
167 // We have lock on an object and can process it
168 GotItem = true;
169 break;
170 }
171 } // go through queue
172 } // lock
173
174 if (GotItem == true)
175 {
176 // Execute function
177 try
178 {
179 m_ScriptEngine.m_ScriptManager.ExecuteEvent(QIS.localID, QIS.itemID, QIS.functionName, QIS.param);
180 }
181 catch (Exception e)
182 {
183 // DISPLAY ERROR INWORLD
184 string text = "Error executing script function \"" + QIS.functionName + "\":\r\n";
185 if (e.InnerException != null)
186 { // Send inner exception
187 text += e.InnerException.Message.ToString();
188 }
189 else
190 { // Send normal
191 text += e.Message.ToString();
192 }
193 try
194 {
195 if (text.Length > 1500)
196 text = text.Substring(0, 1500);
197 IScriptHost m_host = m_ScriptEngine.World.GetSceneObjectPart(QIS.localID);
198 //if (m_host != null)
199 //{
200 m_ScriptEngine.World.SimChat(Helpers.StringToField(text), 1, 0, m_host.AbsolutePosition, m_host.Name, m_host.UUID);
201 } catch {
202 //}
203 //else
204 //{
205 // T oconsole
206 Console.WriteLine("Unable to send text in-world:\r\n" + text);
207 }
208
209 }
210 finally
211 {
212 ReleaseLock(QIS.localID);
213 }
214 }
215
216 } // Something in queue
217 } catch (ThreadAbortException tae) {
218 throw tae;
219 } catch (Exception e) {
220 Console.WriteLine("Exception in EventQueueThreadLoop: " + e.ToString());
221 }
222 } // while
223 } // try
224 catch (ThreadAbortException)
225 {
226 //myScriptEngine.Log.Verbose("ScriptEngine", "EventQueueManager Worker thread killed: " + tae.Message);
227 }
228 }
229
230 /// <summary>
231 /// Try to get a mutex lock on localID
232 /// </summary>
233 /// <param name="localID"></param>
234 /// <returns></returns>
235 private bool TryLock(uint localID)
236 {
237 lock (tryLockLock)
238 {
239 if (objectLocks.Contains(localID) == true)
240 {
241 return false;
242 }
243 else
244 {
245 objectLocks.Add(localID);
246 return true;
247 }
248 }
249 }
250
251 /// <summary>
252 /// Release mutex lock on localID
253 /// </summary>
254 /// <param name="localID"></param>
255 private void ReleaseLock(uint localID)
256 {
257 lock (tryLockLock)
258 {
259 if (objectLocks.Contains(localID) == true)
260 {
261 objectLocks.Remove(localID);
262 }
263 }
264 }
265
266
267 /// <summary>
268 /// Add event to event execution queue
269 /// </summary>
270 /// <param name="localID"></param>
271 /// <param name="FunctionName">Name of the function, will be state + "_event_" + FunctionName</param>
272 /// <param name="param">Array of parameters to match event mask</param>
273 public void AddToObjectQueue(uint localID, string FunctionName, object[] param)
274 {
275 // Determine all scripts in Object and add to their queue
276 //myScriptEngine.m_logger.Verbose("ScriptEngine", "EventQueueManager Adding localID: " + localID + ", FunctionName: " + FunctionName);
277
278
279 // Do we have any scripts in this object at all? If not, return
280 if (m_ScriptEngine.m_ScriptManager.Scripts.ContainsKey(localID) == false)
281 {
282 //Console.WriteLine("Event \"" + FunctionName + "\" for localID: " + localID + ". No scripts found on this localID.");
283 return;
284 }
285
286 Dictionary<LLUUID, LSL_BaseClass>.KeyCollection scriptKeys = m_ScriptEngine.m_ScriptManager.GetScriptKeys(localID);
287
288 foreach ( LLUUID itemID in scriptKeys )
289 {
290 // Add to each script in that object
291 // TODO: Some scripts may not subscribe to this event. Should we NOT add it? Does it matter?
292 AddToScriptQueue(localID, itemID, FunctionName, param);
293 }
294
295 }
296
297 /// <summary>
298 /// Add event to event execution queue
299 /// </summary>
300 /// <param name="localID"></param>
301 /// <param name="itemID"></param>
302 /// <param name="FunctionName">Name of the function, will be state + "_event_" + FunctionName</param>
303 /// <param name="param">Array of parameters to match event mask</param>
304 public void AddToScriptQueue(uint localID, LLUUID itemID, string FunctionName, object[] param)
305 {
306 lock (queueLock)
307 {
308 // Create a structure and add data
309 QueueItemStruct QIS = new QueueItemStruct();
310 QIS.localID = localID;
311 QIS.itemID = itemID;
312 QIS.functionName = FunctionName;
313 QIS.param = param;
314
315 // Add it to queue
316 eventQueue.Enqueue(QIS);
317 }
318 }
319
320 }
321}
diff --git a/OpenSim/Grid/ScriptEngine/DotNetEngine/LSLLongCmdHandler.cs b/OpenSim/Grid/ScriptEngine/DotNetEngine/LSLLongCmdHandler.cs
new file mode 100644
index 0000000..5b92ff0
--- /dev/null
+++ b/OpenSim/Grid/ScriptEngine/DotNetEngine/LSLLongCmdHandler.cs
@@ -0,0 +1,321 @@
1using System;
2using System.Collections.Generic;
3using System.Text;
4using System.Threading;
5using libsecondlife;
6using OpenSim.Region.ScriptEngine.Common;
7using OpenSim.Region.Environment.Modules;
8using OpenSim.Region.Environment.Interfaces;
9
10namespace OpenSim.Region.ScriptEngine.DotNetEngine
11{
12 /// <summary>
13 /// Handles LSL commands that takes long time and returns an event, for example timers, HTTP requests, etc.
14 /// </summary>
15 class LSLLongCmdHandler
16 {
17 private Thread cmdHandlerThread;
18 private int cmdHandlerThreadCycleSleepms = 100;
19
20 private ScriptEngine m_ScriptEngine;
21 public LSLLongCmdHandler(ScriptEngine _ScriptEngine)
22 {
23 m_ScriptEngine = _ScriptEngine;
24
25 // Start the thread that will be doing the work
26 cmdHandlerThread = new Thread(CmdHandlerThreadLoop);
27 cmdHandlerThread.Name = "CmdHandlerThread";
28 cmdHandlerThread.Priority = ThreadPriority.BelowNormal;
29 cmdHandlerThread.IsBackground = true;
30 cmdHandlerThread.Start();
31
32 }
33 ~LSLLongCmdHandler()
34 {
35 // Shut down thread
36 try
37 {
38 if (cmdHandlerThread != null)
39 {
40 if (cmdHandlerThread.IsAlive == true)
41 {
42 cmdHandlerThread.Abort();
43 cmdHandlerThread.Join();
44 }
45 }
46 }
47 catch { }
48 }
49
50 private void CmdHandlerThreadLoop()
51 {
52 while (true)
53 {
54 // Check timers
55 CheckTimerEvents();
56 Thread.Sleep(25);
57 // Check HttpRequests
58 CheckHttpRequests();
59 Thread.Sleep(25);
60 // Check XMLRPCRequests
61 CheckXMLRPCRequests();
62 Thread.Sleep(25);
63 // Check Listeners
64 CheckListeners();
65 Thread.Sleep(25);
66
67 // Sleep before next cycle
68 //Thread.Sleep(cmdHandlerThreadCycleSleepms);
69 }
70 }
71
72 /// <summary>
73 /// Remove a specific script (and all its pending commands)
74 /// </summary>
75 /// <param name="m_localID"></param>
76 /// <param name="m_itemID"></param>
77 public void RemoveScript(uint localID, LLUUID itemID)
78 {
79 // Remove a specific script
80
81 // Remove from: Timers
82 UnSetTimerEvents(localID, itemID);
83 // Remove from: HttpRequest
84 StopHttpRequest(localID, itemID);
85 }
86
87 #region TIMER
88
89 //
90 // TIMER
91 //
92 private class TimerClass
93 {
94 public uint localID;
95 public LLUUID itemID;
96 public double interval;
97 public DateTime next;
98 }
99 private List<TimerClass> Timers = new List<TimerClass>();
100 private object TimerListLock = new object();
101 public void SetTimerEvent(uint m_localID, LLUUID m_itemID, double sec)
102 {
103 Console.WriteLine("SetTimerEvent");
104
105 // Always remove first, in case this is a re-set
106 UnSetTimerEvents(m_localID, m_itemID);
107 if (sec == 0) // Disabling timer
108 return;
109
110 // Add to timer
111 TimerClass ts = new TimerClass();
112 ts.localID = m_localID;
113 ts.itemID = m_itemID;
114 ts.interval = sec;
115 ts.next = DateTime.Now.ToUniversalTime().AddSeconds(ts.interval);
116 lock (TimerListLock)
117 {
118 Timers.Add(ts);
119 }
120 }
121 public void UnSetTimerEvents(uint m_localID, LLUUID m_itemID)
122 {
123 // Remove from timer
124 lock (TimerListLock)
125 {
126 List<TimerClass> NewTimers = new List<TimerClass>();
127 foreach (TimerClass ts in Timers)
128 {
129 if (ts.localID != m_localID && ts.itemID != m_itemID)
130 {
131 NewTimers.Add(ts);
132 }
133 }
134 Timers.Clear();
135 Timers = NewTimers;
136 }
137 }
138 public void CheckTimerEvents()
139 {
140 // Nothing to do here?
141 if (Timers.Count == 0)
142 return;
143
144 lock (TimerListLock)
145 {
146
147 // Go through all timers
148 foreach (TimerClass ts in Timers)
149 {
150 // Time has passed?
151 if (ts.next.ToUniversalTime() < DateTime.Now.ToUniversalTime())
152 {
153 // Add it to queue
154 m_ScriptEngine.m_EventQueueManager.AddToScriptQueue(ts.localID, ts.itemID, "timer", new object[] { });
155 // set next interval
156
157
158 ts.next = DateTime.Now.ToUniversalTime().AddSeconds(ts.interval);
159 }
160 }
161 } // lock
162 }
163 #endregion
164
165 #region HTTP REQUEST
166
167 //
168 // HTTP REAQUEST
169 //
170 private class HttpClass
171 {
172 public uint localID;
173 public LLUUID itemID;
174 public string url;
175 public List<string> parameters;
176 public string body;
177 public DateTime next;
178
179 public string response_request_id;
180 public int response_status;
181 public List<string> response_metadata;
182 public string response_body;
183
184 public void SendRequest()
185 {
186 // TODO: SEND REQUEST!!!
187 }
188 public void Stop()
189 {
190 // TODO: Cancel any ongoing request
191 }
192 public bool CheckResponse()
193 {
194 // TODO: Check if we got a response yet, return true if so -- false if not
195 return true;
196
197 // TODO: If we got a response, set the following then return true
198 //response_request_id
199 //response_status
200 //response_metadata
201 //response_body
202
203 }
204 }
205 private List<HttpClass> HttpRequests = new List<HttpClass>();
206 private object HttpListLock = new object();
207 public void StartHttpRequest(uint localID, LLUUID itemID, string url, List<string> parameters, string body)
208 {
209 Console.WriteLine("StartHttpRequest");
210
211 HttpClass htc = new HttpClass();
212 htc.localID = localID;
213 htc.itemID = itemID;
214 htc.url = url;
215 htc.parameters = parameters;
216 htc.body = body;
217 lock (HttpListLock)
218 {
219
220 //ADD REQUEST
221 HttpRequests.Add(htc);
222 }
223 }
224 public void StopHttpRequest(uint m_localID, LLUUID m_itemID)
225 {
226 // Remove from list
227 lock (HttpListLock)
228 {
229 List<HttpClass> NewHttpList = new List<HttpClass>();
230 foreach (HttpClass ts in HttpRequests)
231 {
232 if (ts.localID != m_localID && ts.itemID != m_itemID)
233 {
234 // Keeping this one
235 NewHttpList.Add(ts);
236 }
237 else
238 {
239 // Shutting this one down
240 ts.Stop();
241 }
242 }
243 HttpRequests.Clear();
244 HttpRequests = NewHttpList;
245 }
246 }
247 public void CheckHttpRequests()
248 {
249 // Nothing to do here?
250 if (HttpRequests.Count == 0)
251 return;
252
253 lock (HttpListLock)
254 {
255 foreach (HttpClass ts in HttpRequests)
256 {
257
258 if (ts.CheckResponse() == true)
259 {
260 // Add it to event queue
261 //key request_id, integer status, list metadata, string body
262 object[] resobj = new object[] { ts.response_request_id, ts.response_status, ts.response_metadata, ts.response_body };
263 m_ScriptEngine.m_EventQueueManager.AddToScriptQueue(ts.localID, ts.itemID, "http_response", resobj);
264 // Now stop it
265 StopHttpRequest(ts.localID, ts.itemID);
266 }
267 }
268 } // lock
269 }
270 #endregion
271
272 public void CheckXMLRPCRequests()
273 {
274
275 IXMLRPC xmlrpc = m_ScriptEngine.World.RequestModuleInterface<IXMLRPC>();
276
277 while (xmlrpc.hasRequests())
278 {
279 RPCRequestInfo rInfo = xmlrpc.GetNextRequest();
280 System.Console.WriteLine("PICKED REQUEST");
281
282 //Deliver data to prim's remote_data handler
283 object[] resobj = new object[] {
284 2, rInfo.GetChannelKey().ToString(), rInfo.GetMessageID().ToString(), "", rInfo.GetIntValue(), rInfo.GetStrVal()
285 };
286 m_ScriptEngine.m_EventQueueManager.AddToScriptQueue(
287 rInfo.GetLocalID(), rInfo.GetItemID(), "remote_data", resobj
288 );
289
290 }
291
292 }
293
294 public void CheckListeners()
295 {
296
297 IWorldComm comms = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>();
298
299 while (comms.HasMessages())
300 {
301 ListenerInfo lInfo = comms.GetNextMessage();
302 System.Console.WriteLine("PICKED LISTENER");
303
304 //Deliver data to prim's listen handler
305 object[] resobj = new object[] {
306 lInfo.GetChannel(), lInfo.GetName(), lInfo.GetID().ToString(), lInfo.GetMessage()
307 };
308
309 m_ScriptEngine.m_EventQueueManager.AddToScriptQueue(
310 lInfo.GetLocalID(), lInfo.GetItemID(), "listen", resobj
311 );
312
313 }
314
315 }
316
317
318
319
320 }
321}
diff --git a/OpenSim/Grid/ScriptEngine/DotNetEngine/Properties/AssemblyInfo.cs b/OpenSim/Grid/ScriptEngine/DotNetEngine/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..e1e025c
--- /dev/null
+++ b/OpenSim/Grid/ScriptEngine/DotNetEngine/Properties/AssemblyInfo.cs
@@ -0,0 +1,35 @@
1using System.Reflection;
2using System.Runtime.CompilerServices;
3using System.Runtime.InteropServices;
4
5// General Information about an assembly is controlled through the following
6// set of attributes. Change these attribute values to modify the information
7// associated with an assembly.
8[assembly: AssemblyTitle("OpenSim.Grid.ScriptEngine.DotNetEngine")]
9[assembly: AssemblyDescription("")]
10[assembly: AssemblyConfiguration("")]
11[assembly: AssemblyCompany("")]
12[assembly: AssemblyProduct("OpenSim.Grid.ScriptEngine.DotNetEngine")]
13[assembly: AssemblyCopyright("Copyright © 2007")]
14[assembly: AssemblyTrademark("")]
15[assembly: AssemblyCulture("")]
16
17// Setting ComVisible to false makes the types in this assembly not visible
18// to COM components. If you need to access a type in this assembly from
19// COM, set the ComVisible attribute to true on that type.
20[assembly: ComVisible(false)]
21
22// The following GUID is for the ID of the typelib if this project is exposed to COM
23[assembly: Guid("2842257e-6fde-4460-9368-4cde57fa9cc4")]
24
25// Version information for an assembly consists of the following four values:
26//
27// Major Version
28// Minor Version
29// Build Number
30// Revision
31//
32// You can specify all the values or you can default the Revision and Build Numbers
33// by using the '*' as shown below:
34[assembly: AssemblyVersion("1.0.0.0")]
35[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/OpenSim/Grid/ScriptEngine/DotNetEngine/ScriptEngine.cs b/OpenSim/Grid/ScriptEngine/DotNetEngine/ScriptEngine.cs
new file mode 100644
index 0000000..81a95c5
--- /dev/null
+++ b/OpenSim/Grid/ScriptEngine/DotNetEngine/ScriptEngine.cs
@@ -0,0 +1,132 @@
1/*
2* Copyright (c) Contributors, http://opensimulator.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28/* Original code: Tedd Hansen */
29using System;
30using System.Collections.Generic;
31using System.Text;
32using OpenSim.Framework.Console;
33using OpenSim.Region.Environment.Scenes;
34using OpenSim.Region.Environment.Scenes.Scripting;
35using OpenSim.Region.Environment.Interfaces;
36using libsecondlife;
37
38namespace OpenSim.Grid.ScriptEngine.DotNetEngine
39{
40 /// <summary>
41 /// This is the root object for ScriptEngine
42 /// </summary>
43 [Serializable]
44 public class ScriptEngine :IRegionModule
45 {
46
47 internal OpenSim.Region.Environment.Scenes.Scene World;
48 internal EventManager m_EventManager; // Handles and queues incoming events from OpenSim
49 internal EventQueueManager m_EventQueueManager; // Executes events
50 internal ScriptManager m_ScriptManager; // Load, unload and execute scripts
51 internal AppDomainManager m_AppDomainManager;
52 internal LSLLongCmdHandler m_LSLLongCmdHandler;
53
54 private OpenSim.Framework.Console.LogBase m_log;
55
56 public ScriptEngine()
57 {
58 //Common.SendToDebug("ScriptEngine Object Initialized");
59 Common.mySE = this;
60 }
61
62 public LogBase Log
63 {
64 get { return m_log; }
65 }
66
67 public void InitializeEngine(OpenSim.Region.Environment.Scenes.Scene Sceneworld, OpenSim.Framework.Console.LogBase logger)
68 {
69
70 World = Sceneworld;
71 m_log = logger;
72
73 Log.Verbose("ScriptEngine", "DotNet & LSL ScriptEngine initializing");
74
75 //m_logger.Status("ScriptEngine", "InitializeEngine");
76
77 // Create all objects we'll be using
78 m_EventQueueManager = new EventQueueManager(this);
79 m_EventManager = new EventManager(this);
80 m_ScriptManager = new ScriptManager(this);
81 m_AppDomainManager = new AppDomainManager();
82 m_LSLLongCmdHandler = new LSLLongCmdHandler(this);
83
84 // Should we iterate the region for scripts that needs starting?
85 // Or can we assume we are loaded before anything else so we can use proper events?
86
87
88 }
89
90 public void Shutdown()
91 {
92 // We are shutting down
93 }
94
95 //// !!!FOR DEBUGGING ONLY!!! (for executing script directly from test app)
96 //[Obsolete("!!!FOR DEBUGGING ONLY!!!")]
97 //public void StartScript(string ScriptID, IScriptHost ObjectID)
98 //{
99 // this.myEventManager.TEMP_OBJECT_ID = ObjectID;
100 // Log.Status("ScriptEngine", "DEBUG FUNCTION: StartScript: " + ScriptID);
101 // myScriptManager.StartScript(ScriptID, ObjectID);
102 //}
103
104 #region IRegionModule
105
106 public void Initialise(Scene scene)
107 {
108 this.InitializeEngine(scene, MainLog.Instance);
109 }
110
111 public void PostInitialise()
112 {
113
114 }
115
116 public void CloseDown()
117 {
118 }
119
120 public string GetName()
121 {
122 return "LSLScriptingModule";
123 }
124
125 public bool IsSharedModule()
126 {
127 return false;
128 }
129
130 #endregion
131 }
132}
diff --git a/OpenSim/Grid/ScriptEngine/DotNetEngine/ScriptManager.cs b/OpenSim/Grid/ScriptEngine/DotNetEngine/ScriptManager.cs
new file mode 100644
index 0000000..988230f
--- /dev/null
+++ b/OpenSim/Grid/ScriptEngine/DotNetEngine/ScriptManager.cs
@@ -0,0 +1,417 @@
1/*
2* Copyright (c) Contributors, http://opensimulator.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*
27*/
28/* Original code: Tedd Hansen */
29using System;
30using System.Collections.Generic;
31using System.Text;
32using System.Threading;
33using System.Reflection;
34using System.Runtime.Remoting;
35using System.Runtime.Serialization;
36using System.Runtime.Serialization.Formatters.Binary;
37using OpenSim.Region.Environment.Scenes;
38using OpenSim.Region.Environment.Scenes.Scripting;
39using OpenSim.Grid.ScriptEngine.DotNetEngine.Compiler;
40using OpenSim.Grid.ScriptEngine.DotNetEngine.Compiler.LSL;
41using OpenSim.Region.ScriptEngine.Common;
42using libsecondlife;
43
44
45namespace OpenSim.Grid.ScriptEngine.DotNetEngine
46{
47 /// <summary>
48 /// Loads scripts
49 /// Compiles them if necessary
50 /// Execute functions for EventQueueManager (Sends them to script on other AppDomain for execution)
51 /// </summary>
52 [Serializable]
53 public class ScriptManager
54 {
55 #region Declares
56 private Thread scriptLoadUnloadThread;
57 private int scriptLoadUnloadThread_IdleSleepms = 100;
58 private Queue<LoadStruct> loadQueue = new Queue<LoadStruct>();
59 private Queue<UnloadStruct> unloadQueue = new Queue<UnloadStruct>();
60 private struct LoadStruct
61 {
62 public uint localID;
63 public LLUUID itemID;
64 public string script;
65 }
66 private struct UnloadStruct
67 {
68 public uint localID;
69 public LLUUID itemID;
70 }
71
72 // Object<string, Script<string, script>>
73 // IMPORTANT: Types and MemberInfo-derived objects require a LOT of memory.
74 // Instead use RuntimeTypeHandle, RuntimeFieldHandle and RunTimeHandle (IntPtr) instead!
75 internal Dictionary<uint, Dictionary<LLUUID, LSL_BaseClass>> Scripts = new Dictionary<uint, Dictionary<LLUUID, LSL_BaseClass>>();
76 public Scene World
77 {
78 get
79 {
80 return m_scriptEngine.World;
81 }
82 }
83#endregion
84 #region Object init/shutdown
85 private ScriptEngine m_scriptEngine;
86 public ScriptManager(ScriptEngine scriptEngine)
87 {
88 m_scriptEngine = scriptEngine;
89 AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
90 scriptLoadUnloadThread = new Thread(ScriptLoadUnloadThreadLoop);
91 scriptLoadUnloadThread.Name = "ScriptLoadUnloadThread";
92 scriptLoadUnloadThread.IsBackground = true;
93 scriptLoadUnloadThread.Priority = ThreadPriority.BelowNormal;
94 scriptLoadUnloadThread.Start();
95
96 }
97 ~ScriptManager ()
98 {
99 // Abort load/unload thread
100 try
101 {
102 if (scriptLoadUnloadThread != null)
103 {
104 if (scriptLoadUnloadThread.IsAlive == true)
105 {
106 scriptLoadUnloadThread.Abort();
107 scriptLoadUnloadThread.Join();
108 }
109 }
110 }
111 catch
112 {
113 }
114 }
115 #endregion
116 #region Load / Unload scripts (Thread loop)
117 private void ScriptLoadUnloadThreadLoop()
118 {
119 try
120 {
121 while (true)
122 {
123 if (loadQueue.Count == 0 && unloadQueue.Count == 0)
124 Thread.Sleep(scriptLoadUnloadThread_IdleSleepms);
125
126 if (loadQueue.Count > 0)
127 {
128 LoadStruct item = loadQueue.Dequeue();
129 _StartScript(item.localID, item.itemID, item.script);
130 }
131
132 if (unloadQueue.Count > 0)
133 {
134 UnloadStruct item = unloadQueue.Dequeue();
135 _StopScript(item.localID, item.itemID);
136 }
137
138
139
140 }
141 }
142 catch (ThreadAbortException tae)
143 {
144 string a = tae.ToString();
145 a = "";
146 // Expected
147 }
148
149 }
150 #endregion
151 #region Helper functions
152 private static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
153 {
154
155 //Console.WriteLine("ScriptManager.CurrentDomain_AssemblyResolve: " + args.Name);
156 return Assembly.GetExecutingAssembly().FullName == args.Name ? Assembly.GetExecutingAssembly() : null;
157
158 }
159
160
161 #endregion
162 #region Internal functions to keep track of script
163 internal Dictionary<LLUUID, LSL_BaseClass>.KeyCollection GetScriptKeys(uint localID)
164 {
165 if (Scripts.ContainsKey(localID) == false)
166 return null;
167
168 Dictionary<LLUUID, LSL_BaseClass> Obj;
169 Scripts.TryGetValue(localID, out Obj);
170
171 return Obj.Keys;
172
173 }
174
175 internal LSL_BaseClass GetScript(uint localID, LLUUID itemID)
176 {
177 if (Scripts.ContainsKey(localID) == false)
178 return null;
179
180 Dictionary<LLUUID, LSL_BaseClass> Obj;
181 Scripts.TryGetValue(localID, out Obj);
182 if (Obj.ContainsKey(itemID) == false)
183 return null;
184
185 // Get script
186 LSL_BaseClass Script;
187 Obj.TryGetValue(itemID, out Script);
188
189 return Script;
190
191 }
192 internal void SetScript(uint localID, LLUUID itemID, LSL_BaseClass Script)
193 {
194 // Create object if it doesn't exist
195 if (Scripts.ContainsKey(localID) == false)
196 {
197 Scripts.Add(localID, new Dictionary<LLUUID, LSL_BaseClass>());
198 }
199
200 // Delete script if it exists
201 Dictionary<LLUUID, LSL_BaseClass> Obj;
202 Scripts.TryGetValue(localID, out Obj);
203 if (Obj.ContainsKey(itemID) == true)
204 Obj.Remove(itemID);
205
206 // Add to object
207 Obj.Add(itemID, Script);
208
209 }
210 internal void RemoveScript(uint localID, LLUUID itemID)
211 {
212 // Don't have that object?
213 if (Scripts.ContainsKey(localID) == false)
214 return;
215
216 // Delete script if it exists
217 Dictionary<LLUUID, LSL_BaseClass> Obj;
218 Scripts.TryGetValue(localID, out Obj);
219 if (Obj.ContainsKey(itemID) == true)
220 Obj.Remove(itemID);
221
222 }
223 #endregion
224 #region Start/Stop/Reset script
225 /// <summary>
226 /// Fetches, loads and hooks up a script to an objects events
227 /// </summary>
228 /// <param name="itemID"></param>
229 /// <param name="localID"></param>
230 public void StartScript(uint localID, LLUUID itemID, string Script)
231 {
232 LoadStruct ls = new LoadStruct();
233 ls.localID = localID;
234 ls.itemID = itemID;
235 ls.script = Script;
236 loadQueue.Enqueue(ls);
237 }
238 /// <summary>
239 /// Disables and unloads a script
240 /// </summary>
241 /// <param name="localID"></param>
242 /// <param name="itemID"></param>
243 public void StopScript(uint localID, LLUUID itemID)
244 {
245 UnloadStruct ls = new UnloadStruct();
246 ls.localID = localID;
247 ls.itemID = itemID;
248 unloadQueue.Enqueue(ls);
249 }
250 public void ResetScript(uint localID, LLUUID itemID)
251 {
252 string script = GetScript(localID, itemID).SourceCode;
253 StopScript(localID, itemID);
254 StartScript(localID, itemID, script);
255 }
256
257 private void _StartScript(uint localID, LLUUID itemID, string Script)
258 {
259 //IScriptHost root = host.GetRoot();
260 Console.WriteLine("ScriptManager StartScript: localID: " + localID + ", itemID: " + itemID);
261
262 // We will initialize and start the script.
263 // It will be up to the script itself to hook up the correct events.
264 string ScriptSource = "";
265
266 SceneObjectPart m_host = World.GetSceneObjectPart(localID);
267
268 try
269 {
270
271
272
273
274 // Create a new instance of the compiler (currently we don't want reuse)
275 OpenSim.Grid.ScriptEngine.DotNetEngine.Compiler.LSL.Compiler LSLCompiler = new OpenSim.Grid.ScriptEngine.DotNetEngine.Compiler.LSL.Compiler();
276 // Compile (We assume LSL)
277 ScriptSource = LSLCompiler.CompileFromLSLText(Script);
278 //Console.WriteLine("Compilation of " + FileName + " done");
279 // * Insert yield into code
280 ScriptSource = ProcessYield(ScriptSource);
281
282
283#if DEBUG
284 long before;
285 before = GC.GetTotalMemory(true);
286#endif
287
288 LSL_BaseClass CompiledScript;
289 CompiledScript = m_scriptEngine.m_AppDomainManager.LoadScript(ScriptSource);
290
291#if DEBUG
292 Console.WriteLine("Script " + itemID + " occupies {0} bytes", GC.GetTotalMemory(true) - before);
293#endif
294
295 CompiledScript.SourceCode = ScriptSource;
296 // Add it to our script memstruct
297 SetScript(localID, itemID, CompiledScript);
298
299 // We need to give (untrusted) assembly a private instance of BuiltIns
300 // this private copy will contain Read-Only FullitemID so that it can bring that on to the server whenever needed.
301
302
303 LSL_BuiltIn_Commands LSLB = new LSL_BuiltIn_Commands(m_scriptEngine, m_host, localID, itemID);
304
305 // Start the script - giving it BuiltIns
306 CompiledScript.Start(LSLB);
307
308 // Fire the first start-event
309 m_scriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "state_entry", new object[] { });
310
311
312 }
313 catch (Exception e)
314 {
315 //m_scriptEngine.Log.Error("ScriptEngine", "Error compiling script: " + e.ToString());
316 try
317 {
318 // DISPLAY ERROR INWORLD
319 string text = "Error compiling script:\r\n" + e.Message.ToString();
320 if (text.Length > 1500)
321 text = text.Substring(0, 1500);
322 World.SimChat(Helpers.StringToField(text), 1, 0, m_host.AbsolutePosition, m_host.Name, m_host.UUID);
323 }
324 catch (Exception e2)
325 {
326 m_scriptEngine.Log.Error("ScriptEngine", "Error displaying error in-world: " + e2.ToString());
327 }
328 }
329
330
331
332 }
333
334 private void _StopScript(uint localID, LLUUID itemID)
335 {
336 // Stop script
337 Console.WriteLine("Stop script localID: " + localID + " LLUID: " + itemID.ToString());
338
339
340 // Stop long command on script
341 m_scriptEngine.m_LSLLongCmdHandler.RemoveScript(localID, itemID);
342
343 LSL_BaseClass LSLBC = GetScript(localID, itemID);
344 if (LSLBC == null)
345 return;
346
347 // TEMP: First serialize it
348 //GetSerializedScript(localID, itemID);
349
350
351 try
352 {
353 // Get AppDomain
354 AppDomain ad = LSLBC.Exec.GetAppDomain();
355 // Tell script not to accept new requests
356 GetScript(localID, itemID).Exec.StopScript();
357 // Remove from internal structure
358 RemoveScript(localID, itemID);
359 // Tell AppDomain that we have stopped script
360 m_scriptEngine.m_AppDomainManager.StopScript(ad);
361 }
362 catch(Exception e)
363 {
364 Console.WriteLine("Exception stopping script localID: " + localID + " LLUID: " + itemID.ToString() + ": " + e.ToString());
365 }
366 }
367 private string ProcessYield(string FileName)
368 {
369 // TODO: Create a new assembly and copy old but insert Yield Code
370 //return TempDotNetMicroThreadingCodeInjector.TestFix(FileName);
371 return FileName;
372 }
373 #endregion
374 #region Perform event execution in script
375 /// <summary>
376 /// Execute a LL-event-function in Script
377 /// </summary>
378 /// <param name="localID">Object the script is located in</param>
379 /// <param name="itemID">Script ID</param>
380 /// <param name="FunctionName">Name of function</param>
381 /// <param name="args">Arguments to pass to function</param>
382 internal void ExecuteEvent(uint localID, LLUUID itemID, string FunctionName, object[] args)
383 {
384
385 // Execute a function in the script
386 //m_scriptEngine.Log.Verbose("ScriptEngine", "Executing Function localID: " + localID + ", itemID: " + itemID + ", FunctionName: " + FunctionName);
387 LSL_BaseClass Script = m_scriptEngine.m_ScriptManager.GetScript(localID, itemID);
388 if (Script == null)
389 return;
390
391 // Must be done in correct AppDomain, so leaving it up to the script itself
392 Script.Exec.ExecuteEvent(FunctionName, args);
393
394 }
395 #endregion
396
397 #region Script serialization/deserialization
398 public void GetSerializedScript(uint localID, LLUUID itemID)
399 {
400 // Serialize the script and return it
401 // Should not be a problem
402 System.IO.FileStream fs = System.IO.File.Create("SERIALIZED_SCRIPT_" + itemID);
403 BinaryFormatter b = new BinaryFormatter();
404 b.Serialize(fs, GetScript(localID,itemID));
405 fs.Close();
406
407
408 }
409 public void PutSerializedScript(uint localID, LLUUID itemID)
410 {
411 // Deserialize the script and inject it into an AppDomain
412
413 // How to inject into an AppDomain?
414 }
415 #endregion
416 }
417}
diff --git a/OpenSim/Grid/ScriptEngine/DotNetEngine/TempDotNetMicroThreadingCodeInjector.cs b/OpenSim/Grid/ScriptEngine/DotNetEngine/TempDotNetMicroThreadingCodeInjector.cs
new file mode 100644
index 0000000..7120b6c
--- /dev/null
+++ b/OpenSim/Grid/ScriptEngine/DotNetEngine/TempDotNetMicroThreadingCodeInjector.cs
@@ -0,0 +1,45 @@
1using System;
2using System.Collections.Generic;
3using System.Text;
4using Rail.Transformation;
5using Rail.Reflect;
6using Rail.Exceptions;
7using Rail.MSIL;
8
9namespace OpenSim.Grid.ScriptEngine.DotNetEngine
10{
11 /// <summary>
12 /// Tedds Sandbox for RAIL/microtrheading. This class is only for testing purposes!
13 /// Its offspring will be the actual implementation.
14 /// </summary>
15 class TempDotNetMicroThreadingCodeInjector
16 {
17 public static string TestFix(string FileName)
18 {
19 string ret = System.IO.Path.GetFileNameWithoutExtension(FileName + "_fixed.dll");
20
21 Console.WriteLine("Loading: \"" + FileName + "\"");
22 RAssemblyDef rAssembly = RAssemblyDef.LoadAssembly(FileName);
23
24
25 //Get the type of the method to copy from assembly Teste2.exe to assembly Teste.exe
26 RTypeDef type = (RTypeDef)rAssembly.RModuleDef.GetType("SecondLife.Script");
27
28 //Get the methods in the type
29 RMethod[] m = type.GetMethods();
30
31 //Create a MethodPrologueAdder visitor object with the method to add
32 //and with the flag that enables local variable creation set to true
33 MethodPrologueAdder mpa = new MethodPrologueAdder((RMethodDef)m[0], true);
34
35 //Apply the changes to the assembly
36 rAssembly.Accept(mpa);
37
38 //Save the new assembly
39 rAssembly.SaveAssembly(ret);
40
41 return ret;
42
43 }
44 }
45}