Skip to content

Commit

Permalink
OAR asset serializer now uses original XML format not XML2
Browse files Browse the repository at this point in the history
  • Loading branch information
appurist authored and kf6kjg committed Mar 25, 2019
1 parent 0856c3f commit 5eb03bb
Show file tree
Hide file tree
Showing 8 changed files with 81 additions and 11 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,7 @@ string terrainPath

Vector3 position = sceneObject.AbsolutePosition;

string serializedObject = m_serializer.SaveGroupToXml2(sceneObject);
string serializedObject = m_serializer.SaveGroupToOriginalXml(sceneObject);
string filename
= string.Format(
"{0}{1}_{2:000}-{3:000}-{4:000}__{5}.xml",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -225,7 +225,7 @@ ArchiveWriteRequestExecution awre
m_log.InfoFormat("[ARCHIVER]: Added control file to archive.");

new AssetsRequest(
new AssetsArchiver(archiveWriter), assetUuids.Keys,
new AssetsArchiver(archiveWriter, m_scene), assetUuids.Keys,
m_scene.CommsManager.AssetCache, awre.ReceivedAllAssets).Execute();
}

Expand Down
50 changes: 46 additions & 4 deletions OpenSim/Region/CoreModules/World/Archiver/AssetsArchiver.cs
Original file line number Diff line number Diff line change
Expand Up @@ -27,14 +27,17 @@

using System;
using System.Collections.Generic;
using System.IO;
using System.Reflection;
using System.Xml;
using log4net;
using OpenMetaverse;
using OpenSim.Framework;
using OpenSim.Framework.Serialization;

// We need to include these because Tranq stored inventory assets in an alternative binary "Thoosa" format which need to be XML.
using OpenSim.Region.Framework.Interfaces;
using OpenSim.Region.Framework.Scenes;
using OpenSim.Region.Framework.Scenes.Serialization;

namespace OpenSim.Region.CoreModules.World.Archiver
{
/// <summary>
Expand All @@ -55,10 +58,22 @@ public class AssetsArchiver
protected int m_assetsWritten;

protected TarArchiveWriter m_archiveWriter;
protected Scene m_scene;
protected IRegionSerializerModule m_serializer;
private IInventoryObjectSerializer m_inventorySerializer;

public AssetsArchiver(TarArchiveWriter archiveWriter)
public AssetsArchiver(TarArchiveWriter archiveWriter, Scene scene)
{
m_archiveWriter = archiveWriter;
ISerializationEngine engine;

m_scene = scene;
if (ProviderRegistry.Instance.TryGet<ISerializationEngine>(out engine))
{
// This is the Thoosa inventory format serializer/deserializer.
m_inventorySerializer = engine.InventoryObjectSerializer;
}
m_serializer = m_scene.RequestModuleInterface<IRegionSerializerModule>();
}

/// <summary>
Expand Down Expand Up @@ -139,9 +154,36 @@ protected void WriteData(AssetBase asset)
asset.Type, asset.ID);
}

// Check for Thoosa Inventory object and decode to XML if necessary for Archive.
string xmlData;
if ((m_inventorySerializer != null) && (m_inventorySerializer.CanDeserialize(asset.Data)))
{
if (m_inventorySerializer.IsValidCoalesced(asset.Data))
{
CoalescedObject obj = m_inventorySerializer.DeserializeCoalescedObjFromInventoryBytes(asset.Data);
List<ItemPermissionBlock> perms = new List<ItemPermissionBlock>();
foreach (var grp in obj.Groups)
{
perms.Add(obj.FindPermissions(grp.UUID));
}
xmlData = CoalescedSceneObjectSerializer.ToXmlFormat(obj.Groups, perms, StopScriptReason.None);
}
else
if (m_inventorySerializer.IsValidGroup(asset.Data))
{
SceneObjectGroup grp = m_inventorySerializer.DeserializeGroupFromInventoryBytes(asset.Data);
xmlData = m_serializer.SaveGroupToOriginalXml(grp);
}
else return;
}
else
{
xmlData = Utils.BytesToString(asset.Data);
}

