From f6ef48741303b6e19a5aa73de038b46e0ab409c5 Mon Sep 17 00:00:00 2001
From: Melanie
Date: Mon, 21 Dec 2009 06:29:23 +0000
Subject: Script State Fix: Step 1 Add Engine=xxx attribute and check for it's
presence. Ignore state data written bby another engine
---
OpenSim/Region/ScriptEngine/XEngine/XEngine.cs | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
index 9030a5c..20dbbd4 100644
--- a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
+++ b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
@@ -1266,6 +1266,9 @@ namespace OpenSim.Region.ScriptEngine.XEngine
XmlAttribute assetID = doc.CreateAttribute("", "Asset", "");
assetID.Value = instance.AssetID.ToString();
stateData.Attributes.Append(assetID);
+ XmlAttribute engineName = doc.CreateAttribute("", "Engine", "");
+ engineName.Value = ScriptEngineName;
+ stateData.Attributes.Append(engineName);
doc.AppendChild(stateData);
// Add ...
@@ -1388,6 +1391,9 @@ namespace OpenSim.Region.ScriptEngine.XEngine
XmlElement rootE = (XmlElement)rootL[0];
+ if (rootE.GetAttribute("Engine") != ScriptEngineName)
+ return;
+
if (rootE.GetAttribute("UUID") != itemID.ToString())
return;
--
cgit v1.1
From 83d8ba5775146da220b7e60d3779810db8a1eb5d Mon Sep 17 00:00:00 2001
From: Melanie
Date: Mon, 21 Dec 2009 06:41:10 +0000
Subject: Remove extra checking on the itemID of saved state, since it changes
during rez from inventory.
---
OpenSim/Region/ScriptEngine/XEngine/XEngine.cs | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
index 20dbbd4..082c99b 100644
--- a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
+++ b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
@@ -1394,10 +1394,11 @@ namespace OpenSim.Region.ScriptEngine.XEngine
if (rootE.GetAttribute("Engine") != ScriptEngineName)
return;
- if (rootE.GetAttribute("UUID") != itemID.ToString())
- return;
-
-// string assetID = rootE.GetAttribute("Asset");
+// On rez from inventory, that ID will have changed. It was only
+// advisory anyway. So we don't check it anymore.
+//
+// if (rootE.GetAttribute("UUID") != itemID.ToString())
+// return;
XmlNodeList stateL = rootE.GetElementsByTagName("ScriptState");
--
cgit v1.1
From 27453890d5a5d09e47c638ccef92f45b1ce360b2 Mon Sep 17 00:00:00 2001
From: Melanie
Date: Mon, 21 Dec 2009 10:26:52 +0000
Subject: Script State Fix: Part 2 Change the reader to wrap old-style
definitions in new style wrappers. Change importer to not check irrelevant
data that can't be reconstructed This removes the last bit of knowledge of
XEngine's .state files from core.
---
.../Region/Framework/Interfaces/IScriptModule.cs | 2 +-
.../Framework/Scenes/SceneObjectPartInventory.cs | 55 +++++++++++++++++++---
OpenSim/Region/ScriptEngine/XEngine/XEngine.cs | 36 +++++++-------
3 files changed, 69 insertions(+), 24 deletions(-)
diff --git a/OpenSim/Region/Framework/Interfaces/IScriptModule.cs b/OpenSim/Region/Framework/Interfaces/IScriptModule.cs
index f11e571..98efcbe 100644
--- a/OpenSim/Region/Framework/Interfaces/IScriptModule.cs
+++ b/OpenSim/Region/Framework/Interfaces/IScriptModule.cs
@@ -35,7 +35,7 @@ namespace OpenSim.Region.Framework.Interfaces
string ScriptEngineName { get; }
string GetXMLState(UUID itemID);
- void SetXMLState(UUID itemID, string xml);
+ bool SetXMLState(UUID itemID, string xml);
bool PostScriptEvent(UUID itemID, string name, Object[] args);
bool PostObjectEvent(UUID itemID, string name, Object[] args);
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
index 22eedba..47e4ad0 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
@@ -26,6 +26,7 @@
*/
using System;
+using System.Xml;
using System.IO;
using System.Collections.Generic;
using System.Reflection;
@@ -283,15 +284,55 @@ namespace OpenSim.Region.Framework.Scenes
private void RestoreSavedScriptState(UUID oldID, UUID newID)
{
+ IScriptModule[] engines = m_part.ParentGroup.Scene.RequestModuleInterfaces();
+ if (engines == null) // No engine at all
+ return;
+
if (m_part.ParentGroup.m_savedScriptState.ContainsKey(oldID))
{
- string fpath = Path.Combine("ScriptEngines/"+m_part.ParentGroup.Scene.RegionInfo.RegionID.ToString(),
- newID.ToString()+".state");
- FileStream fs = File.Create(fpath);
- Byte[] buffer = enc.GetBytes(m_part.ParentGroup.m_savedScriptState[oldID]);
- fs.Write(buffer,0,buffer.Length);
- fs.Close();
- m_part.ParentGroup.m_savedScriptState.Remove(oldID);
+ XmlDocument doc = new XmlDocument();
+
+ doc.LoadXml(m_part.ParentGroup.m_savedScriptState[oldID]);
+
+ ////////// CRUFT WARNING ///////////////////////////////////
+ //
+ // Old objects will have ...
+ // This format is XEngine ONLY
+ //
+ // New objects have ...
+ // This can be passed to any engine
+ //
+ XmlNode n = doc.SelectSingleNode("ScriptState");
+ if (n != null) // Old format data
+ {
+ XmlDocument newDoc = new XmlDocument();
+
+ XmlElement rootN = newDoc.CreateElement("", "State", "");
+ XmlAttribute uuidA = newDoc.CreateAttribute("", "UUID", "");
+ uuidA.Value = oldID.ToString();
+ rootN.Attributes.Append(uuidA);
+ XmlAttribute engineA = newDoc.CreateAttribute("", "Engine", "");
+ engineA.Value = "XEngine";
+ rootN.Attributes.Append(engineA);
+
+ newDoc.AppendChild(rootN);
+
+ XmlNode stateN = newDoc.ImportNode(n, true);
+ rootN.AppendChild(stateN);
+
+ // This created document has only the minimun data
+ // necessary for XEngine to parse it successfully
+
+ m_part.ParentGroup.m_savedScriptState[oldID] = newDoc.OuterXml;
+ }
+ foreach (IScriptModule e in engines)
+ {
+ if (e != null)
+ {
+ if (e.SetXMLState(newID, m_part.ParentGroup.m_savedScriptState[oldID]))
+ break;
+ }
+ }
}
}
diff --git a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
index 082c99b..25a4cd6 100644
--- a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
+++ b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
@@ -1368,10 +1368,10 @@ namespace OpenSim.Region.ScriptEngine.XEngine
return false;
}
- public void SetXMLState(UUID itemID, string xml)
+ public bool SetXMLState(UUID itemID, string xml)
{
if (xml == String.Empty)
- return;
+ return false;
XmlDocument doc = new XmlDocument();
@@ -1382,17 +1382,17 @@ namespace OpenSim.Region.ScriptEngine.XEngine
catch (Exception)
{
m_log.Error("[XEngine]: Exception decoding XML data from region transfer");
- return;
+ return false;
}
XmlNodeList rootL = doc.GetElementsByTagName("State");
if (rootL.Count < 1)
- return;
+ return false;
XmlElement rootE = (XmlElement)rootL[0];
if (rootE.GetAttribute("Engine") != ScriptEngineName)
- return;
+ return false;
// On rez from inventory, that ID will have changed. It was only
// advisory anyway. So we don't check it anymore.
@@ -1403,7 +1403,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine
XmlNodeList stateL = rootE.GetElementsByTagName("ScriptState");
if (stateL.Count != 1)
- return;
+ return false;
XmlElement stateE = (XmlElement)stateL[0];
@@ -1412,7 +1412,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine
XmlNodeList assemL = rootE.GetElementsByTagName("Assembly");
if (assemL.Count != 1)
- return;
+ return false;
XmlElement assemE = (XmlElement)assemL[0];
@@ -1452,19 +1452,23 @@ namespace OpenSim.Region.ScriptEngine.XEngine
sfs.Close();
XmlNodeList mapL = rootE.GetElementsByTagName("LineMap");
-
- XmlElement mapE = (XmlElement)mapL[0];
+ if (mapL.Count > 0)
+ {
+ XmlElement mapE = (XmlElement)mapL[0];
- string mappath = Path.Combine("ScriptEngines", World.RegionInfo.RegionID.ToString());
- mappath = Path.Combine(mappath, mapE.GetAttribute("Filename"));
+ string mappath = Path.Combine("ScriptEngines", World.RegionInfo.RegionID.ToString());
+ mappath = Path.Combine(mappath, mapE.GetAttribute("Filename"));
- FileStream mfs = File.Create(mappath);
- StreamWriter msw = new StreamWriter(mfs);
+ FileStream mfs = File.Create(mappath);
+ StreamWriter msw = new StreamWriter(mfs);
- msw.Write(mapE.InnerText);
+ msw.Write(mapE.InnerText);
- msw.Close();
- mfs.Close();
+ msw.Close();
+ mfs.Close();
+ }
+
+ return true;
}
}
}
--
cgit v1.1