From ebd9f22b29bfbe0cfb0689405984f856e0413405 Mon Sep 17 00:00:00 2001
From: Justin Clarke Casey
Date: Fri, 7 Nov 2008 18:46:11 +0000
Subject: * refactor: allocate local ids to prims only when an object is
 attached to a scene

---
 .../Archiver/ArchiveWriteRequestPreparation.cs     |  2 +-
 .../Modules/World/Serialiser/SceneXmlLoader.cs     |  2 +-
 .../Region/Environment/Scenes/Scene.Inventory.cs   |  8 +++--
 OpenSim/Region/Environment/Scenes/Scene.cs         |  2 +-
 .../Region/Environment/Scenes/SceneObjectGroup.cs  | 42 +++++++++++++++-------
 5 files changed, 37 insertions(+), 19 deletions(-)

(limited to 'OpenSim/Region')

diff --git a/OpenSim/Region/Environment/Modules/World/Archiver/ArchiveWriteRequestPreparation.cs b/OpenSim/Region/Environment/Modules/World/Archiver/ArchiveWriteRequestPreparation.cs
index 1fbc20f..0202841 100644
--- a/OpenSim/Region/Environment/Modules/World/Archiver/ArchiveWriteRequestPreparation.cs
+++ b/OpenSim/Region/Environment/Modules/World/Archiver/ArchiveWriteRequestPreparation.cs
@@ -176,7 +176,7 @@ namespace OpenSim.Region.Environment.Modules.World.Archiver
             if (null != objectAsset)
             {
                 string xml = Utils.BytesToString(objectAsset.Data);
-                SceneObjectGroup sog = new SceneObjectGroup(m_scene, m_scene.RegionInfo.RegionHandle, xml);
+                SceneObjectGroup sog = new SceneObjectGroup(xml, true);
                 GetSceneObjectAssetUuids(sog, assetUuids);
             }
         }
