mirror of
https://github.com/opensim/opensim.git
synced 2026-08-06 09:16:28 +08:00
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.
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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<IScriptModule>();
|
||||
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 <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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user