Merge branch 'master' of /home/opensim/var/repo/opensim
commit
3e00395b37
|
@ -41,6 +41,7 @@ using OpenSim.Framework.Serialization.External;
|
||||||
using OpenSim.Region.CoreModules.World.Terrain;
|
using OpenSim.Region.CoreModules.World.Terrain;
|
||||||
using OpenSim.Region.Framework.Interfaces;
|
using OpenSim.Region.Framework.Interfaces;
|
||||||
using OpenSim.Region.Framework.Scenes;
|
using OpenSim.Region.Framework.Scenes;
|
||||||
|
using OpenSim.Region.Framework.Scenes.Serialization;
|
||||||
using OpenSim.Services.Interfaces;
|
using OpenSim.Services.Interfaces;
|
||||||
|
|
||||||
namespace OpenSim.Region.CoreModules.World.Archiver
|
namespace OpenSim.Region.CoreModules.World.Archiver
|
||||||
|
|
|
@ -291,6 +291,59 @@ namespace OpenSim.Region.CoreModules.World.Archiver.Tests
|
||||||
// TODO: Test presence of more files and contents of files.
|
// TODO: Test presence of more files and contents of files.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Test loading an OpenSim Region Archive where the scene object parts are not ordered by link number (e.g.
|
||||||
|
/// 2 can come after 3).
|
||||||
|
/// </summary>
|
||||||
|
[Test]
|
||||||
|
public void TestLoadOarUnorderedParts()
|
||||||
|
{
|
||||||
|
TestHelpers.InMethod();
|
||||||
|
|
||||||
|
UUID ownerId = TestHelpers.ParseTail(0xaaaa);
|
||||||
|
|
||||||
|
MemoryStream archiveWriteStream = new MemoryStream();
|
||||||
|
TarArchiveWriter tar = new TarArchiveWriter(archiveWriteStream);
|
||||||
|
|
||||||
|
tar.WriteFile(
|
||||||
|
ArchiveConstants.CONTROL_FILE_PATH,
|
||||||
|
new ArchiveWriteRequestPreparation(null, (Stream)null, Guid.Empty).CreateControlFile(new Dictionary<string, Object>()));
|
||||||
|
|
||||||
|
SceneObjectGroup sog1 = SceneHelpers.CreateSceneObject(1, ownerId, "obj1-", 0x11);
|
||||||
|
SceneObjectPart sop2
|
||||||
|
= SceneHelpers.CreateSceneObjectPart("obj1-Part2", TestHelpers.ParseTail(0x12), ownerId);
|
||||||
|
SceneObjectPart sop3
|
||||||
|
= SceneHelpers.CreateSceneObjectPart("obj1-Part3", TestHelpers.ParseTail(0x13), ownerId);
|
||||||
|
|
||||||
|
// Add the parts so they will be written out in reverse order to the oar
|
||||||
|
sog1.AddPart(sop3);
|
||||||
|
sop3.LinkNum = 3;
|
||||||
|
sog1.AddPart(sop2);
|
||||||
|
sop2.LinkNum = 2;
|
||||||
|
|
||||||
|
tar.WriteFile(
|
||||||
|
ArchiveConstants.CreateOarObjectPath(sog1.Name, sog1.UUID, sog1.AbsolutePosition),
|
||||||
|
SceneObjectSerializer.ToXml2Format(sog1));
|
||||||
|
|
||||||
|
tar.Close();
|
||||||
|
|
||||||
|
MemoryStream archiveReadStream = new MemoryStream(archiveWriteStream.ToArray());
|
||||||
|
|
||||||
|
lock (this)
|
||||||
|
{
|
||||||
|
m_scene.EventManager.OnOarFileLoaded += LoadCompleted;
|
||||||
|
m_archiverModule.DearchiveRegion(archiveReadStream);
|
||||||
|
}
|
||||||
|
|
||||||
|
Assert.That(m_lastErrorMessage, Is.Null);
|
||||||
|
|
||||||
|
SceneObjectPart part2 = m_scene.GetSceneObjectPart("obj1-Part2");
|
||||||
|
Assert.That(part2.LinkNum, Is.EqualTo(2));
|
||||||
|
|
||||||
|
SceneObjectPart part3 = m_scene.GetSceneObjectPart("obj1-Part3");
|
||||||
|
Assert.That(part3.LinkNum, Is.EqualTo(3));
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Test loading an OpenSim Region Archive.
|
/// Test loading an OpenSim Region Archive.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
|
@ -29,8 +29,10 @@ using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
|
using System.Text.RegularExpressions;
|
||||||
using log4net;
|
using log4net;
|
||||||
using Mono.Addins;
|
using Mono.Addins;
|
||||||
|
using NDesk.Options;
|
||||||
using Nini.Config;
|
using Nini.Config;
|
||||||
using OpenMetaverse;
|
using OpenMetaverse;
|
||||||
using OpenSim.Framework;
|
using OpenSim.Framework;
|
||||||
|
@ -78,25 +80,31 @@ namespace OpenSim.Region.CoreModules.World.Objects.Commands
|
||||||
m_scene = scene;
|
m_scene = scene;
|
||||||
m_console = MainConsole.Instance;
|
m_console = MainConsole.Instance;
|
||||||
|
|
||||||
m_console.Commands.AddCommand("Objects", false, "delete object owner",
|
m_console.Commands.AddCommand(
|
||||||
"delete object owner <UUID>",
|
"Objects", false, "delete object owner",
|
||||||
"Delete a scene object by owner", HandleDeleteObject);
|
"delete object owner <UUID>",
|
||||||
|
"Delete a scene object by owner", HandleDeleteObject);
|
||||||
|
|
||||||
m_console.Commands.AddCommand("Objects", false, "delete object creator",
|
m_console.Commands.AddCommand(
|
||||||
"delete object creator <UUID>",
|
"Objects", false, "delete object creator",
|
||||||
"Delete a scene object by creator", HandleDeleteObject);
|
"delete object creator <UUID>",
|
||||||
|
"Delete a scene object by creator", HandleDeleteObject);
|
||||||
|
|
||||||
m_console.Commands.AddCommand("Objects", false, "delete object uuid",
|
m_console.Commands.AddCommand(
|
||||||
"delete object uuid <UUID>",
|
"Objects", false, "delete object uuid",
|
||||||
"Delete a scene object by uuid", HandleDeleteObject);
|
"delete object uuid <UUID>",
|
||||||
|
"Delete a scene object by uuid", HandleDeleteObject);
|
||||||
|
|
||||||
m_console.Commands.AddCommand("Objects", false, "delete object name",
|
m_console.Commands.AddCommand(
|
||||||
"delete object name <name>",
|
"Objects", false, "delete object name",
|
||||||
"Delete a scene object by name", HandleDeleteObject);
|
"delete object name [--regex] <name>",
|
||||||
|
"Delete a scene object by name.\nIf --regex is specified then the name is treatead as a regular expression",
|
||||||
|
HandleDeleteObject);
|
||||||
|
|
||||||
m_console.Commands.AddCommand("Objects", false, "delete object outside",
|
m_console.Commands.AddCommand(
|
||||||
"delete object outside",
|
"Objects", false, "delete object outside",
|
||||||
"Delete all scene objects outside region boundaries", HandleDeleteObject);
|
"delete object outside",
|
||||||
|
"Delete all scene objects outside region boundaries", HandleDeleteObject);
|
||||||
|
|
||||||
m_console.Commands.AddCommand(
|
m_console.Commands.AddCommand(
|
||||||
"Objects",
|
"Objects",
|
||||||
|
@ -109,8 +117,9 @@ namespace OpenSim.Region.CoreModules.World.Objects.Commands
|
||||||
"Objects",
|
"Objects",
|
||||||
false,
|
false,
|
||||||
"show object name",
|
"show object name",
|
||||||
"show object name <name>",
|
"show object name [--regex] <name>",
|
||||||
"Show details of scene objects with the given name", HandleShowObjectByName);
|
"Show details of scene objects with the given name.\nIf --regex is specified then the name is treatead as a regular expression",
|
||||||
|
HandleShowObjectByName);
|
||||||
|
|
||||||
m_console.Commands.AddCommand(
|
m_console.Commands.AddCommand(
|
||||||
"Objects",
|
"Objects",
|
||||||
|
@ -123,8 +132,9 @@ namespace OpenSim.Region.CoreModules.World.Objects.Commands
|
||||||
"Objects",
|
"Objects",
|
||||||
false,
|
false,
|
||||||
"show part name",
|
"show part name",
|
||||||
"show part name <name>",
|
"show part name [--regex] <name>",
|
||||||
"Show details of scene object parts with the given name", HandleShowPartByName);
|
"Show details of scene object parts with the given name.\nIf --regex is specified then the name is treatead as a regular expression",
|
||||||
|
HandleShowPartByName);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void RemoveRegion(Scene scene)
|
public void RemoveRegion(Scene scene)
|
||||||
|
@ -169,22 +179,38 @@ namespace OpenSim.Region.CoreModules.World.Objects.Commands
|
||||||
m_console.OutputFormat(sb.ToString());
|
m_console.OutputFormat(sb.ToString());
|
||||||
}
|
}
|
||||||
|
|
||||||
private void HandleShowObjectByName(string module, string[] cmd)
|
private void HandleShowObjectByName(string module, string[] cmdparams)
|
||||||
{
|
{
|
||||||
if (!(m_console.ConsoleScene == null || m_console.ConsoleScene == m_scene))
|
if (!(m_console.ConsoleScene == null || m_console.ConsoleScene == m_scene))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (cmd.Length < 4)
|
bool useRegex = false;
|
||||||
|
OptionSet options = new OptionSet().Add("regex", v=> useRegex = v != null );
|
||||||
|
|
||||||
|
List<string> mainParams = options.Parse(cmdparams);
|
||||||
|
|
||||||
|
if (mainParams.Count < 4)
|
||||||
{
|
{
|
||||||
m_console.OutputFormat("Usage: show object name <name>");
|
m_console.OutputFormat("Usage: show object name [--regex] <name>");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
string name = cmd[3];
|
string name = mainParams[3];
|
||||||
|
|
||||||
List<SceneObjectGroup> sceneObjects = new List<SceneObjectGroup>();
|
List<SceneObjectGroup> sceneObjects = new List<SceneObjectGroup>();
|
||||||
|
Action<SceneObjectGroup> searchAction;
|
||||||
|
|
||||||
m_scene.ForEachSOG(so => { if (so.Name == name) { sceneObjects.Add(so); }});
|
if (useRegex)
|
||||||
|
{
|
||||||
|
Regex nameRegex = new Regex(name);
|
||||||
|
searchAction = so => { if (nameRegex.IsMatch(so.Name)) { sceneObjects.Add(so); }};
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
searchAction = so => { if (so.Name == name) { sceneObjects.Add(so); }};
|
||||||
|
}
|
||||||
|
|
||||||
|
m_scene.ForEachSOG(searchAction);
|
||||||
|
|
||||||
if (sceneObjects.Count == 0)
|
if (sceneObjects.Count == 0)
|
||||||
{
|
{
|
||||||
|
@ -235,22 +261,39 @@ namespace OpenSim.Region.CoreModules.World.Objects.Commands
|
||||||
m_console.OutputFormat(sb.ToString());
|
m_console.OutputFormat(sb.ToString());
|
||||||
}
|
}
|
||||||
|
|
||||||
private void HandleShowPartByName(string module, string[] cmd)
|
private void HandleShowPartByName(string module, string[] cmdparams)
|
||||||
{
|
{
|
||||||
if (!(m_console.ConsoleScene == null || m_console.ConsoleScene == m_scene))
|
if (!(m_console.ConsoleScene == null || m_console.ConsoleScene == m_scene))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (cmd.Length < 4)
|
bool useRegex = false;
|
||||||
|
OptionSet options = new OptionSet().Add("regex", v=> useRegex = v != null );
|
||||||
|
|
||||||
|
List<string> mainParams = options.Parse(cmdparams);
|
||||||
|
|
||||||
|
if (mainParams.Count < 4)
|
||||||
{
|
{
|
||||||
m_console.OutputFormat("Usage: show part name <name>");
|
m_console.OutputFormat("Usage: show part name [--regex] <name>");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
string name = cmd[3];
|
string name = mainParams[3];
|
||||||
|
|
||||||
List<SceneObjectPart> parts = new List<SceneObjectPart>();
|
List<SceneObjectPart> parts = new List<SceneObjectPart>();
|
||||||
|
|
||||||
m_scene.ForEachSOG(so => so.ForEachPart(sop => { if (sop.Name == name) { parts.Add(sop); } }));
|
Action<SceneObjectGroup> searchAction;
|
||||||
|
|
||||||
|
if (useRegex)
|
||||||
|
{
|
||||||
|
Regex nameRegex = new Regex(name);
|
||||||
|
searchAction = so => so.ForEachPart(sop => { if (nameRegex.IsMatch(sop.Name)) { parts.Add(sop); } });
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
searchAction = so => so.ForEachPart(sop => { if (sop.Name == name) { parts.Add(sop); } });
|
||||||
|
}
|
||||||
|
|
||||||
|
m_scene.ForEachSOG(searchAction);
|
||||||
|
|
||||||
if (parts.Count == 0)
|
if (parts.Count == 0)
|
||||||
{
|
{
|
||||||
|
@ -312,96 +355,121 @@ namespace OpenSim.Region.CoreModules.World.Objects.Commands
|
||||||
o = cmd[3];
|
o = cmd[3];
|
||||||
}
|
}
|
||||||
|
|
||||||
List<SceneObjectGroup> deletes = new List<SceneObjectGroup>();
|
List<SceneObjectGroup> deletes = null;
|
||||||
|
|
||||||
UUID match;
|
UUID match;
|
||||||
|
bool requireConfirmation = true;
|
||||||
|
|
||||||
switch (mode)
|
switch (mode)
|
||||||
{
|
{
|
||||||
case "owner":
|
case "owner":
|
||||||
if (!UUID.TryParse(o, out match))
|
if (!UUID.TryParse(o, out match))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
m_scene.ForEachSOG(delegate (SceneObjectGroup g)
|
deletes = new List<SceneObjectGroup>();
|
||||||
{
|
|
||||||
if (g.OwnerID == match && !g.IsAttachment)
|
|
||||||
deletes.Add(g);
|
|
||||||
});
|
|
||||||
|
|
||||||
// if (deletes.Count == 0)
|
m_scene.ForEachSOG(delegate (SceneObjectGroup g)
|
||||||
// m_console.OutputFormat("No objects were found with owner {0}", match);
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "creator":
|
|
||||||
if (!UUID.TryParse(o, out match))
|
|
||||||
return;
|
|
||||||
|
|
||||||
m_scene.ForEachSOG(delegate (SceneObjectGroup g)
|
|
||||||
{
|
|
||||||
if (g.RootPart.CreatorID == match && !g.IsAttachment)
|
|
||||||
deletes.Add(g);
|
|
||||||
});
|
|
||||||
|
|
||||||
// if (deletes.Count == 0)
|
|
||||||
// m_console.OutputFormat("No objects were found with creator {0}", match);
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "uuid":
|
|
||||||
if (!UUID.TryParse(o, out match))
|
|
||||||
return;
|
|
||||||
|
|
||||||
m_scene.ForEachSOG(delegate (SceneObjectGroup g)
|
|
||||||
{
|
|
||||||
if (g.UUID == match && !g.IsAttachment)
|
|
||||||
deletes.Add(g);
|
|
||||||
});
|
|
||||||
|
|
||||||
// if (deletes.Count == 0)
|
|
||||||
// m_console.OutputFormat("No objects were found with uuid {0}", match);
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "name":
|
|
||||||
m_scene.ForEachSOG(delegate (SceneObjectGroup g)
|
|
||||||
{
|
|
||||||
if (g.RootPart.Name == o && !g.IsAttachment)
|
|
||||||
deletes.Add(g);
|
|
||||||
});
|
|
||||||
|
|
||||||
// if (deletes.Count == 0)
|
|
||||||
// m_console.OutputFormat("No objects were found with name {0}", o);
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "outside":
|
|
||||||
m_scene.ForEachSOG(delegate (SceneObjectGroup g)
|
|
||||||
{
|
|
||||||
SceneObjectPart rootPart = g.RootPart;
|
|
||||||
bool delete = false;
|
|
||||||
|
|
||||||
if (rootPart.GroupPosition.Z < 0.0 || rootPart.GroupPosition.Z > 10000.0)
|
|
||||||
{
|
{
|
||||||
delete = true;
|
if (g.OwnerID == match && !g.IsAttachment)
|
||||||
}
|
deletes.Add(g);
|
||||||
else
|
});
|
||||||
{
|
|
||||||
ILandObject parcel
|
// if (deletes.Count == 0)
|
||||||
= m_scene.LandChannel.GetLandObject(rootPart.GroupPosition.X, rootPart.GroupPosition.Y);
|
// m_console.OutputFormat("No objects were found with owner {0}", match);
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "creator":
|
||||||
|
if (!UUID.TryParse(o, out match))
|
||||||
|
return;
|
||||||
|
|
||||||
if (parcel == null || parcel.LandData.Name == "NO LAND")
|
deletes = new List<SceneObjectGroup>();
|
||||||
|
|
||||||
|
m_scene.ForEachSOG(delegate (SceneObjectGroup g)
|
||||||
|
{
|
||||||
|
if (g.RootPart.CreatorID == match && !g.IsAttachment)
|
||||||
|
deletes.Add(g);
|
||||||
|
});
|
||||||
|
|
||||||
|
// if (deletes.Count == 0)
|
||||||
|
// m_console.OutputFormat("No objects were found with creator {0}", match);
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "uuid":
|
||||||
|
if (!UUID.TryParse(o, out match))
|
||||||
|
return;
|
||||||
|
|
||||||
|
requireConfirmation = false;
|
||||||
|
deletes = new List<SceneObjectGroup>();
|
||||||
|
|
||||||
|
m_scene.ForEachSOG(delegate (SceneObjectGroup g)
|
||||||
|
{
|
||||||
|
if (g.UUID == match && !g.IsAttachment)
|
||||||
|
deletes.Add(g);
|
||||||
|
});
|
||||||
|
|
||||||
|
// if (deletes.Count == 0)
|
||||||
|
// m_console.OutputFormat("No objects were found with uuid {0}", match);
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "name":
|
||||||
|
deletes = GetDeleteCandidatesByName(module, cmd);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "outside":
|
||||||
|
deletes = new List<SceneObjectGroup>();
|
||||||
|
|
||||||
|
m_scene.ForEachSOG(delegate (SceneObjectGroup g)
|
||||||
|
{
|
||||||
|
SceneObjectPart rootPart = g.RootPart;
|
||||||
|
bool delete = false;
|
||||||
|
|
||||||
|
if (rootPart.GroupPosition.Z < 0.0 || rootPart.GroupPosition.Z > 10000.0)
|
||||||
|
{
|
||||||
delete = true;
|
delete = true;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ILandObject parcel
|
||||||
|
= m_scene.LandChannel.GetLandObject(rootPart.GroupPosition.X, rootPart.GroupPosition.Y);
|
||||||
|
|
||||||
|
if (parcel == null || parcel.LandData.Name == "NO LAND")
|
||||||
|
delete = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (delete && !g.IsAttachment && !deletes.Contains(g))
|
||||||
|
deletes.Add(g);
|
||||||
|
});
|
||||||
|
|
||||||
|
if (deletes.Count == 0)
|
||||||
|
m_console.OutputFormat("No objects were found outside region bounds");
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
if (delete && !g.IsAttachment && !deletes.Contains(g))
|
default:
|
||||||
deletes.Add(g);
|
m_console.OutputFormat("Unrecognized mode {0}", mode);
|
||||||
});
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// if (deletes.Count == 0)
|
if (deletes == null || deletes.Count <= 0)
|
||||||
// m_console.OutputFormat("No objects were found outside region bounds");
|
return;
|
||||||
|
|
||||||
break;
|
if (requireConfirmation)
|
||||||
|
{
|
||||||
|
string response = MainConsole.Instance.CmdPrompt(
|
||||||
|
string.Format(
|
||||||
|
"Are you sure that you want to delete {0} objects from {1}",
|
||||||
|
deletes.Count, m_scene.RegionInfo.RegionName),
|
||||||
|
"n");
|
||||||
|
|
||||||
|
if (response.ToLower() != "y")
|
||||||
|
{
|
||||||
|
MainConsole.Instance.OutputFormat(
|
||||||
|
"Aborting delete of {0} objects from {1}", deletes.Count, m_scene.RegionInfo.RegionName);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
m_console.OutputFormat("Deleting {0} objects in {1}", deletes.Count, m_scene.RegionInfo.RegionName);
|
m_console.OutputFormat("Deleting {0} objects in {1}", deletes.Count, m_scene.RegionInfo.RegionName);
|
||||||
|
@ -412,5 +480,44 @@ namespace OpenSim.Region.CoreModules.World.Objects.Commands
|
||||||
m_scene.DeleteSceneObject(g, false);
|
m_scene.DeleteSceneObject(g, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private List<SceneObjectGroup> GetDeleteCandidatesByName(string module, string[] cmdparams)
|
||||||
|
{
|
||||||
|
if (!(m_console.ConsoleScene == null || m_console.ConsoleScene == m_scene))
|
||||||
|
return null;
|
||||||
|
|
||||||
|
bool useRegex = false;
|
||||||
|
OptionSet options = new OptionSet().Add("regex", v=> useRegex = v != null );
|
||||||
|
|
||||||
|
List<string> mainParams = options.Parse(cmdparams);
|
||||||
|
|
||||||
|
if (mainParams.Count < 4)
|
||||||
|
{
|
||||||
|
m_console.OutputFormat("Usage: delete object name [--regex] <name>");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
string name = mainParams[3];
|
||||||
|
|
||||||
|
List<SceneObjectGroup> sceneObjects = new List<SceneObjectGroup>();
|
||||||
|
Action<SceneObjectGroup> searchAction;
|
||||||
|
|
||||||
|
if (useRegex)
|
||||||
|
{
|
||||||
|
Regex nameRegex = new Regex(name);
|
||||||
|
searchAction = so => { if (nameRegex.IsMatch(so.Name)) { sceneObjects.Add(so); }};
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
searchAction = so => { if (so.Name == name) { sceneObjects.Add(so); }};
|
||||||
|
}
|
||||||
|
|
||||||
|
m_scene.ForEachSOG(searchAction);
|
||||||
|
|
||||||
|
if (sceneObjects.Count == 0)
|
||||||
|
m_console.OutputFormat("No objects with name {0} found in {1}", name, m_scene.RegionInfo.RegionName);
|
||||||
|
|
||||||
|
return sceneObjects;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -944,7 +944,18 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
public int LinkNum
|
public int LinkNum
|
||||||
{
|
{
|
||||||
get { return m_linkNum; }
|
get { return m_linkNum; }
|
||||||
set { m_linkNum = value; }
|
set
|
||||||
|
{
|
||||||
|
// if (ParentGroup != null)
|
||||||
|
// {
|
||||||
|
// m_log.DebugFormat(
|
||||||
|
// "[SCENE OBJECT PART]: Setting linknum of {0}@{1} to {2} from {3}",
|
||||||
|
// Name, AbsolutePosition, value, m_linkNum);
|
||||||
|
// Util.PrintCallStack();
|
||||||
|
// }
|
||||||
|
|
||||||
|
m_linkNum = value;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public byte ClickAction
|
public byte ClickAction
|
||||||
|
|
|
@ -1424,51 +1424,6 @@ namespace OpenSim.Region.Framework.Scenes.Serialization
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//////// Read /////////
|
|
||||||
public static bool Xml2ToSOG(XmlTextReader reader, SceneObjectGroup sog)
|
|
||||||
{
|
|
||||||
reader.Read();
|
|
||||||
reader.ReadStartElement("SceneObjectGroup");
|
|
||||||
SceneObjectPart root = Xml2ToSOP(reader);
|
|
||||||
if (root != null)
|
|
||||||
sog.SetRootPart(root);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sog.UUID == UUID.Zero)
|
|
||||||
sog.UUID = sog.RootPart.UUID;
|
|
||||||
|
|
||||||
reader.Read(); // OtherParts
|
|
||||||
|
|
||||||
while (!reader.EOF)
|
|
||||||
{
|
|
||||||
switch (reader.NodeType)
|
|
||||||
{
|
|
||||||
case XmlNodeType.Element:
|
|
||||||
if (reader.Name == "SceneObjectPart")
|
|
||||||
{
|
|
||||||
SceneObjectPart child = Xml2ToSOP(reader);
|
|
||||||
if (child != null)
|
|
||||||
sog.AddPart(child);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
//Logger.Log("Found unexpected prim XML element " + reader.Name, Helpers.LogLevel.Debug);
|
|
||||||
reader.Read();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case XmlNodeType.EndElement:
|
|
||||||
default:
|
|
||||||
reader.Read();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static SceneObjectPart Xml2ToSOP(XmlTextReader reader)
|
public static SceneObjectPart Xml2ToSOP(XmlTextReader reader)
|
||||||
{
|
{
|
||||||
SceneObjectPart obj = new SceneObjectPart();
|
SceneObjectPart obj = new SceneObjectPart();
|
||||||
|
|
|
@ -223,50 +223,7 @@ namespace OpenSim.Region.Framework.Scenes.Serialization
|
||||||
|
|
||||||
public static SceneObjectGroup DeserializeGroupFromXml2(string xmlString)
|
public static SceneObjectGroup DeserializeGroupFromXml2(string xmlString)
|
||||||
{
|
{
|
||||||
XmlDocument doc = new XmlDocument();
|
return SceneObjectSerializer.FromXml2Format(xmlString);
|
||||||
XmlNode rootNode;
|
|
||||||
|
|
||||||
XmlTextReader reader = new XmlTextReader(new StringReader(xmlString));
|
|
||||||
reader.WhitespaceHandling = WhitespaceHandling.None;
|
|
||||||
doc.Load(reader);
|
|
||||||
reader.Close();
|
|
||||||
rootNode = doc.FirstChild;
|
|
||||||
|
|
||||||
// This is to deal with neighbouring regions that are still surrounding the group xml with the <scene>
|
|
||||||
// tag. It should be possible to remove the first part of this if statement once we go past 0.5.9 (or
|
|
||||||
// when some other changes forces all regions to upgrade).
|
|
||||||
// This might seem rather pointless since prim crossing from this revision to an earlier revision remains
|
|
||||||
// broken. But it isn't much work to accomodate the old format here.
|
|
||||||
if (rootNode.LocalName.Equals("scene"))
|
|
||||||
{
|
|
||||||
foreach (XmlNode aPrimNode in rootNode.ChildNodes)
|
|
||||||
{
|
|
||||||
// There is only ever one prim. This oddity should be removeable post 0.5.9
|
|
||||||
//return SceneObjectSerializer.FromXml2Format(aPrimNode.OuterXml);
|
|
||||||
using (reader = new XmlTextReader(new StringReader(aPrimNode.OuterXml)))
|
|
||||||
{
|
|
||||||
SceneObjectGroup obj = new SceneObjectGroup();
|
|
||||||
if (SceneObjectSerializer.Xml2ToSOG(reader, obj))
|
|
||||||
return obj;
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
//return SceneObjectSerializer.FromXml2Format(rootNode.OuterXml);
|
|
||||||
using (reader = new XmlTextReader(new StringReader(rootNode.OuterXml)))
|
|
||||||
{
|
|
||||||
SceneObjectGroup obj = new SceneObjectGroup();
|
|
||||||
if (SceneObjectSerializer.Xml2ToSOG(reader, obj))
|
|
||||||
return obj;
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -307,8 +264,8 @@ namespace OpenSim.Region.Framework.Scenes.Serialization
|
||||||
ICollection<SceneObjectGroup> sceneObjects = new List<SceneObjectGroup>();
|
ICollection<SceneObjectGroup> sceneObjects = new List<SceneObjectGroup>();
|
||||||
foreach (XmlNode aPrimNode in rootNode.ChildNodes)
|
foreach (XmlNode aPrimNode in rootNode.ChildNodes)
|
||||||
{
|
{
|
||||||
SceneObjectGroup obj = CreatePrimFromXml2(scene, aPrimNode.OuterXml);
|
SceneObjectGroup obj = DeserializeGroupFromXml2(aPrimNode.OuterXml);
|
||||||
if (obj != null && startScripts)
|
if (startScripts)
|
||||||
sceneObjects.Add(obj);
|
sceneObjects.Add(obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -319,27 +276,6 @@ namespace OpenSim.Region.Framework.Scenes.Serialization
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Create a prim from the xml2 representation.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="scene"></param>
|
|
||||||
/// <param name="xmlData"></param>
|
|
||||||
/// <returns>The scene object created. null if the scene object already existed</returns>
|
|
||||||
protected static SceneObjectGroup CreatePrimFromXml2(Scene scene, string xmlData)
|
|
||||||
{
|
|
||||||
//SceneObjectGroup obj = SceneObjectSerializer.FromXml2Format(xmlData);
|
|
||||||
using (XmlTextReader reader = new XmlTextReader(new StringReader(xmlData)))
|
|
||||||
{
|
|
||||||
SceneObjectGroup obj = new SceneObjectGroup();
|
|
||||||
SceneObjectSerializer.Xml2ToSOG(reader, obj);
|
|
||||||
|
|
||||||
if (scene.AddRestoredSceneObject(obj, true, false))
|
|
||||||
return obj;
|
|
||||||
else
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -624,7 +624,7 @@ namespace OpenSim.Tests.Common
|
||||||
/// <param name="ownerId"></param>
|
/// <param name="ownerId"></param>
|
||||||
/// <param name="partNamePrefix">
|
/// <param name="partNamePrefix">
|
||||||
/// The prefix to be given to part names. This will be suffixed with "Part<part no>"
|
/// The prefix to be given to part names. This will be suffixed with "Part<part no>"
|
||||||
/// (e.g. mynamePart0 for the root part)
|
/// (e.g. mynamePart1 for the root part)
|
||||||
/// </param>
|
/// </param>
|
||||||
/// <param name="uuidTail">
|
/// <param name="uuidTail">
|
||||||
/// The hexadecimal last part of the UUID for parts created. A UUID of the form "00000000-0000-0000-0000-{0:XD12}"
|
/// The hexadecimal last part of the UUID for parts created. A UUID of the form "00000000-0000-0000-0000-{0:XD12}"
|
||||||
|
@ -637,14 +637,14 @@ namespace OpenSim.Tests.Common
|
||||||
|
|
||||||
SceneObjectGroup sog
|
SceneObjectGroup sog
|
||||||
= new SceneObjectGroup(
|
= new SceneObjectGroup(
|
||||||
CreateSceneObjectPart(string.Format("{0}Part0", partNamePrefix), new UUID(rawSogId), ownerId));
|
CreateSceneObjectPart(string.Format("{0}Part1", partNamePrefix), new UUID(rawSogId), ownerId));
|
||||||
|
|
||||||
if (parts > 1)
|
if (parts > 1)
|
||||||
for (int i = 1; i < parts; i++)
|
for (int i = 2; i <= parts; i++)
|
||||||
sog.AddPart(
|
sog.AddPart(
|
||||||
CreateSceneObjectPart(
|
CreateSceneObjectPart(
|
||||||
string.Format("{0}Part{1}", partNamePrefix, i),
|
string.Format("{0}Part{1}", partNamePrefix, i),
|
||||||
new UUID(string.Format("00000000-0000-0000-0000-{0:X12}", uuidTail + i)),
|
new UUID(string.Format("00000000-0000-0000-0000-{0:X12}", uuidTail + i - 1)),
|
||||||
ownerId));
|
ownerId));
|
||||||
|
|
||||||
return sog;
|
return sog;
|
||||||
|
|
Loading…
Reference in New Issue