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
parent
83d8ba5775
commit
27453890d5
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue