From 3965fa2ff3fd59dd5bb049b1321468380cf2af2d Mon Sep 17 00:00:00 2001 From: Teravus Ovares Date: Sat, 24 May 2008 09:40:14 +0000 Subject: * Implements selected object return. * If user is in the same sim with you, they'll get an inventory update, if not.... oh well, they'll have to clear their cache potentially before they'll see it. --- .../Region/Environment/Scenes/Scene.Inventory.cs | 352 ++++++++++++++++----- 1 file changed, 267 insertions(+), 85 deletions(-) (limited to 'OpenSim/Region/Environment/Scenes') diff --git a/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs b/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs index e92178c..a284ba5 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs @@ -70,6 +70,24 @@ namespace OpenSim.Region.Environment.Scenes AddInventoryItem(agentID, item); } + public bool AddInventoryItemReturned(LLUUID AgentId, InventoryItemBase item) + { + CachedUserInfo userInfo + = CommsManager.UserProfileCacheService.GetUserDetails(AgentId); + if (userInfo != null) + { + userInfo.AddItem(item); + return true; + } + else + { + m_log.ErrorFormat( + "[AGENT INVENTORY]: Agent was not found for add of item {1} {2}", item.Name, item.ID); + + return false; + } + } + /// /// Add an inventory item to an avatar's inventory. /// @@ -1060,6 +1078,7 @@ namespace OpenSim.Region.Environment.Scenes } } + /// /// Called when an object is removed from the environment into inventory. /// @@ -1068,123 +1087,178 @@ namespace OpenSim.Region.Environment.Scenes public virtual void DeRezObject(Packet packet, IClientAPI remoteClient) { DeRezObjectPacket DeRezPacket = (DeRezObjectPacket) packet; + + LLUUID folderID = LLUUID.Zero; - if (DeRezPacket.AgentBlock.DestinationID == LLUUID.Zero) - { - //currently following code not used (or don't know of any case of destination being zero - } - else + + + + + foreach (DeRezObjectPacket.ObjectDataBlock Data in DeRezPacket.ObjectData) { - foreach (DeRezObjectPacket.ObjectDataBlock Data in DeRezPacket.ObjectData) - { // m_log.DebugFormat( // "[AGENT INVENTORY]: Received request to derez {0} into folder {1}", // Data.ObjectLocalID, DeRezPacket.AgentBlock.DestinationID); - EntityBase selectedEnt = null; - //m_log.Info("[CLIENT]: LocalID:" + Data.ObjectLocalID.ToString()); + EntityBase selectedEnt = null; + //m_log.Info("[CLIENT]: LocalID:" + Data.ObjectLocalID.ToString()); - List EntityList = GetEntities(); + List EntityList = GetEntities(); - foreach (EntityBase ent in EntityList) + foreach (EntityBase ent in EntityList) + { + if (ent.LocalId == Data.ObjectLocalID) { - if (ent.LocalId == Data.ObjectLocalID) - { - selectedEnt = ent; - break; - } + selectedEnt = ent; + break; } - if (selectedEnt != null) + } + if (selectedEnt != null) + { + bool permissionToTake = false; + bool permissionToDelete = false; + if (DeRezPacket.AgentBlock.Destination == 1)// Take Copy { - bool permissionToTake = false; - bool permissionToDelete = false; - if (DeRezPacket.AgentBlock.Destination == 1)// Take Copy - { - permissionToTake = ExternalChecks.ExternalChecksCanTakeCopyObject(((SceneObjectGroup)selectedEnt).UUID, remoteClient.AgentId); - permissionToDelete = false; //Just taking copy! + permissionToTake = ExternalChecks.ExternalChecksCanTakeCopyObject(((SceneObjectGroup)selectedEnt).UUID, remoteClient.AgentId); + permissionToDelete = false; //Just taking copy! - } - else if (DeRezPacket.AgentBlock.Destination == 4) //Take - { - // Take - permissionToTake = ExternalChecks.ExternalChecksCanTakeObject(((SceneObjectGroup)selectedEnt).UUID, remoteClient.AgentId); - permissionToDelete = permissionToTake; //If they can take, they can delete! - } + } + else if (DeRezPacket.AgentBlock.Destination == 4) //Take + { + // Take + permissionToTake = ExternalChecks.ExternalChecksCanTakeObject(((SceneObjectGroup)selectedEnt).UUID, remoteClient.AgentId); + permissionToDelete = permissionToTake; //If they can take, they can delete! + } - else if (DeRezPacket.AgentBlock.Destination == 6) //Delete - { - permissionToTake = false; - permissionToDelete = ExternalChecks.ExternalChecksCanDeleteObject(((SceneObjectGroup)selectedEnt).UUID, remoteClient.AgentId); - } + else if (DeRezPacket.AgentBlock.Destination == 6) //Delete + { + permissionToTake = ExternalChecks.ExternalChecksCanDeleteObject(((SceneObjectGroup)selectedEnt).UUID, remoteClient.AgentId); + permissionToDelete = ExternalChecks.ExternalChecksCanDeleteObject(((SceneObjectGroup)selectedEnt).UUID, remoteClient.AgentId); + } + else if (DeRezPacket.AgentBlock.Destination == 9) //Return + { + permissionToTake = ExternalChecks.ExternalChecksCanDeleteObject(((SceneObjectGroup)selectedEnt).UUID, remoteClient.AgentId); + permissionToDelete = ExternalChecks.ExternalChecksCanDeleteObject(((SceneObjectGroup)selectedEnt).UUID, remoteClient.AgentId); + } - SceneObjectGroup objectGroup = (SceneObjectGroup)selectedEnt; + SceneObjectGroup objectGroup = (SceneObjectGroup)selectedEnt; + + if (permissionToTake) + { - if (permissionToTake) + string sceneObjectXml = objectGroup.ToXmlString(); + + CachedUserInfo userInfo = + CommsManager.UserProfileCacheService.GetUserDetails(remoteClient.AgentId); + if (userInfo != null) { - string sceneObjectXml = objectGroup.ToXmlString(); + string searchFolder = ""; + + if (DeRezPacket.AgentBlock.Destination == 6) + searchFolder = "Trash"; + else if (DeRezPacket.AgentBlock.Destination == 9) + searchFolder = "Lost And Found"; + + // If we're deleting someone else's item, it goes back to their deleted items folder + // If we're returning someone's item, it goes back to the owner's Lost And Found folder. - CachedUserInfo userInfo = - CommsManager.UserProfileCacheService.GetUserDetails(remoteClient.AgentId); - if (userInfo != null) + if (DeRezPacket.AgentBlock.DestinationID == LLUUID.Zero || (DeRezPacket.AgentBlock.Destination == 6 && objectGroup.OwnerID != remoteClient.AgentId)) { - AssetBase asset = CreateAsset( - ((SceneObjectGroup) selectedEnt).GetPartName(selectedEnt.LocalId), - ((SceneObjectGroup) selectedEnt).GetPartDescription(selectedEnt.LocalId), - (sbyte) InventoryType.Object, - (sbyte) AssetType.Object, - Helpers.StringToField(sceneObjectXml)); - AssetCache.AddAsset(asset); - - InventoryItemBase item = new InventoryItemBase(); - item.Creator = objectGroup.RootPart.CreatorID; - item.Owner = remoteClient.AgentId; - 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 = DeRezPacket.AgentBlock.DestinationID; - if ((remoteClient.AgentId != objectGroup.RootPart.OwnerID) && ExternalChecks.ExternalChecksPropagatePermissions()) + List subrootfolders = userInfo.RootFolder.RequestListOfFolders(); + foreach (InventoryFolderBase flder in subrootfolders) { - uint perms=objectGroup.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 & objectGroup.RootPart.NextOwnerMask; - item.CurrentPermissions = item.BasePermissions; - item.NextPermissions = objectGroup.RootPart.NextOwnerMask; - item.EveryOnePermissions = objectGroup.RootPart.EveryoneMask & objectGroup.RootPart.NextOwnerMask; - item.CurrentPermissions |= 8; // Slam! + if (flder.Name == "Lost And Found") + { + folderID = flder.ID; + break; + } } - else + + if (folderID == LLUUID.Zero) { - item.BasePermissions = objectGroup.GetEffectivePermissions(); - item.CurrentPermissions = objectGroup.GetEffectivePermissions(); - item.NextPermissions = objectGroup.RootPart.NextOwnerMask; - item.EveryOnePermissions = objectGroup.RootPart.EveryoneMask; + folderID = userInfo.RootFolder.ID; } + //currently following code not used (or don't know of any case of destination being zero + } + else + { + folderID = DeRezPacket.AgentBlock.DestinationID; + } + + AssetBase asset = CreateAsset( + ((SceneObjectGroup) selectedEnt).GetPartName(selectedEnt.LocalId), + ((SceneObjectGroup) selectedEnt).GetPartDescription(selectedEnt.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 = objectGroup.RootPart.CreatorID; - userInfo.AddItem(item); + if (DeRezPacket.AgentBlock.Destination == 1 || DeRezPacket.AgentBlock.Destination == 4)// Take / Copy + item.Owner = remoteClient.AgentId; + else // Delete / Return + item.Owner = objectGroup.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 ((remoteClient.AgentId != objectGroup.RootPart.OwnerID) && ExternalChecks.ExternalChecksPropagatePermissions()) + { + uint perms=objectGroup.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 & objectGroup.RootPart.NextOwnerMask; + item.CurrentPermissions = item.BasePermissions; + item.NextPermissions = objectGroup.RootPart.NextOwnerMask; + item.EveryOnePermissions = objectGroup.RootPart.EveryoneMask & objectGroup.RootPart.NextOwnerMask; + item.CurrentPermissions |= 8; // Slam! + } + else + { + item.BasePermissions = objectGroup.GetEffectivePermissions(); + item.CurrentPermissions = objectGroup.GetEffectivePermissions(); + item.NextPermissions = objectGroup.RootPart.NextOwnerMask; + item.EveryOnePermissions = objectGroup.RootPart.EveryoneMask; + } + + // TODO: add the new fields (Flags, Sale info, etc) + + userInfo.AddItem(item); + if (item.Owner == remoteClient.AgentId) + { remoteClient.SendInventoryItemCreateUpdate(item); } + else + { + ScenePresence notifyUser = GetScenePresence(item.Owner); + if (notifyUser != null) + { + notifyUser.ControllingClient.SendInventoryItemCreateUpdate(item); + } + } } + } - if (permissionToDelete) - { - DeleteSceneObjectGroup(objectGroup); - } + if (permissionToDelete) + { + DeleteSceneObjectGroup(objectGroup); } } } + } public void updateKnownAsset(IClientAPI remoteClient, SceneObjectGroup grp, LLUUID assetID, LLUUID agentID) @@ -1599,6 +1673,114 @@ namespace OpenSim.Region.Environment.Scenes } return null; } + public virtual bool returnObjects(SceneObjectGroup[] returnobjects, LLUUID AgentId) + { + if (returnobjects.Length <= 0) + return false; + + // for the moment we're going to store them individually.. however, in the future, the rezObject + // will be able to have more items. + + //string returnstring = ""; + //returnstring += "\n"; + //for (int i = 0; i < returnobjects.Length; i++) + //{ + // returnstring += grp.ToXmlString2(); + //} + //returnstring += "\n"; + + + CachedUserInfo userInfo = + CommsManager.UserProfileCacheService.GetUserDetails(AgentId); + if (userInfo != null) + { + LLUUID folderID = LLUUID.Zero; + + List subrootfolders = userInfo.RootFolder.RequestListOfFolders(); + foreach (InventoryFolderBase flder in subrootfolders) + { + if (flder.Name == "Lost And Found") + { + folderID = flder.ID; + break; + } + } + + if (folderID == LLUUID.Zero) + { + folderID = userInfo.RootFolder.ID; + } + + bool permissionToDelete = false; + + for (int i = 0; i < returnobjects.Length; i++) + { + 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); + + InventoryItemBase item = new InventoryItemBase(); + item.Creator = returnobjects[i].RootPart.CreatorID; + item.Owner = AgentId; + 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; + } + + // TODO: add the new fields (Flags, Sale info, etc) + + userInfo.AddItem(item); + + SceneObjectGroup ObjectDeleting = returnobjects[i]; + + returnobjects[i] = null; + + DeleteSceneObjectGroup(ObjectDeleting); + ObjectDeleting = null; + } + return true; + } + return false; + + } } } -- cgit v1.1