* Rex merges, Grid Script Server
							parent
							
								
									ab27cd5513
								
							
						
					
					
						commit
						ce0d1132f8
					
				|  | @ -1,139 +1,139 @@ | |||
| /* | ||||
| * Copyright (c) Contributors, http://opensimulator.org/ | ||||
| * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||||
| * | ||||
| * Redistribution and use in source and binary forms, with or without | ||||
| * modification, are permitted provided that the following conditions are met: | ||||
| *     * Redistributions of source code must retain the above copyright | ||||
| *       notice, this list of conditions and the following disclaimer. | ||||
| *     * Redistributions in binary form must reproduce the above copyright | ||||
| *       notice, this list of conditions and the following disclaimer in the | ||||
| *       documentation and/or other materials provided with the distribution. | ||||
| *     * Neither the name of the OpenSim Project nor the | ||||
| *       names of its contributors may be used to endorse or promote products | ||||
| *       derived from this software without specific prior written permission. | ||||
| * | ||||
| * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS AS IS AND ANY | ||||
| * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||||
| * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||||
| * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||||
| * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||||
| * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||||
| * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||||
| * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
| *  | ||||
| */ | ||||
| 
 | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Reflection; | ||||
| using System.Runtime.Remoting.Lifetime; | ||||
| 
 | ||||
