From 664e8a464e4608afeb590a3330ccc69e7988138b Mon Sep 17 00:00:00 2001 From: Melanie Thielker Date: Sun, 9 Nov 2008 19:30:40 +0000 Subject: Script region crossing. This has not user functionality, but lays all the groundwork. --- OpenSim/Region/Environment/Scenes/EventManager.cs | 6 +- OpenSim/Region/Environment/Scenes/InnerScene.cs | 2 +- .../Region/Environment/Scenes/Scene.Inventory.cs | 14 ++-- OpenSim/Region/Environment/Scenes/Scene.cs | 3 +- .../Scenes/SceneObjectGroup.Inventory.cs | 92 +++++++++++++++++++++- .../Scenes/SceneObjectPart.Inventory.cs | 38 +++++++-- 6 files changed, 134 insertions(+), 21 deletions(-) (limited to 'OpenSim/Region/Environment/Scenes') diff --git a/OpenSim/Region/Environment/Scenes/EventManager.cs b/OpenSim/Region/Environment/Scenes/EventManager.cs index 244b76f8..5d21dc5 100644 --- a/OpenSim/Region/Environment/Scenes/EventManager.cs +++ b/OpenSim/Region/Environment/Scenes/EventManager.cs @@ -104,7 +104,7 @@ namespace OpenSim.Region.Environment.Scenes public event OnPermissionErrorDelegate OnPermissionError; - public delegate void NewRezScript(uint localID, UUID itemID, string script, int startParam, bool postOnRez, string engine); + public delegate void NewRezScript(uint localID, UUID itemID, string script, int startParam, bool postOnRez, string engine, int stateSource); public event NewRezScript OnRezScript; @@ -548,13 +548,13 @@ namespace OpenSim.Region.Environment.Scenes } } - public void TriggerRezScript(uint localID, UUID itemID, string script, int startParam, bool postOnRez, string engine) + public void TriggerRezScript(uint localID, UUID itemID, string script, int startParam, bool postOnRez, string engine, int stateSource) { handlerRezScript = OnRezScript; if (handlerRezScript != null) { handlerRezScript(localID, itemID, script, startParam, - postOnRez, engine); + postOnRez, engine, stateSource); } } diff --git a/OpenSim/Region/Environment/Scenes/InnerScene.cs b/OpenSim/Region/Environment/Scenes/InnerScene.cs index 0b24ce9..aca82c3 100644 --- a/OpenSim/Region/Environment/Scenes/InnerScene.cs +++ b/OpenSim/Region/Environment/Scenes/InnerScene.cs @@ -1667,7 +1667,7 @@ namespace OpenSim.Region.Environment.Scenes copy.UpdateGroupRotation(rot); } - copy.CreateScriptInstances(0, false, m_parentScene.DefaultScriptEngine); + copy.CreateScriptInstances(0, false, m_parentScene.DefaultScriptEngine, 0); copy.HasGroupChanged = true; copy.ScheduleGroupForFullUpdate(); return copy; diff --git a/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs b/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs index 4e93551..b0bac42 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs @@ -61,7 +61,7 @@ namespace OpenSim.Region.Environment.Scenes { if (group is SceneObjectGroup) { - ((SceneObjectGroup) group).CreateScriptInstances(0, false, DefaultScriptEngine); + ((SceneObjectGroup) group).CreateScriptInstances(0, false, DefaultScriptEngine, 0); } } } @@ -292,7 +292,7 @@ namespace OpenSim.Region.Environment.Scenes { // Needs to determine which engine was running it and use that // - part.CreateScriptInstance(item.ItemID, 0, false, DefaultScriptEngine); + part.CreateScriptInstance(item.ItemID, 0, false, DefaultScriptEngine, 0); } else { @@ -1343,7 +1343,7 @@ namespace OpenSim.Region.Environment.Scenes part.ParentGroup.AddInventoryItem(remoteClient, localID, item, copyID); // TODO: switch to posting on_rez here when scripts // have state in inventory - part.CreateScriptInstance(copyID, 0, false, DefaultScriptEngine); + part.CreateScriptInstance(copyID, 0, false, DefaultScriptEngine, 0); // m_log.InfoFormat("[PRIMINVENTORY]: " + // "Rezzed script {0} into prim local ID {1} for user {2}", @@ -1407,7 +1407,7 @@ namespace OpenSim.Region.Environment.Scenes part.AddInventoryItem(taskItem); part.GetProperties(remoteClient); - part.CreateScriptInstance(taskItem, 0, false, DefaultScriptEngine); + part.CreateScriptInstance(taskItem, 0, false, DefaultScriptEngine, 0); } } @@ -1503,7 +1503,7 @@ namespace OpenSim.Region.Environment.Scenes if (running > 0) { - destPart.CreateScriptInstance(destTaskItem, 0, false, DefaultScriptEngine); + destPart.CreateScriptInstance(destTaskItem, 0, false, DefaultScriptEngine, 0); } ScenePresence avatar; @@ -2050,7 +2050,7 @@ namespace OpenSim.Region.Environment.Scenes } // Fire on_rez - group.CreateScriptInstances(0, true, DefaultScriptEngine); + group.CreateScriptInstances(0, true, DefaultScriptEngine, 0); if (!attachment) rootPart.ScheduleFullUpdate(); @@ -2154,7 +2154,7 @@ namespace OpenSim.Region.Environment.Scenes group.UpdateGroupRotation(rot); //group.ApplyPhysics(m_physicalPrim); group.Velocity = vel; - group.CreateScriptInstances(param, true, DefaultScriptEngine); + group.CreateScriptInstances(param, true, DefaultScriptEngine, 0); rootPart.ScheduleFullUpdate(); if (!ExternalChecks.ExternalChecksBypassPermissions()) diff --git a/OpenSim/Region/Environment/Scenes/Scene.cs b/OpenSim/Region/Environment/Scenes/Scene.cs index 70ea709..62e6691 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.cs @@ -30,6 +30,7 @@ using System.Collections.Generic; using System.Drawing; using System.Drawing.Imaging; using System.IO; +using System.Xml; using System.Threading; using System.Timers; using OpenMetaverse; @@ -591,7 +592,7 @@ namespace OpenSim.Region.Environment.Scenes { if (ent is SceneObjectGroup) { - ((SceneObjectGroup)ent).CreateScriptInstances(0, false, DefaultScriptEngine); + ((SceneObjectGroup)ent).CreateScriptInstances(0, false, DefaultScriptEngine, 0); } } } diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.Inventory.cs b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.Inventory.cs index 24ebc48..a4801ad 100644 --- a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.Inventory.cs +++ b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.Inventory.cs @@ -26,11 +26,14 @@ */ using System; +using System.IO; using System.Reflection; using OpenMetaverse; using log4net; using OpenSim.Framework; using OpenSim.Region.Environment.Interfaces; +using System.Collections.Generic; +using System.Xml; namespace OpenSim.Region.Environment.Scenes { @@ -56,14 +59,15 @@ namespace OpenSim.Region.Environment.Scenes /// Start the scripts contained in all the prims in this group. /// public void CreateScriptInstances(int startParam, bool postOnRez, - string engine) + string engine, int stateSource) { // Don't start scripts if they're turned off in the region! if (!m_scene.RegionInfo.RegionSettings.DisableScripts) { foreach (SceneObjectPart part in m_parts.Values) { - part.CreateScriptInstances(startParam, postOnRez, engine); + part.CreateScriptInstances(startParam, postOnRez, engine, + stateSource); } } } @@ -277,5 +281,89 @@ namespace OpenSim.Region.Environment.Scenes foreach (SceneObjectPart part in m_parts.Values) part.ApplyNextOwnerPermissions(); } + + public string GetStateSnapshot() + { + List assemblies = new List(); + Dictionary states = new Dictionary(); + + foreach (SceneObjectPart part in m_parts.Values) + { + foreach (string a in part.GetScriptAssemblies()) + { + if (a != "" && !assemblies.Contains(a)) + assemblies.Add(a); + } + + foreach (KeyValuePair s in part.GetScriptStates()) + { + states[s.Key] = s.Value; + } + } + + if (states.Count < 1 || assemblies.Count < 1) + return ""; + + XmlDocument xmldoc = new XmlDocument(); + + XmlNode xmlnode = xmldoc.CreateNode(XmlNodeType.XmlDeclaration, + "", ""); + + xmldoc.AppendChild(xmlnode); + XmlElement rootElement = xmldoc.CreateElement("", "ScriptData", + ""); + + xmldoc.AppendChild(rootElement); + + XmlElement wrapper = xmldoc.CreateElement("", "Assemblies", + ""); + + rootElement.AppendChild(wrapper); + + foreach (string assembly in assemblies) + { + string fn = Path.GetFileName(assembly); + FileInfo fi = new FileInfo(assembly); + Byte[] data = new Byte[fi.Length]; + + FileStream fs = File.Open(assembly, FileMode.Open, FileAccess.Read); + fs.Read(data, 0, data.Length); + fs.Close(); + + XmlElement assemblyData = xmldoc.CreateElement("", "Assembly", ""); + XmlAttribute assemblyName = xmldoc.CreateAttribute("", "Filename", ""); + assemblyName.Value = fn; + assemblyData.Attributes.Append(assemblyName); + + assemblyData.InnerText = System.Convert.ToBase64String(data); + + wrapper.AppendChild(assemblyData); + } + + wrapper = xmldoc.CreateElement("", "ScriptStates", + ""); + + rootElement.AppendChild(wrapper); + + foreach (KeyValuePair state in states) + { + XmlElement stateData = xmldoc.CreateElement("", "State", ""); + + XmlAttribute stateID = xmldoc.CreateAttribute("", "UUID", ""); + stateID.Value = state.Key.ToString(); + stateData.Attributes.Append(stateID); + + XmlDocument sdoc = new XmlDocument(); + sdoc.LoadXml(state.Value); + XmlNodeList rootL = sdoc.GetElementsByTagName("ScriptState"); + XmlNode rootNode = rootL[0]; + + XmlNode newNode = xmldoc.ImportNode(rootNode, true); + stateData.AppendChild(newNode); + wrapper.AppendChild(stateData); + } + + return xmldoc.InnerXml; + } } } diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectPart.Inventory.cs b/OpenSim/Region/Environment/Scenes/SceneObjectPart.Inventory.cs index 2f08322..501f199 100644 --- a/OpenSim/Region/Environment/Scenes/SceneObjectPart.Inventory.cs +++ b/OpenSim/Region/Environment/Scenes/SceneObjectPart.Inventory.cs @@ -126,7 +126,7 @@ namespace OpenSim.Region.Environment.Scenes /// /// Start all the scripts contained in this prim's inventory /// - public void CreateScriptInstances(int startParam, bool postOnRez, string engine) + public void CreateScriptInstances(int startParam, bool postOnRez, string engine, int stateSource) { lock (m_taskInventory) { @@ -134,7 +134,7 @@ namespace OpenSim.Region.Environment.Scenes { if ((int)InventoryType.LSL == item.InvType) { - CreateScriptInstance(item, startParam, postOnRez, engine); + CreateScriptInstance(item, startParam, postOnRez, engine, stateSource); } } } @@ -163,7 +163,7 @@ namespace OpenSim.Region.Environment.Scenes /// /// /// - public void CreateScriptInstance(TaskInventoryItem item, int startParam, bool postOnRez, string engine) + public void CreateScriptInstance(TaskInventoryItem item, int startParam, bool postOnRez, string engine, int stateSource) { // m_log.InfoFormat( // "[PRIM INVENTORY]: " + @@ -194,7 +194,7 @@ namespace OpenSim.Region.Environment.Scenes m_taskInventory[item.ItemID].PermsGranter = UUID.Zero; string script = Utils.BytesToString(asset.Data); m_parentGroup.Scene.EventManager.TriggerRezScript(LocalId, item.ItemID, script, - startParam, postOnRez, engine); + startParam, postOnRez, engine, stateSource); m_parentGroup.AddActiveScriptCount(1); ScheduleFullUpdate(); } @@ -208,13 +208,13 @@ namespace OpenSim.Region.Environment.Scenes /// /// A /// - public void CreateScriptInstance(UUID itemId, int startParam, bool postOnRez, string engine) + public void CreateScriptInstance(UUID itemId, int startParam, bool postOnRez, string engine, int stateSource) { lock (m_taskInventory) { if (m_taskInventory.ContainsKey(itemId)) { - CreateScriptInstance(m_taskInventory[itemId], startParam, postOnRez, engine); + CreateScriptInstance(m_taskInventory[itemId], startParam, postOnRez, engine, stateSource); } else { @@ -765,7 +765,7 @@ namespace OpenSim.Region.Environment.Scenes return ret; } - string[] GetScriptAssemblies() + public string[] GetScriptAssemblies() { IScriptModule[] engines = m_parentGroup.Scene.RequestModuleInterfaces(); @@ -789,5 +789,29 @@ namespace OpenSim.Region.Environment.Scenes } return ret.ToArray(); } + + public Dictionary GetScriptStates() + { + IScriptModule[] engines = m_parentGroup.Scene.RequestModuleInterfaces(); + Dictionary ret = new Dictionary(); + + foreach (TaskInventoryItem item in m_taskInventory.Values) + { + if (item.InvType == 10) + { + foreach (IScriptModule e in engines) + { + string n = e.GetXMLState(item.ItemID); + if (n != "") + { + if (!ret.ContainsKey(item.ItemID)) + ret[item.ItemID] = n; + break; + } + } + } + } + return ret; + } } } -- cgit v1.1