From 9359293b11dfd0db82ba3ce8110b0014afbde88f Mon Sep 17 00:00:00 2001
From: Dan Lake
Date: Thu, 10 Nov 2011 15:20:21 -0800
Subject: Cleaned UpdatePermissions calls on SOP and SOG to eliminate redundant
 properties packet sends and so one part is not telling a different part what
 to do. That should be up to the SOG to manage permissions on its parts and
 notify clients when one of them changes.

---
 .../Region/Framework/Scenes/SceneObjectGroup.cs    |  7 +++++-
 OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 27 ++++++++--------------
 2 files changed, 15 insertions(+), 19 deletions(-)

diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index 3fa6bb0..4355394 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -1873,7 +1873,7 @@ namespace OpenSim.Region.Framework.Scenes
         }
 
         /// <summary>
-        /// Send metadata about the root prim (name, description, sale price, etc.) to a client.
+        /// Send metadata about the root prim (name, description, sale price, permissions, etc.) to a client.
         /// </summary>
         /// <param name="client"></param>
         public void SendPropertiesToClient(IClientAPI client)
@@ -2481,6 +2481,11 @@ namespace OpenSim.Region.Framework.Scenes
                 parts[i].UpdatePermissions(AgentID, field, localID, mask, addRemTF);
 
             HasGroupChanged = true;
+
+            // Send the group's properties to all clients once all parts are updated
+            IClientAPI client;
+            if (Scene.TryGetClient(AgentID, out client))
+                SendPropertiesToClient(client);
         }
 
         #endregion
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
index 4071159..ad60604 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
@@ -1338,22 +1338,6 @@ namespace OpenSim.Region.Framework.Scenes
             client.SendObjectPropertiesReply(this);
         }
 
-        /// <summary>
-        /// For the scene object group to which this part belongs, send that scene object's root part properties to a client.
-        /// </summary>
-        /// <param name="AgentID"></param>
-        private void SendRootPartPropertiesToClient(UUID AgentID)
-        {
-            m_parentGroup.Scene.ForEachClient(delegate(IClientAPI client)
-            {
-                // Ugly reference :(
-                if (client.AgentId == AgentID)
-                {
-                    m_parentGroup.SendPropertiesToClient(client);
-                }
-            });
-        }
-
         // TODO: unused:
         // private void handleTimerAccounting(uint localID, double interval)
         // {
@@ -4214,6 +4198,15 @@ namespace OpenSim.Region.Framework.Scenes
             }
         }
 
+        /// <summary>
+        /// Update permissions on the SOP. Should only be called from SOG.UpdatePermissions because the SOG
+        /// will handle the client notifications once all of its parts are updated.
+        /// </summary>
+        /// <param name="AgentID"></param>
+        /// <param name="field"></param>
+        /// <param name="localID"></param>
+        /// <param name="mask"></param>
+        /// <param name="addRemTF"></param>
         public void UpdatePermissions(UUID AgentID, byte field, uint localID, uint mask, byte addRemTF)
         {
             bool set = addRemTF == 1;
@@ -4262,8 +4255,6 @@ namespace OpenSim.Region.Framework.Scenes
                 }
 
                 SendFullUpdateToAllClients();
-
-                SendRootPartPropertiesToClient(AgentID);
             }
         }
 
-- 
cgit v1.1