Made OARs use the new serialization procedure. (TPs/crossings still on the old one) Added an options argument down the pipeline. For the time being it takes --old-guids as an option to produce <Guid> instead of <UUID>.

viewer-2-initial-appearance
Diva Canto 2010-10-15 17:27:19 -07:00
parent e039a8c8c2
commit 1499607215
11 changed files with 189 additions and 143 deletions

View File

@ -2284,7 +2284,7 @@ namespace OpenSim.ApplicationPlugins.RemoteController
if (archiver != null) if (archiver != null)
{ {
scene.EventManager.OnOarFileSaved += RemoteAdminOarSaveCompleted; scene.EventManager.OnOarFileSaved += RemoteAdminOarSaveCompleted;
archiver.ArchiveRegion(filename); archiver.ArchiveRegion(filename, new Dictionary<string, object>());
lock (m_saveOarLock) Monitor.Wait(m_saveOarLock,5000); lock (m_saveOarLock) Monitor.Wait(m_saveOarLock,5000);
scene.EventManager.OnOarFileSaved -= RemoteAdminOarSaveCompleted; scene.EventManager.OnOarFileSaved -= RemoteAdminOarSaveCompleted;
} }

View File

@ -264,10 +264,11 @@ namespace OpenSim
LoadOar); LoadOar);
m_console.Commands.AddCommand("region", false, "save oar", m_console.Commands.AddCommand("region", false, "save oar",
"save oar [<OAR path>]", "save oar [--old-guids] [<OAR path>]",
"Save a region's data to an OAR archive.", "Save a region's data to an OAR archive.",
"The OAR path must be a filesystem path." "The OAR path must be a filesystem path."
+ " If this is not given then the oar is saved to region.oar in the current directory.", + " If this is not given then the oar is saved to region.oar in the current directory." + Environment.NewLine
+ "--old-guids produces OARs compatible with older (pre 0.7.1) OpenSim versions.",
SaveOar); SaveOar);
m_console.Commands.AddCommand("region", false, "edit scale", m_console.Commands.AddCommand("region", false, "edit scale",

View File

@ -60,6 +60,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver
protected Scene m_scene; protected Scene m_scene;
protected TarArchiveWriter m_archiveWriter; protected TarArchiveWriter m_archiveWriter;
protected Guid m_requestId; protected Guid m_requestId;
protected Dictionary<string, object> m_options;
public ArchiveWriteRequestExecution( public ArchiveWriteRequestExecution(
List<SceneObjectGroup> sceneObjects, List<SceneObjectGroup> sceneObjects,
@ -67,7 +68,8 @@ namespace OpenSim.Region.CoreModules.World.Archiver
IRegionSerialiserModule serialiser, IRegionSerialiserModule serialiser,
Scene scene, Scene scene,
TarArchiveWriter archiveWriter, TarArchiveWriter archiveWriter,
Guid requestId) Guid requestId,
Dictionary<string, object> options)
{ {
m_sceneObjects = sceneObjects; m_sceneObjects = sceneObjects;
m_terrainModule = terrainModule; m_terrainModule = terrainModule;
@ -75,6 +77,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver
m_scene = scene; m_scene = scene;
m_archiveWriter = archiveWriter; m_archiveWriter = archiveWriter;
m_requestId = requestId; m_requestId = requestId;
m_options = options;
} }
protected internal void ReceivedAllAssets( protected internal void ReceivedAllAssets(
@ -145,7 +148,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver
{ {
//m_log.DebugFormat("[ARCHIVER]: Saving {0} {1}, {2}", entity.Name, entity.UUID, entity.GetType()); //m_log.DebugFormat("[ARCHIVER]: Saving {0} {1}, {2}", entity.Name, entity.UUID, entity.GetType());
string serializedObject = m_serialiser.SerializeGroupToXml2(sceneObject); string serializedObject = m_serialiser.SerializeGroupToXml2(sceneObject, m_options);
m_archiveWriter.WriteFile(ArchiveHelpers.CreateObjectPath(sceneObject), serializedObject); m_archiveWriter.WriteFile(ArchiveHelpers.CreateObjectPath(sceneObject), serializedObject);
} }

View File

@ -98,7 +98,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver
/// Archive the region requested. /// Archive the region requested.
/// </summary> /// </summary>
/// <exception cref="System.IO.IOException">if there was an io problem with creating the file</exception> /// <exception cref="System.IO.IOException">if there was an io problem with creating the file</exception>
public void ArchiveRegion() public void ArchiveRegion(Dictionary<string, object> options)
{ {
Dictionary<UUID, AssetType> assetUuids = new Dictionary<UUID, AssetType>(); Dictionary<UUID, AssetType> assetUuids = new Dictionary<UUID, AssetType>();
@ -165,7 +165,8 @@ namespace OpenSim.Region.CoreModules.World.Archiver
m_scene.RequestModuleInterface<IRegionSerialiserModule>(), m_scene.RequestModuleInterface<IRegionSerialiserModule>(),
m_scene, m_scene,
archiveWriter, archiveWriter,
m_requestId); m_requestId,
options);
new AssetsRequest( new AssetsRequest(
new AssetsArchiver(archiveWriter), assetUuids, new AssetsArchiver(archiveWriter), assetUuids,

View File

@ -122,27 +122,34 @@ namespace OpenSim.Region.CoreModules.World.Archiver
/// <param name="cmdparams"></param> /// <param name="cmdparams"></param>
public void HandleSaveOarConsoleCommand(string module, string[] cmdparams) public void HandleSaveOarConsoleCommand(string module, string[] cmdparams)
{ {
Dictionary<string, object> options = new Dictionary<string, object>();
OptionSet ops = new OptionSet();
ops.Add("old|old-guids", delegate(string v) { options["old-guids"] = (v != null); });
List<string> mainParams = ops.Parse(cmdparams);
if (cmdparams.Length > 2) if (cmdparams.Length > 2)
{ {
ArchiveRegion(cmdparams[2]); ArchiveRegion(mainParams[2], options);
} }
else else
{ {
ArchiveRegion(DEFAULT_OAR_BACKUP_FILENAME); ArchiveRegion(DEFAULT_OAR_BACKUP_FILENAME, options);
} }
} }
public void ArchiveRegion(string savePath) public void ArchiveRegion(string savePath, Dictionary<string, object> options)
{ {
ArchiveRegion(savePath, Guid.Empty); ArchiveRegion(savePath, Guid.Empty, options);
} }
public void ArchiveRegion(string savePath, Guid requestId) public void ArchiveRegion(string savePath, Guid requestId, Dictionary<string, object> options)
{ {
m_log.InfoFormat( m_log.InfoFormat(
"[ARCHIVER]: Writing archive for region {0} to {1}", m_scene.RegionInfo.RegionName, savePath); "[ARCHIVER]: Writing archive for region {0} to {1}", m_scene.RegionInfo.RegionName, savePath);
new ArchiveWriteRequestPreparation(m_scene, savePath, requestId).ArchiveRegion(); new ArchiveWriteRequestPreparation(m_scene, savePath, requestId).ArchiveRegion(options);
} }
public void ArchiveRegion(Stream saveStream) public void ArchiveRegion(Stream saveStream)
@ -152,7 +159,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver
public void ArchiveRegion(Stream saveStream, Guid requestId) public void ArchiveRegion(Stream saveStream, Guid requestId)
{ {
new ArchiveWriteRequestPreparation(m_scene, saveStream, requestId).ArchiveRegion(); new ArchiveWriteRequestPreparation(m_scene, saveStream, requestId).ArchiveRegion(new Dictionary<string, object>());
} }
public void DearchiveRegion(string loadPath) public void DearchiveRegion(string loadPath)

View File

@ -160,9 +160,9 @@ namespace OpenSim.Region.CoreModules.World.Serialiser
return SceneXmlLoader.DeserializeGroupFromXml2(xmlString); return SceneXmlLoader.DeserializeGroupFromXml2(xmlString);
} }
public string SerializeGroupToXml2(SceneObjectGroup grp) public string SerializeGroupToXml2(SceneObjectGroup grp, Dictionary<string, object> options)
{ {
return SceneXmlLoader.SaveGroupToXml2(grp); return SceneXmlLoader.SaveGroupToXml2(grp, options);
} }
public void SavePrimListToXml2(EntityBase[] entityList, string fileName) public void SavePrimListToXml2(EntityBase[] entityList, string fileName)

View File

@ -369,7 +369,7 @@ namespace OpenSim.Region.CoreModules.World.Serialiser.Tests
// Need to add the object to the scene so that the request to get script state succeeds // Need to add the object to the scene so that the request to get script state succeeds
m_scene.AddSceneObject(so); m_scene.AddSceneObject(so);
string xml2 = m_serialiserModule.SerializeGroupToXml2(so); string xml2 = m_serialiserModule.SerializeGroupToXml2(so, new System.Collections.Generic.Dictionary<string,object>());
XmlTextReader xtr = new XmlTextReader(new StringReader(xml2)); XmlTextReader xtr = new XmlTextReader(new StringReader(xml2));
xtr.ReadStartElement("SceneObjectGroup"); xtr.ReadStartElement("SceneObjectGroup");

View File

@ -26,6 +26,7 @@
*/ */
using System; using System;
using System.Collections.Generic;
using System.IO; using System.IO;
namespace OpenSim.Region.Framework.Interfaces namespace OpenSim.Region.Framework.Interfaces
@ -46,7 +47,7 @@ namespace OpenSim.Region.Framework.Interfaces
/// the EventManager.OnOarFileSaved event. /// the EventManager.OnOarFileSaved event.
/// ///
/// <param name="savePath"></param> /// <param name="savePath"></param>
void ArchiveRegion(string savePath); void ArchiveRegion(string savePath, Dictionary<string, object> options);
/// <summary> /// <summary>
/// Archive the region to the given path /// Archive the region to the given path
@ -57,7 +58,7 @@ namespace OpenSim.Region.Framework.Interfaces
/// ///
/// <param name="savePath"></param> /// <param name="savePath"></param>
/// <param name="requestId">If supplied, this request Id is later returned in the saved event</param> /// <param name="requestId">If supplied, this request Id is later returned in the saved event</param>
void ArchiveRegion(string savePath, Guid requestId); void ArchiveRegion(string savePath, Guid requestId, Dictionary<string, object> options);
/// <summary> /// <summary>
/// Archive the region to a stream. /// Archive the region to a stream.

View File

@ -117,6 +117,6 @@ namespace OpenSim.Region.Framework.Interfaces
/// </summary> /// </summary>
/// <param name="grp"></param> /// <param name="grp"></param>
/// <returns></returns> /// <returns></returns>
string SerializeGroupToXml2(SceneObjectGroup grp); string SerializeGroupToXml2(SceneObjectGroup grp, Dictionary<string, object> options);
} }
} }

