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.
mysql-performance
Melanie 2009-12-21 10:26:52 +00:00
parent 83d8ba5775
commit 27453890d5
3 changed files with 69 additions and 24 deletions

View File

@ -35,7 +35,7 @@ namespace OpenSim.Region.Framework.Interfaces
string ScriptEngineName { get; } string ScriptEngineName { get; }
string GetXMLState(UUID itemID); 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 PostScriptEvent(UUID itemID, string name, Object[] args);
bool PostObjectEvent(UUID itemID, string name, Object[] args); bool PostObjectEvent(UUID itemID, string name, Object[] args);

View File

@ -26,6 +26,7 @@
*/ */
using System; using System;
using System.Xml;
using System.IO; using System.IO;
using System.Collections.Generic; using System.Collections.Generic;
using System.Reflection; using System.Reflection;
@ -283,15 +284,55 @@ namespace OpenSim.Region.Framework.Scenes
private void RestoreSavedScriptState(UUID oldID, UUID newID) private void RestoreSavedScriptState(UUID oldID, UUID newID)
{ {
IScriptModule[] engines = m_part.ParentGroup.Scene.RequestModuleInterfaces<IScriptModule>();
if (engines == null) // No engine at all
return;
if (m_part.ParentGroup.m_savedScriptState.ContainsKey(oldID)) if (m_part.ParentGroup.m_savedScriptState.ContainsKey(oldID))
{ {
string fpath = Path.Combine("ScriptEngines/"+m_part.ParentGroup.Scene.RegionInfo.RegionID.ToString(), XmlDocument doc = new XmlDocument();
newID.ToString()+".state");
FileStream fs = File.Create(fpath); doc.LoadXml(m_part.ParentGroup.m_savedScriptState[oldID]);
Byte[] buffer = enc.GetBytes(m_part.ParentGroup.m_savedScriptState[oldID]);
fs.Write(buffer,0,buffer.Length); ////////// CRUFT WARNING ///////////////////////////////////
fs.Close(); //
m_part.ParentGroup.m_savedScriptState.Remove(oldID); // Old objects will have <ScriptState><State> ...
// This format is XEngine ONLY
//
// New objects have <State Engine="...." ...><ScriptState>...
// 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;
}
}
} }
} }

View File

@ -1368,10 +1368,10 @@ namespace OpenSim.Region.ScriptEngine.XEngine
return false; return false;
} }
public void SetXMLState(UUID itemID, string xml) public bool SetXMLState(UUID itemID, string xml)
{ {
if (xml == String.Empty) if (xml == String.Empty)
return; return false;
XmlDocument doc = new XmlDocument(); XmlDocument doc = new XmlDocument();
@ -1382,17 +1382,17 @@ namespace OpenSim.Region.ScriptEngine.XEngine
catch (Exception) catch (Exception)
{ {
m_log.Error("[XEngine]: Exception decoding XML data from region transfer"); m_log.Error("[XEngine]: Exception decoding XML data from region transfer");
return; return false;
} }
XmlNodeList rootL = doc.GetElementsByTagName("State"); XmlNodeList rootL = doc.GetElementsByTagName("State");
if (rootL.Count < 1) if (rootL.Count < 1)
return; return false;
XmlElement rootE = (XmlElement)rootL[0]; XmlElement rootE = (XmlElement)rootL[0];
if (rootE.GetAttribute("Engine") != ScriptEngineName) if (rootE.GetAttribute("Engine") != ScriptEngineName)
return; return false;
// On rez from inventory, that ID will have changed. It was only // On rez from inventory, that ID will have changed. It was only
// advisory anyway. So we don't check it anymore. // advisory anyway. So we don't check it anymore.
@ -1403,7 +1403,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine
XmlNodeList stateL = rootE.GetElementsByTagName("ScriptState"); XmlNodeList stateL = rootE.GetElementsByTagName("ScriptState");
if (stateL.Count != 1) if (stateL.Count != 1)
return; return false;
XmlElement stateE = (XmlElement)stateL[0]; XmlElement stateE = (XmlElement)stateL[0];
@ -1412,7 +1412,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine
XmlNodeList assemL = rootE.GetElementsByTagName("Assembly"); XmlNodeList assemL = rootE.GetElementsByTagName("Assembly");
if (assemL.Count != 1) if (assemL.Count != 1)
return; return false;
XmlElement assemE = (XmlElement)assemL[0]; XmlElement assemE = (XmlElement)assemL[0];
@ -1452,19 +1452,23 @@ namespace OpenSim.Region.ScriptEngine.XEngine
sfs.Close(); sfs.Close();
XmlNodeList mapL = rootE.GetElementsByTagName("LineMap"); XmlNodeList mapL = rootE.GetElementsByTagName("LineMap");
if (mapL.Count > 0)
XmlElement mapE = (XmlElement)mapL[0]; {
XmlElement mapE = (XmlElement)mapL[0];
string mappath = Path.Combine("ScriptEngines", World.RegionInfo.RegionID.ToString()); string mappath = Path.Combine("ScriptEngines", World.RegionInfo.RegionID.ToString());
mappath = Path.Combine(mappath, mapE.GetAttribute("Filename")); mappath = Path.Combine(mappath, mapE.GetAttribute("Filename"));
FileStream mfs = File.Create(mappath); FileStream mfs = File.Create(mappath);
StreamWriter msw = new StreamWriter(mfs); StreamWriter msw = new StreamWriter(mfs);
msw.Write(mapE.InnerText); msw.Write(mapE.InnerText);
msw.Close(); msw.Close();
mfs.Close(); mfs.Close();
}
return true;
} }
} }
} }