aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs')
-rw-r--r--OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs123
1 files changed, 51 insertions, 72 deletions
diff --git a/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs b/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs
index c303d6d..61d604f 100644
--- a/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs
+++ b/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs
@@ -26,8 +26,10 @@
26 */ 26 */
27 27
28using System; 28using System;
29using System.Collections;
29using System.Collections.Generic; 30using System.Collections.Generic;
30using System.IO; 31using System.IO;
32using System.Linq;
31using System.Reflection; 33using System.Reflection;
32using System.Security; 34using System.Security;
33using log4net; 35using log4net;
@@ -45,8 +47,6 @@ namespace OpenSim.Region.CoreModules.World.Estate
45 { 47 {
46 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 48 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
47 49
48 private delegate void LookupUUIDS(List<UUID> uuidLst);
49
50 public Scene Scene { get; private set; } 50 public Scene Scene { get; private set; }
51 public IUserManagement UserManager { get; private set; } 51 public IUserManagement UserManager { get; private set; }
52 52
@@ -876,98 +876,77 @@ namespace OpenSim.Region.CoreModules.World.Estate
876 if (!Scene.Permissions.CanIssueEstateCommand(remoteClient.AgentId, false)) 876 if (!Scene.Permissions.CanIssueEstateCommand(remoteClient.AgentId, false))
877 return; 877 return;
878 878
879 Dictionary<uint, float> SceneData = new Dictionary<uint,float>(); 879 Dictionary<uint, float> sceneData = null;
880 List<UUID> uuidNameLookupList = new List<UUID>(); 880 List<UUID> uuidNameLookupList = new List<UUID>();
881 881
882 if (reportType == 1) 882 if (reportType == 1)
883 { 883 {
884 SceneData = Scene.PhysicsScene.GetTopColliders(); 884 sceneData = Scene.PhysicsScene.GetTopColliders();
885 } 885 }
886 else if (reportType == 0) 886 else if (reportType == 0)
887 { 887 {
888 SceneData = Scene.SceneGraph.GetTopScripts(); 888 IScriptModule scriptModule = Scene.RequestModuleInterface<IScriptModule>();
889
890 if (scriptModule != null)
891 sceneData = scriptModule.GetObjectScriptsExecutionTimes();
889 } 892 }
890 893
891 List<LandStatReportItem> SceneReport = new List<LandStatReportItem>(); 894 List<LandStatReportItem> SceneReport = new List<LandStatReportItem>();
892 lock (SceneData) 895 if (sceneData != null)
893 { 896 {
894 foreach (uint obj in SceneData.Keys) 897 var sortedSceneData
898 = sceneData.Select(
899 item => new { Measurement = item.Value, Part = Scene.GetSceneObjectPart(item.Key) });
900
901 sortedSceneData.OrderBy(item => item.Measurement);
902
903 int items = 0;
904
905 foreach (var entry in sortedSceneData)
895 { 906 {
896 SceneObjectPart prt = Scene.GetSceneObjectPart(obj); 907 // The object may have been deleted since we received the data.
897 if (prt != null) 908 if (entry.Part == null)
909 continue;
910
911 // Don't show scripts that haven't executed or where execution time is below one microsecond in
912 // order to produce a more readable report.
913 if (entry.Measurement < 0.001)
914 continue;
915
916 items++;
917 SceneObjectGroup so = entry.Part.ParentGroup;
918
919 LandStatReportItem lsri = new LandStatReportItem();
920 lsri.LocationX = so.AbsolutePosition.X;
921 lsri.LocationY = so.AbsolutePosition.Y;
922 lsri.LocationZ = so.AbsolutePosition.Z;
923 lsri.Score = entry.Measurement;
924 lsri.TaskID = so.UUID;
925 lsri.TaskLocalID = so.LocalId;
926 lsri.TaskName = entry.Part.Name;
927 lsri.OwnerName = UserManager.GetUserName(so.OwnerID);
928
929 if (filter.Length != 0)
898 { 930 {
899 SceneObjectGroup sog = prt.ParentGroup; 931 if ((lsri.OwnerName.Contains(filter) || lsri.TaskName.Contains(filter)))
900 LandStatReportItem lsri = new LandStatReportItem();
901 lsri.LocationX = sog.AbsolutePosition.X;
902 lsri.LocationY = sog.AbsolutePosition.Y;
903 lsri.LocationZ = sog.AbsolutePosition.Z;
904 lsri.Score = SceneData[obj];
905 lsri.TaskID = sog.UUID;
906 lsri.TaskLocalID = sog.LocalId;
907 lsri.TaskName = sog.GetPartName(obj);
908 lsri.OwnerName = "waiting";
909 lock (uuidNameLookupList)
910 uuidNameLookupList.Add(sog.OwnerID);
911
912 if (filter.Length != 0)
913 { 932 {
914 if ((lsri.OwnerName.Contains(filter) || lsri.TaskName.Contains(filter)))
915 {
916 }
917 else
918 {
919 continue;
920 }
921 } 933 }
922 934 else
923 SceneReport.Add(lsri); 935 {
936 continue;
937 }
924 } 938 }
939
940 SceneReport.Add(lsri);
941
942 if (items >= 100)
943 break;
925 } 944 }
926 } 945 }
927 946
928 remoteClient.SendLandStatReply(reportType, requestFlags, (uint)SceneReport.Count,SceneReport.ToArray()); 947 remoteClient.SendLandStatReply(reportType, requestFlags, (uint)SceneReport.Count,SceneReport.ToArray());
929
930 if (uuidNameLookupList.Count > 0)
931 LookupUUID(uuidNameLookupList);
932 } 948 }
933 949
934 private static void LookupUUIDSCompleted(IAsyncResult iar)
935 {
936 LookupUUIDS icon = (LookupUUIDS)iar.AsyncState;
937 icon.EndInvoke(iar);
938 }
939
940 private void LookupUUID(List<UUID> uuidLst)
941 {
942 LookupUUIDS d = LookupUUIDsAsync;
943
944 d.BeginInvoke(uuidLst,
945 LookupUUIDSCompleted,
946 d);
947 }
948
949 private void LookupUUIDsAsync(List<UUID> uuidLst)
950 {
951 UUID[] uuidarr;
952
953 lock (uuidLst)
954 {
955 uuidarr = uuidLst.ToArray();
956 }
957
958 for (int i = 0; i < uuidarr.Length; i++)
959 {
960 // string lookupname = m_scene.CommsManager.UUIDNameRequestString(uuidarr[i]);
961
962 IUserManagement userManager = Scene.RequestModuleInterface<IUserManagement>();
963 if (userManager != null)
964 userManager.GetUserName(uuidarr[i]);
965
966 // we drop it. It gets cached though... so we're ready for the next request.
967 // diva commnent 11/21/2010: uh?!? wft?
968 // justincc comment 21/01/2011: A side effect of userManager.GetUserName() I presume.
969 }
970 }
971 #endregion 950 #endregion
972 951
973 #region Outgoing Packets 952 #region Outgoing Packets