m_archiveWriter.WriteFile(
ArchiveConstants.ASSETS_PATH + asset.FullID.ToString() + extension,
asset.Data);
xmlData);

m_assetsWritten++;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,11 @@ public string SaveGroupToXml2(SceneObjectGroup grp)
return SceneXmlLoader.SaveGroupToXml2(grp);
}

public string SaveGroupToOriginalXml(SceneObjectGroup grp)
{
return SceneXmlLoader.SaveGroupToOriginalXml(grp);
}

public void SavePrimListToXml2(List<EntityBase> entityList, string fileName)
{
SceneXmlLoader.SavePrimListToXml2(entityList, fileName);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -118,5 +118,12 @@ public interface IRegionSerializerModule
/// <param name="grp"></param>
/// <returns></returns>
string SaveGroupToXml2(SceneObjectGroup grp);

/// <summary>
/// Serialize an individual scene object into the original xml (xml1) format
/// </summary>
/// <param name="grp"></param>
/// <returns></returns>
string SaveGroupToOriginalXml(SceneObjectGroup grp);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@

namespace OpenSim.Region.Framework.Scenes.Serialization
{
class CoalescedSceneObjectSerializer
public class CoalescedSceneObjectSerializer
{
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -178,7 +178,7 @@ public static SceneObjectGroup FromOriginalXmlFormat(UUID fromUserInventoryItemI
catch (Exception e)
{
m_log.ErrorFormat(
"[SERIALIZER]: Deserialization of xml failed with {0}.", e);
"[SERIALIZER]: Deserialization of xml1 failed with {0}.", e);
}
return null;
}
Expand All @@ -199,7 +199,18 @@ public static string ToOriginalXmlFormat(SceneObjectGroup sceneObject, StopScrip

return sw.ToString();
}
}
}

/// <summary>
/// Serialize a scene object to the 'xml2' format.
/// </summary>
/// <param name="sceneObject"></param>
/// <returns></returns>
public static string ToOriginalXmlFormat(SceneObjectGroup sceneObject, bool stopScripts)
{
StopScriptReason reason = stopScripts ? StopScriptReason.Derez : StopScriptReason.None;
return ToOriginalXmlFormat(sceneObject, reason);
}

/// <summary>
/// Serialize a scene object to the original xml format
Expand Down Expand Up @@ -228,7 +239,7 @@ public static void ToOriginalXmlFormat(SceneObjectGroup sceneObject, XmlTextWrit
}

writer.WriteEndElement(); // OtherParts
sceneObject.SaveScriptedState(writer, stopScriptReason);
// sceneObject.SaveScriptedState(writer, stopScriptReason);
writer.WriteEndElement(); // SceneObjectGroup

//m_log.DebugFormat("[SERIALIZER]: Finished serialization of SOG {0}, {1}ms", Name, System.Environment.TickCount - time);
Expand Down Expand Up @@ -294,7 +305,7 @@ public static SceneObjectGroup FromXml2Format(string xmlData)
}
catch (Exception e)
{
m_log.ErrorFormat("[SERIALIZER]: Deserialization of xml failed with {0}.", e);
m_log.ErrorFormat("[SERIALIZER]: Deserialization of xml2 failed with {0}.", e);
}
return null;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,11 @@ public static string SaveGroupToXml2(SceneObjectGroup grp)
return SceneObjectSerializer.ToXml2Format(grp, false);
}

public static string SaveGroupToOriginalXml(SceneObjectGroup grp)
{
return SceneObjectSerializer.ToOriginalXmlFormat(grp, false);
}

public static SceneObjectGroup DeserializeGroupFromXml2(string xmlString)
{
XmlDocument doc = new XmlDocument();
Expand Down

0 comments on commit 5eb03bb

Please sign in to comment.