diff --git a/OpenSim/Framework/ISceneObject.cs b/OpenSim/Framework/ISceneObject.cs
index 4fc3e01fcb..51479014cd 100644
--- a/OpenSim/Framework/ISceneObject.cs
+++ b/OpenSim/Framework/ISceneObject.cs
@@ -38,6 +38,6 @@ namespace OpenSim.Framework
string ExtraToXmlString();
void ExtraFromXmlString(string xmlstr);
string GetStateSnapshot();
- void SetState(string xmlstr, UUID regionID);
+ void SetState(string xmlstr, IScene s);
}
}
diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveReadRequest.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveReadRequest.cs
index 8532d03122..b7783899cd 100644
--- a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveReadRequest.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiveReadRequest.cs
@@ -348,9 +348,17 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
UUID ospResolvedId = OspResolver.ResolveOspa(item.CreatorId, m_scene.CommsManager);
if (UUID.Zero != ospResolvedId)
+ {
item.CreatorIdAsUuid = ospResolvedId;
+
+ // XXX: For now, don't preserve the OSPA in the creator id (which actually gets persisted to the
+ // database). Instead, replace with the UUID that we found.
+ item.CreatorId = ospResolvedId.ToString();
+ }
else
+ {
item.CreatorIdAsUuid = m_userInfo.UserProfile.ID;
+ }
item.Owner = m_userInfo.UserProfile.ID;
diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiverModule.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiverModule.cs
index 2c0d11357a..ecd60bdaad 100644
--- a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiverModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/InventoryArchiverModule.cs
@@ -280,7 +280,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
string savePath = (cmdparams.Length > 6 ? cmdparams[6] : DEFAULT_INV_BACKUP_FILENAME);
m_log.InfoFormat(
- "[INVENTORY ARCHIVER]: Saving archive {0} from inventory path {1} for {2} {3}",
+ "[INVENTORY ARCHIVER]: Saving archive {0} using inventory path {1} for {2} {3}",
savePath, invPath, firstName, lastName);
Guid id = Guid.NewGuid();
diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiverTests.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiverTests.cs
index 792735231a..e4dad18c21 100644
--- a/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiverTests.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Archiver/Tests/InventoryArchiverTests.cs
@@ -259,9 +259,16 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests
= InventoryArchiveUtils.FindItemByPath(scene.InventoryService, userInfo.UserProfile.ID, item1Name);
Assert.That(foundItem1, Is.Not.Null, "Didn't find loaded item 1");
+
+// We have to disable this check since loaded items that did find users via OSPA resolution are now only storing the
+// UUID, not the OSPA itself.
+// Assert.That(
+// foundItem1.CreatorId, Is.EqualTo(item1.CreatorId),
+// "Loaded item non-uuid creator doesn't match original");
Assert.That(
- foundItem1.CreatorId, Is.EqualTo(item1.CreatorId),
+ foundItem1.CreatorId, Is.EqualTo(userItemCreatorUuid.ToString()),
"Loaded item non-uuid creator doesn't match original");
+
Assert.That(
foundItem1.CreatorIdAsUuid, Is.EqualTo(userItemCreatorUuid),
"Loaded item uuid creator doesn't match original");
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Interregion/LocalInterregionComms.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Interregion/LocalInterregionComms.cs
index ee809bd248..d9f6e3300a 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Interregion/LocalInterregionComms.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Interregion/LocalInterregionComms.cs
@@ -263,8 +263,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Interregion
{
// We need to make a local copy of the object
ISceneObject sogClone = sog.CloneForNewScene();
- sogClone.SetState(sog.GetStateSnapshot(),
- s.RegionInfo.RegionID);
+ sogClone.SetState(sog.GetStateSnapshot(), s);
return s.IncomingCreateObject(sogClone);
}
else
@@ -294,15 +293,15 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Interregion
#region Misc
- public UUID GetRegionID(ulong regionhandle)
+ public Scene GetScene(ulong regionhandle)
{
foreach (Scene s in m_sceneList)
{
if (s.RegionInfo.RegionHandle == regionhandle)
- return s.RegionInfo.RegionID;
+ return s;
}
// ? weird. should not happen
- return m_sceneList[0].RegionInfo.RegionID;
+ return m_sceneList[0];
}
public bool IsLocalRegion(ulong regionhandle)
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Interregion/RESTInterregionComms.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Interregion/RESTInterregionComms.cs
index 696225cddc..710e3ca5d9 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Interregion/RESTInterregionComms.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Interregion/RESTInterregionComms.cs
@@ -641,7 +641,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Interregion
if (args["extra"] != null)
extraStr = args["extra"].AsString();
- UUID regionID = m_localBackend.GetRegionID(regionhandle);
+ IScene s = m_localBackend.GetScene(regionhandle);
SceneObjectGroup sog = null;
try
{
@@ -663,7 +663,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Interregion
{
try
{
- sog.SetState(stateXmlStr, regionID);
+ sog.SetState(stateXmlStr, s);
}
catch (Exception ex)
{
@@ -695,8 +695,6 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Interregion
if (args["itemid"] != null)
itemID = args["itemid"].AsUUID();
- //UUID regionID = m_localBackend.GetRegionID(regionhandle);
-
// This is the meaning of PUT object
bool result = m_localBackend.SendCreateObject(regionhandle, userID, itemID);
diff --git a/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs b/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs
index 2998f4553d..89a45da1c9 100644
--- a/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs
+++ b/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs
@@ -191,7 +191,5 @@ namespace OpenSim.Region.Framework.Interfaces
/// A
///
Dictionary GetScriptStates();
-
- bool CanBeDeleted();
}
}
diff --git a/OpenSim/Region/Framework/Interfaces/IScriptModule.cs b/OpenSim/Region/Framework/Interfaces/IScriptModule.cs
index 72bb0f0eec..f11e5713d0 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);
- bool CanBeDeleted(UUID itemID);
+ void 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/Animation/ScenePresenceAnimator.cs b/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs
index 2c4a4b074b..ba11800068 100644
--- a/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs
+++ b/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs
@@ -247,8 +247,7 @@ namespace OpenSim.Region.Framework.Scenes.Animation
else if (m_movementAnimation == "LAND")
{
float landElapsed = (float)(Environment.TickCount - m_animTickFall) / 1000f;
-
- if (landElapsed <= FALL_DELAY)
+ if ((m_animTickFall != 0) && (landElapsed <= FALL_DELAY))
return "LAND";
}
diff --git a/OpenSim/Region/Framework/Scenes/AsyncSceneObjectGroupDeleter.cs b/OpenSim/Region/Framework/Scenes/AsyncSceneObjectGroupDeleter.cs
index 5b571c7227..9a7863b595 100644
--- a/OpenSim/Region/Framework/Scenes/AsyncSceneObjectGroupDeleter.cs
+++ b/OpenSim/Region/Framework/Scenes/AsyncSceneObjectGroupDeleter.cs
@@ -131,11 +131,6 @@ namespace OpenSim.Region.Framework.Scenes
if (left > 0)
{
x = m_inventoryDeletes.Dequeue();
- if (!x.objectGroup.CanBeDeleted())
- {
- m_inventoryDeletes.Enqueue(x);
- return true;
- }
m_log.DebugFormat(
"[SCENE]: Sending object to user's inventory, {0} item(s) remaining.", left);
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index f93265954a..5b13b73711 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -618,7 +618,7 @@ namespace OpenSim.Region.Framework.Scenes
startupConfig.GetLong("MaximumTimeBeforePersistenceConsidered", DEFAULT_MAX_TIME_FOR_PERSISTENCE);
m_persistAfter *= 10000000;
- m_defaultScriptEngine = startupConfig.GetString("DefaultScriptEngine", "DotNetEngine");
+ m_defaultScriptEngine = startupConfig.GetString("DefaultScriptEngine", "XEngine");
IConfig packetConfig = m_config.Configs["PacketPool"];
if (packetConfig != null)
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.Inventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.Inventory.cs
index 9a6f2b83c4..5a06bdb7b9 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.Inventory.cs
@@ -351,12 +351,29 @@ namespace OpenSim.Region.Framework.Scenes
return xmldoc.InnerXml;
}
- public void SetState(string objXMLData, UUID RegionID)
+ public void SetState(string objXMLData, IScene ins)
{
-m_log.Debug("SetState called with " + objXMLData);
+ if (!(ins is Scene))
+ return;
+
+ Scene s = (Scene)ins;
+
if (objXMLData == String.Empty)
return;
+ IScriptModule scriptModule = null;
+
+ foreach (IScriptModule sm in s.RequestModuleInterfaces())
+ {
+ if (sm.ScriptEngineName == s.DefaultScriptEngine)
+ scriptModule = sm;
+ else if (scriptModule == null)
+ scriptModule = sm;
+ }
+
+ if (scriptModule == null)
+ return;
+
XmlDocument doc = new XmlDocument();
try
{
@@ -374,69 +391,23 @@ m_log.Debug("SetState called with " + objXMLData);
}
XmlNodeList rootL = doc.GetElementsByTagName("ScriptData");
- if (rootL.Count == 1)
+ if (rootL.Count != 1)
+ return;
+
+ XmlElement rootE = (XmlElement)rootL[0];
+
+ XmlNodeList dataL = rootE.GetElementsByTagName("ScriptStates");
+ if (dataL.Count != 1)
+ return;
+
+ XmlElement dataE = (XmlElement)dataL[0];
+
+ foreach (XmlNode n in dataE.ChildNodes)
{
- XmlNode rootNode = rootL[0];
- if (rootNode != null)
- {
- XmlNodeList partL = rootNode.ChildNodes;
+ XmlElement stateE = (XmlElement)n;
+ UUID itemID = new UUID(stateE.GetAttribute("UUID"));
- foreach (XmlNode part in partL)
- {
- XmlNodeList nodeL = part.ChildNodes;
-
- switch (part.Name)
- {
- case "Assemblies":
- foreach (XmlNode asm in nodeL)
- {
- string fn = asm.Attributes.GetNamedItem("Filename").Value;
-
- Byte[] filedata = Convert.FromBase64String(asm.InnerText);
- string path = Path.Combine("ScriptEngines", RegionID.ToString());
- path = Path.Combine(path, fn);
-
- if (!File.Exists(path))
- {
- FileStream fs = File.Create(path);
- fs.Write(filedata, 0, filedata.Length);
- fs.Close();
-
- Byte[] textbytes = new System.Text.ASCIIEncoding().GetBytes(asm.InnerText);
- fs = File.Create(path+".text");
- fs.Write(textbytes, 0, textbytes.Length);
- fs.Close();
- }
- }
- break;
- case "ScriptStates":
- foreach (XmlNode st in nodeL)
- {
- string id = st.Attributes.GetNamedItem("UUID").Value;
- UUID uuid = new UUID(id);
- XmlNode state = st.ChildNodes[0];
-
- XmlDocument sdoc = new XmlDocument();
- XmlNode sxmlnode = sdoc.CreateNode(
- XmlNodeType.XmlDeclaration,
- "", "");
- sdoc.AppendChild(sxmlnode);
-
- XmlNode newnode = sdoc.ImportNode(state, true);
- sdoc.AppendChild(newnode);
-
- string spath = Path.Combine("ScriptEngines", RegionID.ToString());
- spath = Path.Combine(spath, uuid.ToString());
- FileStream sfs = File.Create(spath + ".state");
- System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();
- Byte[] buf = enc.GetBytes(sdoc.InnerXml);
- sfs.Write(buf, 0, buf.Length);
- sfs.Close();
- }
- break;
- }
- }
- }
+ scriptModule.SetXMLState(itemID, n.OuterXml);
}
}
}
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index ea4f2c7aac..f36ff1db93 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -3380,17 +3380,6 @@ namespace OpenSim.Region.Framework.Scenes
}
#endregion
- public bool CanBeDeleted()
- {
- foreach (SceneObjectPart part in Children.Values)
- {
- if (!part.CanBeDeleted())
- return false;
- }
-
- return true;
- }
-
public double GetUpdatePriority(IClientAPI client)
{
switch (Scene.UpdatePrioritizationScheme)
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
index bbece2f59b..19e30235c1 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
@@ -3807,10 +3807,5 @@ namespace OpenSim.Region.Framework.Scenes
Inventory.ApplyNextOwnerPermissions();
}
-
- public bool CanBeDeleted()
- {
- return Inventory.CanBeDeleted();
- }
}
}
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
index 2ef8258582..eca8588c51 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
@@ -909,30 +909,5 @@ namespace OpenSim.Region.Framework.Scenes
}
return ret;
}
-
- public bool CanBeDeleted()
- {
- if (!ContainsScripts())
- return true;
-
- IScriptModule[] engines = m_part.ParentGroup.Scene.RequestModuleInterfaces();
-
- if (engines == null) // No engine at all
- return true;
-
- foreach (TaskInventoryItem item in m_items.Values)
- {
- if (item.InvType == (int)InventoryType.LSL)
- {
- foreach (IScriptModule e in engines)
- {
- if (!e.CanBeDeleted(item.ItemID))
- return false;
- }
- }
- }
-
- return true;
- }
}
}
diff --git a/OpenSim/Region/OptionalModules/Scripting/RegionReadyModule/RegionReadyModule.cs b/OpenSim/Region/OptionalModules/Scripting/RegionReadyModule/RegionReadyModule.cs
index 91c25a656a..c653e98401 100644
--- a/OpenSim/Region/OptionalModules/Scripting/RegionReadyModule/RegionReadyModule.cs
+++ b/OpenSim/Region/OptionalModules/Scripting/RegionReadyModule/RegionReadyModule.cs
@@ -62,7 +62,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.RegionReady
public void Initialise(IConfigSource config)
{
- m_log.Info("[RegionReady] Initialising");
+ //m_log.Info("[RegionReady] Initialising");
m_config = config.Configs["RegionReady"];
if (m_config != null)
@@ -74,8 +74,8 @@ namespace OpenSim.Region.OptionalModules.Scripting.RegionReady
}
}
- if (!m_enabled)
- m_log.Info("[RegionReady] disabled.");
+// if (!m_enabled)
+// m_log.Info("[RegionReady] disabled.");
}
public void AddRegion(Scene scene)
@@ -92,7 +92,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.RegionReady
m_scene.EventManager.OnEmptyScriptCompileQueue += OnEmptyScriptCompileQueue;
m_scene.EventManager.OnOarFileLoaded += OnOarFileLoaded;
- m_log.InfoFormat("[RegionReady]: Enabled for region {0}", scene.RegionInfo.RegionName);
+ m_log.DebugFormat("[RegionReady]: Enabled for region {0}", scene.RegionInfo.RegionName);
}
public void RemoveRegion(Scene scene)
@@ -120,7 +120,6 @@ namespace OpenSim.Region.OptionalModules.Scripting.RegionReady
}
#endregion
-
void OnEmptyScriptCompileQueue(int numScriptsFailed, string message)
{
diff --git a/OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs b/OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs
index f49aea8104..ae148a9c5a 100644
--- a/OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs
+++ b/OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs
@@ -96,7 +96,6 @@ namespace OpenSim.Region.ScriptEngine.Interfaces
UUID GetDetectID(int idx);
void SaveState(string assembly);
void DestroyScriptInstance();
- bool CanBeDeleted();
IScriptApi GetApi(string name);
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
index a94cd46a49..6e5436a1a0 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
@@ -2002,6 +2002,18 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
//KF: Do NOT use this next line if using ODE physics engine. This need a switch based on .ini Phys Engine type
// part.ParentGroup.AbsolutePosition = part.ParentGroup.AbsolutePosition;
+
+ // So, after thinking about this for a bit, the issue with the part.ParentGroup.AbsolutePosition = part.ParentGroup.AbsolutePosition line
+ // is it isn't compatible with vehicles because it causes the vehicle body to have to be broken down and rebuilt
+ // It's perfectly okay when the object is not an active physical body though.
+ // So, part.ParentGroup.ResetChildPrimPhysicsPositions(); does the thing that Kitto is warning against
+ // but only if the object is not physial and active. This is important for rotating doors.
+ // without the absoluteposition = absoluteposition happening, the doors do not move in the physics
+ // scene
+ if (part.PhysActor != null && !part.PhysActor.IsPhysical)
+ {
+ part.ParentGroup.ResetChildPrimPhysicsPositions();
+ }
}
///
diff --git a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs
index 0f4a9adf5c..8333a279ae 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs
@@ -1018,10 +1018,5 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
{
get { return m_RegionID; }
}
-
- public bool CanBeDeleted()
- {
- return true;
- }
}
}
diff --git a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
index 4dc6cb860f..2fc2ea1b06 100644
--- a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
+++ b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
@@ -1328,6 +1328,19 @@ namespace OpenSim.Region.ScriptEngine.XEngine
}
}
+ string map = String.Empty;
+
+ if (File.Exists(fn + ".map"))
+ {
+ FileStream mfs = File.Open(fn + ".map", FileMode.Open, FileAccess.Read);
+ StreamReader msr = new StreamReader(mfs);
+
+ map = msr.ReadToEnd();
+
+ msr.Close();
+ mfs.Close();
+ }
+
XmlElement assemblyData = doc.CreateElement("", "Assembly", "");
XmlAttribute assemblyName = doc.CreateAttribute("", "Filename", "");
@@ -1338,21 +1351,116 @@ namespace OpenSim.Region.ScriptEngine.XEngine
stateData.AppendChild(assemblyData);
+ XmlElement mapData = doc.CreateElement("", "LineMap", "");
+ XmlAttribute mapName = doc.CreateAttribute("", "Filename", "");
+
+ mapName.Value = fn + ".map";
+ mapData.Attributes.Append(mapName);
+
+ mapData.InnerText = map;
+
+ stateData.AppendChild(mapData);
return doc.InnerXml;
}
- public bool CanBeDeleted(UUID itemID)
- {
- IScriptInstance instance = GetInstance(itemID);
- if (instance == null)
- return true;
-
- return instance.CanBeDeleted();
- }
-
private bool ShowScriptSaveResponse(UUID ownerID, UUID assetID, string text, bool compiled)
{
return false;
}
+
+ public void SetXMLState(UUID itemID, string xml)
+ {
+ if (xml == String.Empty)
+ return;
+
+ XmlDocument doc = new XmlDocument();
+
+ try
+ {
+ doc.LoadXml(xml);
+ }
+ catch (Exception)
+ {
+ m_log.Error("[XEngine]: Exception decoding XML data from region transfer");
+ return;
+ }
+
+ XmlNodeList rootL = doc.GetElementsByTagName("State");
+ if (rootL.Count < 1)
+ return;
+
+ XmlElement rootE = (XmlElement)rootL[0];
+
+ if (rootE.GetAttribute("UUID") != itemID.ToString())
+ return;
+
+ string assetID = rootE.GetAttribute("Asset");
+
+ XmlNodeList stateL = rootE.GetElementsByTagName("ScriptState");
+
+ if (stateL.Count != 1)
+ return;
+
+ XmlElement stateE = (XmlElement)stateL[0];
+
+ if (World.m_trustBinaries)
+ {
+ XmlNodeList assemL = rootE.GetElementsByTagName("Assembly");
+
+ if (assemL.Count != 1)
+ return;
+
+ XmlElement assemE = (XmlElement)assemL[0];
+
+ string fn = assemE.GetAttribute("Filename");
+ string base64 = assemE.InnerText;
+
+ string path = Path.Combine("ScriptEngines", World.RegionInfo.RegionID.ToString());
+ path = Path.Combine(path, fn);
+
+ if (!File.Exists(path))
+ {
+ Byte[] filedata = Convert.FromBase64String(base64);
+
+ FileStream fs = File.Create(path);
+ fs.Write(filedata, 0, filedata.Length);
+ fs.Close();
+
+ fs = File.Create(path + ".text");
+ StreamWriter sw = new StreamWriter(fs);
+
+ sw.Write(base64);
+
+ sw.Close();
+ fs.Close();
+ }
+ }
+
+ string statepath = Path.Combine("ScriptEngines", World.RegionInfo.RegionID.ToString());
+ statepath = Path.Combine(statepath, itemID.ToString() + ".state");
+
+ FileStream sfs = File.Create(statepath);
+ StreamWriter ssw = new StreamWriter(sfs);
+
+ ssw.Write(stateE.OuterXml);
+
+ ssw.Close();
+ sfs.Close();
+
+ XmlNodeList mapL = rootE.GetElementsByTagName("LineMap");
+
+ XmlElement mapE = (XmlElement)mapL[0];
+
+ 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);
+
+ msw.Write(mapE.InnerText);
+
+ msw.Close();
+ mfs.Close();
+ }
}
}