diff --git a/OpenSim/Region/Environment/Modules/World/Serialiser/SceneXmlLoader.cs b/OpenSim/Region/Environment/Modules/World/Serialiser/SceneXmlLoader.cs
index af69707..a069ac3 100644
--- a/OpenSim/Region/Environment/Modules/World/Serialiser/SceneXmlLoader.cs
+++ b/OpenSim/Region/Environment/Modules/World/Serialiser/SceneXmlLoader.cs
@@ -58,7 +58,7 @@ namespace OpenSim.Region.Environment.Scenes
                 rootNode = doc.FirstChild;
                 foreach (XmlNode aPrimNode in rootNode.ChildNodes)
                 {
-                    SceneObjectGroup obj = new SceneObjectGroup(scene, scene.RegionInfo.RegionHandle, aPrimNode.OuterXml);
+                    SceneObjectGroup obj = new SceneObjectGroup(aPrimNode.OuterXml, true);
 
                     if (newIDS)
                     {
diff --git a/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs b/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs
index c59fffc..4e93551 100644
--- a/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs
+++ b/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs
@@ -1953,8 +1953,10 @@ namespace OpenSim.Region.Environment.Scenes
                         if (rezAsset != null)
                         {
                             string xmlData = Utils.BytesToString(rezAsset.Data);
-                            SceneObjectGroup group = new SceneObjectGroup(this, m_regionHandle, xmlData);
-                            if (!ExternalChecks.ExternalChecksCanRezObject(group.Children.Count, remoteClient.AgentId, pos) && !attachment)
+                            SceneObjectGroup group = new SceneObjectGroup(xmlData, true);
+                            if (!ExternalChecks.ExternalChecksCanRezObject(
+                                group.Children.Count, remoteClient.AgentId, pos) 
+                                && !attachment)
                             {
                                 return null;
                             }
@@ -2091,7 +2093,7 @@ namespace OpenSim.Region.Environment.Scenes
                 if (rezAsset != null)
                 {
                     string xmlData = Utils.BytesToString(rezAsset.Data);
-                    SceneObjectGroup group = new SceneObjectGroup(this, m_regionHandle, xmlData);
+                    SceneObjectGroup group = new SceneObjectGroup(xmlData, true);
 
                     if (!ExternalChecks.ExternalChecksCanRezObject(group.Children.Count, ownerID, pos))
                     {
diff --git a/OpenSim/Region/Environment/Scenes/Scene.cs b/OpenSim/Region/Environment/Scenes/Scene.cs
index 40f8605..95d9f2a 100644
--- a/OpenSim/Region/Environment/Scenes/Scene.cs
+++ b/OpenSim/Region/Environment/Scenes/Scene.cs
@@ -1890,7 +1890,7 @@ namespace OpenSim.Region.Environment.Scenes
 
         public void LoadPrimsFromXml(string fileName, bool newIdsFlag, Vector3 loadOffset)
         {
-            m_log.InfoFormat("[SCENE]: Loading prims in xml format to region {0} from {1}", RegionInfo.RegionName);
+            m_log.InfoFormat("[SCENE]: Loading prims in xml format to region {0} from {1}", RegionInfo.RegionName, fileName);
 
             m_serialiser.LoadPrimsFromXml(this, fileName, newIdsFlag, loadOffset);
         }
diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs
index a19564f..5926445 100644
--- a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs
@@ -381,10 +381,16 @@ namespace OpenSim.Region.Environment.Scenes
         /// <summary>
         /// Create an object using serialized data in OpenSim's original xml format.
         /// </summary>
-        public SceneObjectGroup(Scene scene, ulong regionHandle, string xmlData)
-        {
-            m_scene = scene;
-            m_regionHandle = regionHandle;
+        /// <param name="xmlData"></param>
+        /// <param name="isOriginalXmlFormat">
+        /// This parameter only exists to separate the two different xml constructors.  In the future, versions should
+        /// be specified within the xml itself.
+        /// </param>
+        public SceneObjectGroup(string xmlData, bool isOriginalXmlFormat)
+        {
+            if (!isOriginalXmlFormat)
+                throw new Exception("This constructor must specify the xml is in OpenSim's original format");
+            
             // libomv.types changes UUID to Guid
             xmlData = xmlData.Replace("<UUID>", "<Guid>");
             xmlData = xmlData.Replace("</UUID>", "</Guid>");
@@ -416,16 +422,15 @@ namespace OpenSim.Region.Environment.Scenes
                             {
                                 reader.Read();
                                 SceneObjectPart part = SceneObjectPart.FromXml(reader);
-                                part.LocalId = m_scene.PrimIDAllocate();
                                 linkNum = part.LinkNum;
                                 AddPart(part);
                                 part.LinkNum = linkNum;
-                                part.RegionHandle = m_regionHandle;
 
                                 part.TrimPermissions();
                                 part.StoreUndoState();
                             }
                             break;
+                        
                         case XmlNodeType.EndElement:
                             break;
                     }
@@ -440,11 +445,6 @@ namespace OpenSim.Region.Environment.Scenes
 
             reader.Close();
             sr.Close();
-
-            m_rootPart.LocalId = m_scene.PrimIDAllocate();
-            m_rootPart.ParentID = 0;
-            m_rootPart.RegionHandle = m_regionHandle;
-            UpdateParentIDs();
         }
 
         /// <summary>
@@ -570,8 +570,24 @@ namespace OpenSim.Region.Environment.Scenes
         /// <param name="scene"></param>
         public void AttachToScene(Scene scene)
         {
-            m_scene = scene;
-            RegionHandle = scene.RegionInfo.RegionHandle;
+            m_scene = scene;                        
+            RegionHandle = m_scene.RegionInfo.RegionHandle;
+            
+            m_rootPart.ParentID = 0;
+            m_rootPart.LocalId = m_scene.PrimIDAllocate();
+            
+            //UpdateParentIDs();
+            
+            // No need to lock here since part isn't yet in a scene
+            foreach (SceneObjectPart part in m_parts.Values)
+            {
+                if (Object.ReferenceEquals(part, m_rootPart))
+                    continue;
+                
+                part.LocalId = m_scene.PrimIDAllocate();
+                part.ParentID = m_rootPart.LocalId;
+                m_log.DebugFormat("[SCENE]: Given local id {0} to part {1}, linknum {2}, parent {3} {4}", part.LocalId, part.UUID, part.LinkNum, part.ParentID, part.ParentUUID);
+            }
             
             ApplyPhysics(m_scene.m_physicalPrim);            
             
-- 
cgit v1.1