Merge branch 'master' into careminster-presence-refactor
commit
46e5c8e919
|
@ -2402,7 +2402,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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -424,6 +424,7 @@ namespace OpenSim.Data.MySQL
|
||||||
cmd.CommandText =
|
cmd.CommandText =
|
||||||
"SELECT * FROM prims LEFT JOIN primshapes ON prims.UUID = primshapes.UUID WHERE RegionUUID = ?RegionUUID";
|
"SELECT * FROM prims LEFT JOIN primshapes ON prims.UUID = primshapes.UUID WHERE RegionUUID = ?RegionUUID";
|
||||||
cmd.Parameters.AddWithValue("RegionUUID", regionID.ToString());
|
cmd.Parameters.AddWithValue("RegionUUID", regionID.ToString());
|
||||||
|
cmd.CommandTimeout = 3600;
|
||||||
|
|
||||||
using (IDataReader reader = ExecuteReader(cmd))
|
using (IDataReader reader = ExecuteReader(cmd))
|
||||||
{
|
{
|
||||||
|
|
|
@ -52,6 +52,12 @@ namespace OpenSim.Region.CoreModules.World.Archiver
|
||||||
{
|
{
|
||||||
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The maximum major version of OAR that we can read. Minor versions shouldn't need a number since version
|
||||||
|
/// bumps here should be compatible.
|
||||||
|
/// </summary>
|
||||||
|
public static int MAX_MAJOR_VERSION = 0;
|
||||||
|
|
||||||
protected Scene m_scene;
|
protected Scene m_scene;
|
||||||
protected Stream m_loadStream;
|
protected Stream m_loadStream;
|
||||||
protected Guid m_requestId;
|
protected Guid m_requestId;
|
||||||
|
@ -515,6 +521,22 @@ namespace OpenSim.Region.CoreModules.World.Archiver
|
||||||
{
|
{
|
||||||
if (xtr.NodeType == XmlNodeType.Element)
|
if (xtr.NodeType == XmlNodeType.Element)
|
||||||
{
|
{
|
||||||
|
if (xtr.Name.ToString() == "archive")
|
||||||
|
{
|
||||||
|
int majorVersion = int.Parse(xtr["major_version"]);
|
||||||
|
int minorVersion = int.Parse(xtr["minor_version"]);
|
||||||
|
string version = string.Format("{0}.{1}", majorVersion, minorVersion);
|
||||||
|
|
||||||
|
if (majorVersion > MAX_MAJOR_VERSION)
|
||||||
|
{
|
||||||
|
throw new Exception(
|
||||||
|
string.Format(
|
||||||
|
"The OAR you are trying to load has major version number of {0} but this version of OpenSim can only load OARs with major version number {1} and below",
|
||||||
|
majorVersion, MAX_MAJOR_VERSION));
|
||||||
|
}
|
||||||
|
|
||||||
|
m_log.InfoFormat("[ARCHIVER]: Loading OAR with version {0}", version);
|
||||||
|
}
|
||||||
if (xtr.Name.ToString() == "datetime")
|
if (xtr.Name.ToString() == "datetime")
|
||||||
{
|
{
|
||||||
int value;
|
int value;
|
||||||
|
|
|
@ -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(
|
||||||
|
@ -105,12 +108,6 @@ namespace OpenSim.Region.CoreModules.World.Archiver
|
||||||
// "[ARCHIVER]: Received {0} of {1} assets requested",
|
// "[ARCHIVER]: Received {0} of {1} assets requested",
|
||||||
// assetsFoundUuids.Count, assetsFoundUuids.Count + assetsNotFoundUuids.Count);
|
// assetsFoundUuids.Count, assetsFoundUuids.Count + assetsNotFoundUuids.Count);
|
||||||
|
|
||||||
m_log.InfoFormat("[ARCHIVER]: Creating archive file. This may take some time.");
|
|
||||||
|
|
||||||
// Write out control file
|
|
||||||
m_archiveWriter.WriteFile(ArchiveConstants.CONTROL_FILE_PATH, Create0p2ControlFile());
|
|
||||||
m_log.InfoFormat("[ARCHIVER]: Added control file to archive.");
|
|
||||||
|
|
||||||
// Write out region settings
|
// Write out region settings
|
||||||
string settingsPath
|
string settingsPath
|
||||||
= String.Format("{0}{1}.xml", ArchiveConstants.SETTINGS_PATH, m_scene.RegionInfo.RegionName);
|
= String.Format("{0}{1}.xml", ArchiveConstants.SETTINGS_PATH, m_scene.RegionInfo.RegionName);
|
||||||
|
@ -140,47 +137,22 @@ namespace OpenSim.Region.CoreModules.World.Archiver
|
||||||
|
|
||||||
m_log.InfoFormat("[ARCHIVER]: Added terrain information to archive.");
|
m_log.InfoFormat("[ARCHIVER]: Added terrain information to archive.");
|
||||||
|
|
||||||
|
Dictionary<string, object> serializationOptions = new Dictionary<string, object>();
|
||||||
|
// if (m_options.ContainsKey("version") && (string)m_options["version"] == "0")
|
||||||
|
// serializationOptions["old-guids"] = true;
|
||||||
|
|
||||||
// Write out scene object metadata
|
// Write out scene object metadata
|
||||||
foreach (SceneObjectGroup sceneObject in m_sceneObjects)
|
foreach (SceneObjectGroup sceneObject in m_sceneObjects)
|
||||||
{
|
{
|
||||||
//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, serializationOptions);
|
||||||
m_archiveWriter.WriteFile(ArchiveHelpers.CreateObjectPath(sceneObject), serializedObject);
|
m_archiveWriter.WriteFile(ArchiveHelpers.CreateObjectPath(sceneObject), serializedObject);
|
||||||
}
|
}
|
||||||
|
|
||||||
m_log.InfoFormat("[ARCHIVER]: Added scene objects to archive.");
|
m_log.InfoFormat("[ARCHIVER]: Added scene objects to archive.");
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Create the control file for a 0.2 version archive
|
|
||||||
/// </summary>
|
|
||||||
/// <returns></returns>
|
|
||||||
public static string Create0p2ControlFile()
|
|
||||||
{
|
|
||||||
StringWriter sw = new StringWriter();
|
|
||||||
XmlTextWriter xtw = new XmlTextWriter(sw);
|
|
||||||
xtw.Formatting = Formatting.Indented;
|
|
||||||
xtw.WriteStartDocument();
|
|
||||||
xtw.WriteStartElement("archive");
|
|
||||||
xtw.WriteAttributeString("major_version", "0");
|
|
||||||
xtw.WriteAttributeString("minor_version", "3");
|
|
||||||
|
|
||||||
xtw.WriteStartElement("creation_info");
|
|
||||||
DateTime now = DateTime.UtcNow;
|
|
||||||
TimeSpan t = now - new DateTime(1970, 1, 1);
|
|
||||||
xtw.WriteElementString("datetime", ((int)t.TotalSeconds).ToString());
|
|
||||||
xtw.WriteElementString("id", UUID.Random().ToString());
|
|
||||||
xtw.WriteEndElement();
|
|
||||||
xtw.WriteEndElement();
|
|
||||||
|
|
||||||
xtw.Flush();
|
|
||||||
xtw.Close();
|
|
||||||
|
|
||||||
String s = sw.ToString();
|
|
||||||
sw.Close();
|
|
||||||
|
|
||||||
return s;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,6 +32,7 @@ using System.IO.Compression;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using System.Text.RegularExpressions;
|
using System.Text.RegularExpressions;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
|
using System.Xml;
|
||||||
using log4net;
|
using log4net;
|
||||||
using OpenMetaverse;
|
using OpenMetaverse;
|
||||||
using OpenSim.Framework;
|
using OpenSim.Framework;
|
||||||
|
@ -98,7 +99,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,11 +166,71 @@ 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);
|
||||||
|
|
||||||
|
m_log.InfoFormat("[ARCHIVER]: Creating archive file. This may take some time.");
|
||||||
|
|
||||||
|
// Write out control file
|
||||||
|
archiveWriter.WriteFile(ArchiveConstants.CONTROL_FILE_PATH, Create0p2ControlFile(options));
|
||||||
|
m_log.InfoFormat("[ARCHIVER]: Added control file to archive.");
|
||||||
|
|
||||||
new AssetsRequest(
|
new AssetsRequest(
|
||||||
new AssetsArchiver(archiveWriter), assetUuids,
|
new AssetsArchiver(archiveWriter), assetUuids,
|
||||||
m_scene.AssetService, awre.ReceivedAllAssets).Execute();
|
m_scene.AssetService, awre.ReceivedAllAssets).Execute();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Create the control file for the most up to date archive
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static string Create0p2ControlFile(Dictionary<string, object> options)
|
||||||
|
{
|
||||||
|
int majorVersion = 0, minorVersion = 4;
|
||||||
|
|
||||||
|
/*
|
||||||
|
if (options.ContainsKey("version") && (string)options["version"] == "0")
|
||||||
|
{
|
||||||
|
majorVersion = 0;
|
||||||
|
minorVersion = 3;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
majorVersion = 1;
|
||||||
|
minorVersion = 0;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
m_log.InfoFormat("[ARCHIVER]: Creating version {0}.{1} OAR", majorVersion, minorVersion);
|
||||||
|
// if (majorVersion == 1)
|
||||||
|
// {
|
||||||
|
// m_log.WarnFormat("[ARCHIVER]: Please be aware that version 1.0 OARs are not compatible with OpenSim 0.7.0.2 and earlier. Please use the --version=0 option if you want to produce a compatible OAR");
|
||||||
|
// }
|
||||||
|
|
||||||
|
|
||||||
|
StringWriter sw = new StringWriter();
|
||||||
|
XmlTextWriter xtw = new XmlTextWriter(sw);
|
||||||
|
xtw.Formatting = Formatting.Indented;
|
||||||
|
xtw.WriteStartDocument();
|
||||||
|
xtw.WriteStartElement("archive");
|
||||||
|
xtw.WriteAttributeString("major_version", majorVersion.ToString());
|
||||||
|
xtw.WriteAttributeString("minor_version", minorVersion.ToString());
|
||||||
|
|
||||||
|
xtw.WriteStartElement("creation_info");
|
||||||
|
DateTime now = DateTime.UtcNow;
|
||||||
|
TimeSpan t = now - new DateTime(1970, 1, 1);
|
||||||
|
xtw.WriteElementString("datetime", ((int)t.TotalSeconds).ToString());
|
||||||
|
xtw.WriteElementString("id", UUID.Random().ToString());
|
||||||
|
xtw.WriteEndElement();
|
||||||
|
xtw.WriteEndElement();
|
||||||
|
|
||||||
|
xtw.Flush();
|
||||||
|
xtw.Close();
|
||||||
|
|
||||||
|
String s = sw.ToString();
|
||||||
|
sw.Close();
|
||||||
|
|
||||||
|
return s;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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("v|version=", delegate(string v) { options["version"] = v; });
|
||||||
|
|
||||||
|
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)
|
||||||
|
|
|
@ -230,7 +230,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver.Tests
|
||||||
// upset load
|
// upset load
|
||||||
tar.WriteDir(ArchiveConstants.TERRAINS_PATH);
|
tar.WriteDir(ArchiveConstants.TERRAINS_PATH);
|
||||||
|
|
||||||
tar.WriteFile(ArchiveConstants.CONTROL_FILE_PATH, ArchiveWriteRequestExecution.Create0p2ControlFile());
|
tar.WriteFile(ArchiveConstants.CONTROL_FILE_PATH, ArchiveWriteRequestPreparation.Create0p2ControlFile(new Dictionary<string, Object>()));
|
||||||
|
|
||||||
SceneObjectPart part1 = CreateSceneObjectPart1();
|
SceneObjectPart part1 = CreateSceneObjectPart1();
|
||||||
SceneObjectGroup object1 = new SceneObjectGroup(part1);
|
SceneObjectGroup object1 = new SceneObjectGroup(part1);
|
||||||
|
@ -329,7 +329,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver.Tests
|
||||||
TarArchiveWriter tar = new TarArchiveWriter(archiveWriteStream);
|
TarArchiveWriter tar = new TarArchiveWriter(archiveWriteStream);
|
||||||
|
|
||||||
tar.WriteDir(ArchiveConstants.TERRAINS_PATH);
|
tar.WriteDir(ArchiveConstants.TERRAINS_PATH);
|
||||||
tar.WriteFile(ArchiveConstants.CONTROL_FILE_PATH, ArchiveWriteRequestExecution.Create0p2ControlFile());
|
tar.WriteFile(ArchiveConstants.CONTROL_FILE_PATH, ArchiveWriteRequestPreparation.Create0p2ControlFile(new Dictionary<string, Object>()));
|
||||||
|
|
||||||
RegionSettings rs = new RegionSettings();
|
RegionSettings rs = new RegionSettings();
|
||||||
rs.AgentLimit = 17;
|
rs.AgentLimit = 17;
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -25,6 +25,9 @@
|
||||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.IO;
|
||||||
|
using System.Xml;
|
||||||
using log4net.Config;
|
using log4net.Config;
|
||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
using NUnit.Framework.SyntaxHelpers;
|
using NUnit.Framework.SyntaxHelpers;
|
||||||
|
@ -34,8 +37,6 @@ using OpenSim.Region.Framework.Scenes;
|
||||||
using OpenSim.Region.Framework.Scenes.Serialization;
|
using OpenSim.Region.Framework.Scenes.Serialization;
|
||||||
using OpenSim.Tests.Common;
|
using OpenSim.Tests.Common;
|
||||||
using OpenSim.Tests.Common.Setup;
|
using OpenSim.Tests.Common.Setup;
|
||||||
using System.IO;
|
|
||||||
using System.Xml;
|
|
||||||
|
|
||||||
namespace OpenSim.Region.CoreModules.World.Serialiser.Tests
|
namespace OpenSim.Region.CoreModules.World.Serialiser.Tests
|
||||||
{
|
{
|
||||||
|
@ -369,7 +370,9 @@ 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);
|
Dictionary<string, object> options = new Dictionary<string, object>();
|
||||||
|
options["old-guids"] = true;
|
||||||
|
string xml2 = m_serialiserModule.SerializeGroupToXml2(so, options);
|
||||||
|
|
||||||
XmlTextReader xtr = new XmlTextReader(new StringReader(xml2));
|
XmlTextReader xtr = new XmlTextReader(new StringReader(xml2));
|
||||||
xtr.ReadStartElement("SceneObjectGroup");
|
xtr.ReadStartElement("SceneObjectGroup");
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Binary file not shown.
Loading…
Reference in New Issue