From 8545621d9b4bbaa1af21b2c2334dedb406a58263 Mon Sep 17 00:00:00 2001 From: Arthur Valadares Date: Fri, 29 May 2009 21:12:55 +0000 Subject: * Bug fix: Fixes an exception when Scene.RemoveClient is called to remove on a non-existing ScenePresence avatar. Also removed trailing white spaces. --- OpenSim/Region/Framework/Scenes/Scene.cs | 234 +++++++++++++++---------------- 1 file changed, 117 insertions(+), 117 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 842bf1e..543b0cc 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -154,7 +154,7 @@ namespace OpenSim.Region.Framework.Scenes { get { return m_capsModule; } } - + protected override IConfigSource GetConfig() { return m_config; @@ -899,17 +899,17 @@ namespace OpenSim.Region.Framework.Scenes if (m_updateEntitiesThread == null) { m_updateEntitiesThread = new Thread(m_sceneGraph.UpdateEntities); - + ThreadTracker.Add(m_updateEntitiesThread); } if (m_updateEntitiesThread.ThreadState == ThreadState.Stopped) m_updateEntitiesThread.Start(); */ - + m_sceneGraph.UpdateEntities(); } - + // run through entities that have scheduled themselves for // updates looking for updates(faster) @@ -937,7 +937,7 @@ namespace OpenSim.Region.Framework.Scenes if (m_frame % m_update_land == 0) UpdateLand(); - + otherMS = Environment.TickCount - otherMS; // if (m_frame%m_update_avatars == 0) // UpdateInWorldTime(); @@ -1209,8 +1209,8 @@ namespace OpenSim.Region.Framework.Scenes if (data != null) { IWorldMapModule mapModule = RequestModuleInterface(); - - if (mapModule != null) + + if (mapModule != null) mapModule.LazySaveGeneratedMaptile(data, temporary); } } @@ -1391,7 +1391,7 @@ namespace OpenSim.Region.Framework.Scenes /// /// Add an object into the scene that has come from storage /// - /// + /// /// /// /// If true, changes to the object will be reflected in its persisted data @@ -1778,7 +1778,7 @@ namespace OpenSim.Region.Framework.Scenes uint attPt = (uint)sp.Appearance.GetAttachpoint(itemID); m_sceneGraph.RezSingleAttachment(sp.ControllingClient, itemID, attPt); } - + return false; } @@ -1847,7 +1847,7 @@ namespace OpenSim.Region.Framework.Scenes RootPrim.RemFlag(PrimFlags.TemporaryOnRez); RootPrim.AddFlag(PrimFlags.TemporaryOnRez); } - + } else { @@ -1881,10 +1881,10 @@ namespace OpenSim.Region.Framework.Scenes if (m_restorePresences.ContainsKey(client.AgentId)) { m_log.DebugFormat("[SCENE]: Restoring agent {0} {1} in {2}", client.Name, client.AgentId, RegionInfo.RegionName); - + presence = m_restorePresences[client.AgentId]; m_restorePresences.Remove(client.AgentId); - + // This is one of two paths to create avatars that are // used. This tends to get called more in standalone // than grid, not really sure why, but as such needs @@ -1892,11 +1892,11 @@ namespace OpenSim.Region.Framework.Scenes AvatarAppearance appearance = null; GetAvatarAppearance(client, out appearance); presence.Appearance = appearance; - + presence.initializeScenePresence(client, RegionInfo, this); - + m_sceneGraph.AddScenePresence(presence); - + lock (m_restorePresences) { Monitor.PulseAll(m_restorePresences); @@ -1907,9 +1907,9 @@ namespace OpenSim.Region.Framework.Scenes m_log.DebugFormat( "[SCENE]: Adding new child agent for {0} in {1}", client.Name, RegionInfo.RegionName); - + CommsManager.UserProfileCacheService.AddNewUser(client.AgentId); - + CreateAndAddScenePresence(client); } @@ -1956,7 +1956,7 @@ namespace OpenSim.Region.Framework.Scenes client.OnObjectDuplicate += m_sceneGraph.DuplicateObject; client.OnObjectDuplicateOnRay += doObjectDuplicateOnRay; client.OnUpdatePrimFlags += m_sceneGraph.UpdatePrimFlags; - client.OnRequestObjectPropertiesFamily += m_sceneGraph.RequestObjectPropertiesFamily; + client.OnRequestObjectPropertiesFamily += m_sceneGraph.RequestObjectPropertiesFamily; client.OnObjectPermissions += HandleObjectPermissionsUpdate; client.OnCreateNewInventoryItem += CreateNewInventoryItem; client.OnCreateNewInventoryFolder += HandleCreateInventoryFolder; @@ -1995,9 +1995,9 @@ namespace OpenSim.Region.Framework.Scenes client.OnUnackedTerrain += TerrainUnAcked; client.OnObjectOwner += ObjectOwner; - IGodsModule godsModule = RequestModuleInterface(); + IGodsModule godsModule = RequestModuleInterface(); client.OnGodKickUser += godsModule.KickUser; - client.OnRequestGodlikePowers += godsModule.RequestGodlikePowers; + client.OnRequestGodlikePowers += godsModule.RequestGodlikePowers; client.OnNetworkStatsUpdate += StatsReporter.AddPacketsStats; @@ -2171,7 +2171,7 @@ namespace OpenSim.Region.Framework.Scenes m_log.DebugFormat("[APPEARANCE]: Appearance not found in {0}, returning default", RegionInfo.RegionName); appearance = new AvatarAppearance(client.AgentId); } - + } /// @@ -2185,96 +2185,96 @@ namespace OpenSim.Region.Framework.Scenes if (avatar != null) { childagentYN = avatar.IsChildAgent; - } - if (avatar.ParentID != 0) - { - avatar.StandUp(); - } - - try - { - m_log.DebugFormat( - "[SCENE]: Removing {0} agent {1} from region {2}", - (childagentYN ? "child" : "root"), agentID, RegionInfo.RegionName); - - m_sceneGraph.removeUserCount(!childagentYN); - CapsModule.RemoveCapsHandler(agentID); - - if (avatar.Scene.NeedSceneCacheClear(avatar.UUID)) + if (avatar.ParentID != 0) { - CommsManager.UserProfileCacheService.RemoveUser(agentID); + avatar.StandUp(); } - if (!avatar.IsChildAgent) + try { - m_sceneGridService.LogOffUser(agentID, RegionInfo.RegionID, RegionInfo.RegionHandle, avatar.AbsolutePosition, avatar.Lookat); - //List childknownRegions = new List(); - //List ckn = avatar.KnownChildRegionHandles; - //for (int i = 0; i < ckn.Count; i++) - //{ - // childknownRegions.Add(ckn[i]); - //} - List regions = new List(avatar.KnownChildRegionHandles); - regions.Remove(RegionInfo.RegionHandle); - m_sceneGridService.SendCloseChildAgentConnections(agentID, regions); + m_log.DebugFormat( + "[SCENE]: Removing {0} agent {1} from region {2}", + (childagentYN ? "child" : "root"), agentID, RegionInfo.RegionName); + + m_sceneGraph.removeUserCount(!childagentYN); + CapsModule.RemoveCapsHandler(agentID); + if (avatar.Scene.NeedSceneCacheClear(avatar.UUID)) + { + CommsManager.UserProfileCacheService.RemoveUser(agentID); + } + + if (!avatar.IsChildAgent) + { + m_sceneGridService.LogOffUser(agentID, RegionInfo.RegionID, RegionInfo.RegionHandle, avatar.AbsolutePosition, avatar.Lookat); + //List childknownRegions = new List(); + //List ckn = avatar.KnownChildRegionHandles; + //for (int i = 0; i < ckn.Count; i++) + //{ + // childknownRegions.Add(ckn[i]); + //} + List regions = new List(avatar.KnownChildRegionHandles); + regions.Remove(RegionInfo.RegionHandle); + m_sceneGridService.SendCloseChildAgentConnections(agentID, regions); + + } + m_eventManager.TriggerClientClosed(agentID); + } + catch (NullReferenceException) + { + // We don't know which count to remove it from + // Avatar is already disposed :/ } - m_eventManager.TriggerClientClosed(agentID); - } - catch (NullReferenceException) - { - // We don't know which count to remove it from - // Avatar is already disposed :/ - } - m_eventManager.TriggerOnRemovePresence(agentID); - Broadcast(delegate(IClientAPI client) - { - try + m_eventManager.TriggerOnRemovePresence(agentID); + Broadcast(delegate(IClientAPI client) { - client.SendKillObject(avatar.RegionHandle, avatar.LocalId); - } - catch (NullReferenceException) - { - //We can safely ignore null reference exceptions. It means the avatar are dead and cleaned up anyway. - } - }); + try + { + client.SendKillObject(avatar.RegionHandle, avatar.LocalId); + } + catch (NullReferenceException) + { + //We can safely ignore null reference exceptions. It means the avatar are dead and cleaned up anyway. + } + }); - ForEachScenePresence( - delegate(ScenePresence presence) { presence.CoarseLocationChange(); }); + ForEachScenePresence( + delegate(ScenePresence presence) { presence.CoarseLocationChange(); }); - IAgentAssetTransactions agentTransactions = this.RequestModuleInterface(); - if (agentTransactions != null) - { - agentTransactions.RemoveAgentAssetTransactions(agentID); - } + IAgentAssetTransactions agentTransactions = this.RequestModuleInterface(); + if (agentTransactions != null) + { + agentTransactions.RemoveAgentAssetTransactions(agentID); + } - m_sceneGraph.RemoveScenePresence(agentID); + m_sceneGraph.RemoveScenePresence(agentID); - try - { - avatar.Close(); - } - catch (NullReferenceException) - { - //We can safely ignore null reference exceptions. It means the avatar are dead and cleaned up anyway. - } - catch (Exception e) - { - m_log.Error("[SCENE] Scene.cs:RemoveClient exception: " + e.ToString()); - } + try + { + avatar.Close(); + } + catch (NullReferenceException) + { + //We can safely ignore null reference exceptions. It means the avatar are dead and cleaned up anyway. + } + catch (Exception e) + { + m_log.Error("[SCENE] Scene.cs:RemoveClient exception: " + e.ToString()); + } - // Remove client agent from profile, so new logins will work - if (!childagentYN) - { - m_sceneGridService.ClearUserAgent(agentID); - } + // Remove client agent from profile, so new logins will work + if (!childagentYN) + { + m_sceneGridService.ClearUserAgent(agentID); + } - m_authenticateHandler.RemoveCircuit(avatar.ControllingClient.CircuitCode); + m_authenticateHandler.RemoveCircuit(avatar.ControllingClient.CircuitCode); - //m_log.InfoFormat("[SCENE] Memory pre GC {0}", System.GC.GetTotalMemory(false)); - //m_log.InfoFormat("[SCENE] Memory post GC {0}", System.GC.GetTotalMemory(true)); + //m_log.InfoFormat("[SCENE] Memory pre GC {0}", System.GC.GetTotalMemory(false)); + //m_log.InfoFormat("[SCENE] Memory post GC {0}", System.GC.GetTotalMemory(true)); + } } public void HandleRemoveKnownRegionsFromAvatar(UUID avatarID, List regionslst) @@ -2400,7 +2400,7 @@ namespace OpenSim.Region.Framework.Scenes // Don't disable this log message - it's too helpful m_log.InfoFormat( "[CONNECTION BEGIN]: Region {0} told of incoming {1} agent {2} {3} {4} (circuit code {5})", - RegionInfo.RegionName, (agent.child ? "child" : "root"), agent.firstname, agent.lastname, + RegionInfo.RegionName, (agent.child ? "child" : "root"), agent.firstname, agent.lastname, agent.AgentID, agent.circuitcode); reason = String.Empty; @@ -2412,7 +2412,7 @@ namespace OpenSim.Region.Framework.Scenes m_log.InfoFormat( "[CONNECTION BEGIN]: Region {0} authenticated and authorized incoming {1} agent {2} {3} {4} (circuit code {5})", - RegionInfo.RegionName, (agent.child ? "child" : "root"), agent.firstname, agent.lastname, + RegionInfo.RegionName, (agent.child ? "child" : "root"), agent.firstname, agent.lastname, agent.AgentID, agent.circuitcode); CapsModule.NewUserConnection(agent); @@ -2423,14 +2423,14 @@ namespace OpenSim.Region.Framework.Scenes m_log.DebugFormat( "[SCENE]: Adjusting known seeds for existing agent {0} in {1}", agent.AgentID, RegionInfo.RegionName); - + sp.AdjustKnownSeeds(); - + return true; } - + CapsModule.AddCapsHandler(agent.AgentID); - + if (!agent.child) { // Honor parcel landing type and position. @@ -2443,9 +2443,9 @@ namespace OpenSim.Region.Framework.Scenes } } } - + m_authenticateHandler.AddNewCircuit(agent.circuitcode, agent); - + // rewrite session_id CachedUserInfo userinfo = CommsManager.UserProfileCacheService.GetUserDetails(agent.AgentID); if (userinfo != null) @@ -2457,7 +2457,7 @@ namespace OpenSim.Region.Framework.Scenes m_log.WarnFormat( "[CONNECTION BEGIN]: We couldn't find a User Info record for {0}. This is usually an indication that the UUID we're looking up is invalid", agent.AgentID); } - + return true; } @@ -2467,7 +2467,7 @@ namespace OpenSim.Region.Framework.Scenes bool result = CommsManager.UserService.VerifySession(agent.AgentID, agent.SessionID); m_log.Debug("[CONNECTION BEGIN]: User authentication returned " + result); - if (!result) + if (!result) reason = String.Format("Failed to authenticate user {0} {1}, access denied.", agent.firstname, agent.lastname); return result; @@ -2479,7 +2479,7 @@ namespace OpenSim.Region.Framework.Scenes if (!m_strictAccessControl) return true; if (Permissions.IsGod(agent.AgentID)) return true; - + if (m_regInfo.EstateSettings.IsBanned(agent.AgentID)) { @@ -2490,12 +2490,12 @@ namespace OpenSim.Region.Framework.Scenes return false; } - if (!m_regInfo.EstateSettings.PublicAccess && + if (!m_regInfo.EstateSettings.PublicAccess && !m_regInfo.EstateSettings.HasAccess(agent.AgentID)) { m_log.WarnFormat("[CONNECTION BEGIN]: Denied access to: {0} ({1} {2}) at {3} because the user does not have access to the estate", agent.AgentID, agent.firstname, agent.lastname, RegionInfo.RegionName); - reason = String.Format("Denied access to private region {0}: You are not on the access list for that region.", + reason = String.Format("Denied access to private region {0}: You are not on the access list for that region.", RegionInfo.RegionName); return false; } @@ -2512,7 +2512,7 @@ namespace OpenSim.Region.Framework.Scenes // { // m_log.WarnFormat("[CONNECTION BEGIN]: Denied access to: {0} ({1} {2}) at {3} because the user has been banned from land", // agent.AgentID, agent.firstname, agent.lastname, RegionInfo.RegionName); - // reason = String.Format("Denied access to private region {0}: You are banned from that region.", + // reason = String.Format("Denied access to private region {0}: You are banned from that region.", // RegionInfo.RegionName); // return false; // } @@ -2521,7 +2521,7 @@ namespace OpenSim.Region.Framework.Scenes // { // m_log.WarnFormat("[CONNECTION BEGIN]: Denied access to: {0} ({1} {2}) at {3} because the user does not have access to the region", // agent.AgentID, agent.firstname, agent.lastname, RegionInfo.RegionName); - // reason = String.Format("Denied access to private region {0}: You are not on the access list for that region.", + // reason = String.Format("Denied access to private region {0}: You are not on the access list for that region.", // RegionInfo.RegionName); // return false; // } @@ -2861,7 +2861,7 @@ namespace OpenSim.Region.Framework.Scenes #endregion #region Other Methods - + public void SetObjectCapacity(int objects) { // Region specific config overrides global @@ -2875,7 +2875,7 @@ namespace OpenSim.Region.Framework.Scenes } objectCapacity = objects; } - + public List GetFriendList(string id) { UUID avatarID; @@ -2974,7 +2974,7 @@ namespace OpenSim.Region.Framework.Scenes public override void Show(string[] showParams) { base.Show(showParams); - + switch (showParams[0]) { case "users": @@ -2993,9 +2993,9 @@ namespace OpenSim.Region.Framework.Scenes "Unknown", RegionInfo.RegionName); } - + break; - } + } } #region Script Handling Methods @@ -3055,8 +3055,8 @@ namespace OpenSim.Region.Framework.Scenes } else if ((parcel.landData.Flags & (uint)Parcel.ParcelFlags.AllowGroupScripts) != 0) { - if (part.OwnerID == parcel.landData.OwnerID - || (parcel.landData.IsGroupOwned && part.GroupID == parcel.landData.GroupID) + if (part.OwnerID == parcel.landData.OwnerID + || (parcel.landData.IsGroupOwned && part.GroupID == parcel.landData.GroupID) || Permissions.IsGod(part.OwnerID)) { return true; -- cgit v1.1