diff --git a/OpenSim/Region/Environment/Modules/World/Serialiser/IRegionSerialiser.cs b/OpenSim/Region/Environment/Modules/World/Serialiser/IRegionSerialiser.cs index 331b46069a..752b5b6df8 100644 --- a/OpenSim/Region/Environment/Modules/World/Serialiser/IRegionSerialiser.cs +++ b/OpenSim/Region/Environment/Modules/World/Serialiser/IRegionSerialiser.cs @@ -25,6 +25,7 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +using libsecondlife; using System.Collections.Generic; using OpenSim.Region.Environment.Scenes; @@ -32,6 +33,18 @@ namespace OpenSim.Region.Environment.Modules.World.Serialiser { public interface IRegionSerialiser { - List SerialiseRegion(Scene scene, string saveDir); + List SerialiseRegion(Scene scene, string saveDir); + + void LoadPrimsFromXml(Scene scene, string fileName, bool newIDS, LLVector3 loadOffset); + + void SavePrimsToXml(Scene scene, string fileName); + + void LoadPrimsFromXml2(Scene scene, string fileName); + + void SavePrimsToXml2(Scene scene, string fileName); + + void LoadGroupFromXml2String(Scene scene, string xmlString); + + string SavePrimGroupToXML2String(SceneObjectGroup grp); } -} \ No newline at end of file +} diff --git a/OpenSim/Region/Environment/Scenes/SceneXmlLoader.cs b/OpenSim/Region/Environment/Modules/World/Serialiser/SceneXmlLoader.cs similarity index 83% rename from OpenSim/Region/Environment/Scenes/SceneXmlLoader.cs rename to OpenSim/Region/Environment/Modules/World/Serialiser/SceneXmlLoader.cs index 742996ec2b..7f51b58b54 100644 --- a/OpenSim/Region/Environment/Scenes/SceneXmlLoader.cs +++ b/OpenSim/Region/Environment/Modules/World/Serialiser/SceneXmlLoader.cs @@ -36,20 +36,12 @@ using OpenSim.Region.Physics.Manager; namespace OpenSim.Region.Environment.Scenes { - public class SceneXmlLoader // can move to a module? + /// + /// Static methods to serialize and deserialize scene objects to and from XML + /// + public class SceneXmlLoader { - protected InnerScene m_innerScene; - protected RegionInfo m_regInfo; - protected Scene m_parentScene; - - public SceneXmlLoader(Scene parentScene, InnerScene innerScene, RegionInfo regionInfo) - { - m_parentScene = parentScene; - m_innerScene = innerScene; - m_regInfo = regionInfo; - } - - public void LoadPrimsFromXml(string fileName, bool newIDS, LLVector3 loadOffset) + public static void LoadPrimsFromXml(Scene scene, string fileName, bool newIDS, LLVector3 loadOffset) { XmlDocument doc = new XmlDocument(); XmlNode rootNode; @@ -63,8 +55,8 @@ namespace OpenSim.Region.Environment.Scenes rootNode = doc.FirstChild; foreach (XmlNode aPrimNode in rootNode.ChildNodes) { - SceneObjectGroup obj = new SceneObjectGroup(m_parentScene, - m_regInfo.RegionHandle, aPrimNode.OuterXml); + SceneObjectGroup obj = new SceneObjectGroup(scene, scene.RegionInfo.RegionHandle, aPrimNode.OuterXml); + if (newIDS) { obj.ResetIDs(); @@ -72,16 +64,16 @@ namespace OpenSim.Region.Environment.Scenes //if we want this to be a import method then we need new uuids for the object to avoid any clashes //obj.RegenerateFullIDs(); - m_innerScene.AddSceneObject(obj); + scene.AddSceneObject(obj); SceneObjectPart rootPart = obj.GetChildPart(obj.UUID); // Apply loadOffsets for load/import and move combinations rootPart.GroupPosition = rootPart.AbsolutePosition + loadOffset; bool UsePhysics = (((rootPart.GetEffectiveObjectFlags() & (uint) LLObject.ObjectFlags.Physics) > 0) && - m_parentScene.m_physicalPrim); + scene.m_physicalPrim); if ((rootPart.GetEffectiveObjectFlags() & (uint) LLObject.ObjectFlags.Phantom) == 0) { - rootPart.PhysActor = m_innerScene.PhysicsScene.AddPrimShape( + rootPart.PhysActor = scene.PhysicsScene.AddPrimShape( rootPart.Name, rootPart.Shape, new PhysicsVector(rootPart.AbsolutePosition.X + loadOffset.X, @@ -108,14 +100,14 @@ namespace OpenSim.Region.Environment.Scenes } } - public void SavePrimsToXml(string fileName) + public static void SavePrimsToXml(Scene scene, string fileName) { FileStream file = new FileStream(fileName, FileMode.Create); StreamWriter stream = new StreamWriter(file); int primCount = 0; stream.WriteLine("\n"); - List EntityList = m_innerScene.GetEntities(); + List EntityList = scene.GetEntities(); foreach (EntityBase ent in EntityList) { @@ -130,17 +122,16 @@ namespace OpenSim.Region.Environment.Scenes file.Close(); } - public string SavePrimGroupToXML2String(SceneObjectGroup grp) + public static string SavePrimGroupToXML2String(SceneObjectGroup grp) { string returnstring = ""; returnstring += "\n"; returnstring += grp.ToXmlString2(); returnstring += "\n"; return returnstring; - } - public void LoadGroupFromXml2String(string xmlString) + public static void LoadGroupFromXml2String(Scene scene, string xmlString) { XmlDocument doc = new XmlDocument(); XmlNode rootNode; @@ -152,12 +143,11 @@ namespace OpenSim.Region.Environment.Scenes rootNode = doc.FirstChild; foreach (XmlNode aPrimNode in rootNode.ChildNodes) { - CreatePrimFromXml(aPrimNode.OuterXml); + CreatePrimFromXml(scene, aPrimNode.OuterXml); } - } - public void LoadPrimsFromXml2(string fileName) + public static void LoadPrimsFromXml2(Scene scene, string fileName) { XmlDocument doc = new XmlDocument(); XmlNode rootNode; @@ -170,7 +160,7 @@ namespace OpenSim.Region.Environment.Scenes rootNode = doc.FirstChild; foreach (XmlNode aPrimNode in rootNode.ChildNodes) { - CreatePrimFromXml(aPrimNode.OuterXml); + CreatePrimFromXml(scene, aPrimNode.OuterXml); } } else @@ -179,19 +169,19 @@ namespace OpenSim.Region.Environment.Scenes } } - public void CreatePrimFromXml(string xmlData) + public static void CreatePrimFromXml(Scene scene, string xmlData) { SceneObjectGroup obj = new SceneObjectGroup(xmlData); LLVector3 receivedVelocity = obj.RootPart.Velocity; - //System.Console.WriteLine(obj.RootPart.Velocity.ToString()); - m_innerScene.AddSceneObjectFromStorage(obj); + //System.Console.WriteLine(obj.RootPart.Velocity.ToString()); + scene.AddSceneObjectFromStorage(obj); SceneObjectPart rootPart = obj.GetChildPart(obj.UUID); bool UsePhysics = (((rootPart.GetEffectiveObjectFlags() & (uint) LLObject.ObjectFlags.Physics) > 0) && - m_parentScene.m_physicalPrim); + scene.m_physicalPrim); if ((rootPart.GetEffectiveObjectFlags() & (uint) LLObject.ObjectFlags.Phantom) == 0) { - rootPart.PhysActor = m_innerScene.PhysicsScene.AddPrimShape( + rootPart.PhysActor = scene.PhysicsScene.AddPrimShape( rootPart.Name, rootPart.Shape, new PhysicsVector(rootPart.AbsolutePosition.X, rootPart.AbsolutePosition.Y, @@ -213,14 +203,14 @@ namespace OpenSim.Region.Environment.Scenes obj.ScheduleGroupForFullUpdate(); } - public void SavePrimsToXml2(string fileName) + public static void SavePrimsToXml2(Scene scene, string fileName) { FileStream file = new FileStream(fileName, FileMode.Create); StreamWriter stream = new StreamWriter(file); int primCount = 0; stream.WriteLine("\n"); - List EntityList = m_innerScene.GetEntities(); + List EntityList = scene.GetEntities(); foreach (EntityBase ent in EntityList) { diff --git a/OpenSim/Region/Environment/Modules/World/Serialiser/SerialiserModule.cs b/OpenSim/Region/Environment/Modules/World/Serialiser/SerialiserModule.cs index bd8a0f46da..bfa0a43169 100644 --- a/OpenSim/Region/Environment/Modules/World/Serialiser/SerialiserModule.cs +++ b/OpenSim/Region/Environment/Modules/World/Serialiser/SerialiserModule.cs @@ -28,6 +28,7 @@ using System; using System.Collections.Generic; using System.IO; +using libsecondlife; using Nini.Config; using OpenSim.Region.Environment.Interfaces; using OpenSim.Region.Environment.Modules.Framework.InterfaceCommander; @@ -85,7 +86,37 @@ namespace OpenSim.Region.Environment.Modules.World.Serialiser #endregion #region IRegionSerialiser Members - + + public void LoadPrimsFromXml(Scene scene, string fileName, bool newIDS, LLVector3 loadOffset) + { + SceneXmlLoader.LoadPrimsFromXml(scene, fileName, newIDS, loadOffset); + } + + public void SavePrimsToXml(Scene scene, string fileName) + { + SceneXmlLoader.SavePrimsToXml(scene, fileName); + } + + public void LoadPrimsFromXml2(Scene scene, string fileName) + { + SceneXmlLoader.LoadPrimsFromXml2(scene, fileName); + } + + public void SavePrimsToXml2(Scene scene, string fileName) + { + SceneXmlLoader.SavePrimsToXml2(scene, fileName); + } + + public void LoadGroupFromXml2String(Scene scene, string xmlString) + { + SceneXmlLoader.LoadGroupFromXml2String(scene, xmlString); + } + + public string SavePrimGroupToXML2String(SceneObjectGroup grp) + { + return SceneXmlLoader.SavePrimGroupToXML2String(grp); + } + public List SerialiseRegion(Scene scene, string saveDir) { List results = new List(); @@ -165,4 +196,4 @@ namespace OpenSim.Region.Environment.Modules.World.Serialiser m_commander.RegisterCommand("save-all", serialiseAllScenesCommand); } } -} \ No newline at end of file +} diff --git a/OpenSim/Region/Environment/Scenes/Scene.cs b/OpenSim/Region/Environment/Scenes/Scene.cs index c1e8602298..26f3499757 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.cs @@ -41,6 +41,7 @@ using OpenSim.Framework.Communications.Cache; using OpenSim.Framework.Servers; using OpenSim.Region.Environment.Interfaces; using OpenSim.Region.Environment.Modules.World.Archiver; +using OpenSim.Region.Environment.Modules.World.Serialiser; using OpenSim.Region.Environment.Modules.World.Terrain; using OpenSim.Region.Environment.Scenes.Scripting; using OpenSim.Region.Physics.Manager; @@ -94,7 +95,6 @@ namespace OpenSim.Region.Environment.Scenes public CommunicationsManager CommsManager; protected SceneCommunicationService m_sceneGridService; - protected SceneXmlLoader m_sceneXmlLoader; /// /// Each agent has its own capabilities handler. @@ -268,8 +268,6 @@ namespace OpenSim.Region.Environment.Scenes // Operating system has killed the plugin m_innerScene.UnRecoverableError += RestartNow; - m_sceneXmlLoader = new SceneXmlLoader(this, m_innerScene, m_regInfo); - RegisterDefaultSceneEvents(); m_httpListener = httpServer; @@ -1400,22 +1398,26 @@ namespace OpenSim.Region.Environment.Scenes public void LoadPrimsFromXml(string fileName, bool newIdsFlag, LLVector3 loadOffset) { - m_sceneXmlLoader.LoadPrimsFromXml(fileName, newIdsFlag, loadOffset); + IRegionSerialiser loader = RequestModuleInterface(); + loader.LoadPrimsFromXml(this, fileName, newIdsFlag, loadOffset); } public void SavePrimsToXml(string fileName) { - m_sceneXmlLoader.SavePrimsToXml(fileName); + IRegionSerialiser loader = RequestModuleInterface(); + loader.SavePrimsToXml(this, fileName); } public void LoadPrimsFromXml2(string fileName) { - m_sceneXmlLoader.LoadPrimsFromXml2(fileName); + IRegionSerialiser loader = RequestModuleInterface(); + loader.LoadPrimsFromXml2(this, fileName); } public void SavePrimsToXml2(string fileName) { - m_sceneXmlLoader.SavePrimsToXml2(fileName); + IRegionSerialiser loader = RequestModuleInterface(); + loader.SavePrimsToXml2(this, fileName); } /// @@ -1505,15 +1507,20 @@ namespace OpenSim.Region.Environment.Scenes grp.OffsetForNewRegion(pos); CrossPrimGroupIntoNewRegion(newRegionHandle, grp); - } + public void CrossPrimGroupIntoNewRegion(ulong newRegionHandle, SceneObjectGroup grp) { int primcrossingXMLmethod = 0; if (newRegionHandle != 0) { bool successYN = false; - successYN = m_sceneGridService.PrimCrossToNeighboringRegion(newRegionHandle, grp.UUID, m_sceneXmlLoader.SavePrimGroupToXML2String(grp), primcrossingXMLmethod); + + IRegionSerialiser loader = RequestModuleInterface(); + successYN + = m_sceneGridService.PrimCrossToNeighboringRegion( + newRegionHandle, grp.UUID, loader.SavePrimGroupToXML2String(grp), primcrossingXMLmethod); + if (successYN) { // We remove the object here @@ -1545,7 +1552,9 @@ namespace OpenSim.Region.Environment.Scenes m_log.Warn("{[INTERREGION]: A new prim arrived from a neighbor"); if (XMLMethod == 0) { - m_sceneXmlLoader.LoadGroupFromXml2String(objXMLData); + IRegionSerialiser loader = RequestModuleInterface(); + loader.LoadGroupFromXml2String(this, objXMLData); + SceneObjectPart RootPrim = GetSceneObjectPart(primID); if (RootPrim != null) { @@ -3025,7 +3034,6 @@ namespace OpenSim.Region.Environment.Scenes public bool pipeEventsForScript(uint localID) { - SceneObjectPart part = GetSceneObjectPart(localID); if (part != null) {