From cd79be569cf74c7bead86305caed1f9050d0db8c Mon Sep 17 00:00:00 2001 From: Teravus Ovares Date: Sat, 24 May 2008 21:13:44 +0000 Subject: * Fixes endless loop in the Land Module when selecting any object. * Fixes returning objects when the object owner hasn't been in the simulator since the simulator started up last. --- OpenSim/Region/Environment/Scenes/EventManager.cs | 21 +-- .../Region/Environment/Scenes/Scene.Inventory.cs | 158 ++++++++++++--------- 2 files changed, 104 insertions(+), 75 deletions(-) (limited to 'OpenSim/Region/Environment/Scenes') diff --git a/OpenSim/Region/Environment/Scenes/EventManager.cs b/OpenSim/Region/Environment/Scenes/EventManager.cs index 6c714f8..a3f5d2f 100644 --- a/OpenSim/Region/Environment/Scenes/EventManager.cs +++ b/OpenSim/Region/Environment/Scenes/EventManager.cs @@ -438,6 +438,16 @@ namespace OpenSim.Region.Environment.Scenes } } + public void TriggerObjectBeingRemovedFromScene(SceneObjectGroup obj) + { + handlerObjectBeingRemovedFromScene = OnObjectBeingRemovedFromScene; + if (handlerObjectBeingRemovedFromScene != null) + { + handlerObjectBeingRemovedFromScene(obj); + + } + } + public void TriggerShutdown() { handlerShutdown = OnShutdown; @@ -725,16 +735,7 @@ namespace OpenSim.Region.Environment.Scenes } } - public void TriggerObjectBeingRemovedFromScene(SceneObjectGroup obj) - { - handlerObjectBeingRemovedFromScene = OnObjectBeingRemovedFromScene; - if (handlerObjectBeingRemovedFromScene != null) - { - handlerObjectBeingRemovedFromScene(obj); - - } - } - + public void TriggerRequestParcelPrimCountUpdate() { diff --git a/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs b/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs index 850962d..409ee1e 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs @@ -1675,6 +1675,7 @@ namespace OpenSim.Region.Environment.Scenes } public virtual bool returnObjects(SceneObjectGroup[] returnobjects, LLUUID AgentId) { + string message = ""; if (returnobjects.Length <= 0) return false; @@ -1692,13 +1693,20 @@ namespace OpenSim.Region.Environment.Scenes - bool permissionToDelete = false; + bool permissionToDelete = false; - for (int i = 0; i < returnobjects.Length; i++) + for (int i = 0; i < returnobjects.Length; i++) + { + CachedUserInfo userInfo = + CommsManager.UserProfileCacheService.GetUserDetails(returnobjects[i].OwnerID); + if (userInfo == null) + { + CommsManager.UserProfileCacheService.AddNewUser(returnobjects[i].OwnerID); + + } + if (userInfo != null) { - CachedUserInfo userInfo = - CommsManager.UserProfileCacheService.GetUserDetails(returnobjects[i].OwnerID); - if (userInfo != null) + if (userInfo.HasInventory) { LLUUID folderID = LLUUID.Zero; @@ -1716,76 +1724,96 @@ namespace OpenSim.Region.Environment.Scenes { folderID = userInfo.RootFolder.ID; } - permissionToDelete = ExternalChecks.ExternalChecksCanDeleteObject(returnobjects[i].UUID, AgentId); + permissionToDelete = ExternalChecks.ExternalChecksCanDeleteObject(returnobjects[i].UUID, AgentId); + + // If the user doesn't have permission, go on to the next one. + if (!permissionToDelete) + continue; + + string sceneObjectXml = returnobjects[i].ToXmlString2(); + AssetBase asset = CreateAsset( + returnobjects[i].GetPartName(returnobjects[i].LocalId), + returnobjects[i].GetPartDescription(returnobjects[i].LocalId), + (sbyte)InventoryType.Object, + (sbyte)AssetType.Object, + Helpers.StringToField(sceneObjectXml)); + AssetCache.AddAsset(asset); - // If the user doesn't have permission, go on to the next one. - if (!permissionToDelete) - continue; + InventoryItemBase item = new InventoryItemBase(); + item.Creator = returnobjects[i].RootPart.CreatorID; + item.Owner = returnobjects[i].OwnerID; + item.ID = LLUUID.Random(); + item.AssetID = asset.FullID; + item.Description = asset.Description; + item.Name = asset.Name; + item.AssetType = asset.Type; + item.InvType = asset.InvType; + item.Folder = folderID; + if ((AgentId != returnobjects[i].RootPart.OwnerID) && ExternalChecks.ExternalChecksPropagatePermissions()) + { + uint perms = returnobjects[i].GetEffectivePermissions(); + uint nextPerms = (perms & 7) << 13; + if ((nextPerms & (uint)PermissionMask.Copy) == 0) + perms &= ~(uint)PermissionMask.Copy; + if ((nextPerms & (uint)PermissionMask.Transfer) == 0) + perms &= ~(uint)PermissionMask.Transfer; + if ((nextPerms & (uint)PermissionMask.Modify) == 0) + perms &= ~(uint)PermissionMask.Modify; + + item.BasePermissions = perms & returnobjects[i].RootPart.NextOwnerMask; + item.CurrentPermissions = item.BasePermissions; + item.NextPermissions = returnobjects[i].RootPart.NextOwnerMask; + item.EveryOnePermissions = returnobjects[i].RootPart.EveryoneMask & returnobjects[i].RootPart.NextOwnerMask; + item.CurrentPermissions |= 8; // Slam! + } + else + { + item.BasePermissions = returnobjects[i].GetEffectivePermissions(); + item.CurrentPermissions = returnobjects[i].GetEffectivePermissions(); + item.NextPermissions = returnobjects[i].RootPart.NextOwnerMask; + item.EveryOnePermissions = returnobjects[i].RootPart.EveryoneMask; + } - string sceneObjectXml = returnobjects[i].ToXmlString2(); - AssetBase asset = CreateAsset( - returnobjects[i].GetPartName(returnobjects[i].LocalId), - returnobjects[i].GetPartDescription(returnobjects[i].LocalId), - (sbyte)InventoryType.Object, - (sbyte)AssetType.Object, - Helpers.StringToField(sceneObjectXml)); - AssetCache.AddAsset(asset); + // TODO: add the new fields (Flags, Sale info, etc) - InventoryItemBase item = new InventoryItemBase(); - item.Creator = returnobjects[i].RootPart.CreatorID; - item.Owner = returnobjects[i].OwnerID; - item.ID = LLUUID.Random(); - item.AssetID = asset.FullID; - item.Description = asset.Description; - item.Name = asset.Name; - item.AssetType = asset.Type; - item.InvType = asset.InvType; - item.Folder = folderID; - if ((AgentId != returnobjects[i].RootPart.OwnerID) && ExternalChecks.ExternalChecksPropagatePermissions()) - { - uint perms = returnobjects[i].GetEffectivePermissions(); - uint nextPerms = (perms & 7) << 13; - if ((nextPerms & (uint)PermissionMask.Copy) == 0) - perms &= ~(uint)PermissionMask.Copy; - if ((nextPerms & (uint)PermissionMask.Transfer) == 0) - perms &= ~(uint)PermissionMask.Transfer; - if ((nextPerms & (uint)PermissionMask.Modify) == 0) - perms &= ~(uint)PermissionMask.Modify; - - item.BasePermissions = perms & returnobjects[i].RootPart.NextOwnerMask; - item.CurrentPermissions = item.BasePermissions; - item.NextPermissions = returnobjects[i].RootPart.NextOwnerMask; - item.EveryOnePermissions = returnobjects[i].RootPart.EveryoneMask & returnobjects[i].RootPart.NextOwnerMask; - item.CurrentPermissions |= 8; // Slam! - } - else - { - item.BasePermissions = returnobjects[i].GetEffectivePermissions(); - item.CurrentPermissions = returnobjects[i].GetEffectivePermissions(); - item.NextPermissions = returnobjects[i].RootPart.NextOwnerMask; - item.EveryOnePermissions = returnobjects[i].RootPart.EveryoneMask; - } + userInfo.AddItem(item); - // TODO: add the new fields (Flags, Sale info, etc) + ScenePresence notifyUser = GetScenePresence(item.Owner); + if (notifyUser != null) + { + notifyUser.ControllingClient.SendInventoryItemCreateUpdate(item); + } - userInfo.AddItem(item); + SceneObjectGroup ObjectDeleting = returnobjects[i]; - ScenePresence notifyUser = GetScenePresence(item.Owner); - if (notifyUser != null) + returnobjects[i] = null; + + DeleteSceneObjectGroup(ObjectDeleting); + ObjectDeleting = null; + } + else { - notifyUser.ControllingClient.SendInventoryItemCreateUpdate(item); + CommsManager.UserProfileCacheService.RequestInventoryForUser(returnobjects[i].OwnerID); + message = "Still waiting on the inventory service, some of the items won't be returned until the inventory services completes it's task. Try again shortly."; } - - SceneObjectGroup ObjectDeleting = returnobjects[i]; - - returnobjects[i] = null; - - DeleteSceneObjectGroup(ObjectDeleting); - ObjectDeleting = null; } - return true; + else + { + message = "Still waiting on the inventory service, some of the items won't be returned until the inventory services completes it's task. Try again shortly."; + } + //return true; } - return false; + + if (message.Length != 0) + { + ScenePresence returningavatar = GetScenePresence(AgentId); + if (returningavatar != null) + { + returningavatar.ControllingClient.SendAlertMessage(message); + } + return false; + } + return true; } -- cgit v1.1