| namespace OpenSim.Grid.ScriptEngine.Common | ||||
| { | ||||
|     public class Executor : MarshalByRefObject | ||||
|     { | ||||
|         // Private instance for each script | ||||
| 
 | ||||
|         private IScript m_Script; | ||||
|         private Dictionary<string, MethodInfo> Events = new Dictionary<string, MethodInfo>(); | ||||
|         private bool m_Running = true; | ||||
|         //private List<IScript> Scripts = new List<IScript>(); | ||||
| 
 | ||||
|         public Executor(IScript Script) | ||||
|         { | ||||
|             m_Script = Script; | ||||
|         } | ||||
| 
 | ||||
|         // Object never expires | ||||
|         public override Object InitializeLifetimeService() | ||||
|         { | ||||
|             //Console.WriteLine("Executor: InitializeLifetimeService()"); | ||||
|             //            return null; | ||||
|             ILease lease = (ILease) base.InitializeLifetimeService(); | ||||
| 
 | ||||
|             if (lease.CurrentState == LeaseState.Initial) | ||||
|             { | ||||
|                 lease.InitialLeaseTime = TimeSpan.Zero; // TimeSpan.FromMinutes(1); | ||||
| //                lease.SponsorshipTimeout = TimeSpan.FromMinutes(2); | ||||
| //                lease.RenewOnCallTime = TimeSpan.FromSeconds(2); | ||||
|             } | ||||
|             return lease; | ||||
|         } | ||||
| 
 | ||||
|         public AppDomain GetAppDomain() | ||||
|         { | ||||
|             return AppDomain.CurrentDomain; | ||||
|         } | ||||
| 
 | ||||
|         public void ExecuteEvent(string FunctionName, object[] args) | ||||
|         { | ||||
|             // IMPORTANT: Types and MemberInfo-derived objects require a LOT of memory. | ||||
|             // Instead use RuntimeTypeHandle, RuntimeFieldHandle and RunTimeHandle (IntPtr) instead! | ||||
|             //try | ||||
|             //{ | ||||
|             if (m_Running == false) | ||||
|             { | ||||
|                 // Script is inactive, do not execute! | ||||
|                 return; | ||||
|             } | ||||
| 
 | ||||
|             string EventName = m_Script.State() + "_event_" + FunctionName; | ||||
| 
 | ||||
|             //type.InvokeMember(EventName, BindingFlags.InvokeMethod, null, m_Script, args); | ||||
| 
 | ||||
|             //Console.WriteLine("ScriptEngine Executor.ExecuteEvent: \"" + EventName + "\""); | ||||
| 
 | ||||
|             if (Events.ContainsKey(EventName) == false) | ||||
|             { | ||||
|                 // Not found, create | ||||
|                 Type type = m_Script.GetType(); | ||||
|                 try | ||||
|                 { | ||||
|                     MethodInfo mi = type.GetMethod(EventName); | ||||
|                     Events.Add(EventName, mi); | ||||
|                 } | ||||
|                 catch | ||||
|                 { | ||||
|                     // Event name not found, cache it as not found | ||||
|                     Events.Add(EventName, null); | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
|             // Get event | ||||
|             MethodInfo ev = null; | ||||
|             Events.TryGetValue(EventName, out ev); | ||||
| 
 | ||||
|             if (ev == null) // No event by that name! | ||||
|             { | ||||
|                 //Console.WriteLine("ScriptEngine Can not find any event named: \"" + EventName + "\""); | ||||
|                 return; | ||||
|             } | ||||
| 
 | ||||
|             // Found | ||||
|             //try | ||||
|             //{ | ||||
|             // Invoke it | ||||
|             ev.Invoke(m_Script, args); | ||||
| 
 | ||||
|             //} | ||||
|             //catch (Exception e) | ||||
|             //{ | ||||
|             //    // TODO: Send to correct place | ||||
|             //    Console.WriteLine("ScriptEngine Exception attempting to executing script function: " + e.ToString()); | ||||
|             //} | ||||
| 
 | ||||
| 
 | ||||
|             //} | ||||
|             //catch { } | ||||
|         } | ||||
| 
 | ||||
| 
 | ||||
|         public void StopScript() | ||||
|         { | ||||
|             m_Running = false; | ||||
|         } | ||||
|     } | ||||
| } | ||||
| /* | ||||
| * Copyright (c) Contributors, http://opensimulator.org/ | ||||
| * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||||
| * | ||||
| * Redistribution and use in source and binary forms, with or without | ||||
| * modification, are permitted provided that the following conditions are met: | ||||
| *     * Redistributions of source code must retain the above copyright | ||||
| *       notice, this list of conditions and the following disclaimer. | ||||
| *     * Redistributions in binary form must reproduce the above copyright | ||||
| *       notice, this list of conditions and the following disclaimer in the | ||||
| *       documentation and/or other materials provided with the distribution. | ||||
| *     * Neither the name of the OpenSim Project nor the | ||||
| *       names of its contributors may be used to endorse or promote products | ||||
| *       derived from this software without specific prior written permission. | ||||
| * | ||||
| * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||||
| * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||||
| * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||||
| * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||||
| * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||||
| * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||||
| * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||||
| * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
| *  | ||||
| */ | ||||
| 
 | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Reflection; | ||||
| using System.Runtime.Remoting.Lifetime; | ||||
| 
 | ||||
| namespace OpenSim.Grid.ScriptEngine.Common | ||||
| { | ||||
|     public class Executor : MarshalByRefObject | ||||
|     { | ||||
|         // Private instance for each script | ||||
| 
 | ||||
|         private IScript m_Script; | ||||
|         private Dictionary<string, MethodInfo> Events = new Dictionary<string, MethodInfo>(); | ||||
|         private bool m_Running = true; | ||||
|         //private List<IScript> Scripts = new List<IScript>(); | ||||
| 
 | ||||
|         public Executor(IScript Script) | ||||
|         { | ||||
|             m_Script = Script; | ||||
|         } | ||||
| 
 | ||||
|         // Object never expires | ||||
|         public override Object InitializeLifetimeService() | ||||
|         { | ||||
|             //Console.WriteLine("Executor: InitializeLifetimeService()"); | ||||
|             //            return null; | ||||
|             ILease lease = (ILease) base.InitializeLifetimeService(); | ||||
| 
 | ||||
|             if (lease.CurrentState == LeaseState.Initial) | ||||
|             { | ||||
|                 lease.InitialLeaseTime = TimeSpan.Zero; // TimeSpan.FromMinutes(1); | ||||
| //                lease.SponsorshipTimeout = TimeSpan.FromMinutes(2); | ||||
| //                lease.RenewOnCallTime = TimeSpan.FromSeconds(2); | ||||
|             } | ||||
|             return lease; | ||||
|         } | ||||
| 
 | ||||
|         public AppDomain GetAppDomain() | ||||
|         { | ||||
|             return AppDomain.CurrentDomain; | ||||
|         } | ||||
| 
 | ||||
|         public void ExecuteEvent(string FunctionName, object[] args) | ||||
|         { | ||||
|             // IMPORTANT: Types and MemberInfo-derived objects require a LOT of memory. | ||||
|             // Instead use RuntimeTypeHandle, RuntimeFieldHandle and RunTimeHandle (IntPtr) instead! | ||||
|             //try | ||||
|             //{ | ||||
|             if (m_Running == false) | ||||
|             { | ||||
|                 // Script is inactive, do not execute! | ||||
|                 return; | ||||
|             } | ||||
| 
 | ||||
|             string EventName = m_Script.State() + "_event_" + FunctionName; | ||||
| 
 | ||||
|             //type.InvokeMember(EventName, BindingFlags.InvokeMethod, null, m_Script, args); | ||||
| 
 | ||||
|             //Console.WriteLine("ScriptEngine Executor.ExecuteEvent: \"" + EventName + "\""); | ||||
| 
 | ||||
|             if (Events.ContainsKey(EventName) == false) | ||||
|             { | ||||
|                 // Not found, create | ||||
|                 Type type = m_Script.GetType(); | ||||
|                 try | ||||
|                 { | ||||
|                     MethodInfo mi = type.GetMethod(EventName); | ||||
|                     Events.Add(EventName, mi); | ||||
|                 } | ||||
|                 catch | ||||
|                 { | ||||
|                     // Event name not found, cache it as not found | ||||
|                     Events.Add(EventName, null); | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
|             // Get event | ||||
|             MethodInfo ev = null; | ||||
|             Events.TryGetValue(EventName, out ev); | ||||
| 
 | ||||
|             if (ev == null) // No event by that name! | ||||
|             { | ||||
|                 //Console.WriteLine("ScriptEngine Can not find any event named: \"" + EventName + "\""); | ||||
|                 return; | ||||
|             } | ||||
| 
 | ||||
|             // Found | ||||
|             //try | ||||
|             //{ | ||||
|             // Invoke it | ||||
|             ev.Invoke(m_Script, args); | ||||
| 
 | ||||
|             //} | ||||
|             //catch (Exception e) | ||||
|             //{ | ||||
|             //    // TODO: Send to correct place | ||||
|             //    Console.WriteLine("ScriptEngine Exception attempting to executing script function: " + e.ToString()); | ||||
|             //} | ||||
| 
 | ||||
| 
 | ||||
|             //} | ||||
|             //catch { } | ||||
|         } | ||||
| 
 | ||||
| 
 | ||||
|         public void StopScript() | ||||
|         { | ||||
|             m_Running = false; | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  |  | |||
|  | @ -1,36 +1,36 @@ | |||
| /* | ||||
| * Copyright (c) Contributors, http://opensimulator.org/ | ||||
| * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||||
| * | ||||
| * Redistribution and use in source and binary forms, with or without | ||||
| * modification, are permitted provided that the following conditions are met: | ||||
| *     * Redistributions of source code must retain the above copyright | ||||
| *       notice, this list of conditions and the following disclaimer. | ||||
| *     * Redistributions in binary form must reproduce the above copyright | ||||
| *       notice, this list of conditions and the following disclaimer in the | ||||
| *       documentation and/or other materials provided with the distribution. | ||||
| *     * Neither the name of the OpenSim Project nor the | ||||
| *       names of its contributors may be used to endorse or promote products | ||||
| *       derived from this software without specific prior written permission. | ||||
| * | ||||
| * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS AS IS AND ANY | ||||
| * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||||
| * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||||
| * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||||
| * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||||
| * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||||
| * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||||
| * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
| *  | ||||
| */ | ||||
| 
 | ||||
| namespace OpenSim.Grid.ScriptEngine.Common | ||||
| { | ||||
|     public interface IScript | ||||
|     { | ||||
|         string State(); | ||||
|         Executor Exec { get; } | ||||
|     } | ||||
| } | ||||
| /* | ||||
| * Copyright (c) Contributors, http://opensimulator.org/ | ||||
| * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||||
| * | ||||
| * Redistribution and use in source and binary forms, with or without | ||||
| * modification, are permitted provided that the following conditions are met: | ||||
| *     * Redistributions of source code must retain the above copyright | ||||
| *       notice, this list of conditions and the following disclaimer. | ||||
| *     * Redistributions in binary form must reproduce the above copyright | ||||
| *       notice, this list of conditions and the following disclaimer in the | ||||
| *       documentation and/or other materials provided with the distribution. | ||||
| *     * Neither the name of the OpenSim Project nor the | ||||
| *       names of its contributors may be used to endorse or promote products | ||||
| *       derived from this software without specific prior written permission. | ||||
| * | ||||
| * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||||
| * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||||
| * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||||
| * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||||
| * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||||
| * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||||
| * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||||
| * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
| *  | ||||
| */ | ||||
| 
 | ||||
| namespace OpenSim.Grid.ScriptEngine.Common | ||||
| { | ||||
|     public interface IScript | ||||
|     { | ||||
|         string State(); | ||||
|         Executor Exec { get; } | ||||
|     } | ||||
| } | ||||
|  |  | |||
|  | @ -1,83 +1,83 @@ | |||
| /* | ||||
| * Copyright (c) Contributors, http://opensimulator.org/ | ||||
| * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||||
| * | ||||
| * Redistribution and use in source and binary forms, with or without | ||||
| * modification, are permitted provided that the following conditions are met: | ||||
| *     * Redistributions of source code must retain the above copyright | ||||
| *       notice, this list of conditions and the following disclaimer. | ||||
| *     * Redistributions in binary form must reproduce the above copyright | ||||
| *       notice, this list of conditions and the following disclaimer in the | ||||
| *       documentation and/or other materials provided with the distribution. | ||||
| *     * Neither the name of the OpenSim Project nor the | ||||
| *       names of its contributors may be used to endorse or promote products | ||||
| *       derived from this software without specific prior written permission. | ||||
| * | ||||
| * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS AS IS AND ANY | ||||
| * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||||
| * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||||
| * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||||
| * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||||
| * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||||
| * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||||
| * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
| *  | ||||
| */ | ||||
| 
 | ||||
| using System; | ||||
| 
 | ||||
| namespace OpenSim.Grid.ScriptEngine.Common | ||||
| { | ||||
|     [Serializable] | ||||
|     public class LSL_Types | ||||
|     { | ||||
|         [Serializable] | ||||
|         public struct Vector3 | ||||
|         { | ||||
|             public double X; | ||||
|             public double Y; | ||||
|             public double Z; | ||||
| 
 | ||||
|             public Vector3(Vector3 vector) | ||||
|             { | ||||
|                 X = (float) vector.X; | ||||
|                 Y = (float) vector.Y; | ||||
|                 Z = (float) vector.Z; | ||||
|             } | ||||
| 
 | ||||
|             public Vector3(double x, double y, double z) | ||||
|             { | ||||
|                 X = x; | ||||
|                 Y = y; | ||||
|                 Z = z; | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         [Serializable] | ||||
|         public struct Quaternion | ||||
|         { | ||||
|             public double X; | ||||
|             public double Y; | ||||
|             public double Z; | ||||
|             public double R; | ||||
| 
 | ||||
|             public Quaternion(Quaternion Quat) | ||||
|             { | ||||
|                 X = (float) Quat.X; | ||||
|                 Y = (float) Quat.Y; | ||||
|                 Z = (float) Quat.Z; | ||||
|                 R = (float) Quat.R; | ||||
|             } | ||||
| 
 | ||||
|             public Quaternion(double x, double y, double z, double r) | ||||
|             { | ||||
|                 X = x; | ||||
|                 Y = y; | ||||
|                 Z = z; | ||||
|                 R = r; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
| /* | ||||
| * Copyright (c) Contributors, http://opensimulator.org/ | ||||
| * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||||
| * | ||||
| * Redistribution and use in source and binary forms, with or without | ||||
| * modification, are permitted provided that the following conditions are met: | ||||
| *     * Redistributions of source code must retain the above copyright | ||||
| *       notice, this list of conditions and the following disclaimer. | ||||
| *     * Redistributions in binary form must reproduce the above copyright | ||||
| *       notice, this list of conditions and the following disclaimer in the | ||||
| *       documentation and/or other materials provided with the distribution. | ||||
| *     * Neither the name of the OpenSim Project nor the | ||||
| *       names of its contributors may be used to endorse or promote products | ||||
| *       derived from this software without specific prior written permission. | ||||
| * | ||||
| * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||||
| * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||||
| * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||||
| * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||||
| * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||||
| * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||||
| * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||||
| * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
| *  | ||||
| */ | ||||
| 
 | ||||
| using System; | ||||
| 
 | ||||
| namespace OpenSim.Grid.ScriptEngine.Common | ||||
| { | ||||
|     [Serializable] | ||||
|     public class LSL_Types | ||||
|     { | ||||
|         [Serializable] | ||||
|         public struct Vector3 | ||||
|         { | ||||
|             public double X; | ||||
|             public double Y; | ||||
|             public double Z; | ||||
| 
 | ||||
|             public Vector3(Vector3 vector) | ||||
|             { | ||||
|                 X = (float) vector.X; | ||||
|                 Y = (float) vector.Y; | ||||
|                 Z = (float) vector.Z; | ||||
|             } | ||||
| 
 | ||||
|             public Vector3(double x, double y, double z) | ||||
|             { | ||||
|                 X = x; | ||||
|                 Y = y; | ||||
|                 Z = z; | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         [Serializable] | ||||
|         public struct Quaternion | ||||
|         { | ||||
|             public double X; | ||||
|             public double Y; | ||||
|             public double Z; | ||||
|             public double R; | ||||
| 
 | ||||
|             public Quaternion(Quaternion Quat) | ||||
|             { | ||||
|                 X = (float) Quat.X; | ||||
|                 Y = (float) Quat.Y; | ||||
|                 Z = (float) Quat.Z; | ||||
|                 R = (float) Quat.R; | ||||
|             } | ||||
| 
 | ||||
|             public Quaternion(double x, double y, double z, double r) | ||||
|             { | ||||
|                 X = x; | ||||
|                 Y = y; | ||||
|                 Z = z; | ||||
|                 R = r; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  |  | |||
|  | @ -1,36 +1,64 @@ | |||
| using System.Reflection; | ||||
| using System.Runtime.InteropServices; | ||||
| 
 | ||||
| // General Information about an assembly is controlled through the following  | ||||
| // set of attributes. Change these attribute values to modify the information | ||||
| // associated with an assembly. | ||||
| 
 | ||||
| [assembly : AssemblyTitle("OpenSim.Grid.ScriptEngine.Common")] | ||||
| [assembly : AssemblyDescription("")] | ||||
| [assembly : AssemblyConfiguration("")] | ||||
| [assembly : AssemblyCompany("")] | ||||
| [assembly : AssemblyProduct("OpenSim.Grid.ScriptEngine.Common")] | ||||
| [assembly : AssemblyCopyright("Copyright ©  2007")] | ||||
| [assembly : AssemblyTrademark("")] | ||||
| [assembly : AssemblyCulture("")] | ||||
| 
 | ||||
| // Setting ComVisible to false makes the types in this assembly not visible  | ||||
| // to COM components.  If you need to access a type in this assembly from  | ||||
| // COM, set the ComVisible attribute to true on that type. | ||||
| 
 | ||||
| [assembly : ComVisible(false)] | ||||
| 
 | ||||
| // The following GUID is for the ID of the typelib if this project is exposed to COM | ||||
| 
 | ||||
| [assembly : Guid("0bf07c53-ae51-487f-a907-e9b30c251602")] | ||||
| 
 | ||||
| // Version information for an assembly consists of the following four values: | ||||
| // | ||||
| //      Major Version | ||||
| //      Minor Version  | ||||
| //      Build Number | ||||
| //      Revision | ||||
| // | ||||
| 
 | ||||
| [assembly : AssemblyVersion("1.0.0.0")] | ||||
| [assembly : AssemblyFileVersion("1.0.0.0")] | ||||
| /* | ||||
| * Copyright (c) Contributors, http://opensimulator.org/ | ||||
| * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||||
| * | ||||
| * Redistribution and use in source and binary forms, with or without | ||||
| * modification, are permitted provided that the following conditions are met: | ||||
| *     * Redistributions of source code must retain the above copyright | ||||
| *       notice, this list of conditions and the following disclaimer. | ||||
| *     * Redistributions in binary form must reproduce the above copyright | ||||
| *       notice, this list of conditions and the following disclaimer in the | ||||
| *       documentation and/or other materials provided with the distribution. | ||||
| *     * Neither the name of the OpenSim Project nor the | ||||
| *       names of its contributors may be used to endorse or promote products | ||||
| *       derived from this software without specific prior written permission. | ||||
| * | ||||
| * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||||
| * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||||
| * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||||
| * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||||
| * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||||
| * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||||
| * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||||
| * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
| *  | ||||
| */ | ||||
| 
 | ||||
| using System.Reflection; | ||||
| using System.Runtime.InteropServices; | ||||
| 
 | ||||
| // General Information about an assembly is controlled through the following  | ||||
| // set of attributes. Change these attribute values to modify the information | ||||
| // associated with an assembly. | ||||
| 
 | ||||
| [assembly : AssemblyTitle("OpenSim.Grid.ScriptEngine.Common")] | ||||
| [assembly : AssemblyDescription("")] | ||||
| [assembly : AssemblyConfiguration("")] | ||||
| [assembly : AssemblyCompany("")] | ||||
| [assembly : AssemblyProduct("OpenSim.Grid.ScriptEngine.Common")] | ||||
| [assembly : AssemblyCopyright("Copyright © 2007")] | ||||
| [assembly : AssemblyTrademark("")] | ||||
| [assembly : AssemblyCulture("")] | ||||
| 
 | ||||
| // Setting ComVisible to false makes the types in this assembly not visible  | ||||
| // to COM components.  If you need to access a type in this assembly from  | ||||
| // COM, set the ComVisible attribute to true on that type. | ||||
| 
 | ||||
| [assembly : ComVisible(false)] | ||||
| 
 | ||||
| // The following GUID is for the ID of the typelib if this project is exposed to COM | ||||
| 
 | ||||
| [assembly : Guid("0bf07c53-ae51-487f-a907-e9b30c251602")] | ||||
| 
 | ||||
| // Version information for an assembly consists of the following four values: | ||||
| // | ||||
| //      Major Version | ||||
| //      Minor Version  | ||||
| //      Build Number | ||||
| //      Revision | ||||
| // | ||||
| 
 | ||||
| [assembly : AssemblyVersion("1.0.0.0")] | ||||
| [assembly : AssemblyFileVersion("1.0.0.0")] | ||||
|  |  | |||
|  | @ -1,226 +1,224 @@ | |||
| /* | ||||
| * Copyright (c) Contributors, http://opensimulator.org/ | ||||
| * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||||
| * | ||||
| * Redistribution and use in source and binary forms, with or without | ||||
| * modification, are permitted provided that the following conditions are met: | ||||
| *     * Redistributions of source code must retain the above copyright | ||||
| *       notice, this list of conditions and the following disclaimer. | ||||
| *     * Redistributions in binary form must reproduce the above copyright | ||||
| *       notice, this list of conditions and the following disclaimer in the | ||||
| *       documentation and/or other materials provided with the distribution. | ||||
| *     * Neither the name of the OpenSim Project nor the | ||||
| *       names of its contributors may be used to endorse or promote products | ||||
| *       derived from this software without specific prior written permission. | ||||
| * | ||||
| * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS AS IS AND ANY | ||||
| * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||||
| * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||||
| * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||||
| * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||||
| * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||||
| * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||||
| * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
| *  | ||||
| */ | ||||
| 
 | ||||
| using System; | ||||
| using System.Collections; | ||||
| using System.Collections.Generic; | ||||
| using System.Reflection; | ||||
| using OpenSim.Grid.ScriptEngine.DotNetEngine.Compiler.LSL; | ||||
| 
 | ||||
| namespace OpenSim.Grid.ScriptEngine.DotNetEngine | ||||
| { | ||||
|     public class AppDomainManager | ||||
|     { | ||||
|         private int maxScriptsPerAppDomain = 1; | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Internal list of all AppDomains | ||||
|         /// </summary> | ||||
|         private List<AppDomainStructure> appDomains = new List<AppDomainStructure>(); | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Structure to keep track of data around AppDomain | ||||
|         /// </summary> | ||||
|         private class AppDomainStructure | ||||
|         { | ||||
|             /// <summary> | ||||
|             /// The AppDomain itself | ||||
|             /// </summary> | ||||
|             public AppDomain CurrentAppDomain; | ||||
| 
 | ||||
|             /// <summary> | ||||
|             /// Number of scripts loaded into AppDomain | ||||
|             /// </summary> | ||||
|             public int ScriptsLoaded; | ||||
| 
 | ||||
|             /// <summary> | ||||
|             /// Number of dead scripts | ||||
|             /// </summary> | ||||
|             public int ScriptsWaitingUnload; | ||||
|         } | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Current AppDomain | ||||
|         /// </summary> | ||||
|         private AppDomainStructure currentAD; | ||||
| 
 | ||||
|         private object getLock = new object(); // Mutex | ||||
|         private object freeLock = new object(); // Mutex | ||||
| 
 | ||||
|         //private ScriptEngine m_scriptEngine; | ||||
|         //public AppDomainManager(ScriptEngine scriptEngine) | ||||
|         public AppDomainManager() | ||||
|         { | ||||
|             //m_scriptEngine = scriptEngine; | ||||
|         } | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Find a free AppDomain, creating one if necessary | ||||
|         /// </summary> | ||||
|         /// <returns>Free AppDomain</returns> | ||||
|         private AppDomainStructure GetFreeAppDomain() | ||||
|         { | ||||
|             Console.WriteLine("Finding free AppDomain"); | ||||
|             lock (getLock) | ||||
|             { | ||||
|                 // Current full? | ||||
|                 if (currentAD != null && currentAD.ScriptsLoaded >= maxScriptsPerAppDomain) | ||||
|                 { | ||||
|                     // Add it to AppDomains list and empty current | ||||
|                     appDomains.Add(currentAD); | ||||
|                     currentAD = null; | ||||
|                 } | ||||
|                 // No current | ||||
|                 if (currentAD == null) | ||||
|                 { | ||||
|                     // Create a new current AppDomain | ||||
|                     currentAD = new AppDomainStructure(); | ||||
|                     currentAD.CurrentAppDomain = PrepareNewAppDomain(); | ||||
|                 } | ||||
| 
 | ||||
|                 Console.WriteLine("Scripts loaded in this Appdomain: " + currentAD.ScriptsLoaded); | ||||
|                 return currentAD; | ||||
|             } // lock | ||||
|         } | ||||
| 
 | ||||
|         private int AppDomainNameCount; | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Create and prepare a new AppDomain for scripts | ||||
|         /// </summary> | ||||
|         /// <returns>The new AppDomain</returns> | ||||
|         private AppDomain PrepareNewAppDomain() | ||||
|         { | ||||
|             // Create and prepare a new AppDomain | ||||
|             AppDomainNameCount++; | ||||
|             // TODO: Currently security match current appdomain | ||||
| 
 | ||||
|             // Construct and initialize settings for a second AppDomain. | ||||
|             AppDomainSetup ads = new AppDomainSetup(); | ||||
|             ads.ApplicationBase = AppDomain.CurrentDomain.BaseDirectory; | ||||
|             ads.DisallowBindingRedirects = false; | ||||
|             ads.DisallowCodeDownload = true; | ||||
|             ads.LoaderOptimization = LoaderOptimization.MultiDomain; // Sounds good ;) | ||||
|             ads.ShadowCopyFiles = "true"; // Enabled shadowing | ||||
|             ads.ConfigurationFile = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile; | ||||
| 
 | ||||
|             AppDomain AD = AppDomain.CreateDomain("ScriptAppDomain_" + AppDomainNameCount, null, ads); | ||||
|             Console.WriteLine("Loading: " + | ||||
|                               AssemblyName.GetAssemblyName("OpenSim.Region.ScriptEngine.Common.dll").ToString()); | ||||
|             AD.Load(AssemblyName.GetAssemblyName("OpenSim.Region.ScriptEngine.Common.dll")); | ||||
| 
 | ||||
|             // Return the new AppDomain | ||||
|             return AD; | ||||
|         } | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Unload appdomains that are full and have only dead scripts | ||||
|         /// </summary> | ||||
|         private void UnloadAppDomains() | ||||
|         { | ||||
|             lock (freeLock) | ||||
|             { | ||||
|                 // Go through all | ||||
|                 foreach (AppDomainStructure ads in new ArrayList(appDomains)) | ||||
|                 { | ||||
|                     // Don't process current AppDomain | ||||
|                     if (ads.CurrentAppDomain != currentAD.CurrentAppDomain) | ||||
|                     { | ||||
|                         // Not current AppDomain | ||||
|                         // Is number of unloaded bigger or equal to number of loaded? | ||||
|                         if (ads.ScriptsLoaded <= ads.ScriptsWaitingUnload) | ||||
|                         { | ||||
|                             Console.WriteLine("Found empty AppDomain, unloading"); | ||||
|                             // Remove from internal list | ||||
|                             appDomains.Remove(ads); | ||||
| #if DEBUG | ||||
|                             long m = GC.GetTotalMemory(true); | ||||
| #endif | ||||
|                             // Unload | ||||
|                             AppDomain.Unload(ads.CurrentAppDomain); | ||||
| #if DEBUG | ||||
|                             Console.WriteLine("AppDomain unload freed " + (m - GC.GetTotalMemory(true)) + | ||||
|                                               " bytes of memory"); | ||||
| #endif | ||||
|                         } | ||||
|                     } | ||||
|                 } // foreach | ||||
|             } // lock | ||||
|         } | ||||
| 
 | ||||
| 
 | ||||
|         public LSL_BaseClass LoadScript(string FileName) | ||||
|         { | ||||
|             // Find next available AppDomain to put it in | ||||
|             AppDomainStructure FreeAppDomain = GetFreeAppDomain(); | ||||
| 
 | ||||
|             Console.WriteLine("Loading into AppDomain: " + FileName); | ||||
|             LSL_BaseClass mbrt = | ||||
|                 (LSL_BaseClass) | ||||
|                 FreeAppDomain.CurrentAppDomain.CreateInstanceFromAndUnwrap(FileName, "SecondLife.Script"); | ||||
|             //Console.WriteLine("ScriptEngine AppDomainManager: is proxy={0}", RemotingServices.IsTransparentProxy(mbrt)); | ||||
|             FreeAppDomain.ScriptsLoaded++; | ||||
| 
 | ||||
|             return mbrt; | ||||
|         } | ||||
| 
 | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Increase "dead script" counter for an AppDomain | ||||
|         /// </summary> | ||||
|         /// <param name="ad"></param> | ||||
|         //[Obsolete("Needs fixing, needs a real purpose in life!!!")] | ||||
|         public void StopScript(AppDomain ad) | ||||
|         { | ||||
|             lock (freeLock) | ||||
|             { | ||||
|                 Console.WriteLine("Stopping script in AppDomain"); | ||||
|                 // Check if it is current AppDomain | ||||
|                 if (currentAD.CurrentAppDomain == ad) | ||||
|                 { | ||||
|                     // Yes - increase | ||||
|                     currentAD.ScriptsWaitingUnload++; | ||||
|                     return; | ||||
|                 } | ||||
| 
 | ||||
|                 // Lopp through all AppDomains | ||||
|                 foreach (AppDomainStructure ads in new ArrayList(appDomains)) | ||||
|                 { | ||||
|                     if (ads.CurrentAppDomain == ad) | ||||
|                     { | ||||
|                         // Found it | ||||
|                         ads.ScriptsWaitingUnload++; | ||||
|                         break; | ||||
|                     } | ||||
|                 } // foreach | ||||
|             } // lock | ||||
| 
 | ||||
|             UnloadAppDomains(); // Outsite lock, has its own GetLock | ||||
|         } | ||||
|     } | ||||
| } | ||||
| /* | ||||
| * Copyright (c) Contributors, http://opensimulator.org/ | ||||
| * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||||
| * | ||||
| * Redistribution and use in source and binary forms, with or without | ||||
| * modification, are permitted provided that the following conditions are met: | ||||
| *     * Redistributions of source code must retain the above copyright | ||||
| *       notice, this list of conditions and the following disclaimer. | ||||
| *     * Redistributions in binary form must reproduce the above copyright | ||||
| *       notice, this list of conditions and the following disclaimer in the | ||||
| *       documentation and/or other materials provided with the distribution. | ||||
| *     * Neither the name of the OpenSim Project nor the | ||||
| *       names of its contributors may be used to endorse or promote products | ||||
| *       derived from this software without specific prior written permission. | ||||
| * | ||||
| * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||||
| * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||||
| * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||||
| * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||||
| * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||||
| * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||||
| * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||||
| * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
| *  | ||||
| */ | ||||
| 
 | ||||
| using System; | ||||
| using System.Collections; | ||||
| using System.Collections.Generic; | ||||
| using System.Reflection; | ||||
| using OpenSim.Grid.ScriptEngine.DotNetEngine.Compiler.LSL; | ||||
| 
 | ||||
| namespace OpenSim.Grid.ScriptEngine.DotNetEngine | ||||
| { | ||||
|     public class AppDomainManager | ||||
|     { | ||||
|         private int maxScriptsPerAppDomain = 1; | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Internal list of all AppDomains | ||||
|         /// </summary> | ||||
|         private List<AppDomainStructure> appDomains = new List<AppDomainStructure>(); | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Structure to keep track of data around AppDomain | ||||
|         /// </summary> | ||||
|         private class AppDomainStructure | ||||
|         { | ||||
|             /// <summary> | ||||
|             /// The AppDomain itself | ||||
|             /// </summary> | ||||
|             public AppDomain CurrentAppDomain; | ||||
| 
 | ||||
|             /// <summary> | ||||
|             /// Number of scripts loaded into AppDomain | ||||
|             /// </summary> | ||||
|             public int ScriptsLoaded; | ||||
| 
 | ||||
|             /// <summary> | ||||
|             /// Number of dead scripts | ||||
|             /// </summary> | ||||
|             public int ScriptsWaitingUnload; | ||||
|         } | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Current AppDomain | ||||
|         /// </summary> | ||||
|         private AppDomainStructure currentAD; | ||||
| 
 | ||||
|         private object getLock = new object(); // Mutex | ||||
|         private object freeLock = new object(); // Mutex | ||||
| 
 | ||||
|         //private ScriptEngine m_scriptEngine; | ||||
|         //public AppDomainManager(ScriptEngine scriptEngine) | ||||
|         public AppDomainManager() | ||||
|         { | ||||
|             //m_scriptEngine = scriptEngine; | ||||
|         } | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Find a free AppDomain, creating one if necessary | ||||
|         /// </summary> | ||||
|         /// <returns>Free AppDomain</returns> | ||||
|         private AppDomainStructure GetFreeAppDomain() | ||||
|         { | ||||
|             Console.WriteLine("Finding free AppDomain"); | ||||
|             lock (getLock) | ||||
|             { | ||||
|                 // Current full? | ||||
|                 if (currentAD != null && currentAD.ScriptsLoaded >= maxScriptsPerAppDomain) | ||||
|                 { | ||||
|                     // Add it to AppDomains list and empty current | ||||
|                     appDomains.Add(currentAD); | ||||
|                     currentAD = null; | ||||
|                 } | ||||
|                 // No current | ||||
|                 if (currentAD == null) | ||||
|                 { | ||||
|                     // Create a new current AppDomain | ||||
|                     currentAD = new AppDomainStructure(); | ||||
|                     currentAD.CurrentAppDomain = PrepareNewAppDomain(); | ||||
|                 } | ||||
| 
 | ||||
|                 Console.WriteLine("Scripts loaded in this Appdomain: " + currentAD.ScriptsLoaded); | ||||
|                 return currentAD; | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         private int AppDomainNameCount; | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Create and prepare a new AppDomain for scripts | ||||
|         /// </summary> | ||||
|         /// <returns>The new AppDomain</returns> | ||||
|         private AppDomain PrepareNewAppDomain() | ||||
|         { | ||||
|             // Create and prepare a new AppDomain | ||||
|             AppDomainNameCount++; | ||||
|             // TODO: Currently security match current appdomain | ||||
| 
 | ||||
|             // Construct and initialize settings for a second AppDomain. | ||||
|             AppDomainSetup ads = new AppDomainSetup(); | ||||
|             ads.ApplicationBase = AppDomain.CurrentDomain.BaseDirectory; | ||||
|             ads.DisallowBindingRedirects = false; | ||||
|             ads.DisallowCodeDownload = true; | ||||
|             ads.LoaderOptimization = LoaderOptimization.MultiDomain; // Sounds good ;) | ||||
|             ads.ShadowCopyFiles = "true"; // Enabled shadowing | ||||
|             ads.ConfigurationFile = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile; | ||||
| 
 | ||||
|             AppDomain AD = AppDomain.CreateDomain("ScriptAppDomain_" + AppDomainNameCount, null, ads); | ||||
|             Console.WriteLine("Loading: " + | ||||
|                               AssemblyName.GetAssemblyName("OpenSim.Region.ScriptEngine.Common.dll").ToString()); | ||||
|             AD.Load(AssemblyName.GetAssemblyName("OpenSim.Region.ScriptEngine.Common.dll")); | ||||
| 
 | ||||
|             // Return the new AppDomain | ||||
|             return AD; | ||||
|         } | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Unload appdomains that are full and have only dead scripts | ||||
|         /// </summary> | ||||
|         private void UnloadAppDomains() | ||||
|         { | ||||
|             lock (freeLock) | ||||
|             { | ||||
|                 // Go through all | ||||
|                 foreach (AppDomainStructure ads in new ArrayList(appDomains)) | ||||
|                 { | ||||
|                     // Don't process current AppDomain | ||||
|                     if (ads.CurrentAppDomain != currentAD.CurrentAppDomain) | ||||
|                     { | ||||
|                         // Not current AppDomain | ||||
|                         // Is number of unloaded bigger or equal to number of loaded? | ||||
|                         if (ads.ScriptsLoaded <= ads.ScriptsWaitingUnload) | ||||
|                         { | ||||
|                             Console.WriteLine("Found empty AppDomain, unloading"); | ||||
|                             // Remove from internal list | ||||
|                             appDomains.Remove(ads); | ||||
| #if DEBUG | ||||
|                             long m = GC.GetTotalMemory(true); | ||||
| #endif | ||||
|                             // Unload | ||||
|                             AppDomain.Unload(ads.CurrentAppDomain); | ||||
| #if DEBUG | ||||
|                             Console.WriteLine("AppDomain unload freed " + (m - GC.GetTotalMemory(true)) + | ||||
|                                               " bytes of memory"); | ||||
| #endif | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         public LSL_BaseClass LoadScript(string FileName) | ||||
|         { | ||||
|             // Find next available AppDomain to put it in | ||||
|             AppDomainStructure FreeAppDomain = GetFreeAppDomain(); | ||||
| 
 | ||||
|             Console.WriteLine("Loading into AppDomain: " + FileName); | ||||
|             LSL_BaseClass mbrt = | ||||
|                 (LSL_BaseClass) | ||||
|                 FreeAppDomain.CurrentAppDomain.CreateInstanceFromAndUnwrap(FileName, "SecondLife.Script"); | ||||
|             //Console.WriteLine("ScriptEngine AppDomainManager: is proxy={0}", RemotingServices.IsTransparentProxy(mbrt)); | ||||
|             FreeAppDomain.ScriptsLoaded++; | ||||
| 
 | ||||
|             return mbrt; | ||||
|         } | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Increase "dead script" counter for an AppDomain | ||||
|         /// </summary> | ||||
|         /// <param name="ad"></param> | ||||
|         //[Obsolete("Needs fixing, needs a real purpose in life!!!")] | ||||
|         public void StopScript(AppDomain ad) | ||||
|         { | ||||
|             lock (freeLock) | ||||
|             { | ||||
|                 Console.WriteLine("Stopping script in AppDomain"); | ||||
|                 // Check if it is current AppDomain | ||||
|                 if (currentAD.CurrentAppDomain == ad) | ||||
|                 { | ||||
|                     // Yes - increase | ||||
|                     currentAD.ScriptsWaitingUnload++; | ||||
|                     return; | ||||
|                 } | ||||
| 
 | ||||
|                 // Lopp through all AppDomains | ||||
|                 foreach (AppDomainStructure ads in new ArrayList(appDomains)) | ||||
|                 { | ||||
|                     if (ads.CurrentAppDomain == ad) | ||||
|                     { | ||||
|                         // Found it | ||||
|                         ads.ScriptsWaitingUnload++; | ||||
|                         break; | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
|             UnloadAppDomains(); // Outsite lock, has its own GetLock | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  |  | |||
|  | @ -1,55 +1,58 @@ | |||
| /* | ||||
| * Copyright (c) Contributors, http://opensimulator.org/ | ||||
| * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||||
| * | ||||
| * Redistribution and use in source and binary forms, with or without | ||||
| * modification, are permitted provided that the following conditions are met: | ||||
| *     * Redistributions of source code must retain the above copyright | ||||
| *       notice, this list of conditions and the following disclaimer. | ||||
| *     * Redistributions in binary form must reproduce the above copyright | ||||
| *       notice, this list of conditions and the following disclaimer in the | ||||
| *       documentation and/or other materials provided with the distribution. | ||||
| *     * Neither the name of the OpenSim Project nor the | ||||
| *       names of its contributors may be used to endorse or promote products | ||||
| *       derived from this software without specific prior written permission. | ||||
| * | ||||
| * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||||
| * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||||
| * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||||
| * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||||
| * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||||
| * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||||
| * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||||
| * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
| *  | ||||
| */ | ||||
| /* Original code: Tedd Hansen */ | ||||
| namespace OpenSim.Grid.ScriptEngine.DotNetEngine | ||||
| { | ||||
|     public static class Common | ||||
|     { | ||||
|         public static bool debug = true; | ||||
|         public static ScriptEngine mySE; | ||||
| 
 | ||||
|         //public delegate void SendToDebugEventDelegate(string Message); | ||||
|         //public delegate void SendToLogEventDelegate(string Message); | ||||
|         //static public event SendToDebugEventDelegate SendToDebugEvent; | ||||
|         //static public event SendToLogEventDelegate SendToLogEvent; | ||||
| 
 | ||||
|         public static void SendToDebug(string Message) | ||||
|         { | ||||
|             //if (Debug == true) | ||||
|             mySE.Log.Verbose("ScriptEngine", "Debug: " + Message); | ||||
|             //SendToDebugEvent("\r\n" + DateTime.Now.ToString("[HH:mm:ss] ") + Message); | ||||
|         } | ||||
| 
 | ||||
|         public static void SendToLog(string Message) | ||||
|         { | ||||
|             //if (Debug == true) | ||||
|             mySE.Log.Verbose("ScriptEngine", "LOG: " + Message); | ||||
|             //SendToLogEvent("\r\n" + DateTime.Now.ToString("[HH:mm:ss] ") + Message); | ||||
|         } | ||||
|     } | ||||
| } | ||||
| /* | ||||
| * Copyright (c) Contributors, http://opensimulator.org/ | ||||
| * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||||
| * | ||||
| * Redistribution and use in source and binary forms, with or without | ||||
| * modification, are permitted provided that the following conditions are met: | ||||
| *     * Redistributions of source code must retain the above copyright | ||||
| *       notice, this list of conditions and the following disclaimer. | ||||
| *     * Redistributions in binary form must reproduce the above copyright | ||||
| *       notice, this list of conditions and the following disclaimer in the | ||||
| *       documentation and/or other materials provided with the distribution. | ||||
| *     * Neither the name of the OpenSim Project nor the | ||||
| *       names of its contributors may be used to endorse or promote products | ||||
| *       derived from this software without specific prior written permission. | ||||
| * | ||||
| * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||||
| * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||||
| * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||||
| * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||||
| * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||||
| * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||||
| * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||||
| * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
| *  | ||||
| */ | ||||
| /* Original code: Tedd Hansen */ | ||||
| 
 | ||||
| namespace OpenSim.Grid.ScriptEngine.DotNetEngine | ||||
| { | ||||
|     public static class Common | ||||
|     { | ||||
|         private static readonly log4net.ILog m_log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); | ||||
| 
 | ||||
|         public static bool debug = true; | ||||
|         public static ScriptEngine mySE; | ||||
| 
 | ||||
|         //public delegate void SendToDebugEventDelegate(string Message); | ||||
|         //public delegate void SendToLogEventDelegate(string Message); | ||||
|         //static public event SendToDebugEventDelegate SendToDebugEvent; | ||||
|         //static public event SendToLogEventDelegate SendToLogEvent; | ||||
| 
 | ||||
|         public static void SendToDebug(string Message) | ||||
|         { | ||||
|             //if (Debug == true) | ||||
|             mySE.m_log.Info("[ScriptEngine]: Debug: " + Message); | ||||
|             //SendToDebugEvent("\r\n" + DateTime.Now.ToString("[HH:mm:ss] ") + Message); | ||||
|         } | ||||
| 
 | ||||
|         public static void SendToLog(string Message) | ||||
|         { | ||||
|             //if (Debug == true) | ||||
|             mySE.m_log.Info("[ScriptEngine]: LOG: " + Message); | ||||
|             //SendToLogEvent("\r\n" + DateTime.Now.ToString("[HH:mm:ss] ") + Message); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  |  | |||
|  | @ -1,146 +1,146 @@ | |||
| /* | ||||
| * Copyright (c) Contributors, http://opensimulator.org/ | ||||
| * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||||
| * | ||||
| * Redistribution and use in source and binary forms, with or without | ||||
| * modification, are permitted provided that the following conditions are met: | ||||
| *     * Redistributions of source code must retain the above copyright | ||||
| *       notice, this list of conditions and the following disclaimer. | ||||
| *     * Redistributions in binary form must reproduce the above copyright | ||||
| *       notice, this list of conditions and the following disclaimer in the | ||||
| *       documentation and/or other materials provided with the distribution. | ||||
| *     * Neither the name of the OpenSim Project nor the | ||||
| *       names of its contributors may be used to endorse or promote products | ||||
| *       derived from this software without specific prior written permission. | ||||
| * | ||||
| * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS AS IS AND ANY | ||||
| * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||||
| * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||||
| * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||||
| * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||||
| * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||||
| * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||||
| * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
| *  | ||||
| */ | ||||
| 
 | ||||
| using System; | ||||
| using System.CodeDom.Compiler; | ||||
| using System.IO; | ||||
| using System.Reflection; | ||||
| using Microsoft.CSharp; | ||||
| 
 | ||||
| namespace OpenSim.Grid.ScriptEngine.DotNetEngine.Compiler.LSL | ||||
| { | ||||
|     public class Compiler | ||||
|     { | ||||
|         private LSL2CSConverter LSL_Converter = new LSL2CSConverter(); | ||||
|         private CSharpCodeProvider codeProvider = new CSharpCodeProvider(); | ||||
|         private static UInt64 scriptCompileCounter = 0; | ||||
|         //private ICodeCompiler icc = codeProvider.CreateCompiler(); | ||||
|         public string CompileFromFile(string LSOFileName) | ||||
|         { | ||||
|             switch (Path.GetExtension(LSOFileName).ToLower()) | ||||
|             { | ||||
|                 case ".txt": | ||||
|                 case ".lsl": | ||||
|                     Common.SendToDebug("Source code is LSL, converting to CS"); | ||||
|                     return CompileFromLSLText(File.ReadAllText(LSOFileName)); | ||||
|                 case ".cs": | ||||
|                     Common.SendToDebug("Source code is CS"); | ||||
|                     return CompileFromCSText(File.ReadAllText(LSOFileName)); | ||||
|                 default: | ||||
|                     throw new Exception("Unknown script type."); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Converts script from LSL to CS and calls CompileFromCSText | ||||
|         /// </summary> | ||||
|         /// <param name="Script">LSL script</param> | ||||
|         /// <returns>Filename to .dll assembly</returns> | ||||
|         public string CompileFromLSLText(string Script) | ||||
|         { | ||||
|             if (Script.Substring(0, 4).ToLower() == "//c#") | ||||
|             { | ||||
|                 return CompileFromCSText(Script); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 return CompileFromCSText(LSL_Converter.Convert(Script)); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Compile CS script to .Net assembly (.dll) | ||||
|         /// </summary> | ||||
|         /// <param name="Script">CS script</param> | ||||
|         /// <returns>Filename to .dll assembly</returns> | ||||
|         public string CompileFromCSText(string Script) | ||||
|         { | ||||
|             // Output assembly name | ||||
|             scriptCompileCounter++; | ||||
|             string OutFile = Path.Combine("ScriptEngines", "Script_" + scriptCompileCounter + ".dll"); | ||||
|             try | ||||
|             { | ||||
|                 File.Delete(OutFile); | ||||
|             } | ||||
|             catch (Exception e) | ||||
|             { | ||||
|                 Console.WriteLine("Exception attempting to delete old compiled script: " + e.ToString()); | ||||
|             } | ||||
|             //string OutFile = Path.Combine("ScriptEngines", "SecondLife.Script.dll"); | ||||
| 
 | ||||
|             // DEBUG - write source to disk | ||||
|             try | ||||
|             { | ||||
|                 File.WriteAllText( | ||||
|                     Path.Combine("ScriptEngines", "debug_" + Path.GetFileNameWithoutExtension(OutFile) + ".cs"), Script); | ||||
|             } | ||||
|             catch | ||||
|             { | ||||
|             } | ||||
| 
 | ||||
|             // Do actual compile | ||||
|             CompilerParameters parameters = new CompilerParameters(); | ||||
|             parameters.IncludeDebugInformation = true; | ||||
|             // Add all available assemblies | ||||
|             foreach (Assembly asm in AppDomain.CurrentDomain.GetAssemblies()) | ||||
|             { | ||||
|                 //Console.WriteLine("Adding assembly: " + asm.Location); | ||||
|                 //parameters.ReferencedAssemblies.Add(asm.Location); | ||||
|             } | ||||
| 
 | ||||
|             string rootPath = Path.GetDirectoryName(AppDomain.CurrentDomain.BaseDirectory); | ||||
|             string rootPathSE = Path.GetDirectoryName(GetType().Assembly.Location); | ||||
|             //Console.WriteLine("Assembly location: " + rootPath); | ||||
|             parameters.ReferencedAssemblies.Add(Path.Combine(rootPath, "OpenSim.Region.ScriptEngine.Common.dll")); | ||||
|             parameters.ReferencedAssemblies.Add(Path.Combine(rootPathSE, "OpenSim.Grid.ScriptEngine.DotNetEngine.dll")); | ||||
| 
 | ||||
|             //parameters.ReferencedAssemblies.Add("OpenSim.Region.Environment"); | ||||
|             parameters.GenerateExecutable = false; | ||||
|             parameters.OutputAssembly = OutFile; | ||||
|             parameters.IncludeDebugInformation = false; | ||||
|             CompilerResults results = codeProvider.CompileAssemblyFromSource(parameters, Script); | ||||
| 
 | ||||
|             // Go through errors | ||||
|             // TODO: Return errors to user somehow | ||||
|             if (results.Errors.Count > 0) | ||||
|             { | ||||
|                 string errtext = ""; | ||||
|                 foreach (CompilerError CompErr in results.Errors) | ||||
|                 { | ||||
|                     errtext += "Line number " + (CompErr.Line - 1) + | ||||
|                                ", Error Number: " + CompErr.ErrorNumber + | ||||
|                                ", '" + CompErr.ErrorText + "'\r\n"; | ||||
|                 } | ||||
|                 throw new Exception(errtext); | ||||
|             } | ||||
| 
 | ||||
| 
 | ||||
|             return OutFile; | ||||
|         } | ||||
|     } | ||||
| } | ||||
| /* | ||||
| * Copyright (c) Contributors, http://opensimulator.org/ | ||||
| * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||||
| * | ||||
| * Redistribution and use in source and binary forms, with or without | ||||
| * modification, are permitted provided that the following conditions are met: | ||||
| *     * Redistributions of source code must retain the above copyright | ||||
| *       notice, this list of conditions and the following disclaimer. | ||||
| *     * Redistributions in binary form must reproduce the above copyright | ||||
| *       notice, this list of conditions and the following disclaimer in the | ||||
| *       documentation and/or other materials provided with the distribution. | ||||
| *     * Neither the name of the OpenSim Project nor the | ||||
| *       names of its contributors may be used to endorse or promote products | ||||
| *       derived from this software without specific prior written permission. | ||||
| * | ||||
| * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||||
| * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||||
| * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||||
| * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||||
| * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||||
| * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||||
| * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||||
| * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
| *  | ||||
| */ | ||||
| 
 | ||||
| using System; | ||||
| using System.CodeDom.Compiler; | ||||
| using System.IO; | ||||
| using System.Reflection; | ||||
| using Microsoft.CSharp; | ||||
| 
 | ||||
| namespace OpenSim.Grid.ScriptEngine.DotNetEngine.Compiler.LSL | ||||
| { | ||||
|     public class Compiler | ||||
|     { | ||||
|         private LSL2CSConverter LSL_Converter = new LSL2CSConverter(); | ||||
|         private CSharpCodeProvider codeProvider = new CSharpCodeProvider(); | ||||
|         private static UInt64 scriptCompileCounter = 0; | ||||
|         //private ICodeCompiler icc = codeProvider.CreateCompiler(); | ||||
|         public string CompileFromFile(string LSOFileName) | ||||
|         { | ||||
|             switch (Path.GetExtension(LSOFileName).ToLower()) | ||||
|             { | ||||
|                 case ".txt": | ||||
|                 case ".lsl": | ||||
|                     Common.SendToDebug("Source code is LSL, converting to CS"); | ||||
|                     return CompileFromLSLText(File.ReadAllText(LSOFileName)); | ||||
|                 case ".cs": | ||||
|                     Common.SendToDebug("Source code is CS"); | ||||
|                     return CompileFromCSText(File.ReadAllText(LSOFileName)); | ||||
|                 default: | ||||
|                     throw new Exception("Unknown script type."); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Converts script from LSL to CS and calls CompileFromCSText | ||||
|         /// </summary> | ||||
|         /// <param name="Script">LSL script</param> | ||||
|         /// <returns>Filename to .dll assembly</returns> | ||||
|         public string CompileFromLSLText(string Script) | ||||
|         { | ||||
|             if (Script.Substring(0, 4).ToLower() == "//c#") | ||||
|             { | ||||
|                 return CompileFromCSText(Script); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 return CompileFromCSText(LSL_Converter.Convert(Script)); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Compile CS script to .Net assembly (.dll) | ||||
|         /// </summary> | ||||
|         /// <param name="Script">CS script</param> | ||||
|         /// <returns>Filename to .dll assembly</returns> | ||||
|         public string CompileFromCSText(string Script) | ||||
|         { | ||||
|             // Output assembly name | ||||
|             scriptCompileCounter++; | ||||
|             string OutFile = Path.Combine("ScriptEngines", "Script_" + scriptCompileCounter + ".dll"); | ||||
|             try | ||||
|             { | ||||
|                 File.Delete(OutFile); | ||||
|             } | ||||
|             catch (Exception e) | ||||
|             { | ||||
|                 Console.WriteLine("Exception attempting to delete old compiled script: " + e.ToString()); | ||||
|             } | ||||
|             //string OutFile = Path.Combine("ScriptEngines", "SecondLife.Script.dll"); | ||||
| 
 | ||||
|             // DEBUG - write source to disk | ||||
|             try | ||||
|             { | ||||
|                 File.WriteAllText( | ||||
|                     Path.Combine("ScriptEngines", "debug_" + Path.GetFileNameWithoutExtension(OutFile) + ".cs"), Script); | ||||
|             } | ||||
|             catch | ||||
|             { | ||||
|             } | ||||
| 
 | ||||
|             // Do actual compile | ||||
|             CompilerParameters parameters = new CompilerParameters(); | ||||
|             parameters.IncludeDebugInformation = true; | ||||
|             // Add all available assemblies | ||||
|             foreach (Assembly asm in AppDomain.CurrentDomain.GetAssemblies()) | ||||
|             { | ||||
|                 //Console.WriteLine("Adding assembly: " + asm.Location); | ||||
|                 //parameters.ReferencedAssemblies.Add(asm.Location); | ||||
|             } | ||||
| 
 | ||||
|             string rootPath = Path.GetDirectoryName(AppDomain.CurrentDomain.BaseDirectory); | ||||
|             string rootPathSE = Path.GetDirectoryName(GetType().Assembly.Location); | ||||
|             //Console.WriteLine("Assembly location: " + rootPath); | ||||
|             parameters.ReferencedAssemblies.Add(Path.Combine(rootPath, "OpenSim.Region.ScriptEngine.Common.dll")); | ||||
|             parameters.ReferencedAssemblies.Add(Path.Combine(rootPathSE, "OpenSim.Grid.ScriptEngine.DotNetEngine.dll")); | ||||
| 
 | ||||
|             //parameters.ReferencedAssemblies.Add("OpenSim.Region.Environment"); | ||||
|             parameters.GenerateExecutable = false; | ||||
|             parameters.OutputAssembly = OutFile; | ||||
|             parameters.IncludeDebugInformation = false; | ||||
|             CompilerResults results = codeProvider.CompileAssemblyFromSource(parameters, Script); | ||||
| 
 | ||||
|             // Go through errors | ||||
|             // TODO: Return errors to user somehow | ||||
|             if (results.Errors.Count > 0) | ||||
|             { | ||||
|                 string errtext = ""; | ||||
|                 foreach (CompilerError CompErr in results.Errors) | ||||
|                 { | ||||
|                     errtext += "Line number " + (CompErr.Line - 1) + | ||||
|                                ", Error Number: " + CompErr.ErrorNumber + | ||||
|                                ", '" + CompErr.ErrorText + "'\r\n"; | ||||
|                 } | ||||
|                 throw new Exception(errtext); | ||||
|             } | ||||
| 
 | ||||
| 
 | ||||
|             return OutFile; | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  |  | |||
|  | @ -1,316 +1,316 @@ | |||
| /* | ||||
| * Copyright (c) Contributors, http://opensimulator.org/ | ||||
| * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||||
| * | ||||
| * Redistribution and use in source and binary forms, with or without | ||||
| * modification, are permitted provided that the following conditions are met: | ||||
| *     * Redistributions of source code must retain the above copyright | ||||
| *       notice, this list of conditions and the following disclaimer. | ||||
| *     * Redistributions in binary form must reproduce the above copyright | ||||
| *       notice, this list of conditions and the following disclaimer in the | ||||
| *       documentation and/or other materials provided with the distribution. | ||||
| *     * Neither the name of the OpenSim Project nor the | ||||
| *       names of its contributors may be used to endorse or promote products | ||||
| *       derived from this software without specific prior written permission. | ||||
| * | ||||
| * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS AS IS AND ANY | ||||
| * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||||
| * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||||
| * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||||
| * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||||
| * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||||
| * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||||
| * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
| *  | ||||
| */ | ||||
| 
 | ||||
| using System.Collections.Generic; | ||||
| using System.Text.RegularExpressions; | ||||
| 
 | ||||
| namespace OpenSim.Grid.ScriptEngine.DotNetEngine.Compiler.LSL | ||||
| { | ||||
|     public class LSL2CSConverter | ||||
|     { | ||||
|         //private Regex rnw = new Regex(@"[a-zA-Z0-9_\-]", RegexOptions.Compiled); | ||||
|         private Dictionary<string, string> dataTypes = new Dictionary<string, string>(); | ||||
|         private Dictionary<string, string> quotes = new Dictionary<string, string>(); | ||||
| 
 | ||||
|         public LSL2CSConverter() | ||||
|         { | ||||
|             // Only the types we need to convert | ||||
|             dataTypes.Add("void", "void"); | ||||
|             dataTypes.Add("integer", "int"); | ||||
|             dataTypes.Add("float", "double"); | ||||
|             dataTypes.Add("string", "string"); | ||||
|             dataTypes.Add("key", "string"); | ||||
|             dataTypes.Add("vector", "LSL_Types.Vector3"); | ||||
|             dataTypes.Add("rotation", "LSL_Types.Quaternion"); | ||||
|             dataTypes.Add("list", "list"); | ||||
|             dataTypes.Add("null", "null"); | ||||
|         } | ||||
| 
 | ||||
|         public string Convert(string Script) | ||||
|         { | ||||
|             string Return = ""; | ||||
|             Script = " \r\n" + Script; | ||||
| 
 | ||||
|             // | ||||
|             // Prepare script for processing | ||||
|             // | ||||
| 
 | ||||
|             // Clean up linebreaks | ||||
|             Script = Regex.Replace(Script, @"\r\n", "\n"); | ||||
|             Script = Regex.Replace(Script, @"\n", "\r\n"); | ||||
| 
 | ||||
| 
 | ||||
|             // QUOTE REPLACEMENT | ||||
|             // temporarily replace quotes so we can work our magic on the script without | ||||
|             //  always considering if we are inside our outside ""'s | ||||
|             string _Script = ""; | ||||
|             string C; | ||||
|             bool in_quote = false; | ||||
|             bool quote_replaced = false; | ||||
|             string quote_replacement_string = "Q_U_O_T_E_REPLACEMENT_"; | ||||
|             string quote = ""; | ||||
|             bool last_was_escape = false; | ||||
|             int quote_replaced_count = 0; | ||||
|             for (int p = 0; p < Script.Length; p++) | ||||
|             { | ||||
|                 C = Script.Substring(p, 1); | ||||
|                 while (true) | ||||
|                 { | ||||
|                     // found " and last was not \ so this is not an escaped \" | ||||
|                     if (C == "\"" && last_was_escape == false) | ||||
|                     { | ||||
|                         // Toggle inside/outside quote | ||||
|                         in_quote = !in_quote; | ||||
|                         if (in_quote) | ||||
|                         { | ||||
|                             quote_replaced_count++; | ||||
|                         } | ||||
|                         else | ||||
|                         { | ||||
|                             if (quote == "") | ||||
|                             { | ||||
|                                 // We didn't replace quote, probably because of empty string? | ||||
|                                 _Script += quote_replacement_string + | ||||
|                                            quote_replaced_count.ToString().PadLeft(5, "0".ToCharArray()[0]); | ||||
|                             } | ||||
|                             // We just left a quote | ||||
|                             quotes.Add( | ||||
|                                 quote_replacement_string + | ||||
|                                 quote_replaced_count.ToString().PadLeft(5, "0".ToCharArray()[0]), quote); | ||||
|                             quote = ""; | ||||
|                         } | ||||
|                         break; | ||||
|                     } | ||||
| 
 | ||||
|                     if (!in_quote) | ||||
|                     { | ||||
|                         // We are not inside a quote | ||||
|                         quote_replaced = false; | ||||
|                     } | ||||
|                     else | ||||
|                     { | ||||
|                         // We are inside a quote | ||||
|                         if (!quote_replaced) | ||||
|                         { | ||||
|                             // Replace quote | ||||
|                             _Script += quote_replacement_string + | ||||
|                                        quote_replaced_count.ToString().PadLeft(5, "0".ToCharArray()[0]); | ||||
|                             quote_replaced = true; | ||||
|                         } | ||||
|                         quote += C; | ||||
|                         break; | ||||
|                     } | ||||
|                     _Script += C; | ||||
|                     break; | ||||
|                 } | ||||
|                 last_was_escape = false; | ||||
|                 if (C == @"\") | ||||
|                 { | ||||
|                     last_was_escape = true; | ||||
|                 } | ||||
|             } | ||||
|             Script = _Script; | ||||
|             // | ||||
|             // END OF QUOTE REPLACEMENT | ||||
|             // | ||||
| 
 | ||||
| 
 | ||||
|             // | ||||
|             // PROCESS STATES | ||||
|             // Remove state definitions and add state names to start of each event within state | ||||
|             // | ||||
|             int ilevel = 0; | ||||
|             int lastlevel = 0; | ||||
|             string ret = ""; | ||||
|             string cache = ""; | ||||
|             bool in_state = false; | ||||
|             string current_statename = ""; | ||||
|             for (int p = 0; p < Script.Length; p++) | ||||
|             { | ||||
|                 C = Script.Substring(p, 1); | ||||
|                 while (true) | ||||
|                 { | ||||
|                     // inc / dec level | ||||
|                     if (C == @"{") | ||||
|                         ilevel++; | ||||
|                     if (C == @"}") | ||||
|                         ilevel--; | ||||
|                     if (ilevel < 0) | ||||
|                         ilevel = 0; | ||||
|                     cache += C; | ||||
| 
 | ||||
|                     // if level == 0, add to return | ||||
|                     if (ilevel == 1 && lastlevel == 0) | ||||
|                     { | ||||
|                         // 0 => 1: Get last  | ||||
|                         Match m = | ||||
|                             Regex.Match(cache, @"(?![a-zA-Z_]+)\s*([a-zA-Z_]+)[^a-zA-Z_\(\)]*{", | ||||
|                                         RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.Singleline); | ||||
| 
 | ||||
|                         in_state = false; | ||||
|                         if (m.Success) | ||||
|                         { | ||||
|                             // Go back to level 0, this is not a state | ||||
|                             in_state = true; | ||||
|                             current_statename = m.Groups[1].Captures[0].Value; | ||||
|                             //Console.WriteLine("Current statename: " + current_statename); | ||||
|                             cache = | ||||
|                                 Regex.Replace(cache, | ||||
|                                               @"(?<s1>(?![a-zA-Z_]+)\s*)" + @"([a-zA-Z_]+)(?<s2>[^a-zA-Z_\(\)]*){", | ||||
|                                               "${s1}${s2}", | ||||
|                                               RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.Singleline); | ||||
|                         } | ||||
|                         ret += cache; | ||||
|                         cache = ""; | ||||
|                     } | ||||
|                     if (ilevel == 0 && lastlevel == 1) | ||||
|                     { | ||||
|                         // 1 => 0: Remove last } | ||||
|                         if (in_state == true) | ||||
|                         { | ||||
|                             cache = cache.Remove(cache.Length - 1, 1); | ||||
|                             //cache = Regex.Replace(cache, "}$", "", RegexOptions.Multiline | RegexOptions.Singleline); | ||||
| 
 | ||||
|                             //Replace function names | ||||
|                             // void dataserver(key query_id, string data) { | ||||
|                             //cache = Regex.Replace(cache, @"([^a-zA-Z_]\s*)((?!if|switch|for)[a-zA-Z_]+\s*\([^\)]*\)[^{]*{)", "$1" + "<STATE>" + "$2", RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.Singleline); | ||||
|                             //Console.WriteLine("Replacing using statename: " + current_statename); | ||||
|                             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); | ||||
|                         } | ||||
| 
 | ||||
|                         ret += cache; | ||||
|                         cache = ""; | ||||
|                         in_state = true; | ||||
|                         current_statename = ""; | ||||
|                     } | ||||
| 
 | ||||
|                     break; | ||||
|                 } | ||||
|                 lastlevel = ilevel; | ||||
|             } | ||||
|             ret += cache; | ||||
|             cache = ""; | ||||
| 
 | ||||
|             Script = ret; | ||||
|             ret = ""; | ||||
| 
 | ||||
| 
 | ||||
|             foreach (string key in dataTypes.Keys) | ||||
|             { | ||||
|                 string val; | ||||
|                 dataTypes.TryGetValue(key, out val); | ||||
| 
 | ||||
|                 // Replace CAST - (integer) with (int) | ||||
|                 Script = | ||||
|                     Regex.Replace(Script, @"\(" + key + @"\)", @"(" + val + ")", | ||||
|                                   RegexOptions.Compiled | RegexOptions.Multiline); | ||||
|                 // Replace return types and function variables - integer a() and f(integer a, integer a) | ||||
|                 Script = | ||||
|                     Regex.Replace(Script, @"(^|;|}|[\(,])(\s*)" + key + @"(\s*)", @"$1$2" + val + "$3", | ||||
|                                   RegexOptions.Compiled | RegexOptions.Multiline); | ||||
|             } | ||||
| 
 | ||||
|             // Add "void" in front of functions that needs it | ||||
|             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); | ||||
| 
 | ||||
|             // Replace <x,y,z> and <x,y,z,r> | ||||
|             Script = | ||||
|                 Regex.Replace(Script, @"<([^,>]*,[^,>]*,[^,>]*,[^,>]*)>", @"new LSL_Types.Quaternion($1)", | ||||
|                               RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.Singleline); | ||||
|             Script = | ||||
|                 Regex.Replace(Script, @"<([^,>]*,[^,>]*,[^,>]*)>", @"new LSL_Types.Vector3($1)", | ||||
|                               RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.Singleline); | ||||
| 
 | ||||
|             // Replace List []'s | ||||
|             Script = | ||||
|                 Regex.Replace(Script, @"\[([^\]]*)\]", @"List.Parse($1)", | ||||
|                               RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.Singleline); | ||||
| 
 | ||||
| 
 | ||||
|             // Replace (string) to .ToString() // | ||||
|             Script = | ||||
|                 Regex.Replace(Script, @"\(string\)\s*([a-zA-Z0-9_]+(\s*\([^\)]*\))?)", @"$1.ToString()", | ||||
|                               RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.Singleline); | ||||
|             Script = | ||||
|                 Regex.Replace(Script, @"\((float|int)\)\s*([a-zA-Z0-9_]+(\s*\([^\)]*\))?)", @"$1.Parse($2)", | ||||
|                               RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.Singleline); | ||||
| 
 | ||||
| 
 | ||||
|             // REPLACE BACK QUOTES | ||||
|             foreach (string key in quotes.Keys) | ||||
|             { | ||||
|                 string val; | ||||
|                 quotes.TryGetValue(key, out val); | ||||
|                 Script = Script.Replace(key, "\"" + val + "\""); | ||||
|             } | ||||
| 
 | ||||
| 
 | ||||
|             // Add namespace, class name and inheritance | ||||
| 
 | ||||
|             Return = "" + | ||||
|                      "using OpenSim.Region.ScriptEngine.Common;"; | ||||
|             //"using System; " + | ||||
|             //"using System.Collections.Generic; " + | ||||
|             //"using System.Text; " + | ||||
|             //"using OpenSim.Region.ScriptEngine.Common; " + | ||||
|             //"using integer = System.Int32; " + | ||||
|             //"using key = System.String; "; | ||||
| 
 | ||||
|             //// Make a Using out of DataTypes | ||||
|             //// Using integer = System.Int32; | ||||
|             //string _val; | ||||
|             //foreach (string key in DataTypes.Keys) | ||||
|             //{ | ||||
|             //    DataTypes.TryGetValue(key, out _val); | ||||
|             //    if (key != _val) | ||||
|             //    { | ||||
|             //        Return += "using " + key + " = " + _val + "; "; | ||||
|             //    } | ||||
|             //} | ||||
| 
 | ||||
| 
 | ||||
|             Return += "" + | ||||
|                       "namespace SecondLife { "; | ||||
|             Return += "" + | ||||
|                       //"[Serializable] " + | ||||
|                       "public class Script : OpenSim.Grid.ScriptEngine.DotNetEngine.Compiler.LSL.LSL_BaseClass { "; | ||||
|             Return += @"public Script() { } "; | ||||
|             Return += Script; | ||||
|             Return += "} }\r\n"; | ||||
| 
 | ||||
|             return Return; | ||||
|         } | ||||
|     } | ||||
| } | ||||
| /* | ||||
| * Copyright (c) Contributors, http://opensimulator.org/ | ||||
| * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||||
| * | ||||
| * Redistribution and use in source and binary forms, with or without | ||||
| * modification, are permitted provided that the following conditions are met: | ||||
| *     * Redistributions of source code must retain the above copyright | ||||
| *       notice, this list of conditions and the following disclaimer. | ||||
| *     * Redistributions in binary form must reproduce the above copyright | ||||
| *       notice, this list of conditions and the following disclaimer in the | ||||
| *       documentation and/or other materials provided with the distribution. | ||||
| *     * Neither the name of the OpenSim Project nor the | ||||
| *       names of its contributors may be used to endorse or promote products | ||||
| *       derived from this software without specific prior written permission. | ||||
| * | ||||
| * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||||
| * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||||
| * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||||
| * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||||
| * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||||
| * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||||
| * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||||
| * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
| *  | ||||
| */ | ||||
| 
 | ||||
| using System.Collections.Generic; | ||||
| using System.Text.RegularExpressions; | ||||
| 
 | ||||
| namespace OpenSim.Grid.ScriptEngine.DotNetEngine.Compiler.LSL | ||||
| { | ||||
|     public class LSL2CSConverter | ||||
|     { | ||||
|         //private Regex rnw = new Regex(@"[a-zA-Z0-9_\-]", RegexOptions.Compiled); | ||||
|         private Dictionary<string, string> dataTypes = new Dictionary<string, string>(); | ||||
|         private Dictionary<string, string> quotes = new Dictionary<string, string>(); | ||||
| 
 | ||||
|         public LSL2CSConverter() | ||||
|         { | ||||
|             // Only the types we need to convert | ||||
|             dataTypes.Add("void", "void"); | ||||
|             dataTypes.Add("integer", "int"); | ||||
|             dataTypes.Add("float", "double"); | ||||
|             dataTypes.Add("string", "string"); | ||||
|             dataTypes.Add("key", "string"); | ||||
|             dataTypes.Add("vector", "LSL_Types.Vector3"); | ||||
|             dataTypes.Add("rotation", "LSL_Types.Quaternion"); | ||||
|             dataTypes.Add("list", "list"); | ||||
|             dataTypes.Add("null", "null"); | ||||
|         } | ||||
| 
 | ||||
|         public string Convert(string Script) | ||||
|         { | ||||
|             string Return = ""; | ||||
|             Script = " \r\n" + Script; | ||||
| 
 | ||||
|             // | ||||
|             // Prepare script for processing | ||||
|             // | ||||
| 
 | ||||
|             // Clean up linebreaks | ||||
|             Script = Regex.Replace(Script, @"\r\n", "\n"); | ||||
|             Script = Regex.Replace(Script, @"\n", "\r\n"); | ||||
| 
 | ||||
| 
 | ||||
|             // QUOTE REPLACEMENT | ||||
|             // temporarily replace quotes so we can work our magic on the script without | ||||
|             //  always considering if we are inside our outside ""'s | ||||
|             string _Script = ""; | ||||
|             string C; | ||||
|             bool in_quote = false; | ||||
|             bool quote_replaced = false; | ||||
|             string quote_replacement_string = "Q_U_O_T_E_REPLACEMENT_"; | ||||
|             string quote = ""; | ||||
|             bool last_was_escape = false; | ||||
|             int quote_replaced_count = 0; | ||||
|             for (int p = 0; p < Script.Length; p++) | ||||
|             { | ||||
|                 C = Script.Substring(p, 1); | ||||
|                 while (true) | ||||
|                 { | ||||
|                     // found " and last was not \ so this is not an escaped \" | ||||
|                     if (C == "\"" && last_was_escape == false) | ||||
|                     { | ||||
|                         // Toggle inside/outside quote | ||||
|                         in_quote = !in_quote; | ||||
|                         if (in_quote) | ||||
|                         { | ||||
|                             quote_replaced_count++; | ||||
|                         } | ||||
|                         else | ||||
|                         { | ||||
|                             if (quote == "") | ||||
|                             { | ||||
|                                 // We didn't replace quote, probably because of empty string? | ||||
|                                 _Script += quote_replacement_string + | ||||
|                                            quote_replaced_count.ToString().PadLeft(5, "0".ToCharArray()[0]); | ||||
|                             } | ||||
|                             // We just left a quote | ||||
|                             quotes.Add( | ||||
|                                 quote_replacement_string + | ||||
|                                 quote_replaced_count.ToString().PadLeft(5, "0".ToCharArray()[0]), quote); | ||||
|                             quote = ""; | ||||
|                         } | ||||
|                         break; | ||||
|                     } | ||||
| 
 | ||||
|                     if (!in_quote) | ||||
|                     { | ||||
|                         // We are not inside a quote | ||||
|                         quote_replaced = false; | ||||
|                     } | ||||
|                     else | ||||
|                     { | ||||
|                         // We are inside a quote | ||||
|                         if (!quote_replaced) | ||||
|                         { | ||||
|                             // Replace quote | ||||
|                             _Script += quote_replacement_string + | ||||
|                                        quote_replaced_count.ToString().PadLeft(5, "0".ToCharArray()[0]); | ||||
|                             quote_replaced = true; | ||||
|                         } | ||||
|                         quote += C; | ||||
|                         break; | ||||
|                     } | ||||
|                     _Script += C; | ||||
|                     break; | ||||
|                 } | ||||
|                 last_was_escape = false; | ||||
|                 if (C == @"\") | ||||
|                 { | ||||
|                     last_was_escape = true; | ||||
|                 } | ||||
|             } | ||||
|             Script = _Script; | ||||
|             // | ||||
|             // END OF QUOTE REPLACEMENT | ||||
|             // | ||||
| 
 | ||||
| 
 | ||||
|             // | ||||
|             // PROCESS STATES | ||||
|             // Remove state definitions and add state names to start of each event within state | ||||
|             // | ||||
|             int ilevel = 0; | ||||
|             int lastlevel = 0; | ||||
|             string ret = ""; | ||||
|             string cache = ""; | ||||
|             bool in_state = false; | ||||
|             string current_statename = ""; | ||||
|             for (int p = 0; p < Script.Length; p++) | ||||
|             { | ||||
|                 C = Script.Substring(p, 1); | ||||
|                 while (true) | ||||
|                 { | ||||
|                     // inc / dec level | ||||
|                     if (C == @"{") | ||||
|                         ilevel++; | ||||
|                     if (C == @"}") | ||||
|                         ilevel--; | ||||
|                     if (ilevel < 0) | ||||
|                         ilevel = 0; | ||||
|                     cache += C; | ||||
| 
 | ||||
|                     // if level == 0, add to return | ||||
|                     if (ilevel == 1 && lastlevel == 0) | ||||
|                     { | ||||
|                         // 0 => 1: Get last  | ||||
|                         Match m = | ||||
|                             Regex.Match(cache, @"(?![a-zA-Z_]+)\s*([a-zA-Z_]+)[^a-zA-Z_\(\)]*{", | ||||
|                                         RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.Singleline); | ||||
| 
 | ||||
|                         in_state = false; | ||||
|                         if (m.Success) | ||||
|                         { | ||||
|                             // Go back to level 0, this is not a state | ||||
|                             in_state = true; | ||||
|                             current_statename = m.Groups[1].Captures[0].Value; | ||||
|                             //Console.WriteLine("Current statename: " + current_statename); | ||||
|                             cache = | ||||
|                                 Regex.Replace(cache, | ||||
|                                               @"(?<s1>(?![a-zA-Z_]+)\s*)" + @"([a-zA-Z_]+)(?<s2>[^a-zA-Z_\(\)]*){", | ||||
|                                               "${s1}${s2}", | ||||
|                                               RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.Singleline); | ||||
|                         } | ||||
|                         ret += cache; | ||||
|                         cache = ""; | ||||
|                     } | ||||
|                     if (ilevel == 0 && lastlevel == 1) | ||||
|                     { | ||||
|                         // 1 => 0: Remove last } | ||||
|                         if (in_state == true) | ||||
|                         { | ||||
|                             cache = cache.Remove(cache.Length - 1, 1); | ||||
|                             //cache = Regex.Replace(cache, "}$", "", RegexOptions.Multiline | RegexOptions.Singleline); | ||||
| 
 | ||||
|                             //Replace function names | ||||
|                             // void dataserver(key query_id, string data) { | ||||
|                             //cache = Regex.Replace(cache, @"([^a-zA-Z_]\s*)((?!if|switch|for)[a-zA-Z_]+\s*\([^\)]*\)[^{]*{)", "$1" + "<STATE>" + "$2", RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.Singleline); | ||||
|                             //Console.WriteLine("Replacing using statename: " + current_statename); | ||||
|                             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); | ||||
|                         } | ||||
| 
 | ||||
|                         ret += cache; | ||||
|                         cache = ""; | ||||
|                         in_state = true; | ||||
|                         current_statename = ""; | ||||
|                     } | ||||
| 
 | ||||
|                     break; | ||||
|                 } | ||||
|                 lastlevel = ilevel; | ||||
|             } | ||||
|             ret += cache; | ||||
|             cache = ""; | ||||
| 
 | ||||
|             Script = ret; | ||||
|             ret = ""; | ||||
| 
 | ||||
| 
 | ||||
|             foreach (string key in dataTypes.Keys) | ||||
|             { | ||||
|                 string val; | ||||
|                 dataTypes.TryGetValue(key, out val); | ||||
| 
 | ||||
|                 // Replace CAST - (integer) with (int) | ||||
|                 Script = | ||||
|                     Regex.Replace(Script, @"\(" + key + @"\)", @"(" + val + ")", | ||||
|                                   RegexOptions.Compiled | RegexOptions.Multiline); | ||||
|                 // Replace return types and function variables - integer a() and f(integer a, integer a) | ||||
|                 Script = | ||||
|                     Regex.Replace(Script, @"(^|;|}|[\(,])(\s*)" + key + @"(\s*)", @"$1$2" + val + "$3", | ||||
|                                   RegexOptions.Compiled | RegexOptions.Multiline); | ||||
|             } | ||||
| 
 | ||||
|             // Add "void" in front of functions that needs it | ||||
|             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); | ||||
| 
 | ||||
|             // Replace <x,y,z> and <x,y,z,r> | ||||
|             Script = | ||||
|                 Regex.Replace(Script, @"<([^,>]*,[^,>]*,[^,>]*,[^,>]*)>", @"new LSL_Types.Quaternion($1)", | ||||
|                               RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.Singleline); | ||||
|             Script = | ||||
|                 Regex.Replace(Script, @"<([^,>]*,[^,>]*,[^,>]*)>", @"new LSL_Types.Vector3($1)", | ||||
|                               RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.Singleline); | ||||
| 
 | ||||
|             // Replace List []'s | ||||
|             Script = | ||||
|                 Regex.Replace(Script, @"\[([^\]]*)\]", @"List.Parse($1)", | ||||
|                               RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.Singleline); | ||||
| 
 | ||||
| 
 | ||||
|             // Replace (string) to .ToString() // | ||||
|             Script = | ||||
|                 Regex.Replace(Script, @"\(string\)\s*([a-zA-Z0-9_]+(\s*\([^\)]*\))?)", @"$1.ToString()", | ||||
|                               RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.Singleline); | ||||
|             Script = | ||||
|                 Regex.Replace(Script, @"\((float|int)\)\s*([a-zA-Z0-9_]+(\s*\([^\)]*\))?)", @"$1.Parse($2)", | ||||
|                               RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.Singleline); | ||||
| 
 | ||||
| 
 | ||||
|             // REPLACE BACK QUOTES | ||||
|             foreach (string key in quotes.Keys) | ||||
|             { | ||||
|                 string val; | ||||
|                 quotes.TryGetValue(key, out val); | ||||
|                 Script = Script.Replace(key, "\"" + val + "\""); | ||||
|             } | ||||
| 
 | ||||
| 
 | ||||
|             // Add namespace, class name and inheritance | ||||
| 
 | ||||
|             Return = "" + | ||||
|                      "using OpenSim.Region.ScriptEngine.Common;"; | ||||
|             //"using System; " + | ||||
|             //"using System.Collections.Generic; " + | ||||
|             //"using System.Text; " + | ||||
|             //"using OpenSim.Region.ScriptEngine.Common; " + | ||||
|             //"using integer = System.Int32; " + | ||||
|             //"using key = System.String; "; | ||||
| 
 | ||||
|             //// Make a Using out of DataTypes | ||||
|             //// Using integer = System.Int32; | ||||
|             //string _val; | ||||
|             //foreach (string key in DataTypes.Keys) | ||||
|             //{ | ||||
|             //    DataTypes.TryGetValue(key, out _val); | ||||
|             //    if (key != _val) | ||||
|             //    { | ||||
|             //        Return += "using " + key + " = " + _val + "; "; | ||||
|             //    } | ||||
|             //} | ||||
| 
 | ||||
| 
 | ||||
|             Return += "" + | ||||
|                       "namespace SecondLife { "; | ||||
|             Return += "" + | ||||
|                       //"[Serializable] " + | ||||
|                       "public class Script : OpenSim.Grid.ScriptEngine.DotNetEngine.Compiler.LSL.LSL_BaseClass { "; | ||||
|             Return += @"public Script() { } "; | ||||
|             Return += Script; | ||||
|             Return += "} }\r\n"; | ||||
| 
 | ||||
|             return Return; | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  |  | |||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							|  | @ -1,86 +1,86 @@ | |||
| /* | ||||
| * Copyright (c) Contributors, http://opensimulator.org/ | ||||
| * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||||
| * | ||||
| * Redistribution and use in source and binary forms, with or without | ||||
| * modification, are permitted provided that the following conditions are met: | ||||
| *     * Redistributions of source code must retain the above copyright | ||||
| *       notice, this list of conditions and the following disclaimer. | ||||
| *     * Redistributions in binary form must reproduce the above copyright | ||||
| *       notice, this list of conditions and the following disclaimer in the | ||||
| *       documentation and/or other materials provided with the distribution. | ||||
| *     * Neither the name of the OpenSim Project nor the | ||||
| *       names of its contributors may be used to endorse or promote products | ||||
| *       derived from this software without specific prior written permission. | ||||
| * | ||||
| * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS AS IS AND ANY | ||||
| * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||||
| * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||||
| * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||||
| * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||||
| * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||||
| * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||||
| * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
| *  | ||||
| */ | ||||
| 
 | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using OpenSim.Region.ScriptEngine.Common; | ||||
| 
 | ||||
| namespace OpenSim.Grid.ScriptEngine.DotNetEngine.Compiler.LSO | ||||
| { | ||||
|     public partial class LSL_BaseClass | ||||
|     { | ||||
|         //public MemoryStream LSLStack = new MemoryStream(); | ||||
|         public Stack<object> LSLStack = new Stack<object>(); | ||||
|         public Dictionary<uint, object> StaticVariables = new Dictionary<uint, object>(); | ||||
|         public Dictionary<uint, object> GlobalVariables = new Dictionary<uint, object>(); | ||||
|         public Dictionary<uint, object> LocalVariables = new Dictionary<uint, object>(); | ||||
|         //public System.Collections.Generic.List<string> FunctionList = new System.Collections.Generic.List<string>(); | ||||
|         //public void AddFunction(String x) { | ||||
|         //    FunctionList.Add(x); | ||||
|         //} | ||||
|         //public Stack<StackItemStruct> LSLStack = new Stack<StackItemStruct>; | ||||
|         //public struct StackItemStruct | ||||
|         //{ | ||||
|         //    public LSO_Enums.Variable_Type_Codes ItemType; | ||||
|         //    public object Data; | ||||
|         //} | ||||
|         public UInt32 State = 0; | ||||
|         public LSL_BuiltIn_Commands_Interface LSL_Builtins; | ||||
| 
 | ||||
|         public LSL_BuiltIn_Commands_Interface GetLSL_BuiltIn() | ||||
|         { | ||||
|             return LSL_Builtins; | ||||
|         } | ||||
| 
 | ||||
| 
 | ||||
|         public LSL_BaseClass() | ||||
|         { | ||||
|         } | ||||
| 
 | ||||
| 
 | ||||
|         public virtual int OverrideMe() | ||||
|         { | ||||
|             return 0; | ||||
|         } | ||||
| 
 | ||||
|         public void Start(LSL_BuiltIn_Commands_Interface LSLBuiltins) | ||||
|         { | ||||
|             LSL_Builtins = LSLBuiltins; | ||||
| 
 | ||||
|             Common.SendToLog("OpenSim.Grid.ScriptEngine.DotNetEngine.Compiler.LSO.LSL_BaseClass.Start() called"); | ||||
|             //LSL_Builtins.llSay(0, "Test"); | ||||
|             return; | ||||
|         } | ||||
| 
 | ||||
|         public void AddToStatic(UInt32 index, object obj) | ||||
|         { | ||||
|             Common.SendToDebug("AddToStatic: " + index + " type: " + obj.GetType()); | ||||
|             StaticVariables.Add(index, obj); | ||||
|         } | ||||
|     } | ||||
| } | ||||
| /* | ||||
| * Copyright (c) Contributors, http://opensimulator.org/ | ||||
| * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||||
| * | ||||
| * Redistribution and use in source and binary forms, with or without | ||||
| * modification, are permitted provided that the following conditions are met: | ||||
| *     * Redistributions of source code must retain the above copyright | ||||
| *       notice, this list of conditions and the following disclaimer. | ||||
| *     * Redistributions in binary form must reproduce the above copyright | ||||
| *       notice, this list of conditions and the following disclaimer in the | ||||
| *       documentation and/or other materials provided with the distribution. | ||||
| *     * Neither the name of the OpenSim Project nor the | ||||
| *       names of its contributors may be used to endorse or promote products | ||||
| *       derived from this software without specific prior written permission. | ||||
| * | ||||
| * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||||
| * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||||
| * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||||
| * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||||
| * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||||
| * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||||
| * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||||
| * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
| *  | ||||
| */ | ||||
| 
 | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using OpenSim.Region.ScriptEngine.Common; | ||||
| 
 | ||||
| namespace OpenSim.Grid.ScriptEngine.DotNetEngine.Compiler.LSO | ||||
| { | ||||
|     public partial class LSL_BaseClass | ||||
|     { | ||||
|         //public MemoryStream LSLStack = new MemoryStream(); | ||||
|         public Stack<object> LSLStack = new Stack<object>(); | ||||
|         public Dictionary<uint, object> StaticVariables = new Dictionary<uint, object>(); | ||||
|         public Dictionary<uint, object> GlobalVariables = new Dictionary<uint, object>(); | ||||
|         public Dictionary<uint, object> LocalVariables = new Dictionary<uint, object>(); | ||||
|         //public System.Collections.Generic.List<string> FunctionList = new System.Collections.Generic.List<string>(); | ||||
|         //public void AddFunction(String x) { | ||||
|         //    FunctionList.Add(x); | ||||
|         //} | ||||
|         //public Stack<StackItemStruct> LSLStack = new Stack<StackItemStruct>; | ||||
|         //public struct StackItemStruct | ||||
|         //{ | ||||
|         //    public LSO_Enums.Variable_Type_Codes ItemType; | ||||
|         //    public object Data; | ||||
|         //} | ||||
|         public UInt32 State = 0; | ||||
|         public LSL_BuiltIn_Commands_Interface LSL_Builtins; | ||||
| 
 | ||||
|         public LSL_BuiltIn_Commands_Interface GetLSL_BuiltIn() | ||||
|         { | ||||
|             return LSL_Builtins; | ||||
|         } | ||||
| 
 | ||||
| 
 | ||||
|         public LSL_BaseClass() | ||||
|         { | ||||
|         } | ||||
| 
 | ||||
| 
 | ||||
|         public virtual int OverrideMe() | ||||
|         { | ||||
|             return 0; | ||||
|         } | ||||
| 
 | ||||
|         public void Start(LSL_BuiltIn_Commands_Interface LSLBuiltins) | ||||
|         { | ||||
|             LSL_Builtins = LSLBuiltins; | ||||
| 
 | ||||
|             Common.SendToLog("OpenSim.Grid.ScriptEngine.DotNetEngine.Compiler.LSO.LSL_BaseClass.Start() called"); | ||||
|             //LSL_Builtins.llSay(0, "Test"); | ||||
|             return; | ||||
|         } | ||||
| 
 | ||||
|         public void AddToStatic(UInt32 index, object obj) | ||||
|         { | ||||
|             Common.SendToDebug("AddToStatic: " + index + " type: " + obj.GetType()); | ||||
|             StaticVariables.Add(index, obj); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  |  | |||
|  | @ -1,401 +1,401 @@ | |||
| /* | ||||
| * Copyright (c) Contributors, http://opensimulator.org/ | ||||
| * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||||
| * | ||||
| * Redistribution and use in source and binary forms, with or without | ||||
| * modification, are permitted provided that the following conditions are met: | ||||
| *     * Redistributions of source code must retain the above copyright | ||||
| *       notice, this list of conditions and the following disclaimer. | ||||
| *     * Redistributions in binary form must reproduce the above copyright | ||||
| *       notice, this list of conditions and the following disclaimer in the | ||||
| *       documentation and/or other materials provided with the distribution. | ||||
| *     * Neither the name of the OpenSim Project nor the | ||||
| *       names of its contributors may be used to endorse or promote products | ||||
| *       derived from this software without specific prior written permission. | ||||
| * | ||||
| * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS AS IS AND ANY | ||||
| * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||||
| * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||||
| * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||||
| * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||||
| * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||||
| * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||||
| * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
| *  | ||||
| */ | ||||
| 
 | ||||
| //using System; | ||||
| //using System.Collections.Generic; | ||||
| //using System.Text; | ||||
| 
 | ||||
| //namespace OpenSim.Grid.ScriptEngine.DotNetEngine.Compiler.LSO | ||||
| //{ | ||||
| //    public partial class LSL_BaseClass | ||||
| //    { | ||||
| 
 | ||||
| 
 | ||||
| //        public float llSin() { | ||||
| //            float f = (float)LSLStack.Pop(); | ||||
| //            return LSL_Builtins.llSin(f); | ||||
| //        } | ||||
| //        public float llCos() { | ||||
| //            float f = (float)LSLStack.Pop(); | ||||
| //            return LSL_Builtins.llCos(f); | ||||
| //        } | ||||
| //        public float llTan() { | ||||
| //            float f = (float)LSLStack.Pop(); | ||||
| //            return LSL_Builtins.llTan(f); | ||||
| //        } | ||||
| //        public float llAtan2() { | ||||
| //            float x = (float)LSLStack.Pop(); | ||||
| //            float y = (float)LSLStack.Pop(); | ||||
| //            return LSL_Builtins.llAtan2(x, y); | ||||
| //        } | ||||
| //        public float llSqrt() { | ||||
| //            float f = (float)LSLStack.Pop(); | ||||
| //            return LSL_Builtins.llSqrt(f); | ||||
| //        } | ||||
| //        float llPow() | ||||
| //        { | ||||
| //            float fexponent = (float)LSLStack.Pop(); | ||||
| //            float fbase = (float)LSLStack.Pop(); | ||||
| //            return LSL_Builtins.llPow(fbase, fexponent); | ||||
| //        } | ||||
| //        //UInt32 llAbs(UInt32 i){ return; } | ||||
| //        //float llFabs(float f){ return; } | ||||
| //        //float llFrand(float mag){ return; } | ||||
| //        //UInt32 llFloor(float f){ return; } | ||||
| //        //UInt32 llCeil(float f){ return; } | ||||
| //        //UInt32 llRound(float f){ return; } | ||||
| //        //float llVecMag(LSO_Enums.Vector v){ return; } | ||||
| //        //LSO_Enums.Vector llVecNorm(LSO_Enums.Vector v){ return; } | ||||
| //        //float llVecDist(LSO_Enums.Vector a, LSO_Enums.Vector b){ return; } | ||||
| //        //LSO_Enums.Vector llRot2Euler(LSO_Enums.Rotation r){ return; } | ||||
| //        //LSO_Enums.Rotation llEuler2Rot(LSO_Enums.Vector v){ return; } | ||||
| //        //LSO_Enums.Rotation llAxes2Rot(LSO_Enums.Vector fwd, LSO_Enums.Vector left, LSO_Enums.Vector up){ return; } | ||||
| //        //LSO_Enums.Vector llRot2Fwd(LSO_Enums.Rotation r){ return; } | ||||
| //        //LSO_Enums.Vector llRot2Left(LSO_Enums.Rotation r){ return; } | ||||
| //        //LSO_Enums.Vector llRot2Up(LSO_Enums.Rotation r){ return; } | ||||
| //        //LSO_Enums.Rotation llRotBetween(LSO_Enums.Vector start, LSO_Enums.Vector end){ return; } | ||||
| //        public void llWhisper() | ||||
| //        { | ||||
| //            UInt16 i = (UInt16)LSLStack.Pop(); | ||||
| //            string s = (string)LSLStack.Pop(); | ||||
| //            LSL_Builtins.llWhisper(i, s); | ||||
| //        } | ||||
| //        public void llSay() | ||||
| //        { | ||||
| //            UInt16 i = (UInt16)LSLStack.Pop(); | ||||
| //            string s = (string)LSLStack.Pop(); | ||||
| //            LSL_Builtins.llSay(i, s); | ||||
| //        } | ||||
| //        //void llShout(UInt16 channelID, string text); | ||||
| //        //UInt32 llListen(UInt16 channelID, string name, LSO_Enums.Key ID, string msg); | ||||
| //        //void llListenControl(UInt32 number, UInt32 active); | ||||
| //        //void llListenRemove(UInt32 number); | ||||
| //        //void llSensor(string name, LSO_Enums.Key id, UInt32 type, float range, float arc); | ||||
| //        //void llSensorRepeat(string name, LSO_Enums.Key id, UInt32 type, float range, float arc, float rate); | ||||
| //        //void llSensorRemove(); | ||||
| //        //string llDetectedName(UInt32 number); | ||||
| //        //LSO_Enums.Key llDetectedKey(UInt32 number); | ||||
| //        //LSO_Enums.Key llDetectedOwner(UInt32 number); | ||||
| //        //UInt32 llDetectedType(UInt32 number); | ||||
| //        //LSO_Enums.Vector llDetectedPos(UInt32 number); | ||||
| //        //LSO_Enums.Vector llDetectedVel(UInt32 number); | ||||
| //        //LSO_Enums.Vector llDetectedGrab(UInt32 number); | ||||
| //        //LSO_Enums.Rotation llDetectedRot(UInt32 number); | ||||
| //        //UInt32 llDetectedGroup(UInt32 number); | ||||
| //        //UInt32 llDetectedLinkNumber(UInt32 number); | ||||
| //        //void llDie(); | ||||
| //        //float llGround(LSO_Enums.Vector offset); | ||||
| //        //float llCloud(LSO_Enums.Vector offset); | ||||
| //        //LSO_Enums.Vector llWind(LSO_Enums.Vector offset); | ||||
| //        //void llSetStatus(UInt32 status, UInt32 value); | ||||
| //        //UInt32 llGetStatus(UInt32 status); | ||||
| //        //void llSetScale(LSO_Enums.Vector scale); | ||||
| //        //LSO_Enums.Vector llGetScale(); | ||||
| //        //void llSetColor(); | ||||
| //        //float llGetAlpha(); | ||||
| //        //void llSetAlpha(); | ||||
| //        //LSO_Enums.Vector llGetColor(); | ||||
| //        //void llSetTexture(); | ||||
| //        //void llScaleTexture(); | ||||
| //        //void llOffsetTexture(); | ||||
| //        //void llRotateTexture(); | ||||
| //        //string llGetTexture(); | ||||
| //        //void llSetPos(); | ||||
| 
 | ||||
| //        public void llGetPos() { } | ||||
| //        public void llGetLocalPos() { } | ||||
| //        public void llSetRot() { } | ||||
| //        public void llGetRot() { } | ||||
| //        public void llGetLocalRot() { } | ||||
| //        public void llSetForce() { } | ||||
| //        public void llGetForce() { } | ||||
| //        public void llTarget() { } | ||||
| //        public void llTargetRemove() { } | ||||
| //        public void llRotTarget() { } | ||||
| //        public void llRotTargetRemove() { } | ||||
| //        public void llMoveToTarget() { } | ||||
| //        public void llStopMoveToTarget() { } | ||||
| //        public void llApplyImpulse() { } | ||||
| //        public void llApplyRotationalImpulse() { } | ||||
| //        public void llSetTorque() { } | ||||
| //        public void llGetTorque() { } | ||||
| //        public void llSetForceAndTorque() { } | ||||
| //        public void llGetVel() { } | ||||
| //        public void llGetAccel() { } | ||||
| //        public void llGetOmega() { } | ||||
| //        public void llGetTimeOfDay() { } | ||||
| //        public void llGetWallclock() { } | ||||
| //        public void llGetTime() { } | ||||
| //        public void llResetTime() { } | ||||
| //        public void llGetAndResetTime() { } | ||||
| //        public void llSound() { } | ||||
| //        public void llPlaySound() { } | ||||
| //        public void llLoopSound() { } | ||||
| //        public void llLoopSoundMaster() { } | ||||
| //        public void llLoopSoundSlave() { } | ||||
| //        public void llPlaySoundSlave() { } | ||||
| //        public void llTriggerSound() { } | ||||
| //        public void llStopSound() { } | ||||
| //        public void llPreloadSound() { } | ||||
| //        public void llGetSubString() { } | ||||
| //        public void llDeleteSubString() { } | ||||
| //        public void llInsertString() { } | ||||
| //        public void llToUpper() { } | ||||
| //        public void llToLower() { } | ||||
| //        public void llGiveMoney() { } | ||||
| //        public void llMakeExplosion() { } | ||||
| //        public void llMakeFountain() { } | ||||
| //        public void llMakeSmoke() { } | ||||
| //        public void llMakeFire() { } | ||||
| //        public void llRezObject() { } | ||||
| //        public void llLookAt() { } | ||||
| //        public void llStopLookAt() { } | ||||
| //        public void llSetTimerEvent() { } | ||||
| //        public void llSleep() { } | ||||
| //        public void llGetMass() { } | ||||
| //        public void llCollisionFilter() { } | ||||
| //        public void llTakeControls() { } | ||||
| //        public void llReleaseControls() { } | ||||
| //        public void llAttachToAvatar() { } | ||||
| //        public void llDetachFromAvatar() { } | ||||
| //        public void llTakeCamera() { } | ||||
| //        public void llReleaseCamera() { } | ||||
| //        public void llGetOwner() { } | ||||
| //        public void llInstantMessage() { } | ||||
| //        public void llEmail() { } | ||||
| //        public void llGetNextEmail() { } | ||||
| //        public void llGetKey() { } | ||||
| //        public void llSetBuoyancy() { } | ||||
| //        public void llSetHoverHeight() { } | ||||
| //        public void llStopHover() { } | ||||
| //        public void llMinEventDelay() { } | ||||
| //        public void llSoundPreload() { } | ||||
| //        public void llRotLookAt() { } | ||||
| //        public void llStringLength() { } | ||||
| //        public void llStartAnimation() { } | ||||
| //        public void llStopAnimation() { } | ||||
| //        public void llPointAt() { } | ||||
| //        public void llStopPointAt() { } | ||||
| //        public void llTargetOmega() { } | ||||
| //        public void llGetStartParameter() { } | ||||
| //        public void llGodLikeRezObject() { } | ||||
| //        public void llRequestPermissions() { } | ||||
| //        public void llGetPermissionsKey() { } | ||||
| //        public void llGetPermissions() { } | ||||
| //        public void llGetLinkNumber() { } | ||||
| //        public void llSetLinkColor() { } | ||||
| //        public void llCreateLink() { } | ||||
| //        public void llBreakLink() { } | ||||
| //        public void llBreakAllLinks() { } | ||||
| //        public void llGetLinkKey() { } | ||||
| //        public void llGetLinkName() { } | ||||
| //        public void llGetInventoryNumber() { } | ||||
| //        public void llGetInventoryName() { } | ||||
| //        public void llSetScriptState() { } | ||||
| //        public void llGetEnergy() { } | ||||
| //        public void llGiveInventory() { } | ||||
| //        public void llRemoveInventory() { } | ||||
| //        public void llSetText() { } | ||||
| //        public void llWater() { } | ||||
| //        public void llPassTouches() { } | ||||
| //        public void llRequestAgentData() { } | ||||
| //        public void llRequestInventoryData() { } | ||||
| //        public void llSetDamage() { } | ||||
| //        public void llTeleportAgentHome() { } | ||||
| //        public void llModifyLand() { } | ||||
| //        public void llCollisionSound() { } | ||||
| //        public void llCollisionSprite() { } | ||||
| //        public void llGetAnimation() { } | ||||
| //        public void llResetScript() { } | ||||
| //        public void llMessageLinked() { } | ||||
| //        public void llPushObject() { } | ||||
| //        public void llPassCollisions() { } | ||||
| //        public void llGetScriptName() { } | ||||
| //        public void llGetNumberOfSides() { } | ||||
| //        public void llAxisAngle2Rot() { } | ||||
| //        public void llRot2Axis() { } | ||||
| //        public void llRot2Angle() { } | ||||
| //        public void llAcos() { } | ||||
| //        public void llAsin() { } | ||||
| //        public void llAngleBetween() { } | ||||
| //        public void llGetInventoryKey() { } | ||||
| //        public void llAllowInventoryDrop() { } | ||||
| //        public void llGetSunDirection() { } | ||||
| //        public void llGetTextureOffset() { } | ||||
| //        public void llGetTextureScale() { } | ||||
| //        public void llGetTextureRot() { } | ||||
| //        public void llSubStringIndex() { } | ||||
| //        public void llGetOwnerKey() { } | ||||
| //        public void llGetCenterOfMass() { } | ||||
| //        public void llListSort() { } | ||||
| //        public void llGetListLength() { } | ||||
| //        public void llList2Integer() { } | ||||
| //        public void llList2Float() { } | ||||
| //        public void llList2String() { } | ||||
| //        public void llList2Key() { } | ||||
| //        public void llList2Vector() { } | ||||
| //        public void llList2Rot() { } | ||||
| //        public void llList2List() { } | ||||
| //        public void llDeleteSubList() { } | ||||
| //        public void llGetListEntryType() { } | ||||
| //        public void llList2CSV() { } | ||||
| //        public void llCSV2List() { } | ||||
| //        public void llListRandomize() { } | ||||
| //        public void llList2ListStrided() { } | ||||
| //        public void llGetRegionCorner() { } | ||||
| //        public void llListInsertList() { } | ||||
| //        public void llListFindList() { } | ||||
| //        public void llGetObjectName() { } | ||||
| //        public void llSetObjectName() { } | ||||
| //        public void llGetDate() { } | ||||
| //        public void llEdgeOfWorld() { } | ||||
| //        public void llGetAgentInfo() { } | ||||
| //        public void llAdjustSoundVolume() { } | ||||
| //        public void llSetSoundQueueing() { } | ||||
| //        public void llSetSoundRadius() { } | ||||
| //        public void llKey2Name() { } | ||||
| //        public void llSetTextureAnim() { } | ||||
| //        public void llTriggerSoundLimited() { } | ||||
| //        public void llEjectFromLand() { } | ||||
| //        public void llParseString2List() { } | ||||
| //        public void llOverMyLand() { } | ||||
| //        public void llGetLandOwnerAt() { } | ||||
| //        public void llGetNotecardLine() { } | ||||
| //        public void llGetAgentSize() { } | ||||
| //        public void llSameGroup() { } | ||||
| //        public void llUnSit() { } | ||||
| //        public void llGroundSlope() { } | ||||
| //        public void llGroundNormal() { } | ||||
| //        public void llGroundContour() { } | ||||
| //        public void llGetAttached() { } | ||||
| //        public void llGetFreeMemory() { } | ||||
| //        public void llGetRegionName() { } | ||||
| //        public void llGetRegionTimeDilation() { } | ||||
| //        public void llGetRegionFPS() { } | ||||
| //        public void llParticleSystem() { } | ||||
| //        public void llGroundRepel() { } | ||||
| //        public void llGiveInventoryList() { } | ||||
| //        public void llSetVehicleType() { } | ||||
| //        public void llSetVehicleFloatParam() { } | ||||
| //        public void llSetVehicleVectorParam() { } | ||||
| //        public void llSetVehicleRotationParam() { } | ||||
| //        public void llSetVehicleFlags() { } | ||||
| //        public void llRemoveVehicleFlags() { } | ||||
| //        public void llSitTarget() { } | ||||
| //        public void llAvatarOnSitTarget() { } | ||||
| //        public void llAddToLandPassList() { } | ||||
| //        public void llSetTouchText() { } | ||||
| //        public void llSetSitText() { } | ||||
| //        public void llSetCameraEyeOffset() { } | ||||
| //        public void llSetCameraAtOffset() { } | ||||
| //        public void llDumpList2String() { } | ||||
| //        public void llScriptDanger() { } | ||||
| //        public void llDialog() { } | ||||
| //        public void llVolumeDetect() { } | ||||
| //        public void llResetOtherScript() { } | ||||
| //        public void llGetScriptState() { } | ||||
| //        public void llRemoteLoadScript() { } | ||||
| //        public void llSetRemoteScriptAccessPin() { } | ||||
| //        public void llRemoteLoadScriptPin() { } | ||||
| //        public void llOpenRemoteDataChannel() { } | ||||
| //        public void llSendRemoteData() { } | ||||
| //        public void llRemoteDataReply() { } | ||||
| //        public void llCloseRemoteDataChannel() { } | ||||
| //        public void llMD5String() { } | ||||
| //        public void llSetPrimitiveParams() { } | ||||
| //        public void llStringToBase64() { } | ||||
| //        public void llBase64ToString() { } | ||||
| //        public void llXorBase64Strings() { } | ||||
| //        public void llRemoteDataSetRegion() { } | ||||
| //        public void llLog10() { } | ||||
| //        public void llLog() { } | ||||
| //        public void llGetAnimationList() { } | ||||
| //        public void llSetParcelMusicURL() { } | ||||
| //        public void llGetRootPosition() { } | ||||
| //        public void llGetRootRotation() { } | ||||
| //        public void llGetObjectDesc() { } | ||||
| //        public void llSetObjectDesc() { } | ||||
| //        public void llGetCreator() { } | ||||
| //        public void llGetTimestamp() { } | ||||
| //        public void llSetLinkAlpha() { } | ||||
| //        public void llGetNumberOfPrims() { } | ||||
| //        public void llGetNumberOfNotecardLines() { } | ||||
| //        public void llGetBoundingBox() { } | ||||
| //        public void llGetGeometricCenter() { } | ||||
| //        public void llGetPrimitiveParams() { } | ||||
| //        public void llIntegerToBase64() { } | ||||
| //        public void llBase64ToInteger() { } | ||||
| //        public void llGetGMTclock() { } | ||||
| //        public void llGetSimulatorHostname() { } | ||||
| //        public void llSetLocalRot() { } | ||||
| //        public void llParseStringKeepNulls() { } | ||||
| //        public void llRezAtRoot() { } | ||||
| //        public void llGetObjectPermMask() { } | ||||
| //        public void llSetObjectPermMask() { } | ||||
| //        public void llGetInventoryPermMask() { } | ||||
| //        public void llSetInventoryPermMask() { } | ||||
| //        public void llGetInventoryCreator() { } | ||||
| //        public void llOwnerSay() { } | ||||
| //        public void llRequestSimulatorData() { } | ||||
| //        public void llForceMouselook() { } | ||||
| //        public void llGetObjectMass() { } | ||||
| //        public void llListReplaceList() { } | ||||
| //        public void llLoadURL() { } | ||||
| //        public void llParcelMediaCommandList() { } | ||||
| //        public void llParcelMediaQuery() { } | ||||
| //        public void llModPow() { } | ||||
| //        public void llGetInventoryType() { } | ||||
| //        public void llSetPayPrice() { } | ||||
| //        public void llGetCameraPos() { } | ||||
| //        public void llGetCameraRot() { } | ||||
| //        public void llSetPrimURL() { } | ||||
| //        public void llRefreshPrimURL() { } | ||||
| //        public void llEscapeURL() { } | ||||
| //        public void llUnescapeURL() { } | ||||
| //        public void llMapDestination() { } | ||||
| //        public void llAddToLandBanList() { } | ||||
| //        public void llRemoveFromLandPassList() { } | ||||
| //        public void llRemoveFromLandBanList() { } | ||||
| //        public void llSetCameraParams() { } | ||||
| //        public void llClearCameraParams() { } | ||||
| //        public void llListStatistics() { } | ||||
| //        public void llGetUnixTime() { } | ||||
| //        public void llGetParcelFlags() { } | ||||
| //        public void llGetRegionFlags() { } | ||||
| //        public void llXorBase64StringsCorrect() { } | ||||
| //        public void llHTTPRequest() { } | ||||
| //        public void llResetLandBanList() { } | ||||
| //        public void llResetLandPassList() { } | ||||
| //        public void llGetParcelPrimCount() { } | ||||
| //        public void llGetParcelPrimOwners() { } | ||||
| //        public void llGetObjectPrimCount() { } | ||||
| //        public void llGetParcelMaxPrims() { } | ||||
| //        public void llGetParcelDetails() { } | ||||
| 
 | ||||
| //    } | ||||
| //} | ||||
| /* | ||||
| * Copyright (c) Contributors, http://opensimulator.org/ | ||||
| * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||||
| * | ||||
| * Redistribution and use in source and binary forms, with or without | ||||
| * modification, are permitted provided that the following conditions are met: | ||||
| *     * Redistributions of source code must retain the above copyright | ||||
| *       notice, this list of conditions and the following disclaimer. | ||||
| *     * Redistributions in binary form must reproduce the above copyright | ||||
| *       notice, this list of conditions and the following disclaimer in the | ||||
| *       documentation and/or other materials provided with the distribution. | ||||
| *     * Neither the name of the OpenSim Project nor the | ||||
| *       names of its contributors may be used to endorse or promote products | ||||
| *       derived from this software without specific prior written permission. | ||||
| * | ||||
| * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||||
| * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||||
| * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||||
| * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||||
| * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||||
| * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||||
| * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||||
| * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
| *  | ||||
| */ | ||||
| 
 | ||||
| //using System; | ||||
| //using System.Collections.Generic; | ||||
| //using System.Text; | ||||
| 
 | ||||
| //namespace OpenSim.Grid.ScriptEngine.DotNetEngine.Compiler.LSO | ||||
| //{ | ||||
| //    public partial class LSL_BaseClass | ||||
| //    { | ||||
| 
 | ||||
| 
 | ||||
| //        public float llSin() { | ||||
| //            float f = (float)LSLStack.Pop(); | ||||
| //            return LSL_Builtins.llSin(f); | ||||
| //        } | ||||
| //        public float llCos() { | ||||
| //            float f = (float)LSLStack.Pop(); | ||||
| //            return LSL_Builtins.llCos(f); | ||||
| //        } | ||||
| //        public float llTan() { | ||||
| //            float f = (float)LSLStack.Pop(); | ||||
| //            return LSL_Builtins.llTan(f); | ||||
| //        } | ||||
| //        public float llAtan2() { | ||||
| //            float x = (float)LSLStack.Pop(); | ||||
| //            float y = (float)LSLStack.Pop(); | ||||
| //            return LSL_Builtins.llAtan2(x, y); | ||||
| //        } | ||||
| //        public float llSqrt() { | ||||
| //            float f = (float)LSLStack.Pop(); | ||||
| //            return LSL_Builtins.llSqrt(f); | ||||
| //        } | ||||
| //        float llPow() | ||||
| //        { | ||||
| //            float fexponent = (float)LSLStack.Pop(); | ||||
| //            float fbase = (float)LSLStack.Pop(); | ||||
| //            return LSL_Builtins.llPow(fbase, fexponent); | ||||
| //        } | ||||
| //        //UInt32 llAbs(UInt32 i){ return; } | ||||
| //        //float llFabs(float f){ return; } | ||||
| //        //float llFrand(float mag){ return; } | ||||
| //        //UInt32 llFloor(float f){ return; } | ||||
| //        //UInt32 llCeil(float f){ return; } | ||||
| //        //UInt32 llRound(float f){ return; } | ||||
| //        //float llVecMag(LSO_Enums.Vector v){ return; } | ||||
| //        //LSO_Enums.Vector llVecNorm(LSO_Enums.Vector v){ return; } | ||||
| //        //float llVecDist(LSO_Enums.Vector a, LSO_Enums.Vector b){ return; } | ||||
| //        //LSO_Enums.Vector llRot2Euler(LSO_Enums.Rotation r){ return; } | ||||
| //        //LSO_Enums.Rotation llEuler2Rot(LSO_Enums.Vector v){ return; } | ||||
| //        //LSO_Enums.Rotation llAxes2Rot(LSO_Enums.Vector fwd, LSO_Enums.Vector left, LSO_Enums.Vector up){ return; } | ||||
| //        //LSO_Enums.Vector llRot2Fwd(LSO_Enums.Rotation r){ return; } | ||||
| //        //LSO_Enums.Vector llRot2Left(LSO_Enums.Rotation r){ return; } | ||||
| //        //LSO_Enums.Vector llRot2Up(LSO_Enums.Rotation r){ return; } | ||||
| //        //LSO_Enums.Rotation llRotBetween(LSO_Enums.Vector start, LSO_Enums.Vector end){ return; } | ||||
| //        public void llWhisper() | ||||
| //        { | ||||
| //            UInt16 i = (UInt16)LSLStack.Pop(); | ||||
| //            string s = (string)LSLStack.Pop(); | ||||
| //            LSL_Builtins.llWhisper(i, s); | ||||
| //        } | ||||
| //        public void llSay() | ||||
| //        { | ||||
| //            UInt16 i = (UInt16)LSLStack.Pop(); | ||||
| //            string s = (string)LSLStack.Pop(); | ||||
| //            LSL_Builtins.llSay(i, s); | ||||
| //        } | ||||
| //        //void llShout(UInt16 channelID, string text); | ||||
| //        //UInt32 llListen(UInt16 channelID, string name, LSO_Enums.Key ID, string msg); | ||||
| //        //void llListenControl(UInt32 number, UInt32 active); | ||||
| //        //void llListenRemove(UInt32 number); | ||||
| //        //void llSensor(string name, LSO_Enums.Key id, UInt32 type, float range, float arc); | ||||
| //        //void llSensorRepeat(string name, LSO_Enums.Key id, UInt32 type, float range, float arc, float rate); | ||||
| //        //void llSensorRemove(); | ||||
| //        //string llDetectedName(UInt32 number); | ||||
| //        //LSO_Enums.Key llDetectedKey(UInt32 number); | ||||
| //        //LSO_Enums.Key llDetectedOwner(UInt32 number); | ||||
| //        //UInt32 llDetectedType(UInt32 number); | ||||
| //        //LSO_Enums.Vector llDetectedPos(UInt32 number); | ||||
| //        //LSO_Enums.Vector llDetectedVel(UInt32 number); | ||||
| //        //LSO_Enums.Vector llDetectedGrab(UInt32 number); | ||||
| //        //LSO_Enums.Rotation llDetectedRot(UInt32 number); | ||||
| //        //UInt32 llDetectedGroup(UInt32 number); | ||||
| //        //UInt32 llDetectedLinkNumber(UInt32 number); | ||||
| //        //void llDie(); | ||||
| //        //float llGround(LSO_Enums.Vector offset); | ||||
| //        //float llCloud(LSO_Enums.Vector offset); | ||||
| //        //LSO_Enums.Vector llWind(LSO_Enums.Vector offset); | ||||
| //        //void llSetStatus(UInt32 status, UInt32 value); | ||||
| //        //UInt32 llGetStatus(UInt32 status); | ||||
| //        //void llSetScale(LSO_Enums.Vector scale); | ||||
| //        //LSO_Enums.Vector llGetScale(); | ||||
| //        //void llSetColor(); | ||||
| //        //float llGetAlpha(); | ||||
| //        //void llSetAlpha(); | ||||
| //        //LSO_Enums.Vector llGetColor(); | ||||
| //        //void llSetTexture(); | ||||
| //        //void llScaleTexture(); | ||||
| //        //void llOffsetTexture(); | ||||
| //        //void llRotateTexture(); | ||||
| //        //string llGetTexture(); | ||||
| //        //void llSetPos(); | ||||
| 
 | ||||
| //        public void llGetPos() { } | ||||
| //        public void llGetLocalPos() { } | ||||
| //        public void llSetRot() { } | ||||
| //        public void llGetRot() { } | ||||
| //        public void llGetLocalRot() { } | ||||
| //        public void llSetForce() { } | ||||
| //        public void llGetForce() { } | ||||
| //        public void llTarget() { } | ||||
| //        public void llTargetRemove() { } | ||||
| //        public void llRotTarget() { } | ||||
| //        public void llRotTargetRemove() { } | ||||
| //        public void llMoveToTarget() { } | ||||
| //        public void llStopMoveToTarget() { } | ||||
| //        public void llApplyImpulse() { } | ||||
| //        public void llApplyRotationalImpulse() { } | ||||
| //        public void llSetTorque() { } | ||||
| //        public void llGetTorque() { } | ||||
| //        public void llSetForceAndTorque() { } | ||||
| //        public void llGetVel() { } | ||||
| //        public void llGetAccel() { } | ||||
| //        public void llGetOmega() { } | ||||
| //        public void llGetTimeOfDay() { } | ||||
| //        public void llGetWallclock() { } | ||||
| //        public void llGetTime() { } | ||||
| //        public void llResetTime() { } | ||||
| //        public void llGetAndResetTime() { } | ||||
| //        public void llSound() { } | ||||
| //        public void llPlaySound() { } | ||||
| //        public void llLoopSound() { } | ||||
| //        public void llLoopSoundMaster() { } | ||||
| //        public void llLoopSoundSlave() { } | ||||
| //        public void llPlaySoundSlave() { } | ||||
| //        public void llTriggerSound() { } | ||||
| //        public void llStopSound() { } | ||||
| //        public void llPreloadSound() { } | ||||
| //        public void llGetSubString() { } | ||||
| //        public void llDeleteSubString() { } | ||||
| //        public void llInsertString() { } | ||||
| //        public void llToUpper() { } | ||||
| //        public void llToLower() { } | ||||
| //        public void llGiveMoney() { } | ||||
| //        public void llMakeExplosion() { } | ||||
| //        public void llMakeFountain() { } | ||||
| //        public void llMakeSmoke() { } | ||||
| //        public void llMakeFire() { } | ||||
| //        public void llRezObject() { } | ||||
| //        public void llLookAt() { } | ||||
| //        public void llStopLookAt() { } | ||||
| //        public void llSetTimerEvent() { } | ||||
| //        public void llSleep() { } | ||||
| //        public void llGetMass() { } | ||||
| //        public void llCollisionFilter() { } | ||||
| //        public void llTakeControls() { } | ||||
| //        public void llReleaseControls() { } | ||||
| //        public void llAttachToAvatar() { } | ||||
| //        public void llDetachFromAvatar() { } | ||||
| //        public void llTakeCamera() { } | ||||
| //        public void llReleaseCamera() { } | ||||
| //        public void llGetOwner() { } | ||||
| //        public void llInstantMessage() { } | ||||
| //        public void llEmail() { } | ||||
| //        public void llGetNextEmail() { } | ||||
| //        public void llGetKey() { } | ||||
| //        public void llSetBuoyancy() { } | ||||
| //        public void llSetHoverHeight() { } | ||||
| //        public void llStopHover() { } | ||||
| //        public void llMinEventDelay() { } | ||||
| //        public void llSoundPreload() { } | ||||
| //        public void llRotLookAt() { } | ||||
| //        public void llStringLength() { } | ||||
| //        public void llStartAnimation() { } | ||||
| //        public void llStopAnimation() { } | ||||
| //        public void llPointAt() { } | ||||
| //        public void llStopPointAt() { } | ||||
| //        public void llTargetOmega() { } | ||||
| //        public void llGetStartParameter() { } | ||||
| //        public void llGodLikeRezObject() { } | ||||
| //        public void llRequestPermissions() { } | ||||
| //        public void llGetPermissionsKey() { } | ||||
| //        public void llGetPermissions() { } | ||||
| //        public void llGetLinkNumber() { } | ||||
| //        public void llSetLinkColor() { } | ||||
| //        public void llCreateLink() { } | ||||
| //        public void llBreakLink() { } | ||||
| //        public void llBreakAllLinks() { } | ||||
| //        public void llGetLinkKey() { } | ||||
| //        public void llGetLinkName() { } | ||||
| //        public void llGetInventoryNumber() { } | ||||
| //        public void llGetInventoryName() { } | ||||
| //        public void llSetScriptState() { } | ||||
| //        public void llGetEnergy() { } | ||||
| //        public void llGiveInventory() { } | ||||
| //        public void llRemoveInventory() { } | ||||
| //        public void llSetText() { } | ||||
| //        public void llWater() { } | ||||
| //        public void llPassTouches() { } | ||||
| //        public void llRequestAgentData() { } | ||||
| //        public void llRequestInventoryData() { } | ||||
| //        public void llSetDamage() { } | ||||
| //        public void llTeleportAgentHome() { } | ||||
| //        public void llModifyLand() { } | ||||
| //        public void llCollisionSound() { } | ||||
| //        public void llCollisionSprite() { } | ||||
| //        public void llGetAnimation() { } | ||||
| //        public void llResetScript() { } | ||||
| //        public void llMessageLinked() { } | ||||
| //        public void llPushObject() { } | ||||
| //        public void llPassCollisions() { } | ||||
| //        public void llGetScriptName() { } | ||||
| //        public void llGetNumberOfSides() { } | ||||
| //        public void llAxisAngle2Rot() { } | ||||
| //        public void llRot2Axis() { } | ||||
| //        public void llRot2Angle() { } | ||||
| //        public void llAcos() { } | ||||
| //        public void llAsin() { } | ||||
| //        public void llAngleBetween() { } | ||||
| //        public void llGetInventoryKey() { } | ||||
| //        public void llAllowInventoryDrop() { } | ||||
| //        public void llGetSunDirection() { } | ||||
| //        public void llGetTextureOffset() { } | ||||
| //        public void llGetTextureScale() { } | ||||
| //        public void llGetTextureRot() { } | ||||
| //        public void llSubStringIndex() { } | ||||
| //        public void llGetOwnerKey() { } | ||||
| //        public void llGetCenterOfMass() { } | ||||
| //        public void llListSort() { } | ||||
| //        public void llGetListLength() { } | ||||
| //        public void llList2Integer() { } | ||||
| //        public void llList2Float() { } | ||||
| //        public void llList2String() { } | ||||
| //        public void llList2Key() { } | ||||
| //        public void llList2Vector() { } | ||||
| //        public void llList2Rot() { } | ||||
| //        public void llList2List() { } | ||||
| //        public void llDeleteSubList() { } | ||||
| //        public void llGetListEntryType() { } | ||||
| //        public void llList2CSV() { } | ||||
| //        public void llCSV2List() { } | ||||
| //        public void llListRandomize() { } | ||||
| //        public void llList2ListStrided() { } | ||||
| //        public void llGetRegionCorner() { } | ||||
| //        public void llListInsertList() { } | ||||
| //        public void llListFindList() { } | ||||
| //        public void llGetObjectName() { } | ||||
| //        public void llSetObjectName() { } | ||||
| //        public void llGetDate() { } | ||||
| //        public void llEdgeOfWorld() { } | ||||
| //        public void llGetAgentInfo() { } | ||||
| //        public void llAdjustSoundVolume() { } | ||||
| //        public void llSetSoundQueueing() { } | ||||
| //        public void llSetSoundRadius() { } | ||||
| //        public void llKey2Name() { } | ||||
| //        public void llSetTextureAnim() { } | ||||
| //        public void llTriggerSoundLimited() { } | ||||
| //        public void llEjectFromLand() { } | ||||
| //        public void llParseString2List() { } | ||||
| //        public void llOverMyLand() { } | ||||
| //        public void llGetLandOwnerAt() { } | ||||
| //        public void llGetNotecardLine() { } | ||||
| //        public void llGetAgentSize() { } | ||||
| //        public void llSameGroup() { } | ||||
| //        public void llUnSit() { } | ||||
| //        public void llGroundSlope() { } | ||||
| //        public void llGroundNormal() { } | ||||
| //        public void llGroundContour() { } | ||||
| //        public void llGetAttached() { } | ||||
| //        public void llGetFreeMemory() { } | ||||
| //        public void llGetRegionName() { } | ||||
| //        public void llGetRegionTimeDilation() { } | ||||
| //        public void llGetRegionFPS() { } | ||||
| //        public void llParticleSystem() { } | ||||
| //        public void llGroundRepel() { } | ||||
| //        public void llGiveInventoryList() { } | ||||
| //        public void llSetVehicleType() { } | ||||
| //        public void llSetVehicleFloatParam() { } | ||||
| //        public void llSetVehicleVectorParam() { } | ||||
| //        public void llSetVehicleRotationParam() { } | ||||
| //        public void llSetVehicleFlags() { } | ||||
| //        public void llRemoveVehicleFlags() { } | ||||
| //        public void llSitTarget() { } | ||||
| //        public void llAvatarOnSitTarget() { } | ||||
| //        public void llAddToLandPassList() { } | ||||
| //        public void llSetTouchText() { } | ||||
| //        public void llSetSitText() { } | ||||
| //        public void llSetCameraEyeOffset() { } | ||||
| //        public void llSetCameraAtOffset() { } | ||||
| //        public void llDumpList2String() { } | ||||
| //        public void llScriptDanger() { } | ||||
| //        public void llDialog() { } | ||||
| //        public void llVolumeDetect() { } | ||||
| //        public void llResetOtherScript() { } | ||||
| //        public void llGetScriptState() { } | ||||
| //        public void llRemoteLoadScript() { } | ||||
| //        public void llSetRemoteScriptAccessPin() { } | ||||
| //        public void llRemoteLoadScriptPin() { } | ||||
| //        public void llOpenRemoteDataChannel() { } | ||||
| //        public void llSendRemoteData() { } | ||||
| //        public void llRemoteDataReply() { } | ||||
| //        public void llCloseRemoteDataChannel() { } | ||||
| //        public void llMD5String() { } | ||||
| //        public void llSetPrimitiveParams() { } | ||||
| //        public void llStringToBase64() { } | ||||
| //        public void llBase64ToString() { } | ||||
| //        public void llXorBase64Strings() { } | ||||
| //        public void llRemoteDataSetRegion() { } | ||||
| //        public void llLog10() { } | ||||
| //        public void llLog() { } | ||||
| //        public void llGetAnimationList() { } | ||||
| //        public void llSetParcelMusicURL() { } | ||||
| //        public void llGetRootPosition() { } | ||||
| //        public void llGetRootRotation() { } | ||||
| //        public void llGetObjectDesc() { } | ||||
| //        public void llSetObjectDesc() { } | ||||
| //        public void llGetCreator() { } | ||||
| //        public void llGetTimestamp() { } | ||||
| //        public void llSetLinkAlpha() { } | ||||
| //        public void llGetNumberOfPrims() { } | ||||
| //        public void llGetNumberOfNotecardLines() { } | ||||
| //        public void llGetBoundingBox() { } | ||||
| //        public void llGetGeometricCenter() { } | ||||
| //        public void llGetPrimitiveParams() { } | ||||
| //        public void llIntegerToBase64() { } | ||||
| //        public void llBase64ToInteger() { } | ||||
| //        public void llGetGMTclock() { } | ||||
| //        public void llGetSimulatorHostname() { } | ||||
| //        public void llSetLocalRot() { } | ||||
| //        public void llParseStringKeepNulls() { } | ||||
| //        public void llRezAtRoot() { } | ||||
| //        public void llGetObjectPermMask() { } | ||||
| //        public void llSetObjectPermMask() { } | ||||
| //        public void llGetInventoryPermMask() { } | ||||
| //        public void llSetInventoryPermMask() { } | ||||
| //        public void llGetInventoryCreator() { } | ||||
| //        public void llOwnerSay() { } | ||||
| //        public void llRequestSimulatorData() { } | ||||
| //        public void llForceMouselook() { } | ||||
| //        public void llGetObjectMass() { } | ||||
| //        public void llListReplaceList() { } | ||||
| //        public void llLoadURL() { } | ||||
| //        public void llParcelMediaCommandList() { } | ||||
| //        public void llParcelMediaQuery() { } | ||||
| //        public void llModPow() { } | ||||
| //        public void llGetInventoryType() { } | ||||
| //        public void llSetPayPrice() { } | ||||
| //        public void llGetCameraPos() { } | ||||
| //        public void llGetCameraRot() { } | ||||
| //        public void llSetPrimURL() { } | ||||
| //        public void llRefreshPrimURL() { } | ||||
| //        public void llEscapeURL() { } | ||||
| //        public void llUnescapeURL() { } | ||||
| //        public void llMapDestination() { } | ||||
| //        public void llAddToLandBanList() { } | ||||
| //        public void llRemoveFromLandPassList() { } | ||||
| //        public void llRemoveFromLandBanList() { } | ||||
| //        public void llSetCameraParams() { } | ||||
| //        public void llClearCameraParams() { } | ||||
| //        public void llListStatistics() { } | ||||
| //        public void llGetUnixTime() { } | ||||
| //        public void llGetParcelFlags() { } | ||||
| //        public void llGetRegionFlags() { } | ||||
| //        public void llXorBase64StringsCorrect() { } | ||||
| //        public void llHTTPRequest() { } | ||||
| //        public void llResetLandBanList() { } | ||||
| //        public void llResetLandPassList() { } | ||||
| //        public void llGetParcelPrimCount() { } | ||||
| //        public void llGetParcelPrimOwners() { } | ||||
| //        public void llGetObjectPrimCount() { } | ||||
| //        public void llGetParcelMaxPrims() { } | ||||
| //        public void llGetParcelDetails() { } | ||||
| 
 | ||||
| //    } | ||||
| //} | ||||
|  |  | |||
|  | @ -1,394 +1,394 @@ | |||
| /* | ||||
| * Copyright (c) Contributors, http://opensimulator.org/ | ||||
| * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||||
| * | ||||
| * Redistribution and use in source and binary forms, with or without | ||||
| * modification, are permitted provided that the following conditions are met: | ||||
| *     * Redistributions of source code must retain the above copyright | ||||
| *       notice, this list of conditions and the following disclaimer. | ||||
| *     * Redistributions in binary form must reproduce the above copyright | ||||
| *       notice, this list of conditions and the following disclaimer in the | ||||
| *       documentation and/or other materials provided with the distribution. | ||||
| *     * Neither the name of the OpenSim Project nor the | ||||
| *       names of its contributors may be used to endorse or promote products | ||||
| *       derived from this software without specific prior written permission. | ||||
| * | ||||
| * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS AS IS AND ANY | ||||
| * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||||
| * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||||
| * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||||
| * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||||
| * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||||
| * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||||
| * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
| *  | ||||
| */ | ||||
| 
 | ||||
| using System; | ||||
| 
 | ||||
| namespace OpenSim.Grid.ScriptEngine.DotNetEngine.Compiler.LSO | ||||
| { | ||||
|     public partial class LSL_BaseClass | ||||
|     { | ||||
|         /* | ||||
|          * OPCODES | ||||
|          * | ||||
|          * These are internal "assembly" commands, | ||||
|          *  basic operators like "ADD", "PUSH" and "POP" | ||||
|          *  | ||||
|          * It also contains managed stack and keeps track of internal variables, etc. | ||||
|          *  | ||||
|          */ | ||||
| 
 | ||||
| 
 | ||||
|         public void StoreToLocal(UInt32 index) | ||||
|         { | ||||
|             // TODO: How to determine local? | ||||
|             Common.SendToDebug("::StoreToLocal " + index); | ||||
|             if (LocalVariables.ContainsKey(index)) | ||||
|                 LocalVariables.Remove(index); | ||||
|             LocalVariables.Add(index, LSLStack.Peek()); | ||||
|         } | ||||
| 
 | ||||
|         public void StoreToGlobal(UInt32 index) | ||||
|         { | ||||
|             Common.SendToDebug("::StoreToGlobal " + index); | ||||
|             if (GlobalVariables.ContainsKey(index)) | ||||
|                 GlobalVariables.Remove(index); | ||||
|             GlobalVariables.Add(index, LSLStack.Peek()); | ||||
|         } | ||||
| 
 | ||||
|         public void StoreToStatic(UInt32 index) | ||||
|         { | ||||
|             Common.SendToDebug("::StoreToStatic " + index); | ||||
|             //if (StaticVariables.ContainsKey(index)) | ||||
|             //    StaticVariables.Remove(index); | ||||
|             StaticVariables.Add(index, LSLStack.Peek()); | ||||
|         } | ||||
| 
 | ||||
|         public void GetFromLocal(UInt32 index) | ||||
|         { | ||||
|             // TODO: How to determine local? | ||||
|             Common.SendToDebug("::GetFromLocal " + index); | ||||
|             object ret; | ||||
|             LocalVariables.TryGetValue(index, out ret); | ||||
|             LSLStack.Push(ret); | ||||
|             //return ret; | ||||
|         } | ||||
| 
 | ||||
|         public void GetFromGlobal(UInt32 index) | ||||
|         { | ||||
|             Common.SendToDebug("::GetFromGlobal " + index); | ||||
|             object ret; | ||||
|             GlobalVariables.TryGetValue(index, out ret); | ||||
|             LSLStack.Push(ret); | ||||
|             //return ret; | ||||
|         } | ||||
| 
 | ||||
|         public void GetFromStatic(UInt32 index) | ||||
|         { | ||||
|             Common.SendToDebug("::GetFromStatic " + index); | ||||
|             object ret; | ||||
|             StaticVariables.TryGetValue(index, out ret); | ||||
|             Common.SendToDebug("::GetFromStatic - ObjectType: " + ret.GetType().ToString()); | ||||
|             LSLStack.Push(ret); | ||||
|             //return ret; | ||||
|         } | ||||
| 
 | ||||
|         public object POPToStack() | ||||
|         { | ||||
|             Common.SendToDebug("::POPToStack"); | ||||
|             //return LSLStack.Pop(); | ||||
|             object p = LSLStack.Pop(); | ||||
|             if (p.GetType() == typeof (UInt32)) | ||||
|                 return (UInt32) p; | ||||
|             if (p.GetType() == typeof (string)) | ||||
|                 return (string) p; | ||||
|             if (p.GetType() == typeof (Int32)) | ||||
|                 return (Int32) p; | ||||
|             if (p.GetType() == typeof (UInt16)) | ||||
|                 return (UInt16) p; | ||||
|             if (p.GetType() == typeof (float)) | ||||
|                 return (float) p; | ||||
|             if (p.GetType() == typeof (LSO_Enums.Vector)) | ||||
|                 return (LSO_Enums.Vector) p; | ||||
|             if (p.GetType() == typeof (LSO_Enums.Rotation)) | ||||
|                 return (LSO_Enums.Rotation) p; | ||||
|             if (p.GetType() == typeof (LSO_Enums.Key)) | ||||
|                 return (LSO_Enums.Key) p; | ||||
| 
 | ||||
|             return p; | ||||
|         } | ||||
| 
 | ||||
|         //public object POPToStack(UInt32 count) | ||||
|         //{ | ||||
|         //    // POP NUMBER FROM TOP OF STACK | ||||
|         //    //LSLStack.SetLength(LSLStack.Length - 4); | ||||
|         //    Common.SendToDebug("::POPToStack " + count); | ||||
|         //    if (count < 2) | ||||
|         //        return LSLStack.Pop(); | ||||
| 
 | ||||
|         //    Stack<object> s = new Stack<object>(); | ||||
|         //    for (int i = 0; i < count; i++) | ||||
|         //    { | ||||
|         //        s.Push(LSLStack.Pop); | ||||
| 
 | ||||
|         //    } | ||||
| 
 | ||||
|         //} | ||||
| 
 | ||||
|         public void POP() | ||||
|         { | ||||
|             // POP NUMBER FROM TOP OF STACK | ||||
|             //LSLStack.SetLength(LSLStack.Length - 4); | ||||
|             Common.SendToDebug("::POP"); | ||||
|             if (LSLStack.Count < 1) | ||||
|             { | ||||
|                 //TODO: Temporary fix | ||||
|                 Common.SendToDebug("ERROR: TRYING TO POP EMPTY STACK!"); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 LSLStack.Pop(); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         public void PUSH(object Param) | ||||
|         { | ||||
|             if (Param == null) | ||||
|             { | ||||
|                 Common.SendToDebug("::PUSH: <null>"); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 //Common.SendToDebug("::PUSH: " + Param.GetType()); | ||||
|             } | ||||
| 
 | ||||
|             LSLStack.Push(Param); | ||||
|         } | ||||
| 
 | ||||
|         public void ADD(UInt32 Param) | ||||
|         { | ||||
|             Common.SendToDebug("::ADD: " + Param); | ||||
|             object o2 = LSLStack.Pop(); | ||||
|             object o1 = LSLStack.Pop(); | ||||
|             Common.SendToDebug("::ADD: Debug: o1: " + o1.GetType() + " (" + o1.ToString() + "), o2: " + o2.GetType() + | ||||
|                                " (" + o2.ToString() + ")"); | ||||
|             if (o2.GetType() == typeof (string)) | ||||
|             { | ||||
|                 LSLStack.Push((string) o1 + (string) o2); | ||||
|                 return; | ||||
|             } | ||||
|             if (o2.GetType() == typeof (UInt32)) | ||||
|             { | ||||
|                 LSLStack.Push((UInt32) o1 + (UInt32) o2); | ||||
|                 return; | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         public void SUB(UInt32 Param) | ||||
|         { | ||||
|             Common.SendToDebug("::SUB: " + Param); | ||||
|             UInt32 i2 = (UInt32) LSLStack.Pop(); | ||||
|             UInt32 i1 = (UInt32) LSLStack.Pop(); | ||||
|             LSLStack.Push((UInt32) (i1 - i2)); | ||||
|         } | ||||
| 
 | ||||
|         public void MUL(UInt32 Param) | ||||
|         { | ||||
|             Common.SendToDebug("::SUB: " + Param); | ||||
|             UInt32 i2 = (UInt32) LSLStack.Pop(); | ||||
|             UInt32 i1 = (UInt32) LSLStack.Pop(); | ||||
|             LSLStack.Push((UInt32) (i1*i2)); | ||||
|         } | ||||
| 
 | ||||
|         public void DIV(UInt32 Param) | ||||
|         { | ||||
|             Common.SendToDebug("::DIV: " + Param); | ||||
|             UInt32 i2 = (UInt32) LSLStack.Pop(); | ||||
|             UInt32 i1 = (UInt32) LSLStack.Pop(); | ||||
|             LSLStack.Push((UInt32) (i1/i2)); | ||||
|         } | ||||
| 
 | ||||
| 
 | ||||
|         public void MOD(UInt32 Param) | ||||
|         { | ||||
|             Common.SendToDebug("::MOD: " + Param); | ||||
|             UInt32 i2 = (UInt32) LSLStack.Pop(); | ||||
|             UInt32 i1 = (UInt32) LSLStack.Pop(); | ||||
|             LSLStack.Push((UInt32) (i1%i2)); | ||||
|         } | ||||
| 
 | ||||
|         public void EQ(UInt32 Param) | ||||
|         { | ||||
|             Common.SendToDebug("::EQ: " + Param); | ||||
|             UInt32 i2 = (UInt32) LSLStack.Pop(); | ||||
|             UInt32 i1 = (UInt32) LSLStack.Pop(); | ||||
|             if (i1 == i2) | ||||
|             { | ||||
|                 LSLStack.Push((UInt32) 1); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 LSLStack.Push((UInt32) 0); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         public void NEQ(UInt32 Param) | ||||
|         { | ||||
|             Common.SendToDebug("::NEQ: " + Param); | ||||
|             UInt32 i2 = (UInt32) LSLStack.Pop(); | ||||
|             UInt32 i1 = (UInt32) LSLStack.Pop(); | ||||
|             if (i1 != i2) | ||||
|             { | ||||
|                 LSLStack.Push((UInt32) 1); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 LSLStack.Push((UInt32) 0); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         public void LEQ(UInt32 Param) | ||||
|         { | ||||
|             Common.SendToDebug("::LEQ: " + Param); | ||||
|             UInt32 i2 = (UInt32) LSLStack.Pop(); | ||||
|             UInt32 i1 = (UInt32) LSLStack.Pop(); | ||||
|             if (i1 <= i2) | ||||
|             { | ||||
|                 LSLStack.Push((UInt32) 1); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 LSLStack.Push((UInt32) 0); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         public void GEQ(UInt32 Param) | ||||
|         { | ||||
|             Common.SendToDebug("::GEQ: " + Param); | ||||
|             UInt32 i2 = (UInt32) LSLStack.Pop(); | ||||
|             UInt32 i1 = (UInt32) LSLStack.Pop(); | ||||
|             if (i1 >= i2) | ||||
|             { | ||||
|                 LSLStack.Push((UInt32) 1); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 LSLStack.Push((UInt32) 0); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         public void LESS(UInt32 Param) | ||||
|         { | ||||
|             Common.SendToDebug("::LESS: " + Param); | ||||
|             UInt32 i2 = (UInt32) LSLStack.Pop(); | ||||
|             UInt32 i1 = (UInt32) LSLStack.Pop(); | ||||
|             if (i1 < i2) | ||||
|             { | ||||
|                 LSLStack.Push((UInt32) 1); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 LSLStack.Push((UInt32) 0); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         public void GREATER(UInt32 Param) | ||||
|         { | ||||
|             Common.SendToDebug("::GREATER: " + Param); | ||||
|             UInt32 i2 = (UInt32) LSLStack.Pop(); | ||||
|             UInt32 i1 = (UInt32) LSLStack.Pop(); | ||||
|             if (i1 > i2) | ||||
|             { | ||||
|                 LSLStack.Push((UInt32) 1); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 LSLStack.Push((UInt32) 0); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
| 
 | ||||
|         public void BITAND() | ||||
|         { | ||||
|             Common.SendToDebug("::BITAND"); | ||||
|             UInt32 i2 = (UInt32) LSLStack.Pop(); | ||||
|             UInt32 i1 = (UInt32) LSLStack.Pop(); | ||||
|             LSLStack.Push((UInt32) (i1 & i2)); | ||||
|         } | ||||
| 
 | ||||
|         public void BITOR() | ||||
|         { | ||||
|             Common.SendToDebug("::BITOR"); | ||||
|             UInt32 i2 = (UInt32) LSLStack.Pop(); | ||||
|             UInt32 i1 = (UInt32) LSLStack.Pop(); | ||||
|             LSLStack.Push((UInt32) (i1 | i2)); | ||||
|         } | ||||
| 
 | ||||
|         public void BITXOR() | ||||
|         { | ||||
|             Common.SendToDebug("::BITXOR"); | ||||
|             UInt32 i2 = (UInt32) LSLStack.Pop(); | ||||
|             UInt32 i1 = (UInt32) LSLStack.Pop(); | ||||
|             LSLStack.Push((UInt32) (i1 ^ i2)); | ||||
|         } | ||||
| 
 | ||||
|         public void BOOLAND() | ||||
|         { | ||||
|             Common.SendToDebug("::BOOLAND"); | ||||
|             bool b2 = bool.Parse((string) LSLStack.Pop()); | ||||
|             bool b1 = bool.Parse((string) LSLStack.Pop()); | ||||
|             if (b1 && b2) | ||||
|             { | ||||
|                 LSLStack.Push((UInt32) 1); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 LSLStack.Push((UInt32) 0); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         public void BOOLOR() | ||||
|         { | ||||
|             Common.SendToDebug("::BOOLOR"); | ||||
|             bool b2 = bool.Parse((string) LSLStack.Pop()); | ||||
|             bool b1 = bool.Parse((string) LSLStack.Pop()); | ||||
| 
 | ||||
|             if (b1 || b2) | ||||
|             { | ||||
|                 LSLStack.Push((UInt32) 1); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 LSLStack.Push((UInt32) 0); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         public void NEG(UInt32 Param) | ||||
|         { | ||||
|             Common.SendToDebug("::NEG: " + Param); | ||||
|             //UInt32 i2 = (UInt32)LSLStack.Pop(); | ||||
|             UInt32 i1 = (UInt32) LSLStack.Pop(); | ||||
|             LSLStack.Push((UInt32) (i1*-1)); | ||||
|         } | ||||
| 
 | ||||
|         public void BITNOT() | ||||
|         { | ||||
|             //Common.SendToDebug("::BITNOT"); | ||||
|             //UInt32 i2 = (UInt32)LSLStack.Pop(); | ||||
|             //UInt32 i1 = (UInt32)LSLStack.Pop(); | ||||
|             //LSLStack.Push((UInt32)(i1 / i2)); | ||||
|         } | ||||
| 
 | ||||
|         public void BOOLNOT() | ||||
|         { | ||||
|             //Common.SendToDebug("::BOOLNOT"); | ||||
|             ////UInt32 i2 = (UInt32)LSLStack.Pop(); | ||||
|             //UInt32 i1 = (UInt32)LSLStack.Pop(); | ||||
|             //LSLStack.Push((UInt32)(i1)); | ||||
|         } | ||||
|     } | ||||
| } | ||||
| /* | ||||
| * Copyright (c) Contributors, http://opensimulator.org/ | ||||
| * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||||
| * | ||||
| * Redistribution and use in source and binary forms, with or without | ||||
| * modification, are permitted provided that the following conditions are met: | ||||
| *     * Redistributions of source code must retain the above copyright | ||||
| *       notice, this list of conditions and the following disclaimer. | ||||
| *     * Redistributions in binary form must reproduce the above copyright | ||||
| *       notice, this list of conditions and the following disclaimer in the | ||||
| *       documentation and/or other materials provided with the distribution. | ||||
| *     * Neither the name of the OpenSim Project nor the | ||||
| *       names of its contributors may be used to endorse or promote products | ||||
| *       derived from this software without specific prior written permission. | ||||
| * | ||||
| * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||||
| * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||||
| * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||||
| * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||||
| * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||||
| * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||||
| * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||||
| * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
| *  | ||||
| */ | ||||
| 
 | ||||
| using System; | ||||
| 
 | ||||
| namespace OpenSim.Grid.ScriptEngine.DotNetEngine.Compiler.LSO | ||||
| { | ||||
|     public partial class LSL_BaseClass | ||||
|     { | ||||
|         /* | ||||
|          * OPCODES | ||||
|          * | ||||
|          * These are internal "assembly" commands, | ||||
|          *  basic operators like "ADD", "PUSH" and "POP" | ||||
|          *  | ||||
|          * It also contains managed stack and keeps track of internal variables, etc. | ||||
|          *  | ||||
|          */ | ||||
| 
 | ||||
| 
 | ||||
|         public void StoreToLocal(UInt32 index) | ||||
|         { | ||||
|             // TODO: How to determine local? | ||||
|             Common.SendToDebug("::StoreToLocal " + index); | ||||
|             if (LocalVariables.ContainsKey(index)) | ||||
|                 LocalVariables.Remove(index); | ||||
|             LocalVariables.Add(index, LSLStack.Peek()); | ||||
|         } | ||||
| 
 | ||||
|         public void StoreToGlobal(UInt32 index) | ||||
|         { | ||||
|             Common.SendToDebug("::StoreToGlobal " + index); | ||||
|             if (GlobalVariables.ContainsKey(index)) | ||||
|                 GlobalVariables.Remove(index); | ||||
|             GlobalVariables.Add(index, LSLStack.Peek()); | ||||
|         } | ||||
| 
 | ||||
|         public void StoreToStatic(UInt32 index) | ||||
|         { | ||||
|             Common.SendToDebug("::StoreToStatic " + index); | ||||
|             //if (StaticVariables.ContainsKey(index)) | ||||
|             //    StaticVariables.Remove(index); | ||||
|             StaticVariables.Add(index, LSLStack.Peek()); | ||||
|         } | ||||
| 
 | ||||
|         public void GetFromLocal(UInt32 index) | ||||
|         { | ||||
|             // TODO: How to determine local? | ||||
|             Common.SendToDebug("::GetFromLocal " + index); | ||||
|             object ret; | ||||
|             LocalVariables.TryGetValue(index, out ret); | ||||
|             LSLStack.Push(ret); | ||||
|             //return ret; | ||||
|         } | ||||
| 
 | ||||
|         public void GetFromGlobal(UInt32 index) | ||||
|         { | ||||
|             Common.SendToDebug("::GetFromGlobal " + index); | ||||
|             object ret; | ||||
|             GlobalVariables.TryGetValue(index, out ret); | ||||
|             LSLStack.Push(ret); | ||||
|             //return ret; | ||||
|         } | ||||
| 
 | ||||
|         public void GetFromStatic(UInt32 index) | ||||
|         { | ||||
|             Common.SendToDebug("::GetFromStatic " + index); | ||||
|             object ret; | ||||
|             StaticVariables.TryGetValue(index, out ret); | ||||
|             Common.SendToDebug("::GetFromStatic - ObjectType: " + ret.GetType().ToString()); | ||||
|             LSLStack.Push(ret); | ||||
|             //return ret; | ||||
|         } | ||||
| 
 | ||||
|         public object POPToStack() | ||||
|         { | ||||
|             Common.SendToDebug("::POPToStack"); | ||||
|             //return LSLStack.Pop(); | ||||
|             object p = LSLStack.Pop(); | ||||
|             if (p.GetType() == typeof (UInt32)) | ||||
|                 return (UInt32) p; | ||||
|             if (p.GetType() == typeof (string)) | ||||
|                 return (string) p; | ||||
|             if (p.GetType() == typeof (Int32)) | ||||
|                 return (Int32) p; | ||||
|             if (p.GetType() == typeof (UInt16)) | ||||
|                 return (UInt16) p; | ||||
|             if (p.GetType() == typeof (float)) | ||||
|                 return (float) p; | ||||
|             if (p.GetType() == typeof (LSO_Enums.Vector)) | ||||
|                 return (LSO_Enums.Vector) p; | ||||
|             if (p.GetType() == typeof (LSO_Enums.Rotation)) | ||||
|                 return (LSO_Enums.Rotation) p; | ||||
|             if (p.GetType() == typeof (LSO_Enums.Key)) | ||||
|                 return (LSO_Enums.Key) p; | ||||
| 
 | ||||
|             return p; | ||||
|         } | ||||
| 
 | ||||
|         //public object POPToStack(UInt32 count) | ||||
|         //{ | ||||
|         //    // POP NUMBER FROM TOP OF STACK | ||||
|         //    //LSLStack.SetLength(LSLStack.Length - 4); | ||||
|         //    Common.SendToDebug("::POPToStack " + count); | ||||
|         //    if (count < 2) | ||||
|         //        return LSLStack.Pop(); | ||||
| 
 | ||||
|         //    Stack<object> s = new Stack<object>(); | ||||
|         //    for (int i = 0; i < count; i++) | ||||
|         //    { | ||||
|         //        s.Push(LSLStack.Pop); | ||||
| 
 | ||||
|         //    } | ||||
| 
 | ||||
|         //} | ||||
| 
 | ||||
|         public void POP() | ||||
|         { | ||||
|             // POP NUMBER FROM TOP OF STACK | ||||
|             //LSLStack.SetLength(LSLStack.Length - 4); | ||||
|             Common.SendToDebug("::POP"); | ||||
|             if (LSLStack.Count < 1) | ||||
|             { | ||||
|                 //TODO: Temporary fix | ||||
|                 Common.SendToDebug("ERROR: TRYING TO POP EMPTY STACK!"); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 LSLStack.Pop(); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         public void PUSH(object Param) | ||||
|         { | ||||
|             if (Param == null) | ||||
|             { | ||||
|                 Common.SendToDebug("::PUSH: <null>"); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 //Common.SendToDebug("::PUSH: " + Param.GetType()); | ||||
|             } | ||||
| 
 | ||||
|             LSLStack.Push(Param); | ||||
|         } | ||||
| 
 | ||||
|         public void ADD(UInt32 Param) | ||||
|         { | ||||
|             Common.SendToDebug("::ADD: " + Param); | ||||
|             object o2 = LSLStack.Pop(); | ||||
|             object o1 = LSLStack.Pop(); | ||||
|             Common.SendToDebug("::ADD: Debug: o1: " + o1.GetType() + " (" + o1.ToString() + "), o2: " + o2.GetType() + | ||||
|                                " (" + o2.ToString() + ")"); | ||||
|             if (o2.GetType() == typeof (string)) | ||||
|             { | ||||
|                 LSLStack.Push((string) o1 + (string) o2); | ||||
|                 return; | ||||
|             } | ||||
|             if (o2.GetType() == typeof (UInt32)) | ||||
|             { | ||||
|                 LSLStack.Push((UInt32) o1 + (UInt32) o2); | ||||
|                 return; | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         public void SUB(UInt32 Param) | ||||
|         { | ||||
|             Common.SendToDebug("::SUB: " + Param); | ||||
|             UInt32 i2 = (UInt32) LSLStack.Pop(); | ||||
|             UInt32 i1 = (UInt32) LSLStack.Pop(); | ||||
|             LSLStack.Push((UInt32) (i1 - i2)); | ||||
|         } | ||||
| 
 | ||||
|         public void MUL(UInt32 Param) | ||||
|         { | ||||
|             Common.SendToDebug("::SUB: " + Param); | ||||
|             UInt32 i2 = (UInt32) LSLStack.Pop(); | ||||
|             UInt32 i1 = (UInt32) LSLStack.Pop(); | ||||
|             LSLStack.Push((UInt32) (i1*i2)); | ||||
|         } | ||||
| 
 | ||||
|         public void DIV(UInt32 Param) | ||||
|         { | ||||
|             Common.SendToDebug("::DIV: " + Param); | ||||
|             UInt32 i2 = (UInt32) LSLStack.Pop(); | ||||
|             UInt32 i1 = (UInt32) LSLStack.Pop(); | ||||
|             LSLStack.Push((UInt32) (i1/i2)); | ||||
|         } | ||||
| 
 | ||||
| 
 | ||||
|         public void MOD(UInt32 Param) | ||||
|         { | ||||
|             Common.SendToDebug("::MOD: " + Param); | ||||
|             UInt32 i2 = (UInt32) LSLStack.Pop(); | ||||
|             UInt32 i1 = (UInt32) LSLStack.Pop(); | ||||
|             LSLStack.Push((UInt32) (i1%i2)); | ||||
|         } | ||||
| 
 | ||||
|         public void EQ(UInt32 Param) | ||||
|         { | ||||
|             Common.SendToDebug("::EQ: " + Param); | ||||
|             UInt32 i2 = (UInt32) LSLStack.Pop(); | ||||
|             UInt32 i1 = (UInt32) LSLStack.Pop(); | ||||
|             if (i1 == i2) | ||||
|             { | ||||
|                 LSLStack.Push((UInt32) 1); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 LSLStack.Push((UInt32) 0); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         public void NEQ(UInt32 Param) | ||||
|         { | ||||
|             Common.SendToDebug("::NEQ: " + Param); | ||||
|             UInt32 i2 = (UInt32) LSLStack.Pop(); | ||||
|             UInt32 i1 = (UInt32) LSLStack.Pop(); | ||||
|             if (i1 != i2) | ||||
|             { | ||||
|                 LSLStack.Push((UInt32) 1); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 LSLStack.Push((UInt32) 0); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         public void LEQ(UInt32 Param) | ||||
|         { | ||||
|             Common.SendToDebug("::LEQ: " + Param); | ||||
|             UInt32 i2 = (UInt32) LSLStack.Pop(); | ||||
|             UInt32 i1 = (UInt32) LSLStack.Pop(); | ||||
|             if (i1 <= i2) | ||||
|             { | ||||
|                 LSLStack.Push((UInt32) 1); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 LSLStack.Push((UInt32) 0); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         public void GEQ(UInt32 Param) | ||||
|         { | ||||
|             Common.SendToDebug("::GEQ: " + Param); | ||||
|             UInt32 i2 = (UInt32) LSLStack.Pop(); | ||||
|             UInt32 i1 = (UInt32) LSLStack.Pop(); | ||||
|             if (i1 >= i2) | ||||
|             { | ||||
|                 LSLStack.Push((UInt32) 1); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 LSLStack.Push((UInt32) 0); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         public void LESS(UInt32 Param) | ||||
|         { | ||||
|             Common.SendToDebug("::LESS: " + Param); | ||||
|             UInt32 i2 = (UInt32) LSLStack.Pop(); | ||||
|             UInt32 i1 = (UInt32) LSLStack.Pop(); | ||||
|             if (i1 < i2) | ||||
|             { | ||||
|                 LSLStack.Push((UInt32) 1); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 LSLStack.Push((UInt32) 0); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         public void GREATER(UInt32 Param) | ||||
|         { | ||||
|             Common.SendToDebug("::GREATER: " + Param); | ||||
|             UInt32 i2 = (UInt32) LSLStack.Pop(); | ||||
|             UInt32 i1 = (UInt32) LSLStack.Pop(); | ||||
|             if (i1 > i2) | ||||
|             { | ||||
|                 LSLStack.Push((UInt32) 1); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 LSLStack.Push((UInt32) 0); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
| 
 | ||||
|         public void BITAND() | ||||
|         { | ||||
|             Common.SendToDebug("::BITAND"); | ||||
|             UInt32 i2 = (UInt32) LSLStack.Pop(); | ||||
|             UInt32 i1 = (UInt32) LSLStack.Pop(); | ||||
|             LSLStack.Push((UInt32) (i1 & i2)); | ||||
|         } | ||||
| 
 | ||||
|         public void BITOR() | ||||
|         { | ||||
|             Common.SendToDebug("::BITOR"); | ||||
|             UInt32 i2 = (UInt32) LSLStack.Pop(); | ||||
|             UInt32 i1 = (UInt32) LSLStack.Pop(); | ||||
|             LSLStack.Push((UInt32) (i1 | i2)); | ||||
|         } | ||||
| 
 | ||||
|         public void BITXOR() | ||||
|         { | ||||
|             Common.SendToDebug("::BITXOR"); | ||||
|             UInt32 i2 = (UInt32) LSLStack.Pop(); | ||||
|             UInt32 i1 = (UInt32) LSLStack.Pop(); | ||||
|             LSLStack.Push((UInt32) (i1 ^ i2)); | ||||
|         } | ||||
| 
 | ||||
|         public void BOOLAND() | ||||
|         { | ||||
|             Common.SendToDebug("::BOOLAND"); | ||||
|             bool b2 = bool.Parse((string) LSLStack.Pop()); | ||||
|             bool b1 = bool.Parse((string) LSLStack.Pop()); | ||||
|             if (b1 && b2) | ||||
|             { | ||||
|                 LSLStack.Push((UInt32) 1); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 LSLStack.Push((UInt32) 0); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         public void BOOLOR() | ||||
|         { | ||||
|             Common.SendToDebug("::BOOLOR"); | ||||
|             bool b2 = bool.Parse((string) LSLStack.Pop()); | ||||
|             bool b1 = bool.Parse((string) LSLStack.Pop()); | ||||
| 
 | ||||
|             if (b1 || b2) | ||||
|             { | ||||
|                 LSLStack.Push((UInt32) 1); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 LSLStack.Push((UInt32) 0); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         public void NEG(UInt32 Param) | ||||
|         { | ||||
|             Common.SendToDebug("::NEG: " + Param); | ||||
|             //UInt32 i2 = (UInt32)LSLStack.Pop(); | ||||
|             UInt32 i1 = (UInt32) LSLStack.Pop(); | ||||
|             LSLStack.Push((UInt32) (i1*-1)); | ||||
|         } | ||||
| 
 | ||||
|         public void BITNOT() | ||||
|         { | ||||
|             //Common.SendToDebug("::BITNOT"); | ||||
|             //UInt32 i2 = (UInt32)LSLStack.Pop(); | ||||
|             //UInt32 i1 = (UInt32)LSLStack.Pop(); | ||||
|             //LSLStack.Push((UInt32)(i1 / i2)); | ||||
|         } | ||||
| 
 | ||||
|         public void BOOLNOT() | ||||
|         { | ||||
|             //Common.SendToDebug("::BOOLNOT"); | ||||
|             ////UInt32 i2 = (UInt32)LSLStack.Pop(); | ||||
|             //UInt32 i1 = (UInt32)LSLStack.Pop(); | ||||
|             //LSLStack.Push((UInt32)(i1)); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  |  | |||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							|  | @ -1,220 +1,222 @@ | |||
| /* | ||||
| * Copyright (c) Contributors, http://opensimulator.org/ | ||||
| * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||||
| * | ||||
| * Redistribution and use in source and binary forms, with or without | ||||
| * modification, are permitted provided that the following conditions are met: | ||||
| *     * Redistributions of source code must retain the above copyright | ||||
| *       notice, this list of conditions and the following disclaimer. | ||||
| *     * Redistributions in binary form must reproduce the above copyright | ||||
| *       notice, this list of conditions and the following disclaimer in the | ||||
| *       documentation and/or other materials provided with the distribution. | ||||
| *     * Neither the name of the OpenSim Project nor the | ||||
| *       names of its contributors may be used to endorse or promote products | ||||
| *       derived from this software without specific prior written permission. | ||||
| * | ||||
| * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||||
| * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||||
| * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||||
| * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||||
| * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||||
| * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||||
| * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||||
| * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
| *  | ||||
| */ | ||||
| /* Original code: Tedd Hansen */ | ||||
| using System; | ||||
| using libsecondlife; | ||||
| using OpenSim.Framework; | ||||
| 
 | ||||
| namespace OpenSim.Grid.ScriptEngine.DotNetEngine | ||||
| { | ||||
|     /// <summary> | ||||
|     /// Prepares events so they can be directly executed upon a script by EventQueueManager, then queues it. | ||||
|     /// </summary> | ||||
|     [Serializable] | ||||
|     internal class EventManager | ||||
|     { | ||||
|         private ScriptEngine myScriptEngine; | ||||
|         //public IScriptHost TEMP_OBJECT_ID; | ||||
|         public EventManager(ScriptEngine _ScriptEngine) | ||||
|         { | ||||
|             myScriptEngine = _ScriptEngine; | ||||
|             // TODO: HOOK EVENTS UP TO SERVER! | ||||
|             //myScriptEngine.m_logger.Verbose("ScriptEngine", "EventManager Start"); | ||||
|             // TODO: ADD SERVER HOOK TO LOAD A SCRIPT THROUGH myScriptEngine.ScriptManager | ||||
| 
 | ||||
|             // Hook up a test event to our test form | ||||
|             myScriptEngine.Log.Verbose("ScriptEngine", "Hooking up to server events"); | ||||
|             myScriptEngine.World.EventManager.OnObjectGrab += touch_start; | ||||
|             myScriptEngine.World.EventManager.OnRezScript += OnRezScript; | ||||
|             myScriptEngine.World.EventManager.OnRemoveScript += OnRemoveScript; | ||||
|         } | ||||
| 
 | ||||
|         public void touch_start(uint localID, LLVector3 offsetPos, IClientAPI remoteClient) | ||||
|         { | ||||
|             // Add to queue for all scripts in ObjectID object | ||||
|             //myScriptEngine.m_logger.Verbose("ScriptEngine", "EventManager Event: touch_start"); | ||||
|             //Console.WriteLine("touch_start localID: " + localID); | ||||
|             myScriptEngine.m_EventQueueManager.AddToObjectQueue(localID, "touch_start", new object[] {(int) 1}); | ||||
|         } | ||||
| 
 | ||||
|         public void OnRezScript(uint localID, LLUUID itemID, string script) | ||||
|         { | ||||
|             //myScriptEngine.myScriptManager.StartScript( | ||||
|             //    Path.Combine("ScriptEngines", "Default.lsl"),  | ||||
|             //    new OpenSim.Region.Environment.Scenes.Scripting.NullScriptHost() | ||||
|             //); | ||||
|             Console.WriteLine("OnRezScript localID: " + localID + " LLUID: " + itemID.ToString() + " Size: " + | ||||
|                               script.Length); | ||||
|             myScriptEngine.m_ScriptManager.StartScript(localID, itemID, script); | ||||
|         } | ||||
| 
 | ||||
|         public void OnRemoveScript(uint localID, LLUUID itemID) | ||||
|         { | ||||
|             //myScriptEngine.myScriptManager.StartScript( | ||||
|             //    Path.Combine("ScriptEngines", "Default.lsl"),  | ||||
|             //    new OpenSim.Region.Environment.Scenes.Scripting.NullScriptHost() | ||||
|             //); | ||||
|             Console.WriteLine("OnRemoveScript localID: " + localID + " LLUID: " + itemID.ToString()); | ||||
|             myScriptEngine.m_ScriptManager.StopScript( | ||||
|                 localID, | ||||
|                 itemID | ||||
|                 ); | ||||
|         } | ||||
| 
 | ||||
|         // TODO: Replace placeholders below | ||||
|         //  These needs to be hooked up to OpenSim during init of this class | ||||
|         //   then queued in EventQueueManager. | ||||
|         // When queued in EventQueueManager they need to be LSL compatible (name and params) | ||||
| 
 | ||||
|         //public void state_entry() { } //  | ||||
|         public void state_exit() | ||||
|         { | ||||
|         } | ||||
| 
 | ||||
|         //public void touch_start() { } | ||||
|         public void touch() | ||||
|         { | ||||
|         } | ||||
| 
 | ||||
|         public void touch_end() | ||||
|         { | ||||
|         } | ||||
| 
 | ||||
|         public void collision_start() | ||||
|         { | ||||
|         } | ||||
| 
 | ||||
|         public void collision() | ||||
|         { | ||||
|         } | ||||
| 
 | ||||
|         public void collision_end() | ||||
|         { | ||||
|         } | ||||
| 
 | ||||
|         public void land_collision_start() | ||||
|         { | ||||
|         } | ||||
| 
 | ||||
|         public void land_collision() | ||||
|         { | ||||
|         } | ||||
| 
 | ||||
|         public void land_collision_end() | ||||
|         { | ||||
|         } | ||||
| 
 | ||||
|         public void timer() | ||||
|         { | ||||
|         } | ||||
| 
 | ||||
|         public void listen() | ||||
|         { | ||||
|         } | ||||
| 
 | ||||
|         public void on_rez() | ||||
|         { | ||||
|         } | ||||
| 
 | ||||
|         public void sensor() | ||||
|         { | ||||
|         } | ||||
| 
 | ||||
|         public void no_sensor() | ||||
|         { | ||||
|         } | ||||
| 
 | ||||
|         public void control() | ||||
|         { | ||||
|         } | ||||
| 
 | ||||
|         public void money() | ||||
|         { | ||||
|         } | ||||
| 
 | ||||
|         public void email() | ||||
|         { | ||||
|         } | ||||
| 
 | ||||
|         public void at_target() | ||||
|         { | ||||
|         } | ||||
| 
 | ||||
|         public void not_at_target() | ||||
|         { | ||||
|         } | ||||
| 
 | ||||
|         public void at_rot_target() | ||||
|         { | ||||
|         } | ||||
| 
 | ||||
|         public void not_at_rot_target() | ||||
|         { | ||||
|         } | ||||
| 
 | ||||
|         public void run_time_permissions() | ||||
|         { | ||||
|         } | ||||
| 
 | ||||
|         public void changed() | ||||
|         { | ||||
|         } | ||||
| 
 | ||||
|         public void attach() | ||||
|         { | ||||
|         } | ||||
| 
 | ||||
|         public void dataserver() | ||||
|         { | ||||
|         } | ||||
| 
 | ||||
|         public void link_message() | ||||
|         { | ||||
|         } | ||||
| 
 | ||||
|         public void moving_start() | ||||
|         { | ||||
|         } | ||||
| 
 | ||||
|         public void moving_end() | ||||
|         { | ||||
|         } | ||||
| 
 | ||||
|         public void object_rez() | ||||
|         { | ||||
|         } | ||||
| 
 | ||||
|         public void remote_data() | ||||
|         { | ||||
|         } | ||||
| 
 | ||||
|         public void http_response() | ||||
|         { | ||||
|         } | ||||
|     } | ||||
| } | ||||
| /* | ||||
| * Copyright (c) Contributors, http://opensimulator.org/ | ||||
| * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||||
| * | ||||
| * Redistribution and use in source and binary forms, with or without | ||||
| * modification, are permitted provided that the following conditions are met: | ||||
| *     * Redistributions of source code must retain the above copyright | ||||
| *       notice, this list of conditions and the following disclaimer. | ||||
| *     * Redistributions in binary form must reproduce the above copyright | ||||
| *       notice, this list of conditions and the following disclaimer in the | ||||
| *       documentation and/or other materials provided with the distribution. | ||||
| *     * Neither the name of the OpenSim Project nor the | ||||
| *       names of its contributors may be used to endorse or promote products | ||||
| *       derived from this software without specific prior written permission. | ||||
| * | ||||
| * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||||
| * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||||
| * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||||
| * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||||
| * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||||
| * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||||
| * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||||
| * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
| *  | ||||
| */ | ||||
| /* Original code: Tedd Hansen */ | ||||
| using System; | ||||
| using libsecondlife; | ||||
| using OpenSim.Framework; | ||||
| 
 | ||||
| namespace OpenSim.Grid.ScriptEngine.DotNetEngine | ||||
| { | ||||
|     /// <summary> | ||||
|     /// Prepares events so they can be directly executed upon a script by EventQueueManager, then queues it. | ||||
|     /// </summary> | ||||
|     [Serializable] | ||||
|     internal class EventManager | ||||
|     { | ||||
|         private static readonly log4net.ILog m_log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); | ||||
| 
 | ||||
|         private ScriptEngine myScriptEngine; | ||||
|         //public IScriptHost TEMP_OBJECT_ID; | ||||
|         public EventManager(ScriptEngine _ScriptEngine) | ||||
|         { | ||||
|             myScriptEngine = _ScriptEngine; | ||||
|             // TODO: HOOK EVENTS UP TO SERVER! | ||||
|             //myScriptEngine.m_log.Info("[ScriptEngine]: EventManager Start"); | ||||
|             // TODO: ADD SERVER HOOK TO LOAD A SCRIPT THROUGH myScriptEngine.ScriptManager | ||||
| 
 | ||||
|             // Hook up a test event to our test form | ||||
|             myScriptEngine.m_log.Info("[ScriptEngine]: Hooking up to server events"); | ||||
|             myScriptEngine.World.EventManager.OnObjectGrab += touch_start; | ||||
|             myScriptEngine.World.EventManager.OnRezScript += OnRezScript; | ||||
|             myScriptEngine.World.EventManager.OnRemoveScript += OnRemoveScript; | ||||
|         } | ||||
| 
 | ||||
|         public void touch_start(uint localID, LLVector3 offsetPos, IClientAPI remoteClient) | ||||
|         { | ||||
|             // Add to queue for all scripts in ObjectID object | ||||
|             //myScriptEngine.m_log.Info("[ScriptEngine]: EventManager Event: touch_start"); | ||||
|             //Console.WriteLine("touch_start localID: " + localID); | ||||
|             myScriptEngine.m_EventQueueManager.AddToObjectQueue(localID, "touch_start", new object[] {(int) 1}); | ||||
|         } | ||||
| 
 | ||||
|         public void OnRezScript(uint localID, LLUUID itemID, string script) | ||||
|         { | ||||
|             //myScriptEngine.myScriptManager.StartScript( | ||||
|             //    Path.Combine("ScriptEngines", "Default.lsl"),  | ||||
|             //    new OpenSim.Region.Environment.Scenes.Scripting.NullScriptHost() | ||||
|             //); | ||||
|             Console.WriteLine("OnRezScript localID: " + localID + " LLUID: " + itemID.ToString() + " Size: " + | ||||
|                               script.Length); | ||||
|             myScriptEngine.m_ScriptManager.StartScript(localID, itemID, script); | ||||
|         } | ||||
| 
 | ||||
|         public void OnRemoveScript(uint localID, LLUUID itemID) | ||||
|         { | ||||
|             //myScriptEngine.myScriptManager.StartScript( | ||||
|             //    Path.Combine("ScriptEngines", "Default.lsl"),  | ||||
|             //    new OpenSim.Region.Environment.Scenes.Scripting.NullScriptHost() | ||||
|             //); | ||||
|             Console.WriteLine("OnRemoveScript localID: " + localID + " LLUID: " + itemID.ToString()); | ||||
|             myScriptEngine.m_ScriptManager.StopScript( | ||||
|                 localID, | ||||
|                 itemID | ||||
|                 ); | ||||
|         } | ||||
| 
 | ||||
|         // TODO: Replace placeholders below | ||||
|         //  These needs to be hooked up to OpenSim during init of this class | ||||
|         //   then queued in EventQueueManager. | ||||
|         // When queued in EventQueueManager they need to be LSL compatible (name and params) | ||||
| 
 | ||||
|         //public void state_entry() { } | ||||
|         public void state_exit() | ||||
|         { | ||||
|         } | ||||
| 
 | ||||
|         //public void touch_start() { } | ||||
|         public void touch() | ||||
|         { | ||||
|         } | ||||
| 
 | ||||
|         public void touch_end() | ||||
|         { | ||||
|         } | ||||
| 
 | ||||
|         public void collision_start() | ||||
|         { | ||||
|         } | ||||
| 
 | ||||
|         public void collision() | ||||
|         { | ||||
|         } | ||||
| 
 | ||||
|         public void collision_end() | ||||
|         { | ||||
|         } | ||||
| 
 | ||||
|         public void land_collision_start() | ||||
|         { | ||||
|         } | ||||
| 
 | ||||
|         public void land_collision() | ||||
|         { | ||||
|         } | ||||
| 
 | ||||
|         public void land_collision_end() | ||||
|         { | ||||
|         } | ||||
| 
 | ||||
|         public void timer() | ||||
|         { | ||||
|         } | ||||
| 
 | ||||
|         public void listen() | ||||
|         { | ||||
|         } | ||||
| 
 | ||||
|         public void on_rez() | ||||
|         { | ||||
|         } | ||||
| 
 | ||||
|         public void sensor() | ||||
|         { | ||||
|         } | ||||
| 
 | ||||
|         public void no_sensor() | ||||
|         { | ||||
|         } | ||||
| 
 | ||||
|         public void control() | ||||
|         { | ||||
|         } | ||||
| 
 | ||||
|         public void money() | ||||
|         { | ||||
|         } | ||||
| 
 | ||||
|         public void email() | ||||
|         { | ||||
|         } | ||||
| 
 | ||||
|         public void at_target() | ||||
|         { | ||||
|         } | ||||
| 
 | ||||
|         public void not_at_target() | ||||
|         { | ||||
|         } | ||||
| 
 | ||||
|         public void at_rot_target() | ||||
|         { | ||||
|         } | ||||
| 
 | ||||
|         public void not_at_rot_target() | ||||
|         { | ||||
|         } | ||||
| 
 | ||||
|         public void run_time_permissions() | ||||
|         { | ||||
|         } | ||||
| 
 | ||||
|         public void changed() | ||||
|         { | ||||
|         } | ||||
| 
 | ||||
|         public void attach() | ||||
|         { | ||||
|         } | ||||
| 
 | ||||
|         public void dataserver() | ||||
|         { | ||||
|         } | ||||
| 
 | ||||
|         public void link_message() | ||||
|         { | ||||
|         } | ||||
| 
 | ||||
|         public void moving_start() | ||||
|         { | ||||
|         } | ||||
| 
 | ||||
|         public void moving_end() | ||||
|         { | ||||
|         } | ||||
| 
 | ||||
|         public void object_rez() | ||||
|         { | ||||
|         } | ||||
| 
 | ||||
|         public void remote_data() | ||||
|         { | ||||
|         } | ||||
| 
 | ||||
|         public void http_response() | ||||
|         { | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  |  | |||
|  | @ -1,334 +1,335 @@ | |||
| /* | ||||
| * Copyright (c) Contributors, http://opensimulator.org/ | ||||
| * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||||
| * | ||||
| * Redistribution and use in source and binary forms, with or without | ||||
| * modification, are permitted provided that the following conditions are met: | ||||
| *     * Redistributions of source code must retain the above copyright | ||||
| *       notice, this list of conditions and the following disclaimer. | ||||
| *     * Redistributions in binary form must reproduce the above copyright | ||||
| *       notice, this list of conditions and the following disclaimer in the | ||||
| *       documentation and/or other materials provided with the distribution. | ||||
| *     * Neither the name of the OpenSim Project nor the | ||||
| *       names of its contributors may be used to endorse or promote products | ||||
| *       derived from this software without specific prior written permission. | ||||
| * | ||||
| * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||||
| * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||||
| * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||||
| * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||||
| * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||||
| * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||||
| * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||||
| * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
| *  | ||||
| */ | ||||
| /* Original code: Tedd Hansen */ | ||||
| using System; | ||||
| using System.Collections; | ||||
| using System.Collections.Generic; | ||||
| using System.Threading; | ||||
| using libsecondlife; | ||||
| using OpenSim.Framework; | ||||
| using OpenSim.Grid.ScriptEngine.DotNetEngine.Compiler.LSL; | ||||
| using OpenSim.Region.Environment.Scenes.Scripting; | ||||
| 
 | ||||
| namespace OpenSim.Grid.ScriptEngine.DotNetEngine | ||||
| { | ||||
|     /// <summary> | ||||
|     /// EventQueueManager handles event queues | ||||
|     /// Events are queued and executed in separate thread | ||||
|     /// </summary> | ||||
|     [Serializable] | ||||
|     internal class EventQueueManager | ||||
|     { | ||||
|         /// <summary> | ||||
|         /// List of threads processing event queue | ||||
|         /// </summary> | ||||
|         private List<Thread> eventQueueThreads = new List<Thread>(); | ||||
| 
 | ||||
|         private object queueLock = new object(); // Mutex lock object | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// How many ms to sleep if queue is empty | ||||
|         /// </summary> | ||||
|         private int nothingToDoSleepms = 50; | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// How many threads to process queue with | ||||
|         /// </summary> | ||||
|         private int numberOfThreads = 2; | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Queue containing events waiting to be executed | ||||
|         /// </summary> | ||||
|         private Queue<QueueItemStruct> eventQueue = new Queue<QueueItemStruct>(); | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Queue item structure | ||||
|         /// </summary> | ||||
|         private struct QueueItemStruct | ||||
|         { | ||||
|             public uint localID; | ||||
|             public LLUUID itemID; | ||||
|             public string functionName; | ||||
|             public object[] param; | ||||
|         } | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// List of localID locks for mutex processing of script events | ||||
|         /// </summary> | ||||
|         private List<uint> objectLocks = new List<uint>(); | ||||
| 
 | ||||
|         private object tryLockLock = new object(); // Mutex lock object | ||||
| 
 | ||||
|         private ScriptEngine m_ScriptEngine; | ||||
| 
 | ||||
|         public EventQueueManager(ScriptEngine _ScriptEngine) | ||||
|         { | ||||
|             m_ScriptEngine = _ScriptEngine; | ||||
| 
 | ||||
|             // | ||||
|             // Start event queue processing threads (worker threads) | ||||
|             // | ||||
|             for (int ThreadCount = 0; ThreadCount <= numberOfThreads; ThreadCount++) | ||||
|             { | ||||
|                 Thread EventQueueThread = new Thread(EventQueueThreadLoop); | ||||
|                 eventQueueThreads.Add(EventQueueThread); | ||||
|                 EventQueueThread.IsBackground = true; | ||||
|                 EventQueueThread.Priority = ThreadPriority.BelowNormal; | ||||
|                 EventQueueThread.Name = "EventQueueManagerThread_" + ThreadCount; | ||||
|                 EventQueueThread.Start(); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         ~EventQueueManager() | ||||
|         { | ||||
|             // Kill worker threads | ||||
|             foreach (Thread EventQueueThread in new ArrayList(eventQueueThreads)) | ||||
|             { | ||||
|                 if (EventQueueThread != null && EventQueueThread.IsAlive == true) | ||||
|                 { | ||||
|                     try | ||||
|                     { | ||||
|                         EventQueueThread.Abort(); | ||||
|                         EventQueueThread.Join(); | ||||
|                     } | ||||
|                     catch (Exception) | ||||
|                     { | ||||
|                         //myScriptEngine.Log.Verbose("ScriptEngine", "EventQueueManager Exception killing worker thread: " + e.ToString()); | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|             eventQueueThreads.Clear(); | ||||
|             // Todo: Clean up our queues | ||||
|             eventQueue.Clear(); | ||||
|         } | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Queue processing thread loop | ||||
|         /// </summary> | ||||
|         private void EventQueueThreadLoop() | ||||
|         { | ||||
|             //myScriptEngine.m_logger.Verbose("ScriptEngine", "EventQueueManager Worker thread spawned"); | ||||
|             try | ||||
|             { | ||||
|                 QueueItemStruct BlankQIS = new QueueItemStruct(); | ||||
|                 while (true) | ||||
|                 { | ||||
|                     try | ||||
|                     { | ||||
|                         QueueItemStruct QIS = BlankQIS; | ||||
|                         bool GotItem = false; | ||||
| 
 | ||||
|                         if (eventQueue.Count == 0) | ||||
|                         { | ||||
|                             // Nothing to do? Sleep a bit waiting for something to do | ||||
|                             Thread.Sleep(nothingToDoSleepms); | ||||
|                         } | ||||
|                         else | ||||
|                         { | ||||
|                             // Something in queue, process | ||||
|                             //myScriptEngine.m_logger.Verbose("ScriptEngine", "Processing event for localID: " + QIS.localID + ", itemID: " + QIS.itemID + ", FunctionName: " + QIS.FunctionName); | ||||
| 
 | ||||
|                             // OBJECT BASED LOCK - TWO THREADS WORKING ON SAME OBJECT IS NOT GOOD | ||||
|                             lock (queueLock) | ||||
|                             { | ||||
|                                 GotItem = false; | ||||
|                                 for (int qc = 0; qc < eventQueue.Count; qc++) | ||||
|                                 { | ||||
|                                     // Get queue item | ||||
|                                     QIS = eventQueue.Dequeue(); | ||||
| 
 | ||||
|                                     // Check if object is being processed by someone else | ||||
|                                     if (TryLock(QIS.localID) == false) | ||||
|                                     { | ||||
|                                         // Object is already being processed, requeue it | ||||
|                                         eventQueue.Enqueue(QIS); | ||||
|                                     } | ||||
|                                     else | ||||
|                                     { | ||||
|                                         // We have lock on an object and can process it | ||||
|                                         GotItem = true; | ||||
|                                         break; | ||||
|                                     } | ||||
|                                 } // go through queue | ||||
|                             } // lock | ||||
| 
 | ||||
|                             if (GotItem == true) | ||||
|                             { | ||||
|                                 // Execute function | ||||
|                                 try | ||||
|                                 { | ||||
|                                     m_ScriptEngine.m_ScriptManager.ExecuteEvent(QIS.localID, QIS.itemID, | ||||
|                                                                                 QIS.functionName, QIS.param); | ||||
|                                 } | ||||
|                                 catch (Exception e) | ||||
|                                 { | ||||
|                                     // DISPLAY ERROR INWORLD | ||||
|                                     string text = "Error executing script function \"" + QIS.functionName + "\":\r\n"; | ||||
|                                     if (e.InnerException != null) | ||||
|                                     { | ||||
|                                         // Send inner exception | ||||
|                                         text += e.InnerException.Message.ToString(); | ||||
|                                     } | ||||
|                                     else | ||||
|                                     { | ||||
|                                         // Send normal | ||||
|                                         text += e.Message.ToString(); | ||||
|                                     } | ||||
|                                     try | ||||
|                                     { | ||||
|                                         if (text.Length > 1500) | ||||
|                                             text = text.Substring(0, 1500); | ||||
|                                         IScriptHost m_host = m_ScriptEngine.World.GetSceneObjectPart(QIS.localID); | ||||
|                                         //if (m_host != null) | ||||
|                                         //{ | ||||
|                                         m_ScriptEngine.World.SimChat(Helpers.StringToField(text), ChatTypeEnum.Say, 0, | ||||
|                                                                      m_host.AbsolutePosition, m_host.Name, m_host.UUID); | ||||
|                                     } | ||||
|                                     catch | ||||
|                                     { | ||||
|                                         //} | ||||
|                                         //else | ||||
|                                         //{ | ||||
|                                         // T oconsole | ||||
|                                         Console.WriteLine("Unable to send text in-world:\r\n" + text); | ||||
|                                     } | ||||
|                                 } | ||||
|                                 finally | ||||
|                                 { | ||||
|                                     ReleaseLock(QIS.localID); | ||||
|                                 } | ||||
|                             } | ||||
|                         } // Something in queue | ||||
|                     } | ||||
|                     catch (ThreadAbortException tae) | ||||
|                     { | ||||
|                         throw tae; | ||||
|                     } | ||||
|                     catch (Exception e) | ||||
|                     { | ||||
|                         Console.WriteLine("Exception in EventQueueThreadLoop: " + e.ToString()); | ||||
|                     } | ||||
|                 } // while | ||||
|             } // try | ||||
|             catch (ThreadAbortException) | ||||
|             { | ||||
|                 //myScriptEngine.Log.Verbose("ScriptEngine", "EventQueueManager Worker thread killed: " + tae.Message); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Try to get a mutex lock on localID | ||||
|         /// </summary> | ||||
|         /// <param name="localID"></param> | ||||
|         /// <returns></returns> | ||||
|         private bool TryLock(uint localID) | ||||
|         { | ||||
|             lock (tryLockLock) | ||||
|             { | ||||
|                 if (objectLocks.Contains(localID) == true) | ||||
|                 { | ||||
|                     return false; | ||||
|                 } | ||||
|                 else | ||||
|                 { | ||||
|                     objectLocks.Add(localID); | ||||
|                     return true; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Release mutex lock on localID | ||||
|         /// </summary> | ||||
|         /// <param name="localID"></param> | ||||
|         private void ReleaseLock(uint localID) | ||||
|         { | ||||
|             lock (tryLockLock) | ||||
|             { | ||||
|                 if (objectLocks.Contains(localID) == true) | ||||
|                 { | ||||
|                     objectLocks.Remove(localID); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Add event to event execution queue | ||||
|         /// </summary> | ||||
|         /// <param name="localID"></param> | ||||
|         /// <param name="FunctionName">Name of the function, will be state + "_event_" + FunctionName</param> | ||||
|         /// <param name="param">Array of parameters to match event mask</param> | ||||
|         public void AddToObjectQueue(uint localID, string FunctionName, object[] param) | ||||
|         { | ||||
|             // Determine all scripts in Object and add to their queue | ||||
|             //myScriptEngine.m_logger.Verbose("ScriptEngine", "EventQueueManager Adding localID: " + localID + ", FunctionName: " + FunctionName); | ||||
| 
 | ||||
| 
 | ||||
|             // Do we have any scripts in this object at all? If not, return | ||||
|             if (m_ScriptEngine.m_ScriptManager.Scripts.ContainsKey(localID) == false) | ||||
|             { | ||||
|                 //Console.WriteLine("Event \"" + FunctionName + "\" for localID: " + localID + ". No scripts found on this localID."); | ||||
|                 return; | ||||
|             } | ||||
| 
 | ||||
|             Dictionary<LLUUID, LSL_BaseClass>.KeyCollection scriptKeys = | ||||
|                 m_ScriptEngine.m_ScriptManager.GetScriptKeys(localID); | ||||
| 
 | ||||
|             foreach (LLUUID itemID in scriptKeys) | ||||
|             { | ||||
|                 // Add to each script in that object | ||||
|                 // TODO: Some scripts may not subscribe to this event. Should we NOT add it? Does it matter? | ||||
|                 AddToScriptQueue(localID, itemID, FunctionName, param); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Add event to event execution queue | ||||
|         /// </summary> | ||||
|         /// <param name="localID"></param> | ||||
|         /// <param name="itemID"></param> | ||||
|         /// <param name="FunctionName">Name of the function, will be state + "_event_" + FunctionName</param> | ||||
|         /// <param name="param">Array of parameters to match event mask</param> | ||||
|         public void AddToScriptQueue(uint localID, LLUUID itemID, string FunctionName, object[] param) | ||||
|         { | ||||
|             lock (queueLock) | ||||
|             { | ||||
|                 // Create a structure and add data | ||||
|                 QueueItemStruct QIS = new QueueItemStruct(); | ||||
|                 QIS.localID = localID; | ||||
|                 QIS.itemID = itemID; | ||||
|                 QIS.functionName = FunctionName; | ||||
|                 QIS.param = param; | ||||
| 
 | ||||
|                 // Add it to queue | ||||
|                 eventQueue.Enqueue(QIS); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
| /* | ||||
| * Copyright (c) Contributors, http://opensimulator.org/ | ||||
| * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||||
| * | ||||
| * Redistribution and use in source and binary forms, with or without | ||||
| * modification, are permitted provided that the following conditions are met: | ||||
| *     * Redistributions of source code must retain the above copyright | ||||
| *       notice, this list of conditions and the following disclaimer. | ||||
| *     * Redistributions in binary form must reproduce the above copyright | ||||
| *       notice, this list of conditions and the following disclaimer in the | ||||
| *       documentation and/or other materials provided with the distribution. | ||||
| *     * Neither the name of the OpenSim Project nor the | ||||
| *       names of its contributors may be used to endorse or promote products | ||||
| *       derived from this software without specific prior written permission. | ||||
| * | ||||
| * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||||
| * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||||
| * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||||
| * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||||
| * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||||
| * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||||
| * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||||
| * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
| *  | ||||
| */ | ||||
| /* Original code: Tedd Hansen */ | ||||
| using System; | ||||
| using System.Collections; | ||||
| using System.Collections.Generic; | ||||
| using System.Threading; | ||||
| using libsecondlife; | ||||
| using OpenSim.Framework; | ||||
| using OpenSim.Grid.ScriptEngine.DotNetEngine.Compiler.LSL; | ||||
| using OpenSim.Region.Environment.Scenes.Scripting; | ||||
| 
 | ||||
| namespace OpenSim.Grid.ScriptEngine.DotNetEngine | ||||
| { | ||||
|     /// <summary> | ||||
|     /// EventQueueManager handles event queues | ||||
|     /// Events are queued and executed in separate thread | ||||
|     /// </summary> | ||||
|     [Serializable] | ||||
|     internal class EventQueueManager | ||||
|     { | ||||
|         private static readonly log4net.ILog m_log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// List of threads processing event queue | ||||
|         /// </summary> | ||||
|         private List<Thread> eventQueueThreads = new List<Thread>(); | ||||
| 
 | ||||
|         private object queueLock = new object(); // Mutex lock object | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// How many ms to sleep if queue is empty | ||||
|         /// </summary> | ||||
|         private int nothingToDoSleepms = 50; | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// How many threads to process queue with | ||||
|         /// </summary> | ||||
|         private int numberOfThreads = 2; | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Queue containing events waiting to be executed | ||||
|         /// </summary> | ||||
|         private Queue<QueueItemStruct> eventQueue = new Queue<QueueItemStruct>(); | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Queue item structure | ||||
|         /// </summary> | ||||
|         private struct QueueItemStruct | ||||
|         { | ||||
|             public uint localID; | ||||
|             public LLUUID itemID; | ||||
|             public string functionName; | ||||
|             public object[] param; | ||||
|         } | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// List of localID locks for mutex processing of script events | ||||
|         /// </summary> | ||||
|         private List<uint> objectLocks = new List<uint>(); | ||||
| 
 | ||||
|         private object tryLockLock = new object(); // Mutex lock object | ||||
| 
 | ||||
|         private ScriptEngine m_ScriptEngine; | ||||
| 
 | ||||
|         public EventQueueManager(ScriptEngine _ScriptEngine) | ||||
|         { | ||||
|             m_ScriptEngine = _ScriptEngine; | ||||
| 
 | ||||
|             // | ||||
|             // Start event queue processing threads (worker threads) | ||||
|             // | ||||
|             for (int ThreadCount = 0; ThreadCount <= numberOfThreads; ThreadCount++) | ||||
|             { | ||||
|                 Thread EventQueueThread = new Thread(EventQueueThreadLoop); | ||||
|                 eventQueueThreads.Add(EventQueueThread); | ||||
|                 EventQueueThread.IsBackground = true; | ||||
|                 EventQueueThread.Priority = ThreadPriority.BelowNormal; | ||||
|                 EventQueueThread.Name = "EventQueueManagerThread_" + ThreadCount; | ||||
|                 EventQueueThread.Start(); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         ~EventQueueManager() | ||||
|         { | ||||
|             // Kill worker threads | ||||
|             foreach (Thread EventQueueThread in new ArrayList(eventQueueThreads)) | ||||
|             { | ||||
|                 if (EventQueueThread != null && EventQueueThread.IsAlive == true) | ||||
|                 { | ||||
|                     try | ||||
|                     { | ||||
|                         EventQueueThread.Abort(); | ||||
|                         EventQueueThread.Join(); | ||||
|                     } | ||||
|                     catch (Exception) | ||||
|                     { | ||||
|                         //myScriptEngine.m_log.Info("[ScriptEngine]: EventQueueManager Exception killing worker thread: " + e.ToString()); | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|             eventQueueThreads.Clear(); | ||||
|             // Todo: Clean up our queues | ||||
|             eventQueue.Clear(); | ||||
|         } | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Queue processing thread loop | ||||
|         /// </summary> | ||||
|         private void EventQueueThreadLoop() | ||||
|         { | ||||
|             //myScriptEngine.m_log.Info("[ScriptEngine]: EventQueueManager Worker thread spawned"); | ||||
|             try | ||||
|             { | ||||
|                 QueueItemStruct BlankQIS = new QueueItemStruct(); | ||||
|                 while (true) | ||||
|                 { | ||||
|                     try | ||||
|                     { | ||||
|                         QueueItemStruct QIS = BlankQIS; | ||||
|                         bool GotItem = false; | ||||
| 
 | ||||
|                         if (eventQueue.Count == 0) | ||||
|                         { | ||||
|                             // Nothing to do? Sleep a bit waiting for something to do | ||||
|                             Thread.Sleep(nothingToDoSleepms); | ||||
|                         } | ||||
|                         else | ||||
|                         { | ||||
|                             // Something in queue, process | ||||
|                             //myScriptEngine.m_log.Info("[ScriptEngine]: Processing event for localID: " + QIS.localID + ", itemID: " + QIS.itemID + ", FunctionName: " + QIS.FunctionName); | ||||
| 
 | ||||
|                             // OBJECT BASED LOCK - TWO THREADS WORKING ON SAME OBJECT IS NOT GOOD | ||||
|                             lock (queueLock) | ||||
|                             { | ||||
|                                 GotItem = false; | ||||
|                                 for (int qc = 0; qc < eventQueue.Count; qc++) | ||||
|                                 { | ||||
|                                     // Get queue item | ||||
|                                     QIS = eventQueue.Dequeue(); | ||||
| 
 | ||||
|                                     // Check if object is being processed by someone else | ||||
|                                     if (TryLock(QIS.localID) == false) | ||||
|                                     { | ||||
|                                         // Object is already being processed, requeue it | ||||
|                                         eventQueue.Enqueue(QIS); | ||||
|                                     } | ||||
|                                     else | ||||
|                                     { | ||||
|                                         // We have lock on an object and can process it | ||||
|                                         GotItem = true; | ||||
|                                         break; | ||||
|                                     } | ||||
|                                 } | ||||
|                             } | ||||
| 
 | ||||
|                             if (GotItem == true) | ||||
|                             { | ||||
|                                 // Execute function | ||||
|                                 try | ||||
|                                 { | ||||
|                                     m_ScriptEngine.m_ScriptManager.ExecuteEvent(QIS.localID, QIS.itemID, | ||||
|                                                                                 QIS.functionName, QIS.param); | ||||
|                                 } | ||||
|                                 catch (Exception e) | ||||
|                                 { | ||||
|                                     // DISPLAY ERROR INWORLD | ||||
|                                     string text = "Error executing script function \"" + QIS.functionName + "\":\r\n"; | ||||
|                                     if (e.InnerException != null) | ||||
|                                     { | ||||
|                                         // Send inner exception | ||||
|                                         text += e.InnerException.Message.ToString(); | ||||
|                                     } | ||||
|                                     else | ||||
|                                     { | ||||
|                                         // Send normal | ||||
|                                         text += e.Message.ToString(); | ||||
|                                     } | ||||
|                                     try | ||||
|                                     { | ||||
|                                         if (text.Length > 1500) | ||||
|                                             text = text.Substring(0, 1500); | ||||
|                                         IScriptHost m_host = m_ScriptEngine.World.GetSceneObjectPart(QIS.localID); | ||||
|                                         //if (m_host != null) | ||||
|                                         //{ | ||||
|                                         m_ScriptEngine.World.SimChat(Helpers.StringToField(text), ChatTypeEnum.Say, 0, | ||||
|                                                                      m_host.AbsolutePosition, m_host.Name, m_host.UUID); | ||||
|                                     } | ||||
|                                     catch | ||||
|                                     { | ||||
|                                         //} | ||||
|                                         //else | ||||
|                                         //{ | ||||
|                                         // T oconsole | ||||
|                                         Console.WriteLine("Unable to send text in-world:\r\n" + text); | ||||
|                                     } | ||||
|                                 } | ||||
|                                 finally | ||||
|                                 { | ||||
|                                     ReleaseLock(QIS.localID); | ||||
|                                 } | ||||
|                             } | ||||
|                         } | ||||
|                     } | ||||
|                     catch (ThreadAbortException tae) | ||||
|                     { | ||||
|                         throw tae; | ||||
|                     } | ||||
|                     catch (Exception e) | ||||
|                     { | ||||
|                         Console.WriteLine("Exception in EventQueueThreadLoop: " + e.ToString()); | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|             catch (ThreadAbortException) | ||||
|             { | ||||
|                 //myScriptEngine.m_log.Info("[ScriptEngine]: EventQueueManager Worker thread killed: " + tae.Message); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Try to get a mutex lock on localID | ||||
|         /// </summary> | ||||
|         /// <param name="localID"></param> | ||||
|         /// <returns></returns> | ||||
|         private bool TryLock(uint localID) | ||||
|         { | ||||
|             lock (tryLockLock) | ||||
|             { | ||||
|                 if (objectLocks.Contains(localID) == true) | ||||
|                 { | ||||
|                     return false; | ||||
|                 } | ||||
|                 else | ||||
|                 { | ||||
|                     objectLocks.Add(localID); | ||||
|                     return true; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Release mutex lock on localID | ||||
|         /// </summary> | ||||
|         /// <param name="localID"></param> | ||||
|         private void ReleaseLock(uint localID) | ||||
|         { | ||||
|             lock (tryLockLock) | ||||
|             { | ||||
|                 if (objectLocks.Contains(localID) == true) | ||||
|                 { | ||||
|                     objectLocks.Remove(localID); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Add event to event execution queue | ||||
|         /// </summary> | ||||
|         /// <param name="localID"></param> | ||||
|         /// <param name="FunctionName">Name of the function, will be state + "_event_" + FunctionName</param> | ||||
|         /// <param name="param">Array of parameters to match event mask</param> | ||||
|         public void AddToObjectQueue(uint localID, string FunctionName, object[] param) | ||||
|         { | ||||
|             // Determine all scripts in Object and add to their queue | ||||
|             //myScriptEngine.m_log.Info("[ScriptEngine]: EventQueueManager Adding localID: " + localID + ", FunctionName: " + FunctionName); | ||||
| 
 | ||||
| 
 | ||||
|             // Do we have any scripts in this object at all? If not, return | ||||
|             if (m_ScriptEngine.m_ScriptManager.Scripts.ContainsKey(localID) == false) | ||||
|             { | ||||
|                 //Console.WriteLine("Event \"" + FunctionName + "\" for localID: " + localID + ". No scripts found on this localID."); | ||||
|                 return; | ||||
|             } | ||||
| 
 | ||||
|             Dictionary<LLUUID, LSL_BaseClass>.KeyCollection scriptKeys = | ||||
|                 m_ScriptEngine.m_ScriptManager.GetScriptKeys(localID); | ||||
| 
 | ||||
|             foreach (LLUUID itemID in scriptKeys) | ||||
|             { | ||||
|                 // Add to each script in that object | ||||
|                 // TODO: Some scripts may not subscribe to this event. Should we NOT add it? Does it matter? | ||||
|                 AddToScriptQueue(localID, itemID, FunctionName, param); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Add event to event execution queue | ||||
|         /// </summary> | ||||
|         /// <param name="localID"></param> | ||||
|         /// <param name="itemID"></param> | ||||
|         /// <param name="FunctionName">Name of the function, will be state + "_event_" + FunctionName</param> | ||||
|         /// <param name="param">Array of parameters to match event mask</param> | ||||
|         public void AddToScriptQueue(uint localID, LLUUID itemID, string FunctionName, object[] param) | ||||
|         { | ||||
|             lock (queueLock) | ||||
|             { | ||||
|                 // Create a structure and add data | ||||
|                 QueueItemStruct QIS = new QueueItemStruct(); | ||||
|                 QIS.localID = localID; | ||||
|                 QIS.itemID = itemID; | ||||
|                 QIS.functionName = FunctionName; | ||||
|                 QIS.param = param; | ||||
| 
 | ||||
|                 // Add it to queue | ||||
|                 eventQueue.Enqueue(QIS); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  |  | |||
|  | @ -1,355 +1,355 @@ | |||
| /* | ||||
| * Copyright (c) Contributors, http://opensimulator.org/ | ||||
| * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||||
| * | ||||
| * Redistribution and use in source and binary forms, with or without | ||||
| * modification, are permitted provided that the following conditions are met: | ||||
| *     * Redistributions of source code must retain the above copyright | ||||
| *       notice, this list of conditions and the following disclaimer. | ||||
| *     * Redistributions in binary form must reproduce the above copyright | ||||
| *       notice, this list of conditions and the following disclaimer in the | ||||
| *       documentation and/or other materials provided with the distribution. | ||||
| *     * Neither the name of the OpenSim Project nor the | ||||
| *       names of its contributors may be used to endorse or promote products | ||||
| *       derived from this software without specific prior written permission. | ||||
| * | ||||
| * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS AS IS AND ANY | ||||
| * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||||
| * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||||
| * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||||
| * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||||
| * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||||
| * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||||
| * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
| *  | ||||
| */ | ||||
| 
 | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Threading; | ||||
| using libsecondlife; | ||||
| using OpenSim.Region.Environment.Interfaces; | ||||
| using OpenSim.Region.Environment.Modules; | ||||
| 
 | ||||
| namespace OpenSim.Grid.ScriptEngine.DotNetEngine | ||||
| { | ||||
|     /// <summary> | ||||
|     /// Handles LSL commands that takes long time and returns an event, for example timers, HTTP requests, etc. | ||||
|     /// </summary> | ||||
|     internal class LSLLongCmdHandler | ||||
|     { | ||||
|         private Thread cmdHandlerThread; | ||||
|         private int cmdHandlerThreadCycleSleepms = 100; | ||||
| 
 | ||||
|         private ScriptEngine m_ScriptEngine; | ||||
| 
 | ||||
|         public LSLLongCmdHandler(ScriptEngine _ScriptEngine) | ||||
|         { | ||||
|             m_ScriptEngine = _ScriptEngine; | ||||
| 
 | ||||
|             // Start the thread that will be doing the work | ||||
|             cmdHandlerThread = new Thread(CmdHandlerThreadLoop); | ||||
|             cmdHandlerThread.Name = "CmdHandlerThread"; | ||||
|             cmdHandlerThread.Priority = ThreadPriority.BelowNormal; | ||||
|             cmdHandlerThread.IsBackground = true; | ||||
|             cmdHandlerThread.Start(); | ||||
|         } | ||||
| 
 | ||||
|         ~LSLLongCmdHandler() | ||||
|         { | ||||
|             // Shut down thread | ||||
|             try | ||||
|             { | ||||
|                 if (cmdHandlerThread != null) | ||||
|                 { | ||||
|                     if (cmdHandlerThread.IsAlive == true) | ||||
|                     { | ||||
|                         cmdHandlerThread.Abort(); | ||||
|                         cmdHandlerThread.Join(); | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|             catch | ||||
|             { | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         private void CmdHandlerThreadLoop() | ||||
|         { | ||||
|             while (true) | ||||
|             { | ||||
|                 // Check timers | ||||
|                 CheckTimerEvents(); | ||||
|                 Thread.Sleep(25); | ||||
|                 // Check HttpRequests | ||||
|                 CheckHttpRequests(); | ||||
|                 Thread.Sleep(25); | ||||
|                 // Check XMLRPCRequests | ||||
|                 CheckXMLRPCRequests(); | ||||
|                 Thread.Sleep(25); | ||||
|                 // Check Listeners | ||||
|                 CheckListeners(); | ||||
|                 Thread.Sleep(25); | ||||
| 
 | ||||
|                 // Sleep before next cycle | ||||
|                 //Thread.Sleep(cmdHandlerThreadCycleSleepms); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Remove a specific script (and all its pending commands) | ||||
|         /// </summary> | ||||
|         /// <param name="m_localID"></param> | ||||
|         /// <param name="m_itemID"></param> | ||||
|         public void RemoveScript(uint localID, LLUUID itemID) | ||||
|         { | ||||
|             // Remove a specific script | ||||
| 
 | ||||
|             // Remove from: Timers | ||||
|             UnSetTimerEvents(localID, itemID); | ||||
|             // Remove from: HttpRequest | ||||
|             StopHttpRequest(localID, itemID); | ||||
|         } | ||||
| 
 | ||||
|         #region TIMER | ||||
| 
 | ||||
|         // | ||||
|         // TIMER | ||||
|         // | ||||
|         private class TimerClass | ||||
|         { | ||||
|             public uint localID; | ||||
|             public LLUUID itemID; | ||||
|             public double interval; | ||||
|             public DateTime next; | ||||
|         } | ||||
| 
 | ||||
|         private List<TimerClass> Timers = new List<TimerClass>(); | ||||
|         private object TimerListLock = new object(); | ||||
| 
 | ||||
|         public void SetTimerEvent(uint m_localID, LLUUID m_itemID, double sec) | ||||
|         { | ||||
|             Console.WriteLine("SetTimerEvent"); | ||||
| 
 | ||||
|             // Always remove first, in case this is a re-set | ||||
|             UnSetTimerEvents(m_localID, m_itemID); | ||||
|             if (sec == 0) // Disabling timer | ||||
|                 return; | ||||
| 
 | ||||
|             // Add to timer | ||||
|             TimerClass ts = new TimerClass(); | ||||
|             ts.localID = m_localID; | ||||
|             ts.itemID = m_itemID; | ||||
|             ts.interval = sec; | ||||
|             ts.next = DateTime.Now.ToUniversalTime().AddSeconds(ts.interval); | ||||
|             lock (TimerListLock) | ||||
|             { | ||||
|                 Timers.Add(ts); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         public void UnSetTimerEvents(uint m_localID, LLUUID m_itemID) | ||||
|         { | ||||
|             // Remove from timer | ||||
|             lock (TimerListLock) | ||||
|             { | ||||
|                 List<TimerClass> NewTimers = new List<TimerClass>(); | ||||
|                 foreach (TimerClass ts in Timers) | ||||
|                 { | ||||
|                     if (ts.localID != m_localID && ts.itemID != m_itemID) | ||||
|                     { | ||||
|                         NewTimers.Add(ts); | ||||
|                     } | ||||
|                 } | ||||
|                 Timers.Clear(); | ||||
|                 Timers = NewTimers; | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         public void CheckTimerEvents() | ||||
|         { | ||||
|             // Nothing to do here? | ||||
|             if (Timers.Count == 0) | ||||
|                 return; | ||||
| 
 | ||||
|             lock (TimerListLock) | ||||
|             { | ||||
|                 // Go through all timers | ||||
|                 foreach (TimerClass ts in Timers) | ||||
|                 { | ||||
|                     // Time has passed? | ||||
|                     if (ts.next.ToUniversalTime() < DateTime.Now.ToUniversalTime()) | ||||
|                     { | ||||
|                         // Add it to queue | ||||
|                         m_ScriptEngine.m_EventQueueManager.AddToScriptQueue(ts.localID, ts.itemID, "timer", | ||||
|                                                                             new object[] {}); | ||||
|                         // set next interval | ||||
| 
 | ||||
| 
 | ||||
|                         ts.next = DateTime.Now.ToUniversalTime().AddSeconds(ts.interval); | ||||
|                     } | ||||
|                 } | ||||
|             } // lock | ||||
|         } | ||||
| 
 | ||||
|         #endregion | ||||
| 
 | ||||
|         #region HTTP REQUEST | ||||
| 
 | ||||
|         // | ||||
|         // HTTP REAQUEST | ||||
|         // | ||||
|         private class HttpClass | ||||
|         { | ||||
|             public uint localID; | ||||
|             public LLUUID itemID; | ||||
|             public string url; | ||||
|             public List<string> parameters; | ||||
|             public string body; | ||||
|             public DateTime next; | ||||
| 
 | ||||
|             public string response_request_id; | ||||
|             public int response_status; | ||||
|             public List<string> response_metadata; | ||||
|             public string response_body; | ||||
| 
 | ||||
|             public void SendRequest() | ||||
|             { | ||||
|                 // TODO: SEND REQUEST!!! | ||||
|             } | ||||
| 
 | ||||
|             public void Stop() | ||||
|             { | ||||
|                 // TODO: Cancel any ongoing request | ||||
|             } | ||||
| 
 | ||||
|             public bool CheckResponse() | ||||
|             { | ||||
|                 // TODO: Check if we got a response yet, return true if so -- false if not | ||||
|                 return true; | ||||
| 
 | ||||
|                 // TODO: If we got a response, set the following then return true | ||||
|                 //response_request_id | ||||
|                 //response_status | ||||
|                 //response_metadata | ||||
|                 //response_body | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         private List<HttpClass> HttpRequests = new List<HttpClass>(); | ||||
|         private object HttpListLock = new object(); | ||||
| 
 | ||||
|         public void StartHttpRequest(uint localID, LLUUID itemID, string url, List<string> parameters, string body) | ||||
|         { | ||||
|             Console.WriteLine("StartHttpRequest"); | ||||
| 
 | ||||
|             HttpClass htc = new HttpClass(); | ||||
|             htc.localID = localID; | ||||
|             htc.itemID = itemID; | ||||
|             htc.url = url; | ||||
|             htc.parameters = parameters; | ||||
|             htc.body = body; | ||||
|             lock (HttpListLock) | ||||
|             { | ||||
|                 //ADD REQUEST | ||||
|                 HttpRequests.Add(htc); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         public void StopHttpRequest(uint m_localID, LLUUID m_itemID) | ||||
|         { | ||||
|             // Remove from list | ||||
|             lock (HttpListLock) | ||||
|             { | ||||
|                 List<HttpClass> NewHttpList = new List<HttpClass>(); | ||||
|                 foreach (HttpClass ts in HttpRequests) | ||||
|                 { | ||||
|                     if (ts.localID != m_localID && ts.itemID != m_itemID) | ||||
|                     { | ||||
|                         // Keeping this one | ||||
|                         NewHttpList.Add(ts); | ||||
|                     } | ||||
|                     else | ||||
|                     { | ||||
|                         // Shutting this one down | ||||
|                         ts.Stop(); | ||||
|                     } | ||||
|                 } | ||||
|                 HttpRequests.Clear(); | ||||
|                 HttpRequests = NewHttpList; | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         public void CheckHttpRequests() | ||||
|         { | ||||
|             // Nothing to do here? | ||||
|             if (HttpRequests.Count == 0) | ||||
|                 return; | ||||
| 
 | ||||
|             lock (HttpListLock) | ||||
|             { | ||||
|                 foreach (HttpClass ts in HttpRequests) | ||||
|                 { | ||||
|                     if (ts.CheckResponse() == true) | ||||
|                     { | ||||
|                         // Add it to event queue | ||||
|                         //key request_id, integer status, list metadata, string body | ||||
|                         object[] resobj = | ||||
|                             new object[] | ||||
|                                 {ts.response_request_id, ts.response_status, ts.response_metadata, ts.response_body}; | ||||
|                         m_ScriptEngine.m_EventQueueManager.AddToScriptQueue(ts.localID, ts.itemID, "http_response", | ||||
|                                                                             resobj); | ||||
|                         // Now stop it | ||||
|                         StopHttpRequest(ts.localID, ts.itemID); | ||||
|                     } | ||||
|                 } | ||||
|             } // lock | ||||
|         } | ||||
| 
 | ||||
|         #endregion | ||||
| 
 | ||||
|         public void CheckXMLRPCRequests() | ||||
|         { | ||||
|             IXMLRPC xmlrpc = m_ScriptEngine.World.RequestModuleInterface<IXMLRPC>(); | ||||
| 
 | ||||
|             while (xmlrpc.hasRequests()) | ||||
|             { | ||||
|                 RPCRequestInfo rInfo = xmlrpc.GetNextRequest(); | ||||
|                 Console.WriteLine("PICKED REQUEST"); | ||||
| 
 | ||||
|                 //Deliver data to prim's remote_data handler | ||||
|                 object[] resobj = new object[] | ||||
|                     { | ||||
|                         2, rInfo.GetChannelKey().ToString(), rInfo.GetMessageID().ToString(), "", rInfo.GetIntValue(), | ||||
|                         rInfo.GetStrVal() | ||||
|                     }; | ||||
|                 m_ScriptEngine.m_EventQueueManager.AddToScriptQueue( | ||||
|                     rInfo.GetLocalID(), rInfo.GetItemID(), "remote_data", resobj | ||||
|                     ); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         public void CheckListeners() | ||||
|         { | ||||
|             IWorldComm comms = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>(); | ||||
| 
 | ||||
|             while (comms.HasMessages()) | ||||
|             { | ||||
|                 ListenerInfo lInfo = comms.GetNextMessage(); | ||||
|                 Console.WriteLine("PICKED LISTENER"); | ||||
| 
 | ||||
|                 //Deliver data to prim's listen handler | ||||
|                 object[] resobj = new object[] | ||||
|                     { | ||||
|                         lInfo.GetChannel(), lInfo.GetName(), lInfo.GetID().ToString(), lInfo.GetMessage() | ||||
|                     }; | ||||
| 
 | ||||
|                 m_ScriptEngine.m_EventQueueManager.AddToScriptQueue( | ||||
|                     lInfo.GetLocalID(), lInfo.GetItemID(), "listen", resobj | ||||
|                     ); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
| /* | ||||
| * Copyright (c) Contributors, http://opensimulator.org/ | ||||
| * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||||
| * | ||||
| * Redistribution and use in source and binary forms, with or without | ||||
| * modification, are permitted provided that the following conditions are met: | ||||
| *     * Redistributions of source code must retain the above copyright | ||||
| *       notice, this list of conditions and the following disclaimer. | ||||
| *     * Redistributions in binary form must reproduce the above copyright | ||||
| *       notice, this list of conditions and the following disclaimer in the | ||||
| *       documentation and/or other materials provided with the distribution. | ||||
| *     * Neither the name of the OpenSim Project nor the | ||||
| *       names of its contributors may be used to endorse or promote products | ||||
| *       derived from this software without specific prior written permission. | ||||
| * | ||||
| * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||||
| * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||||
| * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||||
| * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||||
| * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||||
| * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||||
| * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||||
| * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
| *  | ||||
| */ | ||||
| 
 | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Threading; | ||||
| using libsecondlife; | ||||
| using OpenSim.Region.Environment.Interfaces; | ||||
| using OpenSim.Region.Environment.Modules; | ||||
| 
 | ||||
| namespace OpenSim.Grid.ScriptEngine.DotNetEngine | ||||
| { | ||||
|     /// <summary> | ||||
|     /// Handles LSL commands that takes long time and returns an event, for example timers, HTTP requests, etc. | ||||
|     /// </summary> | ||||
|     internal class LSLLongCmdHandler | ||||
|     { | ||||
|         private Thread cmdHandlerThread; | ||||
|         private int cmdHandlerThreadCycleSleepms = 100; | ||||
| 
 | ||||
|         private ScriptEngine m_ScriptEngine; | ||||
| 
 | ||||
|         public LSLLongCmdHandler(ScriptEngine _ScriptEngine) | ||||
|         { | ||||
|             m_ScriptEngine = _ScriptEngine; | ||||
| 
 | ||||
|             // Start the thread that will be doing the work | ||||
|             cmdHandlerThread = new Thread(CmdHandlerThreadLoop); | ||||
|             cmdHandlerThread.Name = "CmdHandlerThread"; | ||||
|             cmdHandlerThread.Priority = ThreadPriority.BelowNormal; | ||||
|             cmdHandlerThread.IsBackground = true; | ||||
|             cmdHandlerThread.Start(); | ||||
|         } | ||||
| 
 | ||||
|         ~LSLLongCmdHandler() | ||||
|         { | ||||
|             // Shut down thread | ||||
|             try | ||||
|             { | ||||
|                 if (cmdHandlerThread != null) | ||||
|                 { | ||||
|                     if (cmdHandlerThread.IsAlive == true) | ||||
|                     { | ||||
|                         cmdHandlerThread.Abort(); | ||||
|                         cmdHandlerThread.Join(); | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|             catch | ||||
|             { | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         private void CmdHandlerThreadLoop() | ||||
|         { | ||||
|             while (true) | ||||
|             { | ||||
|                 // Check timers | ||||
|                 CheckTimerEvents(); | ||||
|                 Thread.Sleep(25); | ||||
|                 // Check HttpRequests | ||||
|                 CheckHttpRequests(); | ||||
|                 Thread.Sleep(25); | ||||
|                 // Check XMLRPCRequests | ||||
|                 CheckXMLRPCRequests(); | ||||
|                 Thread.Sleep(25); | ||||
|                 // Check Listeners | ||||
|                 CheckListeners(); | ||||
|                 Thread.Sleep(25); | ||||
| 
 | ||||
|                 // Sleep before next cycle | ||||
|                 //Thread.Sleep(cmdHandlerThreadCycleSleepms); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Remove a specific script (and all its pending commands) | ||||
|         /// </summary> | ||||
|         /// <param name="m_localID"></param> | ||||
|         /// <param name="m_itemID"></param> | ||||
|         public void RemoveScript(uint localID, LLUUID itemID) | ||||
|         { | ||||
|             // Remove a specific script | ||||
| 
 | ||||
|             // Remove from: Timers | ||||
|             UnSetTimerEvents(localID, itemID); | ||||
|             // Remove from: HttpRequest | ||||
|             StopHttpRequest(localID, itemID); | ||||
|         } | ||||
| 
 | ||||
|         #region TIMER | ||||
| 
 | ||||
|         // | ||||
|         // TIMER | ||||
|         // | ||||
|         private class TimerClass | ||||
|         { | ||||
|             public uint localID; | ||||
|             public LLUUID itemID; | ||||
|             public double interval; | ||||
|             public DateTime next; | ||||
|         } | ||||
| 
 | ||||
|         private List<TimerClass> Timers = new List<TimerClass>(); | ||||
|         private object TimerListLock = new object(); | ||||
| 
 | ||||
|         public void SetTimerEvent(uint m_localID, LLUUID m_itemID, double sec) | ||||
|         { | ||||
|             Console.WriteLine("SetTimerEvent"); | ||||
| 
 | ||||
|             // Always remove first, in case this is a re-set | ||||
|             UnSetTimerEvents(m_localID, m_itemID); | ||||
|             if (sec == 0) // Disabling timer | ||||
|                 return; | ||||
| 
 | ||||
|             // Add to timer | ||||
|             TimerClass ts = new TimerClass(); | ||||
|             ts.localID = m_localID; | ||||
|             ts.itemID = m_itemID; | ||||
|             ts.interval = sec; | ||||
|             ts.next = DateTime.Now.ToUniversalTime().AddSeconds(ts.interval); | ||||
|             lock (TimerListLock) | ||||
|             { | ||||
|                 Timers.Add(ts); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         public void UnSetTimerEvents(uint m_localID, LLUUID m_itemID) | ||||
|         { | ||||
|             // Remove from timer | ||||
|             lock (TimerListLock) | ||||
|             { | ||||
|                 List<TimerClass> NewTimers = new List<TimerClass>(); | ||||
|                 foreach (TimerClass ts in Timers) | ||||
|                 { | ||||
|                     if (ts.localID != m_localID && ts.itemID != m_itemID) | ||||
|                     { | ||||
|                         NewTimers.Add(ts); | ||||
|                     } | ||||
|                 } | ||||
|                 Timers.Clear(); | ||||
|                 Timers = NewTimers; | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         public void CheckTimerEvents() | ||||
|         { | ||||
|             // Nothing to do here? | ||||
|             if (Timers.Count == 0) | ||||
|                 return; | ||||
| 
 | ||||
|             lock (TimerListLock) | ||||
|             { | ||||
|                 // Go through all timers | ||||
|                 foreach (TimerClass ts in Timers) | ||||
|                 { | ||||
|                     // Time has passed? | ||||
|                     if (ts.next.ToUniversalTime() < DateTime.Now.ToUniversalTime()) | ||||
|                     { | ||||
|                         // Add it to queue | ||||
|                         m_ScriptEngine.m_EventQueueManager.AddToScriptQueue(ts.localID, ts.itemID, "timer", | ||||
|                                                                             new object[] {}); | ||||
|                         // set next interval | ||||
| 
 | ||||
| 
 | ||||
|                         ts.next = DateTime.Now.ToUniversalTime().AddSeconds(ts.interval); | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         #endregion | ||||
| 
 | ||||
|         #region HTTP REQUEST | ||||
| 
 | ||||
|         // | ||||
|         // HTTP REAQUEST | ||||
|         // | ||||
|         private class HttpClass | ||||
|         { | ||||
|             public uint localID; | ||||
|             public LLUUID itemID; | ||||
|             public string url; | ||||
|             public List<string> parameters; | ||||
|             public string body; | ||||
|             public DateTime next; | ||||
| 
 | ||||
|             public string response_request_id; | ||||
|             public int response_status; | ||||
|             public List<string> response_metadata; | ||||
|             public string response_body; | ||||
| 
 | ||||
|             public void SendRequest() | ||||
|             { | ||||
|                 // TODO: SEND REQUEST!!! | ||||
|             } | ||||
| 
 | ||||
|             public void Stop() | ||||
|             { | ||||
|                 // TODO: Cancel any ongoing request | ||||
|             } | ||||
| 
 | ||||
|             public bool CheckResponse() | ||||
|             { | ||||
|                 // TODO: Check if we got a response yet, return true if so -- false if not | ||||
|                 return true; | ||||
| 
 | ||||
|                 // TODO: If we got a response, set the following then return true | ||||
|                 //response_request_id | ||||
|                 //response_status | ||||
|                 //response_metadata | ||||
|                 //response_body | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         private List<HttpClass> HttpRequests = new List<HttpClass>(); | ||||
|         private object HttpListLock = new object(); | ||||
| 
 | ||||
|         public void StartHttpRequest(uint localID, LLUUID itemID, string url, List<string> parameters, string body) | ||||
|         { | ||||
|             Console.WriteLine("StartHttpRequest"); | ||||
| 
 | ||||
|             HttpClass htc = new HttpClass(); | ||||
|             htc.localID = localID; | ||||
|             htc.itemID = itemID; | ||||
|             htc.url = url; | ||||
|             htc.parameters = parameters; | ||||
|             htc.body = body; | ||||
|             lock (HttpListLock) | ||||
|             { | ||||
|                 //ADD REQUEST | ||||
|                 HttpRequests.Add(htc); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         public void StopHttpRequest(uint m_localID, LLUUID m_itemID) | ||||
|         { | ||||
|             // Remove from list | ||||
|             lock (HttpListLock) | ||||
|             { | ||||
|                 List<HttpClass> NewHttpList = new List<HttpClass>(); | ||||
|                 foreach (HttpClass ts in HttpRequests) | ||||
|                 { | ||||
|                     if (ts.localID != m_localID && ts.itemID != m_itemID) | ||||
|                     { | ||||
|                         // Keeping this one | ||||
|                         NewHttpList.Add(ts); | ||||
|                     } | ||||
|                     else | ||||
|                     { | ||||
|                         // Shutting this one down | ||||
|                         ts.Stop(); | ||||
|                     } | ||||
|                 } | ||||
|                 HttpRequests.Clear(); | ||||
|                 HttpRequests = NewHttpList; | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         public void CheckHttpRequests() | ||||
|         { | ||||
|             // Nothing to do here? | ||||
|             if (HttpRequests.Count == 0) | ||||
|                 return; | ||||
| 
 | ||||
|             lock (HttpListLock) | ||||
|             { | ||||
|                 foreach (HttpClass ts in HttpRequests) | ||||
|                 { | ||||
|                     if (ts.CheckResponse() == true) | ||||
|                     { | ||||
|                         // Add it to event queue | ||||
|                         //key request_id, integer status, list metadata, string body | ||||
|                         object[] resobj = | ||||
|                             new object[] | ||||
|                                 {ts.response_request_id, ts.response_status, ts.response_metadata, ts.response_body}; | ||||
|                         m_ScriptEngine.m_EventQueueManager.AddToScriptQueue(ts.localID, ts.itemID, "http_response", | ||||
|                                                                             resobj); | ||||
|                         // Now stop it | ||||
|                         StopHttpRequest(ts.localID, ts.itemID); | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         #endregion | ||||
| 
 | ||||
|         public void CheckXMLRPCRequests() | ||||
|         { | ||||
|             IXMLRPC xmlrpc = m_ScriptEngine.World.RequestModuleInterface<IXMLRPC>(); | ||||
| 
 | ||||
|             while (xmlrpc.hasRequests()) | ||||
|             { | ||||
|                 RPCRequestInfo rInfo = xmlrpc.GetNextRequest(); | ||||
|                 Console.WriteLine("PICKED REQUEST"); | ||||
| 
 | ||||
|                 //Deliver data to prim's remote_data handler | ||||
|                 object[] resobj = new object[] | ||||
|                     { | ||||
|                         2, rInfo.GetChannelKey().ToString(), rInfo.GetMessageID().ToString(), "", rInfo.GetIntValue(), | ||||
|                         rInfo.GetStrVal() | ||||
|                     }; | ||||
|                 m_ScriptEngine.m_EventQueueManager.AddToScriptQueue( | ||||
|                     rInfo.GetLocalID(), rInfo.GetItemID(), "remote_data", resobj | ||||
|                     ); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         public void CheckListeners() | ||||
|         { | ||||
|             IWorldComm comms = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>(); | ||||
| 
 | ||||
|             while (comms.HasMessages()) | ||||
|             { | ||||
|                 ListenerInfo lInfo = comms.GetNextMessage(); | ||||
|                 Console.WriteLine("PICKED LISTENER"); | ||||
| 
 | ||||
|                 //Deliver data to prim's listen handler | ||||
|                 object[] resobj = new object[] | ||||
|                     { | ||||
|                         lInfo.GetChannel(), lInfo.GetName(), lInfo.GetID().ToString(), lInfo.GetMessage() | ||||
|                     }; | ||||
| 
 | ||||
|                 m_ScriptEngine.m_EventQueueManager.AddToScriptQueue( | ||||
|                     lInfo.GetLocalID(), lInfo.GetItemID(), "listen", resobj | ||||
|                     ); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  |  | |||
|  | @ -1,38 +1,66 @@ | |||
| using System.Reflection; | ||||
| using System.Runtime.InteropServices; | ||||
| 
 | ||||
| // General Information about an assembly is controlled through the following  | ||||
| // set of attributes. Change these attribute values to modify the information | ||||
| // associated with an assembly. | ||||
| 
 | ||||
| [assembly : AssemblyTitle("OpenSim.Grid.ScriptEngine.DotNetEngine")] | ||||
| [assembly : AssemblyDescription("")] | ||||
| [assembly : AssemblyConfiguration("")] | ||||
| [assembly : AssemblyCompany("")] | ||||
| [assembly : AssemblyProduct("OpenSim.Grid.ScriptEngine.DotNetEngine")] | ||||
| [assembly : AssemblyCopyright("Copyright ©  2007")] | ||||
| [assembly : AssemblyTrademark("")] | ||||
| [assembly : AssemblyCulture("")] | ||||
| 
 | ||||
| // Setting ComVisible to false makes the types in this assembly not visible  | ||||
| // to COM components.  If you need to access a type in this assembly from  | ||||
| // COM, set the ComVisible attribute to true on that type. | ||||
| 
 | ||||
| [assembly : ComVisible(false)] | ||||
| 
 | ||||
| // The following GUID is for the ID of the typelib if this project is exposed to COM | ||||
| 
 | ||||
| [assembly : Guid("2842257e-6fde-4460-9368-4cde57fa9cc4")] | ||||
| 
 | ||||
| // Version information for an assembly consists of the following four values: | ||||
| // | ||||
| //      Major Version | ||||
| //      Minor Version  | ||||
| //      Build Number | ||||
| //      Revision | ||||
| // | ||||
| // You can specify all the values or you can default the Revision and Build Numbers  | ||||
| // by using the '*' as shown below: | ||||
| 
 | ||||
| [assembly : AssemblyVersion("1.0.0.0")] | ||||
| [assembly : AssemblyFileVersion("1.0.0.0")] | ||||
| /* | ||||
| * Copyright (c) Contributors, http://opensimulator.org/ | ||||
| * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||||
| * | ||||
| * Redistribution and use in source and binary forms, with or without | ||||
| * modification, are permitted provided that the following conditions are met: | ||||
| *     * Redistributions of source code must retain the above copyright | ||||
| *       notice, this list of conditions and the following disclaimer. | ||||
| *     * Redistributions in binary form must reproduce the above copyright | ||||
| *       notice, this list of conditions and the following disclaimer in the | ||||
| *       documentation and/or other materials provided with the distribution. | ||||
| *     * Neither the name of the OpenSim Project nor the | ||||
| *       names of its contributors may be used to endorse or promote products | ||||
| *       derived from this software without specific prior written permission. | ||||
| * | ||||
| * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||||
| * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||||
| * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||||
| * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||||
| * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||||
| * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||||
| * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||||
| * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
| *  | ||||
| */ | ||||
| 
 | ||||
| using System.Reflection; | ||||
| using System.Runtime.InteropServices; | ||||
| 
 | ||||
| // General Information about an assembly is controlled through the following  | ||||
| // set of attributes. Change these attribute values to modify the information | ||||
| // associated with an assembly. | ||||
| 
 | ||||
| [assembly : AssemblyTitle("OpenSim.Grid.ScriptEngine.DotNetEngine")] | ||||
| [assembly : AssemblyDescription("")] | ||||
| [assembly : AssemblyConfiguration("")] | ||||
| [assembly : AssemblyCompany("")] | ||||
| [assembly : AssemblyProduct("OpenSim.Grid.ScriptEngine.DotNetEngine")] | ||||
| [assembly : AssemblyCopyright("Copyright © 2007")] | ||||
| [assembly : AssemblyTrademark("")] | ||||
| [assembly : AssemblyCulture("")] | ||||
| 
 | ||||
| // Setting ComVisible to false makes the types in this assembly not visible  | ||||
| // to COM components.  If you need to access a type in this assembly from  | ||||
| // COM, set the ComVisible attribute to true on that type. | ||||
| 
 | ||||
| [assembly : ComVisible(false)] | ||||
| 
 | ||||
| // The following GUID is for the ID of the typelib if this project is exposed to COM | ||||
| 
 | ||||
| [assembly : Guid("2842257e-6fde-4460-9368-4cde57fa9cc4")] | ||||
| 
 | ||||
| // Version information for an assembly consists of the following four values: | ||||
| // | ||||
| //      Major Version | ||||
| //      Minor Version  | ||||
| //      Build Number | ||||
| //      Revision | ||||
| // | ||||
| // You can specify all the values or you can default the Revision and Build Numbers  | ||||
| // by using the '*' as shown below: | ||||
| 
 | ||||
| [assembly : AssemblyVersion("1.0.0.0")] | ||||
| [assembly : AssemblyFileVersion("1.0.0.0")] | ||||
|  |  | |||
|  | @ -1,124 +1,119 @@ | |||
| /* | ||||
| * Copyright (c) Contributors, http://opensimulator.org/ | ||||
| * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||||
| * | ||||
| * Redistribution and use in source and binary forms, with or without | ||||
| * modification, are permitted provided that the following conditions are met: | ||||
| *     * Redistributions of source code must retain the above copyright | ||||
| *       notice, this list of conditions and the following disclaimer. | ||||
| *     * Redistributions in binary form must reproduce the above copyright | ||||
| *       notice, this list of conditions and the following disclaimer in the | ||||
| *       documentation and/or other materials provided with the distribution. | ||||
| *     * Neither the name of the OpenSim Project nor the | ||||
| *       names of its contributors may be used to endorse or promote products | ||||
| *       derived from this software without specific prior written permission. | ||||
| * | ||||
| * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||||
| * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||||
| * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||||
| * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||||
| * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||||
| * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||||
| * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||||
| * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
| *  | ||||
| */ | ||||
| /* Original code: Tedd Hansen */ | ||||
| using System; | ||||
| using Nini.Config; | ||||
| using OpenSim.Framework.Console; | ||||
| using OpenSim.Region.Environment.Interfaces; | ||||
| using OpenSim.Region.Environment.Scenes; | ||||
| 
 | ||||
| namespace OpenSim.Grid.ScriptEngine.DotNetEngine | ||||
| { | ||||
|     /// <summary> | ||||
|     /// This is the root object for ScriptEngine | ||||
|     /// </summary> | ||||
|     [Serializable] | ||||
|     public class ScriptEngine : IRegionModule | ||||
|     { | ||||
|         internal Scene World; | ||||
|         internal EventManager m_EventManager; // Handles and queues incoming events from OpenSim | ||||
|         internal EventQueueManager m_EventQueueManager; // Executes events | ||||
|         internal ScriptManager m_ScriptManager; // Load, unload and execute scripts | ||||
|         internal AppDomainManager m_AppDomainManager; | ||||
|         internal LSLLongCmdHandler m_LSLLongCmdHandler; | ||||
| 
 | ||||
|         private LogBase m_log; | ||||
| 
 | ||||
|         public ScriptEngine() | ||||
|         { | ||||
|             //Common.SendToDebug("ScriptEngine Object Initialized"); | ||||
|             Common.mySE = this; | ||||
|         } | ||||
| 
 | ||||
|         public LogBase Log | ||||
|         { | ||||
|             get { return m_log; } | ||||
|         } | ||||
| 
 | ||||
|         public void InitializeEngine(Scene Sceneworld, LogBase logger) | ||||
|         { | ||||
|             World = Sceneworld; | ||||
|             m_log = logger; | ||||
| 
 | ||||
|             Log.Verbose("ScriptEngine", "DotNet & LSL ScriptEngine initializing"); | ||||
| 
 | ||||
|             //m_logger.Status("ScriptEngine", "InitializeEngine"); | ||||
| 
 | ||||
|             // Create all objects we'll be using | ||||
|             m_EventQueueManager = new EventQueueManager(this); | ||||
|             m_EventManager = new EventManager(this); | ||||
|             m_ScriptManager = new ScriptManager(this); | ||||
|             m_AppDomainManager = new AppDomainManager(); | ||||
|             m_LSLLongCmdHandler = new LSLLongCmdHandler(this); | ||||
| 
 | ||||
|             // Should we iterate the region for scripts that needs starting? | ||||
|             // Or can we assume we are loaded before anything else so we can use proper events? | ||||
|         } | ||||
| 
 | ||||
|         public void Shutdown() | ||||
|         { | ||||
|             // We are shutting down | ||||
|         } | ||||
| 
 | ||||
|         //// !!!FOR DEBUGGING ONLY!!! (for executing script directly from test app) | ||||
|         //[Obsolete("!!!FOR DEBUGGING ONLY!!!")] | ||||
|         //public void StartScript(string ScriptID, IScriptHost ObjectID) | ||||
|         //{ | ||||
|         //    this.myEventManager.TEMP_OBJECT_ID = ObjectID; | ||||
|         //    Log.Status("ScriptEngine", "DEBUG FUNCTION: StartScript: " + ScriptID); | ||||
|         //    myScriptManager.StartScript(ScriptID, ObjectID); | ||||
|         //} | ||||
| 
 | ||||
|         #region IRegionModule | ||||
| 
 | ||||
|         public void Initialise(Scene scene, IConfigSource config) | ||||
|         { | ||||
|             InitializeEngine(scene, MainLog.Instance); | ||||
|         } | ||||
| 
 | ||||
|         public void PostInitialise() | ||||
|         { | ||||
|         } | ||||
| 
 | ||||
|         public void Close() | ||||
|         { | ||||
|         } | ||||
| 
 | ||||
|         public string Name | ||||
|         { | ||||
|             get { return "LSLScriptingModule"; } | ||||
|         } | ||||
| 
 | ||||
|         public bool IsSharedModule | ||||
|         { | ||||
|             get { return false; } | ||||
|         } | ||||
| 
 | ||||
|         #endregion | ||||
|     } | ||||
| } | ||||
| /* | ||||
| * Copyright (c) Contributors, http://opensimulator.org/ | ||||
| * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||||
| * | ||||
| * Redistribution and use in source and binary forms, with or without | ||||
| * modification, are permitted provided that the following conditions are met: | ||||
| *     * Redistributions of source code must retain the above copyright | ||||
| *       notice, this list of conditions and the following disclaimer. | ||||
| *     * Redistributions in binary form must reproduce the above copyright | ||||
| *       notice, this list of conditions and the following disclaimer in the | ||||
| *       documentation and/or other materials provided with the distribution. | ||||
| *     * Neither the name of the OpenSim Project nor the | ||||
| *       names of its contributors may be used to endorse or promote products | ||||
| *       derived from this software without specific prior written permission. | ||||
| * | ||||
| * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||||
| * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||||
| * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||||
| * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||||
| * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||||
| * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||||
| * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||||
| * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
| *  | ||||
| */ | ||||
| /* Original code: Tedd Hansen */ | ||||
| using System; | ||||
| using Nini.Config; | ||||
| using OpenSim.Framework.Console; | ||||
| using OpenSim.Region.Environment.Interfaces; | ||||
| using OpenSim.Region.Environment.Scenes; | ||||
| 
 | ||||
| namespace OpenSim.Grid.ScriptEngine.DotNetEngine | ||||
| { | ||||
|     /// <summary> | ||||
|     /// This is the root object for ScriptEngine | ||||
|     /// </summary> | ||||
|     [Serializable] | ||||
|     public class ScriptEngine : IRegionModule | ||||
|     { | ||||
|         private static readonly log4net.ILog m_log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); | ||||
| 
 | ||||
|         internal Scene World; | ||||
|         internal EventManager m_EventManager; // Handles and queues incoming events from OpenSim | ||||
|         internal EventQueueManager m_EventQueueManager; // Executes events | ||||
|         internal ScriptManager m_ScriptManager; // Load, unload and execute scripts | ||||
|         internal AppDomainManager m_AppDomainManager; | ||||
|         internal LSLLongCmdHandler m_LSLLongCmdHandler; | ||||
| 
 | ||||
| 
 | ||||
|         public ScriptEngine() | ||||
|         { | ||||
|             //Common.SendToDebug("ScriptEngine Object Initialized"); | ||||
|             Common.mySE = this; | ||||
|         } | ||||
| 
 | ||||
|         public void InitializeEngine(Scene Sceneworld) | ||||
|         { | ||||
|             World = Sceneworld; | ||||
| 
 | ||||
|             m_log.Info("[ScriptEngine]: DotNet & LSL ScriptEngine initializing"); | ||||
| 
 | ||||
|             //m_log.Info("[ScriptEngine]: InitializeEngine"); | ||||
| 
 | ||||
|             // Create all objects we'll be using | ||||
|             m_EventQueueManager = new EventQueueManager(this); | ||||
|             m_EventManager = new EventManager(this); | ||||
|             m_ScriptManager = new ScriptManager(this); | ||||
|             m_AppDomainManager = new AppDomainManager(); | ||||
|             m_LSLLongCmdHandler = new LSLLongCmdHandler(this); | ||||
| 
 | ||||
|             // Should we iterate the region for scripts that needs starting? | ||||
|             // Or can we assume we are loaded before anything else so we can use proper events? | ||||
|         } | ||||
| 
 | ||||
|         public void Shutdown() | ||||
|         { | ||||
|             // We are shutting down | ||||
|         } | ||||
| 
 | ||||
|         //// !!!FOR DEBUGGING ONLY!!! (for executing script directly from test app) | ||||
|         //[Obsolete("!!!FOR DEBUGGING ONLY!!!")] | ||||
|         //public void StartScript(string ScriptID, IScriptHost ObjectID) | ||||
|         //{ | ||||
|         //    this.myEventManager.TEMP_OBJECT_ID = ObjectID; | ||||
|         //    m_log.Info("[ScriptEngine]: DEBUG FUNCTION: StartScript: " + ScriptID); | ||||
|         //    myScriptManager.StartScript(ScriptID, ObjectID); | ||||
|         //} | ||||
| 
 | ||||
|         #region IRegionModule | ||||
| 
 | ||||
|         public void Initialise(Scene scene, IConfigSource config) | ||||
|         { | ||||
|             InitializeEngine(scene); | ||||
|         } | ||||
| 
 | ||||
|         public void PostInitialise() | ||||
|         { | ||||
|         } | ||||
| 
 | ||||
|         public void Close() | ||||
|         { | ||||
|         } | ||||
| 
 | ||||
|         public string Name | ||||
|         { | ||||
|             get { return "LSLScriptingModule"; } | ||||
|         } | ||||
| 
 | ||||
|         public bool IsSharedModule | ||||
|         { | ||||
|             get { return false; } | ||||
|         } | ||||
| 
 | ||||
|         #endregion | ||||
|     } | ||||
| } | ||||
|  |  | |||
|  | @ -1,419 +1,421 @@ | |||
| /* | ||||
| * Copyright (c) Contributors, http://opensimulator.org/ | ||||
| * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||||
| * | ||||
| * Redistribution and use in source and binary forms, with or without | ||||
| * modification, are permitted provided that the following conditions are met: | ||||
| *     * Redistributions of source code must retain the above copyright | ||||
| *       notice, this list of conditions and the following disclaimer. | ||||
| *     * Redistributions in binary form must reproduce the above copyright | ||||
| *       notice, this list of conditions and the following disclaimer in the | ||||
| *       documentation and/or other materials provided with the distribution. | ||||
| *     * Neither the name of the OpenSim Project nor the | ||||
| *       names of its contributors may be used to endorse or promote products | ||||
| *       derived from this software without specific prior written permission. | ||||
| * | ||||
| * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||||
| * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||||
| * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||||
| * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||||
| * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||||
| * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||||
| * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||||
| * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
| *  | ||||
| */ | ||||
| /* Original code: Tedd Hansen */ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.IO; | ||||
| using System.Reflection; | ||||
| using System.Runtime.Serialization.Formatters.Binary; | ||||
| using System.Threading; | ||||
| using libsecondlife; | ||||
| using OpenSim.Framework; | ||||
| using OpenSim.Grid.ScriptEngine.DotNetEngine.Compiler; | ||||
| using OpenSim.Grid.ScriptEngine.DotNetEngine.Compiler.LSL; | ||||
| using OpenSim.Region.Environment.Scenes; | ||||
| 
 | ||||
| namespace OpenSim.Grid.ScriptEngine.DotNetEngine | ||||
| { | ||||
|     /// <summary> | ||||
|     /// Loads scripts | ||||
|     /// Compiles them if necessary | ||||
|     /// Execute functions for EventQueueManager (Sends them to script on other AppDomain for execution) | ||||
|     /// </summary> | ||||
|     [Serializable] | ||||
|     public class ScriptManager | ||||
|     { | ||||
|         #region Declares | ||||
| 
 | ||||
|         private Thread scriptLoadUnloadThread; | ||||
|         private int scriptLoadUnloadThread_IdleSleepms = 100; | ||||
|         private Queue<LoadStruct> loadQueue = new Queue<LoadStruct>(); | ||||
|         private Queue<UnloadStruct> unloadQueue = new Queue<UnloadStruct>(); | ||||
| 
 | ||||
|         private struct LoadStruct | ||||
|         { | ||||
|             public uint localID; | ||||
|             public LLUUID itemID; | ||||
|             public string script; | ||||
|         } | ||||
| 
 | ||||
|         private struct UnloadStruct | ||||
|         { | ||||
|             public uint localID; | ||||
|             public LLUUID itemID; | ||||
|         } | ||||
| 
 | ||||
|         // Object<string, Script<string, script>> | ||||
|         // IMPORTANT: Types and MemberInfo-derived objects require a LOT of memory. | ||||
|         // Instead use RuntimeTypeHandle, RuntimeFieldHandle and RunTimeHandle (IntPtr) instead! | ||||
|         internal Dictionary<uint, Dictionary<LLUUID, LSL_BaseClass>> Scripts = | ||||
|             new Dictionary<uint, Dictionary<LLUUID, LSL_BaseClass>>(); | ||||
| 
 | ||||
|         public Scene World | ||||
|         { | ||||
|             get { return m_scriptEngine.World; } | ||||
|         } | ||||
| 
 | ||||
|         #endregion | ||||
| 
 | ||||
|         #region Object init/shutdown | ||||
| 
 | ||||
|         private ScriptEngine m_scriptEngine; | ||||
| 
 | ||||
|         public ScriptManager(ScriptEngine scriptEngine) | ||||
|         { | ||||
|             m_scriptEngine = scriptEngine; | ||||
|             AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve); | ||||
|             scriptLoadUnloadThread = new Thread(ScriptLoadUnloadThreadLoop); | ||||
|             scriptLoadUnloadThread.Name = "ScriptLoadUnloadThread"; | ||||
|             scriptLoadUnloadThread.IsBackground = true; | ||||
|             scriptLoadUnloadThread.Priority = ThreadPriority.BelowNormal; | ||||
|             scriptLoadUnloadThread.Start(); | ||||
|         } | ||||
| 
 | ||||
|         ~ScriptManager() | ||||
|         { | ||||
|             // Abort load/unload thread | ||||
|             try | ||||
|             { | ||||
|                 if (scriptLoadUnloadThread != null) | ||||
|                 { | ||||
|                     if (scriptLoadUnloadThread.IsAlive == true) | ||||
|                     { | ||||
|                         scriptLoadUnloadThread.Abort(); | ||||
|                         scriptLoadUnloadThread.Join(); | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|             catch | ||||
|             { | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         #endregion | ||||
| 
 | ||||
|         #region Load / Unload scripts (Thread loop) | ||||
| 
 | ||||
|         private void ScriptLoadUnloadThreadLoop() | ||||
|         { | ||||
|             try | ||||
|             { | ||||
|                 while (true) | ||||
|                 { | ||||
|                     if (loadQueue.Count == 0 && unloadQueue.Count == 0) | ||||
|                         Thread.Sleep(scriptLoadUnloadThread_IdleSleepms); | ||||
| 
 | ||||
|                     if (loadQueue.Count > 0) | ||||
|                     { | ||||
|                         LoadStruct item = loadQueue.Dequeue(); | ||||
|                         _StartScript(item.localID, item.itemID, item.script); | ||||
|                     } | ||||
| 
 | ||||
|                     if (unloadQueue.Count > 0) | ||||
|                     { | ||||
|                         UnloadStruct item = unloadQueue.Dequeue(); | ||||
|                         _StopScript(item.localID, item.itemID); | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|             catch (ThreadAbortException tae) | ||||
|             { | ||||
|                 string a = tae.ToString(); | ||||
|                 a = ""; | ||||
|                 // Expected | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         #endregion | ||||
| 
 | ||||
|         #region Helper functions | ||||
| 
 | ||||
|         private static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) | ||||
|         { | ||||
|             //Console.WriteLine("ScriptManager.CurrentDomain_AssemblyResolve: " + args.Name); | ||||
|             return Assembly.GetExecutingAssembly().FullName == args.Name ? Assembly.GetExecutingAssembly() : null; | ||||
|         } | ||||
| 
 | ||||
|         #endregion | ||||
| 
 | ||||
|         #region Internal functions to keep track of script | ||||
| 
 | ||||
|         internal Dictionary<LLUUID, LSL_BaseClass>.KeyCollection GetScriptKeys(uint localID) | ||||
|         { | ||||
|             if (Scripts.ContainsKey(localID) == false) | ||||
|                 return null; | ||||
| 
 | ||||
|             Dictionary<LLUUID, LSL_BaseClass> Obj; | ||||
|             Scripts.TryGetValue(localID, out Obj); | ||||
| 
 | ||||
|             return Obj.Keys; | ||||
|         } | ||||
| 
 | ||||
|         internal LSL_BaseClass GetScript(uint localID, LLUUID itemID) | ||||
|         { | ||||
|             if (Scripts.ContainsKey(localID) == false) | ||||
|                 return null; | ||||
| 
 | ||||
|             Dictionary<LLUUID, LSL_BaseClass> Obj; | ||||
|             Scripts.TryGetValue(localID, out Obj); | ||||
|             if (Obj.ContainsKey(itemID) == false) | ||||
|                 return null; | ||||
| 
 | ||||
|             // Get script | ||||
|             LSL_BaseClass Script; | ||||
|             Obj.TryGetValue(itemID, out Script); | ||||
| 
 | ||||
|             return Script; | ||||
|         } | ||||
| 
 | ||||
|         internal void SetScript(uint localID, LLUUID itemID, LSL_BaseClass Script) | ||||
|         { | ||||
|             // Create object if it doesn't exist | ||||
|             if (Scripts.ContainsKey(localID) == false) | ||||
|             { | ||||
|                 Scripts.Add(localID, new Dictionary<LLUUID, LSL_BaseClass>()); | ||||
|             } | ||||
| 
 | ||||
|             // Delete script if it exists | ||||
|             Dictionary<LLUUID, LSL_BaseClass> Obj; | ||||
|             Scripts.TryGetValue(localID, out Obj); | ||||
|             if (Obj.ContainsKey(itemID) == true) | ||||
|                 Obj.Remove(itemID); | ||||
| 
 | ||||
|             // Add to object | ||||
|             Obj.Add(itemID, Script); | ||||
|         } | ||||
| 
 | ||||
|         internal void RemoveScript(uint localID, LLUUID itemID) | ||||
|         { | ||||
|             // Don't have that object? | ||||
|             if (Scripts.ContainsKey(localID) == false) | ||||
|                 return; | ||||
| 
 | ||||
|             // Delete script if it exists | ||||
|             Dictionary<LLUUID, LSL_BaseClass> Obj; | ||||
|             Scripts.TryGetValue(localID, out Obj); | ||||
|             if (Obj.ContainsKey(itemID) == true) | ||||
|                 Obj.Remove(itemID); | ||||
|         } | ||||
| 
 | ||||
|         #endregion | ||||
| 
 | ||||
|         #region Start/Stop/Reset script | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Fetches, loads and hooks up a script to an objects events | ||||
|         /// </summary> | ||||
|         /// <param name="itemID"></param> | ||||
|         /// <param name="localID"></param> | ||||
|         public void StartScript(uint localID, LLUUID itemID, string Script) | ||||
|         { | ||||
|             LoadStruct ls = new LoadStruct(); | ||||
|             ls.localID = localID; | ||||
|             ls.itemID = itemID; | ||||
|             ls.script = Script; | ||||
|             loadQueue.Enqueue(ls); | ||||
|         } | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Disables and unloads a script | ||||
|         /// </summary> | ||||
|         /// <param name="localID"></param> | ||||
|         /// <param name="itemID"></param> | ||||
|         public void StopScript(uint localID, LLUUID itemID) | ||||
|         { | ||||
|             UnloadStruct ls = new UnloadStruct(); | ||||
|             ls.localID = localID; | ||||
|             ls.itemID = itemID; | ||||
|             unloadQueue.Enqueue(ls); | ||||
|         } | ||||
| 
 | ||||
|         public void ResetScript(uint localID, LLUUID itemID) | ||||
|         { | ||||
|             string script = GetScript(localID, itemID).SourceCode; | ||||
|             StopScript(localID, itemID); | ||||
|             StartScript(localID, itemID, script); | ||||
|         } | ||||
| 
 | ||||
|         private void _StartScript(uint localID, LLUUID itemID, string Script) | ||||
|         { | ||||
|             //IScriptHost root = host.GetRoot(); | ||||
|             Console.WriteLine("ScriptManager StartScript: localID: " + localID + ", itemID: " + itemID); | ||||
| 
 | ||||
|             // We will initialize and start the script. | ||||
|             // It will be up to the script itself to hook up the correct events. | ||||
|             string ScriptSource = ""; | ||||
| 
 | ||||
|             SceneObjectPart m_host = World.GetSceneObjectPart(localID); | ||||
| 
 | ||||
|             try | ||||
|             { | ||||
|                 // Create a new instance of the compiler (currently we don't want reuse) | ||||
|                 Compiler.LSL.Compiler LSLCompiler = new Compiler.LSL.Compiler(); | ||||
|                 // Compile (We assume LSL) | ||||
|                 ScriptSource = LSLCompiler.CompileFromLSLText(Script); | ||||
|                 //Console.WriteLine("Compilation of " + FileName + " done"); | ||||
|                 // * Insert yield into code | ||||
|                 ScriptSource = ProcessYield(ScriptSource); | ||||
| 
 | ||||
| 
 | ||||
| #if DEBUG | ||||
|                 long before; | ||||
|                 before = GC.GetTotalMemory(true); | ||||
| #endif | ||||
| 
 | ||||
|                 LSL_BaseClass CompiledScript; | ||||
|                 CompiledScript = m_scriptEngine.m_AppDomainManager.LoadScript(ScriptSource); | ||||
| 
 | ||||
| #if DEBUG | ||||
|                 Console.WriteLine("Script " + itemID + " occupies {0} bytes", GC.GetTotalMemory(true) - before); | ||||
| #endif | ||||
| 
 | ||||
|                 CompiledScript.SourceCode = ScriptSource; | ||||
|                 // Add it to our script memstruct | ||||
|                 SetScript(localID, itemID, CompiledScript); | ||||
| 
 | ||||
|                 // We need to give (untrusted) assembly a private instance of BuiltIns | ||||
|                 //  this private copy will contain Read-Only FullitemID so that it can bring that on to the server whenever needed. | ||||
| 
 | ||||
| 
 | ||||
|                 LSL_BuiltIn_Commands LSLB = new LSL_BuiltIn_Commands(m_scriptEngine, m_host, localID, itemID); | ||||
| 
 | ||||
|                 // Start the script - giving it BuiltIns | ||||
|                 CompiledScript.Start(LSLB); | ||||
| 
 | ||||
|                 // Fire the first start-event | ||||
|                 m_scriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "state_entry", new object[] {}); | ||||
|             } | ||||
|             catch (Exception e) | ||||
|             { | ||||
|                 //m_scriptEngine.Log.Error("ScriptEngine", "Error compiling script: " + e.ToString()); | ||||
|                 try | ||||
|                 { | ||||
|                     // DISPLAY ERROR INWORLD | ||||
|                     string text = "Error compiling script:\r\n" + e.Message.ToString(); | ||||
|                     if (text.Length > 1500) | ||||
|                         text = text.Substring(0, 1500); | ||||
|                     World.SimChat(Helpers.StringToField(text), ChatTypeEnum.Say, 0, m_host.AbsolutePosition, m_host.Name, m_host.UUID); | ||||
|                 } | ||||
|                 catch (Exception e2) | ||||
|                 { | ||||
|                     m_scriptEngine.Log.Error("ScriptEngine", "Error displaying error in-world: " + e2.ToString()); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         private void _StopScript(uint localID, LLUUID itemID) | ||||
|         { | ||||
|             // Stop script | ||||
|             Console.WriteLine("Stop script localID: " + localID + " LLUID: " + itemID.ToString()); | ||||
| 
 | ||||
| 
 | ||||
|             // Stop long command on script | ||||
|             m_scriptEngine.m_LSLLongCmdHandler.RemoveScript(localID, itemID); | ||||
| 
 | ||||
|             LSL_BaseClass LSLBC = GetScript(localID, itemID); | ||||
|             if (LSLBC == null) | ||||
|                 return; | ||||
| 
 | ||||
|             // TEMP: First serialize it | ||||
|             //GetSerializedScript(localID, itemID); | ||||
| 
 | ||||
| 
 | ||||
|             try | ||||
|             { | ||||
|                 // Get AppDomain | ||||
|                 AppDomain ad = LSLBC.Exec.GetAppDomain(); | ||||
|                 // Tell script not to accept new requests | ||||
|                 GetScript(localID, itemID).Exec.StopScript(); | ||||
|                 // Remove from internal structure | ||||
|                 RemoveScript(localID, itemID); | ||||
|                 // Tell AppDomain that we have stopped script | ||||
|                 m_scriptEngine.m_AppDomainManager.StopScript(ad); | ||||
|             } | ||||
|             catch (Exception e) | ||||
|             { | ||||
|                 Console.WriteLine("Exception stopping script localID: " + localID + " LLUID: " + itemID.ToString() + | ||||
|                                   ": " + e.ToString()); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         private string ProcessYield(string FileName) | ||||
|         { | ||||
|             // TODO: Create a new assembly and copy old but insert Yield Code | ||||
|             //return TempDotNetMicroThreadingCodeInjector.TestFix(FileName); | ||||
|             return FileName; | ||||
|         } | ||||
| 
 | ||||
|         #endregion | ||||
| 
 | ||||
|         #region Perform event execution in script | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Execute a LL-event-function in Script | ||||
|         /// </summary> | ||||
|         /// <param name="localID">Object the script is located in</param> | ||||
|         /// <param name="itemID">Script ID</param> | ||||
|         /// <param name="FunctionName">Name of function</param> | ||||
|         /// <param name="args">Arguments to pass to function</param> | ||||
|         internal void ExecuteEvent(uint localID, LLUUID itemID, string FunctionName, object[] args) | ||||
|         { | ||||
|             // Execute a function in the script | ||||
|             //m_scriptEngine.Log.Verbose("ScriptEngine", "Executing Function localID: " + localID + ", itemID: " + itemID + ", FunctionName: " + FunctionName); | ||||
|             LSL_BaseClass Script = m_scriptEngine.m_ScriptManager.GetScript(localID, itemID); | ||||
|             if (Script == null) | ||||
|                 return; | ||||
| 
 | ||||
|             // Must be done in correct AppDomain, so leaving it up to the script itself | ||||
|             Script.Exec.ExecuteEvent(FunctionName, args); | ||||
|         } | ||||
| 
 | ||||
|         #endregion | ||||
| 
 | ||||
|         #region Script serialization/deserialization | ||||
| 
 | ||||
|         public void GetSerializedScript(uint localID, LLUUID itemID) | ||||
|         { | ||||
|             // Serialize the script and return it | ||||
|             // Should not be a problem | ||||
|             FileStream fs = File.Create("SERIALIZED_SCRIPT_" + itemID); | ||||
|             BinaryFormatter b = new BinaryFormatter(); | ||||
|             b.Serialize(fs, GetScript(localID, itemID)); | ||||
|             fs.Close(); | ||||
|         } | ||||
| 
 | ||||
|         public void PutSerializedScript(uint localID, LLUUID itemID) | ||||
|         { | ||||
|             // Deserialize the script and inject it into an AppDomain | ||||
| 
 | ||||
|             // How to inject into an AppDomain? | ||||
|         } | ||||
| 
 | ||||
|         #endregion | ||||
|     } | ||||
| } | ||||
| /* | ||||
| * Copyright (c) Contributors, http://opensimulator.org/ | ||||
| * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||||
| * | ||||
| * Redistribution and use in source and binary forms, with or without | ||||
| * modification, are permitted provided that the following conditions are met: | ||||
| *     * Redistributions of source code must retain the above copyright | ||||
| *       notice, this list of conditions and the following disclaimer. | ||||
| *     * Redistributions in binary form must reproduce the above copyright | ||||
| *       notice, this list of conditions and the following disclaimer in the | ||||
| *       documentation and/or other materials provided with the distribution. | ||||
| *     * Neither the name of the OpenSim Project nor the | ||||
| *       names of its contributors may be used to endorse or promote products | ||||
| *       derived from this software without specific prior written permission. | ||||
| * | ||||
| * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||||
| * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||||
| * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||||
| * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||||
| * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||||
| * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||||
| * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||||
| * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
| *  | ||||
| */ | ||||
| /* Original code: Tedd Hansen */ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.IO; | ||||
| using System.Reflection; | ||||
| using System.Runtime.Serialization.Formatters.Binary; | ||||
| using System.Threading; | ||||
| using libsecondlife; | ||||
| using OpenSim.Framework; | ||||
| using OpenSim.Grid.ScriptEngine.DotNetEngine.Compiler; | ||||
| using OpenSim.Grid.ScriptEngine.DotNetEngine.Compiler.LSL; | ||||
| using OpenSim.Region.Environment.Scenes; | ||||
| 
 | ||||
| namespace OpenSim.Grid.ScriptEngine.DotNetEngine | ||||
| { | ||||
|     /// <summary> | ||||
|     /// Loads scripts | ||||
|     /// Compiles them if necessary | ||||
|     /// Execute functions for EventQueueManager (Sends them to script on other AppDomain for execution) | ||||
|     /// </summary> | ||||
|     [Serializable] | ||||
|     public class ScriptManager | ||||
|     { | ||||
|         private static readonly log4net.ILog m_log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); | ||||
| 
 | ||||
|         #region Declares | ||||
| 
 | ||||
|         private Thread scriptLoadUnloadThread; | ||||
|         private int scriptLoadUnloadThread_IdleSleepms = 100; | ||||
|         private Queue<LoadStruct> loadQueue = new Queue<LoadStruct>(); | ||||
|         private Queue<UnloadStruct> unloadQueue = new Queue<UnloadStruct>(); | ||||
| 
 | ||||
|         private struct LoadStruct | ||||
|         { | ||||
|             public uint localID; | ||||
|             public LLUUID itemID; | ||||
|             public string script; | ||||
|         } | ||||
| 
 | ||||
|         private struct UnloadStruct | ||||
|         { | ||||
|             public uint localID; | ||||
|             public LLUUID itemID; | ||||
|         } | ||||
| 
 | ||||
|         // Object<string, Script<string, script>> | ||||
|         // IMPORTANT: Types and MemberInfo-derived objects require a LOT of memory. | ||||
|         // Instead use RuntimeTypeHandle, RuntimeFieldHandle and RunTimeHandle (IntPtr) instead! | ||||
|         internal Dictionary<uint, Dictionary<LLUUID, LSL_BaseClass>> Scripts = | ||||
|             new Dictionary<uint, Dictionary<LLUUID, LSL_BaseClass>>(); | ||||
| 
 | ||||
|         public Scene World | ||||
|         { | ||||
|             get { return m_scriptEngine.World; } | ||||
|         } | ||||
| 
 | ||||
|         #endregion | ||||
| 
 | ||||
|         #region Object init/shutdown | ||||
| 
 | ||||
|         private ScriptEngine m_scriptEngine; | ||||
| 
 | ||||
|         public ScriptManager(ScriptEngine scriptEngine) | ||||
|         { | ||||
|             m_scriptEngine = scriptEngine; | ||||
|             AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve); | ||||
|             scriptLoadUnloadThread = new Thread(ScriptLoadUnloadThreadLoop); | ||||
|             scriptLoadUnloadThread.Name = "ScriptLoadUnloadThread"; | ||||
|             scriptLoadUnloadThread.IsBackground = true; | ||||
|             scriptLoadUnloadThread.Priority = ThreadPriority.BelowNormal; | ||||
|             scriptLoadUnloadThread.Start(); | ||||
|         } | ||||
| 
 | ||||
|         ~ScriptManager() | ||||
|         { | ||||
|             // Abort load/unload thread | ||||
|             try | ||||
|             { | ||||
|                 if (scriptLoadUnloadThread != null) | ||||
|                 { | ||||
|                     if (scriptLoadUnloadThread.IsAlive == true) | ||||
|                     { | ||||
|                         scriptLoadUnloadThread.Abort(); | ||||
|                         scriptLoadUnloadThread.Join(); | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|             catch | ||||
|             { | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         #endregion | ||||
| 
 | ||||
|         #region Load / Unload scripts (Thread loop) | ||||
| 
 | ||||
|         private void ScriptLoadUnloadThreadLoop() | ||||
|         { | ||||
|             try | ||||
|             { | ||||
|                 while (true) | ||||
|                 { | ||||
|                     if (loadQueue.Count == 0 && unloadQueue.Count == 0) | ||||
|                         Thread.Sleep(scriptLoadUnloadThread_IdleSleepms); | ||||
| 
 | ||||
|                     if (loadQueue.Count > 0) | ||||
|                     { | ||||
|                         LoadStruct item = loadQueue.Dequeue(); | ||||
|                         _StartScript(item.localID, item.itemID, item.script); | ||||
|                     } | ||||
| 
 | ||||
|                     if (unloadQueue.Count > 0) | ||||
|                     { | ||||
|                         UnloadStruct item = unloadQueue.Dequeue(); | ||||
|                         _StopScript(item.localID, item.itemID); | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|             catch (ThreadAbortException tae) | ||||
|             { | ||||
|                 string a = tae.ToString(); | ||||
|                 a = ""; | ||||
|                 // Expected | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         #endregion | ||||
| 
 | ||||
|         #region Helper functions | ||||
| 
 | ||||
|         private static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) | ||||
|         { | ||||
|             //Console.WriteLine("ScriptManager.CurrentDomain_AssemblyResolve: " + args.Name); | ||||
|             return Assembly.GetExecutingAssembly().FullName == args.Name ? Assembly.GetExecutingAssembly() : null; | ||||
|         } | ||||
| 
 | ||||
|         #endregion | ||||
| 
 | ||||
|         #region Internal functions to keep track of script | ||||
| 
 | ||||
|         internal Dictionary<LLUUID, LSL_BaseClass>.KeyCollection GetScriptKeys(uint localID) | ||||
|         { | ||||
|             if (Scripts.ContainsKey(localID) == false) | ||||
|                 return null; | ||||
| 
 | ||||
|             Dictionary<LLUUID, LSL_BaseClass> Obj; | ||||
|             Scripts.TryGetValue(localID, out Obj); | ||||
| 
 | ||||
|             return Obj.Keys; | ||||
|         } | ||||
| 
 | ||||
|         internal LSL_BaseClass GetScript(uint localID, LLUUID itemID) | ||||
|         { | ||||
|             if (Scripts.ContainsKey(localID) == false) | ||||
|                 return null; | ||||
| 
 | ||||
|             Dictionary<LLUUID, LSL_BaseClass> Obj; | ||||
|             Scripts.TryGetValue(localID, out Obj); | ||||
|             if (Obj.ContainsKey(itemID) == false) | ||||
|                 return null; | ||||
| 
 | ||||
|             // Get script | ||||
|             LSL_BaseClass Script; | ||||
|             Obj.TryGetValue(itemID, out Script); | ||||
| 
 | ||||
|             return Script; | ||||
|         } | ||||
| 
 | ||||
|         internal void SetScript(uint localID, LLUUID itemID, LSL_BaseClass Script) | ||||
|         { | ||||
|             // Create object if it doesn't exist | ||||
|             if (Scripts.ContainsKey(localID) == false) | ||||
|             { | ||||
|                 Scripts.Add(localID, new Dictionary<LLUUID, LSL_BaseClass>()); | ||||
|             } | ||||
| 
 | ||||
|             // Delete script if it exists | ||||
|             Dictionary<LLUUID, LSL_BaseClass> Obj; | ||||
|             Scripts.TryGetValue(localID, out Obj); | ||||
|             if (Obj.ContainsKey(itemID) == true) | ||||
|                 Obj.Remove(itemID); | ||||
| 
 | ||||
|             // Add to object | ||||
|             Obj.Add(itemID, Script); | ||||
|         } | ||||
| 
 | ||||
|         internal void RemoveScript(uint localID, LLUUID itemID) | ||||
|         { | ||||
|             // Don't have that object? | ||||
|             if (Scripts.ContainsKey(localID) == false) | ||||
|                 return; | ||||
| 
 | ||||
|             // Delete script if it exists | ||||
|             Dictionary<LLUUID, LSL_BaseClass> Obj; | ||||
|             Scripts.TryGetValue(localID, out Obj); | ||||
|             if (Obj.ContainsKey(itemID) == true) | ||||
|                 Obj.Remove(itemID); | ||||
|         } | ||||
| 
 | ||||
|         #endregion | ||||
| 
 | ||||
|         #region Start/Stop/Reset script | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Fetches, loads and hooks up a script to an objects events | ||||
|         /// </summary> | ||||
|         /// <param name="itemID"></param> | ||||
|         /// <param name="localID"></param> | ||||
|         public void StartScript(uint localID, LLUUID itemID, string Script) | ||||
|         { | ||||
|             LoadStruct ls = new LoadStruct(); | ||||
|             ls.localID = localID; | ||||
|             ls.itemID = itemID; | ||||
|             ls.script = Script; | ||||
|             loadQueue.Enqueue(ls); | ||||
|         } | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Disables and unloads a script | ||||
|         /// </summary> | ||||
|         /// <param name="localID"></param> | ||||
|         /// <param name="itemID"></param> | ||||
|         public void StopScript(uint localID, LLUUID itemID) | ||||
|         { | ||||
|             UnloadStruct ls = new UnloadStruct(); | ||||
|             ls.localID = localID; | ||||
|             ls.itemID = itemID; | ||||
|             unloadQueue.Enqueue(ls); | ||||
|         } | ||||
| 
 | ||||
|         public void ResetScript(uint localID, LLUUID itemID) | ||||
|         { | ||||
|             string script = GetScript(localID, itemID).SourceCode; | ||||
|             StopScript(localID, itemID); | ||||
|             StartScript(localID, itemID, script); | ||||
|         } | ||||
| 
 | ||||
|         private void _StartScript(uint localID, LLUUID itemID, string Script) | ||||
|         { | ||||
|             //IScriptHost root = host.GetRoot(); | ||||
|             Console.WriteLine("ScriptManager StartScript: localID: " + localID + ", itemID: " + itemID); | ||||
| 
 | ||||
|             // We will initialize and start the script. | ||||
|             // It will be up to the script itself to hook up the correct events. | ||||
|             string ScriptSource = ""; | ||||
| 
 | ||||
|             SceneObjectPart m_host = World.GetSceneObjectPart(localID); | ||||
| 
 | ||||
|             try | ||||
|             { | ||||
|                 // Create a new instance of the compiler (currently we don't want reuse) | ||||
|                 Compiler.LSL.Compiler LSLCompiler = new Compiler.LSL.Compiler(); | ||||
|                 // Compile (We assume LSL) | ||||
|                 ScriptSource = LSLCompiler.CompileFromLSLText(Script); | ||||
|                 //Console.WriteLine("Compilation of " + FileName + " done"); | ||||
|                 // * Insert yield into code | ||||
|                 ScriptSource = ProcessYield(ScriptSource); | ||||
| 
 | ||||
| 
 | ||||
| #if DEBUG | ||||
|                 long before; | ||||
|                 before = GC.GetTotalMemory(true); | ||||
| #endif | ||||
| 
 | ||||
|                 LSL_BaseClass CompiledScript; | ||||
|                 CompiledScript = m_scriptEngine.m_AppDomainManager.LoadScript(ScriptSource); | ||||
| 
 | ||||
| #if DEBUG | ||||
|                 Console.WriteLine("Script " + itemID + " occupies {0} bytes", GC.GetTotalMemory(true) - before); | ||||
| #endif | ||||
| 
 | ||||
|                 CompiledScript.SourceCode = ScriptSource; | ||||
|                 // Add it to our script memstruct | ||||
|                 SetScript(localID, itemID, CompiledScript); | ||||
| 
 | ||||
|                 // We need to give (untrusted) assembly a private instance of BuiltIns | ||||
|                 //  this private copy will contain Read-Only FullitemID so that it can bring that on to the server whenever needed. | ||||
| 
 | ||||
| 
 | ||||
|                 LSL_BuiltIn_Commands LSLB = new LSL_BuiltIn_Commands(m_scriptEngine, m_host, localID, itemID); | ||||
| 
 | ||||
|                 // Start the script - giving it BuiltIns | ||||
|                 CompiledScript.Start(LSLB); | ||||
| 
 | ||||
|                 // Fire the first start-event | ||||
|                 m_scriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "state_entry", new object[] {}); | ||||
|             } | ||||
|             catch (Exception e) | ||||
|             { | ||||
|                 //m_scriptEngine.m_log.Error("[ScriptEngine]: Error compiling script: " + e.ToString()); | ||||
|                 try | ||||
|                 { | ||||
|                     // DISPLAY ERROR INWORLD | ||||
|                     string text = "Error compiling script:\r\n" + e.Message.ToString(); | ||||
|                     if (text.Length > 1500) | ||||
|                         text = text.Substring(0, 1500); | ||||
|                     World.SimChat(Helpers.StringToField(text), ChatTypeEnum.Say, 0, m_host.AbsolutePosition, m_host.Name, m_host.UUID); | ||||
|                 } | ||||
|                 catch (Exception e2) | ||||
|                 { | ||||
|                     m_scriptEngine.m_log.Error("[ScriptEngine]: Error displaying error in-world: " + e2.ToString()); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         private void _StopScript(uint localID, LLUUID itemID) | ||||
|         { | ||||
|             // Stop script | ||||
|             Console.WriteLine("Stop script localID: " + localID + " LLUID: " + itemID.ToString()); | ||||
| 
 | ||||
| 
 | ||||
|             // Stop long command on script | ||||
|             m_scriptEngine.m_LSLLongCmdHandler.RemoveScript(localID, itemID); | ||||
| 
 | ||||
|             LSL_BaseClass LSLBC = GetScript(localID, itemID); | ||||
|             if (LSLBC == null) | ||||
|                 return; | ||||
| 
 | ||||
|             // TEMP: First serialize it | ||||
|             //GetSerializedScript(localID, itemID); | ||||
| 
 | ||||
| 
 | ||||
|             try | ||||
|             { | ||||
|                 // Get AppDomain | ||||
|                 AppDomain ad = LSLBC.Exec.GetAppDomain(); | ||||
|                 // Tell script not to accept new requests | ||||
|                 GetScript(localID, itemID).Exec.StopScript(); | ||||
|                 // Remove from internal structure | ||||
|                 RemoveScript(localID, itemID); | ||||
|                 // Tell AppDomain that we have stopped script | ||||
|                 m_scriptEngine.m_AppDomainManager.StopScript(ad); | ||||
|             } | ||||
|             catch (Exception e) | ||||
|             { | ||||
|                 Console.WriteLine("Exception stopping script localID: " + localID + " LLUID: " + itemID.ToString() + | ||||
|                                   ": " + e.ToString()); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         private string ProcessYield(string FileName) | ||||
|         { | ||||
|             // TODO: Create a new assembly and copy old but insert Yield Code | ||||
|             //return TempDotNetMicroThreadingCodeInjector.TestFix(FileName); | ||||
|             return FileName; | ||||
|         } | ||||
| 
 | ||||
|         #endregion | ||||
| 
 | ||||
|         #region Perform event execution in script | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Execute a LL-event-function in Script | ||||
|         /// </summary> | ||||
|         /// <param name="localID">Object the script is located in</param> | ||||
|         /// <param name="itemID">Script ID</param> | ||||
|         /// <param name="FunctionName">Name of function</param> | ||||
|         /// <param name="args">Arguments to pass to function</param> | ||||
|         internal void ExecuteEvent(uint localID, LLUUID itemID, string FunctionName, object[] args) | ||||
|         { | ||||
|             // Execute a function in the script | ||||
|             //m_scriptEngine.m_log.Info("[ScriptEngine]: Executing Function localID: " + localID + ", itemID: " + itemID + ", FunctionName: " + FunctionName); | ||||
|             LSL_BaseClass Script = m_scriptEngine.m_ScriptManager.GetScript(localID, itemID); | ||||
|             if (Script == null) | ||||
|                 return; | ||||
| 
 | ||||
|             // Must be done in correct AppDomain, so leaving it up to the script itself | ||||
|             Script.Exec.ExecuteEvent(FunctionName, args); | ||||
|         } | ||||
| 
 | ||||
|         #endregion | ||||
| 
 | ||||
|         #region Script serialization/deserialization | ||||
| 
 | ||||
|         public void GetSerializedScript(uint localID, LLUUID itemID) | ||||
|         { | ||||
|             // Serialize the script and return it | ||||
|             // Should not be a problem | ||||
|             FileStream fs = File.Create("SERIALIZED_SCRIPT_" + itemID); | ||||
|             BinaryFormatter b = new BinaryFormatter(); | ||||
|             b.Serialize(fs, GetScript(localID, itemID)); | ||||
|             fs.Close(); | ||||
|         } | ||||
| 
 | ||||
|         public void PutSerializedScript(uint localID, LLUUID itemID) | ||||
|         { | ||||
|             // Deserialize the script and inject it into an AppDomain | ||||
| 
 | ||||
|             // How to inject into an AppDomain? | ||||
|         } | ||||
| 
 | ||||
|         #endregion | ||||
|     } | ||||
| } | ||||
|  |  | |||
|  | @ -1,69 +1,69 @@ | |||
| /* | ||||
| * Copyright (c) Contributors, http://opensimulator.org/ | ||||
| * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||||
| * | ||||
| * Redistribution and use in source and binary forms, with or without | ||||
| * modification, are permitted provided that the following conditions are met: | ||||
| *     * Redistributions of source code must retain the above copyright | ||||
| *       notice, this list of conditions and the following disclaimer. | ||||
| *     * Redistributions in binary form must reproduce the above copyright | ||||
| *       notice, this list of conditions and the following disclaimer in the | ||||
| *       documentation and/or other materials provided with the distribution. | ||||
| *     * Neither the name of the OpenSim Project nor the | ||||
| *       names of its contributors may be used to endorse or promote products | ||||
| *       derived from this software without specific prior written permission. | ||||
| * | ||||
| * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS AS IS AND ANY | ||||
| * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||||
| * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||||
| * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||||
| * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||||
| * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||||
| * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||||
| * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
| *  | ||||
| */ | ||||
| 
 | ||||
| using System; | ||||
| using System.IO; | ||||
| using Rail.Reflect; | ||||
| using Rail.Transformation; | ||||
| 
 | ||||
| namespace OpenSim.Grid.ScriptEngine.DotNetEngine | ||||
| { | ||||
|     /// <summary> | ||||
|     /// Tedds Sandbox for RAIL/microtrheading. This class is only for testing purposes! | ||||
|     /// Its offspring will be the actual implementation. | ||||
|     /// </summary> | ||||
|     internal class TempDotNetMicroThreadingCodeInjector | ||||
|     { | ||||
|         public static string TestFix(string FileName) | ||||
|         { | ||||
|             string ret = Path.GetFileNameWithoutExtension(FileName + "_fixed.dll"); | ||||
| 
 | ||||
|             Console.WriteLine("Loading: \"" + FileName + "\""); | ||||
|             RAssemblyDef rAssembly = RAssemblyDef.LoadAssembly(FileName); | ||||
| 
 | ||||
| 
 | ||||
|             //Get the type of the method to copy from assembly Teste2.exe to assembly Teste.exe | ||||
|             RTypeDef type = (RTypeDef) rAssembly.RModuleDef.GetType("SecondLife.Script"); | ||||
| 
 | ||||
|             //Get the methods in the type | ||||
|             RMethod[] m = type.GetMethods(); | ||||
| 
 | ||||
|             //Create a MethodPrologueAdder visitor object with the method to add | ||||
|             //and with the flag that enables local variable creation set to true | ||||
|             MethodPrologueAdder mpa = new MethodPrologueAdder((RMethodDef) m[0], true); | ||||
| 
 | ||||
|             //Apply the changes to the assembly | ||||
|             rAssembly.Accept(mpa); | ||||
| 
 | ||||
|             //Save the new assembly | ||||
|             rAssembly.SaveAssembly(ret); | ||||
| 
 | ||||
|             return ret; | ||||
|         } | ||||
|     } | ||||
| } | ||||
| /* | ||||
| * Copyright (c) Contributors, http://opensimulator.org/ | ||||
| * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||||
| * | ||||
| * Redistribution and use in source and binary forms, with or without | ||||
| * modification, are permitted provided that the following conditions are met: | ||||
| *     * Redistributions of source code must retain the above copyright | ||||
| *       notice, this list of conditions and the following disclaimer. | ||||
| *     * Redistributions in binary form must reproduce the above copyright | ||||
| *       notice, this list of conditions and the following disclaimer in the | ||||
| *       documentation and/or other materials provided with the distribution. | ||||
| *     * Neither the name of the OpenSim Project nor the | ||||
| *       names of its contributors may be used to endorse or promote products | ||||
| *       derived from this software without specific prior written permission. | ||||
| * | ||||
| * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||||
| * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||||
| * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||||
| * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||||
| * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||||
| * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||||
| * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||||
| * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
| *  | ||||
| */ | ||||
| 
 | ||||
| using System; | ||||
| using System.IO; | ||||
| using Rail.Reflect; | ||||
| using Rail.Transformation; | ||||
| 
 | ||||
| namespace OpenSim.Grid.ScriptEngine.DotNetEngine | ||||
| { | ||||
|     /// <summary> | ||||
|     /// Tedds Sandbox for RAIL/microtrheading. This class is only for testing purposes! | ||||
|     /// Its offspring will be the actual implementation. | ||||
|     /// </summary> | ||||
|     internal class TempDotNetMicroThreadingCodeInjector | ||||
|     { | ||||
|         public static string TestFix(string FileName) | ||||
|         { | ||||
|             string ret = Path.GetFileNameWithoutExtension(FileName + "_fixed.dll"); | ||||
| 
 | ||||
|             Console.WriteLine("Loading: \"" + FileName + "\""); | ||||
|             RAssemblyDef rAssembly = RAssemblyDef.LoadAssembly(FileName); | ||||
| 
 | ||||
| 
 | ||||
|             //Get the type of the method to copy from assembly Teste2.exe to assembly Teste.exe | ||||
|             RTypeDef type = (RTypeDef) rAssembly.RModuleDef.GetType("SecondLife.Script"); | ||||
| 
 | ||||
|             //Get the methods in the type | ||||
|             RMethod[] m = type.GetMethods(); | ||||
| 
 | ||||
|             //Create a MethodPrologueAdder visitor object with the method to add | ||||
|             //and with the flag that enables local variable creation set to true | ||||
|             MethodPrologueAdder mpa = new MethodPrologueAdder((RMethodDef) m[0], true); | ||||
| 
 | ||||
|             //Apply the changes to the assembly | ||||
|             rAssembly.Accept(mpa); | ||||
| 
 | ||||
|             //Save the new assembly | ||||
|             rAssembly.SaveAssembly(ret); | ||||
| 
 | ||||
|             return ret; | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Adam Frisby
						Adam Frisby