View File

@ -1075,36 +1075,36 @@ namespace OpenSim.Region.Framework.Scenes.Serialization
////////// Write ///////// ////////// Write /////////
public static void SOGToXml2(XmlTextWriter writer, SceneObjectGroup sog) public static void SOGToXml2(XmlTextWriter writer, SceneObjectGroup sog, Dictionary<string, object>options)
{ {
writer.WriteStartElement(String.Empty, "SceneObjectGroup", String.Empty); writer.WriteStartElement(String.Empty, "SceneObjectGroup", String.Empty);
SOPToXml2(writer, sog.RootPart, null); SOPToXml2(writer, sog.RootPart, null, options);
writer.WriteStartElement(String.Empty, "OtherParts", String.Empty); writer.WriteStartElement(String.Empty, "OtherParts", String.Empty);
sog.ForEachPart(delegate(SceneObjectPart sop) sog.ForEachPart(delegate(SceneObjectPart sop)
{ {
if (sop.UUID != sog.RootPart.UUID) if (sop.UUID != sog.RootPart.UUID)
SOPToXml2(writer, sop, sog.RootPart); SOPToXml2(writer, sop, sog.RootPart, options);
}); });
writer.WriteEndElement(); writer.WriteEndElement();
writer.WriteEndElement(); writer.WriteEndElement();
} }
static void SOPToXml2(XmlTextWriter writer, SceneObjectPart sop, SceneObjectPart parent) static void SOPToXml2(XmlTextWriter writer, SceneObjectPart sop, SceneObjectPart parent, Dictionary<string, object> options)
{ {
writer.WriteStartElement("SceneObjectPart"); writer.WriteStartElement("SceneObjectPart");
writer.WriteAttributeString("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance"); writer.WriteAttributeString("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");
writer.WriteAttributeString("xmlns:xsd", "http://www.w3.org/2001/XMLSchema"); writer.WriteAttributeString("xmlns:xsd", "http://www.w3.org/2001/XMLSchema");
writer.WriteElementString("AllowedDrop", sop.AllowedDrop.ToString().ToLower()); writer.WriteElementString("AllowedDrop", sop.AllowedDrop.ToString().ToLower());
WriteUUID(writer, "CreatorID", sop.CreatorID); WriteUUID(writer, "CreatorID", sop.CreatorID, options);
WriteUUID(writer, "FolderID", sop.FolderID); WriteUUID(writer, "FolderID", sop.FolderID, options);
writer.WriteElementString("InventorySerial", sop.InventorySerial.ToString()); writer.WriteElementString("InventorySerial", sop.InventorySerial.ToString());
WriteTaskInventory(writer, sop.TaskInventory); WriteTaskInventory(writer, sop.TaskInventory, options);
WriteUUID(writer, "UUID", sop.UUID); WriteUUID(writer, "UUID", sop.UUID, options);
writer.WriteElementString("LocalId", sop.LocalId.ToString()); writer.WriteElementString("LocalId", sop.LocalId.ToString());
writer.WriteElementString("Name", sop.Name); writer.WriteElementString("Name", sop.Name);
writer.WriteElementString("Material", sop.Material.ToString()); writer.WriteElementString("Material", sop.Material.ToString());
@ -1137,7 +1137,7 @@ namespace OpenSim.Region.Framework.Scenes.Serialization
writer.WriteElementString("LinkNum", sop.LinkNum.ToString()); writer.WriteElementString("LinkNum", sop.LinkNum.ToString());
writer.WriteElementString("ClickAction", sop.ClickAction.ToString()); writer.WriteElementString("ClickAction", sop.ClickAction.ToString());
WriteShape(writer, sop.Shape); WriteShape(writer, sop.Shape, options);
WriteVector(writer, "Scale", sop.Scale); WriteVector(writer, "Scale", sop.Scale);
writer.WriteElementString("UpdateFlag", sop.UpdateFlag.ToString()); writer.WriteElementString("UpdateFlag", sop.UpdateFlag.ToString());
@ -1151,16 +1151,16 @@ namespace OpenSim.Region.Framework.Scenes.Serialization
writer.WriteElementString("SalePrice", sop.SalePrice.ToString()); writer.WriteElementString("SalePrice", sop.SalePrice.ToString());
writer.WriteElementString("ObjectSaleType", sop.ObjectSaleType.ToString()); writer.WriteElementString("ObjectSaleType", sop.ObjectSaleType.ToString());
writer.WriteElementString("OwnershipCost", sop.OwnershipCost.ToString()); writer.WriteElementString("OwnershipCost", sop.OwnershipCost.ToString());
WriteUUID(writer, "GroupID", sop.GroupID); WriteUUID(writer, "GroupID", sop.GroupID, options);
WriteUUID(writer, "OwnerID", sop.OwnerID); WriteUUID(writer, "OwnerID", sop.OwnerID, options);
WriteUUID(writer, "LastOwnerID", sop.LastOwnerID); WriteUUID(writer, "LastOwnerID", sop.LastOwnerID, options);
writer.WriteElementString("BaseMask", sop.BaseMask.ToString()); writer.WriteElementString("BaseMask", sop.BaseMask.ToString());
writer.WriteElementString("OwnerMask", sop.OwnerMask.ToString()); writer.WriteElementString("OwnerMask", sop.OwnerMask.ToString());
writer.WriteElementString("GroupMask", sop.GroupMask.ToString()); writer.WriteElementString("GroupMask", sop.GroupMask.ToString());
writer.WriteElementString("EveryoneMask", sop.EveryoneMask.ToString()); writer.WriteElementString("EveryoneMask", sop.EveryoneMask.ToString());
writer.WriteElementString("NextOwnerMask", sop.NextOwnerMask.ToString()); writer.WriteElementString("NextOwnerMask", sop.NextOwnerMask.ToString());
writer.WriteElementString("Flags", sop.Flags.ToString()); writer.WriteElementString("Flags", sop.Flags.ToString());
WriteUUID(writer, "CollisionSound", sop.CollisionSound); WriteUUID(writer, "CollisionSound", sop.CollisionSound, options);
writer.WriteElementString("CollisionSoundVolume", sop.CollisionSoundVolume.ToString()); writer.WriteElementString("CollisionSoundVolume", sop.CollisionSoundVolume.ToString());
if (sop.MediaUrl != null) if (sop.MediaUrl != null)
writer.WriteElementString("MediaUrl", sop.MediaUrl.ToString()); writer.WriteElementString("MediaUrl", sop.MediaUrl.ToString());
@ -1168,10 +1168,13 @@ namespace OpenSim.Region.Framework.Scenes.Serialization
writer.WriteEndElement(); writer.WriteEndElement();
} }
static void WriteUUID(XmlTextWriter writer, string name, UUID id) static void WriteUUID(XmlTextWriter writer, string name, UUID id, Dictionary<string, object> options)
{ {
writer.WriteStartElement(name); writer.WriteStartElement(name);
writer.WriteElementString("UUID", id.ToString()); if (options.ContainsKey("old-guids"))
writer.WriteElementString("Guid", id.ToString());
else
writer.WriteElementString("UUID", id.ToString());
writer.WriteEndElement(); writer.WriteEndElement();
} }
@ -1194,7 +1197,7 @@ namespace OpenSim.Region.Framework.Scenes.Serialization
writer.WriteEndElement(); writer.WriteEndElement();
} }
static void WriteTaskInventory(XmlTextWriter writer, TaskInventoryDictionary tinv) static void WriteTaskInventory(XmlTextWriter writer, TaskInventoryDictionary tinv, Dictionary<string, object> options)
{ {
if (tinv.Count > 0) // otherwise skip this if (tinv.Count > 0) // otherwise skip this
{ {
@ -1204,26 +1207,26 @@ namespace OpenSim.Region.Framework.Scenes.Serialization
{ {
writer.WriteStartElement("TaskInventoryItem"); writer.WriteStartElement("TaskInventoryItem");
WriteUUID(writer, "AssetID", item.AssetID); WriteUUID(writer, "AssetID", item.AssetID, options);
writer.WriteElementString("BasePermissions", item.BasePermissions.ToString()); writer.WriteElementString("BasePermissions", item.BasePermissions.ToString());
writer.WriteElementString("CreationDate", item.CreationDate.ToString()); writer.WriteElementString("CreationDate", item.CreationDate.ToString());
WriteUUID(writer, "CreatorID", item.CreatorID); WriteUUID(writer, "CreatorID", item.CreatorID, options);
writer.WriteElementString("Description", item.Description); writer.WriteElementString("Description", item.Description);
writer.WriteElementString("EveryonePermissions", item.EveryonePermissions.ToString()); writer.WriteElementString("EveryonePermissions", item.EveryonePermissions.ToString());
writer.WriteElementString("Flags", item.Flags.ToString()); writer.WriteElementString("Flags", item.Flags.ToString());
WriteUUID(writer, "GroupID", item.GroupID); WriteUUID(writer, "GroupID", item.GroupID, options);
writer.WriteElementString("GroupPermissions", item.GroupPermissions.ToString()); writer.WriteElementString("GroupPermissions", item.GroupPermissions.ToString());
writer.WriteElementString("InvType", item.InvType.ToString()); writer.WriteElementString("InvType", item.InvType.ToString());
WriteUUID(writer, "ItemID", item.ItemID); WriteUUID(writer, "ItemID", item.ItemID, options);
WriteUUID(writer, "OldItemID", item.OldItemID); WriteUUID(writer, "OldItemID", item.OldItemID, options);
WriteUUID(writer, "LastOwnerID", item.LastOwnerID); WriteUUID(writer, "LastOwnerID", item.LastOwnerID, options);
writer.WriteElementString("Name", item.Name); writer.WriteElementString("Name", item.Name);
writer.WriteElementString("NextPermissions", item.NextPermissions.ToString()); writer.WriteElementString("NextPermissions", item.NextPermissions.ToString());
WriteUUID(writer, "OwnerID", item.OwnerID); WriteUUID(writer, "OwnerID", item.OwnerID, options);
writer.WriteElementString("CurrentPermissions", item.CurrentPermissions.ToString()); writer.WriteElementString("CurrentPermissions", item.CurrentPermissions.ToString());
WriteUUID(writer, "ParentID", item.ParentID); WriteUUID(writer, "ParentID", item.ParentID, options);
WriteUUID(writer, "ParentPartID", item.ParentPartID); WriteUUID(writer, "ParentPartID", item.ParentPartID, options);
WriteUUID(writer, "PermsGranter", item.PermsGranter); WriteUUID(writer, "PermsGranter", item.PermsGranter, options);
writer.WriteElementString("PermsMask", item.PermsMask.ToString()); writer.WriteElementString("PermsMask", item.PermsMask.ToString());
writer.WriteElementString("Type", item.Type.ToString()); writer.WriteElementString("Type", item.Type.ToString());
@ -1234,7 +1237,7 @@ namespace OpenSim.Region.Framework.Scenes.Serialization
} }
} }
static void WriteShape(XmlTextWriter writer, PrimitiveBaseShape shp) static void WriteShape(XmlTextWriter writer, PrimitiveBaseShape shp, Dictionary<string, object> options)
{ {
if (shp != null) if (shp != null)
{ {
@ -1283,7 +1286,7 @@ namespace OpenSim.Region.Framework.Scenes.Serialization
writer.WriteElementString("ProfileShape", shp.ProfileShape.ToString()); writer.WriteElementString("ProfileShape", shp.ProfileShape.ToString());
writer.WriteElementString("HollowShape", shp.HollowShape.ToString()); writer.WriteElementString("HollowShape", shp.HollowShape.ToString());
WriteUUID(writer, "SculptTexture", shp.SculptTexture); WriteUUID(writer, "SculptTexture", shp.SculptTexture, options);
writer.WriteElementString("SculptType", shp.SculptType.ToString()); writer.WriteElementString("SculptType", shp.SculptType.ToString());
writer.WriteStartElement("SculptData"); writer.WriteStartElement("SculptData");
byte[] sd; byte[] sd;

View File

@ -45,6 +45,7 @@ namespace OpenSim.Region.Framework.Scenes.Serialization
{ {
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
#region old xml format
public static void LoadPrimsFromXml(Scene scene, string fileName, bool newIDS, Vector3 loadOffset) public static void LoadPrimsFromXml(Scene scene, string fileName, bool newIDS, Vector3 loadOffset)
{ {
XmlDocument doc = new XmlDocument(); XmlDocument doc = new XmlDocument();
@ -98,11 +99,128 @@ namespace OpenSim.Region.Framework.Scenes.Serialization
file.Close(); file.Close();
} }
public static string SaveGroupToXml2(SceneObjectGroup grp) #endregion
#region XML2 serialization
// Called by archives (save oar)
public static string SaveGroupToXml2(SceneObjectGroup grp, Dictionary<string, object> options)
{ {
return SceneObjectSerializer.ToXml2Format(grp); //return SceneObjectSerializer.ToXml2Format(grp);
using (MemoryStream mem = new MemoryStream())
{
using (XmlTextWriter writer = new XmlTextWriter(mem, System.Text.Encoding.UTF8))
{
SceneObjectSerializer.SOGToXml2(writer, grp, options);
writer.Flush();
using (StreamReader reader = new StreamReader(mem))
{
mem.Seek(0, SeekOrigin.Begin);
return reader.ReadToEnd();
}
}
}
} }
// Called by scene serializer (save xml2)
public static void SavePrimsToXml2(Scene scene, string fileName)
{
EntityBase[] entityList = scene.GetEntities();
SavePrimListToXml2(entityList, fileName);
}
// Called by scene serializer (save xml2)
public static void SaveNamedPrimsToXml2(Scene scene, string primName, string fileName)
{
m_log.InfoFormat(
"[SERIALISER]: Saving prims with name {0} in xml2 format for region {1} to {2}",
primName, scene.RegionInfo.RegionName, fileName);
EntityBase[] entityList = scene.GetEntities();
List<EntityBase> primList = new List<EntityBase>();
foreach (EntityBase ent in entityList)
{
if (ent is SceneObjectGroup)
{
if (ent.Name == primName)
{
primList.Add(ent);
}
}
}
SavePrimListToXml2(primList.ToArray(), fileName);
}
// Called by REST Application plugin
public static void SavePrimsToXml2(Scene scene, TextWriter stream, Vector3 min, Vector3 max)
{
EntityBase[] entityList = scene.GetEntities();
SavePrimListToXml2(entityList, stream, min, max);
}
// Called here only. Should be private?
public static void SavePrimListToXml2(EntityBase[] entityList, string fileName)
{
FileStream file = new FileStream(fileName, FileMode.Create);
try
{
StreamWriter stream = new StreamWriter(file);
try
{
SavePrimListToXml2(entityList, stream, Vector3.Zero, Vector3.Zero);
}
finally
{
stream.Close();
}
}
finally
{
file.Close();
}
}
// Called here only. Should be private?
public static void SavePrimListToXml2(EntityBase[] entityList, TextWriter stream, Vector3 min, Vector3 max)
{
XmlTextWriter writer = new XmlTextWriter(stream);
int primCount = 0;
stream.WriteLine("<scene>\n");
foreach (EntityBase ent in entityList)
{
if (ent is SceneObjectGroup)
{
SceneObjectGroup g = (SceneObjectGroup)ent;
if (!min.Equals(Vector3.Zero) || !max.Equals(Vector3.Zero))
{
Vector3 pos = g.RootPart.GetWorldPosition();
if (min.X > pos.X || min.Y > pos.Y || min.Z > pos.Z)
continue;
if (max.X < pos.X || max.Y < pos.Y || max.Z < pos.Z)
continue;
}
//stream.WriteLine(SceneObjectSerializer.ToXml2Format(g));
SceneObjectSerializer.SOGToXml2(writer, (SceneObjectGroup)ent, new Dictionary<string,object>());
stream.WriteLine();
primCount++;
}
}
stream.WriteLine("</scene>\n");
stream.Flush();
}
#endregion
#region XML2 deserialization
public static SceneObjectGroup DeserializeGroupFromXml2(string xmlString) public static SceneObjectGroup DeserializeGroupFromXml2(string xmlString)
{ {
XmlDocument doc = new XmlDocument(); XmlDocument doc = new XmlDocument();
@ -222,94 +340,6 @@ namespace OpenSim.Region.Framework.Scenes.Serialization
} }
} }
public static void SavePrimsToXml2(Scene scene, string fileName) #endregion
{
EntityBase[] entityList = scene.GetEntities();
SavePrimListToXml2(entityList, fileName);
}
public static void SavePrimsToXml2(Scene scene, TextWriter stream, Vector3 min, Vector3 max)
{
EntityBase[] entityList = scene.GetEntities();
SavePrimListToXml2(entityList, stream, min, max);
}
public static void SaveNamedPrimsToXml2(Scene scene, string primName, string fileName)
{
m_log.InfoFormat(
"[SERIALISER]: Saving prims with name {0} in xml2 format for region {1} to {2}",
primName, scene.RegionInfo.RegionName, fileName);
EntityBase[] entityList = scene.GetEntities();
List<EntityBase> primList = new List<EntityBase>();
foreach (EntityBase ent in entityList)
{
if (ent is SceneObjectGroup)
{
if (ent.Name == primName)
{
primList.Add(ent);
}
}
}
SavePrimListToXml2(primList.ToArray(), fileName);
}
public static void SavePrimListToXml2(EntityBase[] entityList, string fileName)
{
FileStream file = new FileStream(fileName, FileMode.Create);
try
{
StreamWriter stream = new StreamWriter(file);
try
{
SavePrimListToXml2(entityList, stream, Vector3.Zero, Vector3.Zero);
}
finally
{
stream.Close();
}
}
finally
{
file.Close();
}
}
public static void SavePrimListToXml2(EntityBase[] entityList, TextWriter stream, Vector3 min, Vector3 max)
{
XmlTextWriter writer = new XmlTextWriter(stream);
int primCount = 0;
stream.WriteLine("<scene>\n");
foreach (EntityBase ent in entityList)
{
if (ent is SceneObjectGroup)
{
SceneObjectGroup g = (SceneObjectGroup)ent;
if (!min.Equals(Vector3.Zero) || !max.Equals(Vector3.Zero))
{
Vector3 pos = g.RootPart.GetWorldPosition();
if (min.X > pos.X || min.Y > pos.Y || min.Z > pos.Z)
continue;
if (max.X < pos.X || max.Y < pos.Y || max.Z < pos.Z)
continue;
}
//stream.WriteLine(SceneObjectSerializer.ToXml2Format(g));
SceneObjectSerializer.SOGToXml2(writer, (SceneObjectGroup)ent);
stream.WriteLine();
primCount++;
}
}
stream.WriteLine("</scene>\n");
stream.Flush();
}
} }
} }