From 375673ec903719f0225b182cb62aab153c86e04e Mon Sep 17 00:00:00 2001 From: Teravus Ovares Date: Sat, 24 May 2008 11:10:21 +0000 Subject: [PATCH] This enables return from the parcel object owner display. There's some oddness with the parcel counts, but if you can get past the oddness, you can return objects under an owner that you have permission to return. --- OpenSim/Framework/IClientAPI.cs | 3 + .../ClientStack/LindenUDP/LLClientView.cs | 25 ++++++ .../Environment/Interfaces/ILandChannel.cs | 1 + .../Environment/Interfaces/ILandObject.cs | 2 +- .../Modules/World/Land/LandChannel.cs | 7 ++ .../World/Land/LandManagementModule.cs | 30 ++++++- .../Modules/World/Land/LandObject.cs | 86 ++++++++++++++----- .../Modules/World/NPC/NPCAvatar.cs | 1 + .../Environment/Scenes/Scene.Inventory.cs | 51 ++++++----- OpenSim/Region/Environment/Scenes/Scene.cs | 1 + .../Examples/SimpleModule/MyNpcCharacter.cs | 1 + 11 files changed, 161 insertions(+), 47 deletions(-) diff --git a/OpenSim/Framework/IClientAPI.cs b/OpenSim/Framework/IClientAPI.cs index 1a97499815..f260245239 100644 --- a/OpenSim/Framework/IClientAPI.cs +++ b/OpenSim/Framework/IClientAPI.cs @@ -502,6 +502,8 @@ namespace OpenSim.Framework public delegate void ParcelAbandonRequest(int local_id, IClientAPI remote_client); + public delegate void ParcelReturnObjectsRequest(int local_id, uint return_type, LLUUID[] agent_ids, LLUUID[] selected_ids, IClientAPI remote_client); + public delegate void EstateOwnerMessageRequest(LLUUID AgentID, LLUUID SessionID, LLUUID TransactionID, LLUUID Invoice, byte[] Method, byte[][] Parameters, IClientAPI remote_client); public delegate void RegionInfoRequest(IClientAPI remote_client); @@ -772,6 +774,7 @@ namespace OpenSim.Framework event ParcelSelectObjects OnParcelSelectObjects; event ParcelObjectOwnerRequest OnParcelObjectOwnerRequest; event ParcelAbandonRequest OnParcelAbandonRequest; + event ParcelReturnObjectsRequest OnParcelReturnObjectsRequest; event RegionInfoRequest OnRegionInfoRequest; event EstateCovenantRequest OnEstateCovenantRequest; diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs index ee2972f0e8..9bef65fc01 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs @@ -221,6 +221,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP private ParcelSelectObjects handlerParcelSelectObjects = null; //OnParcelSelectObjects; private ParcelObjectOwnerRequest handlerParcelObjectOwnerRequest = null; //OnParcelObjectOwnerRequest; private ParcelAbandonRequest handlerParcelAbandonRequest = null; + private ParcelReturnObjectsRequest handlerParcelReturnObjectsRequest = null; private RegionInfoRequest handlerRegionInfoRequest = null; //OnRegionInfoRequest; private EstateCovenantRequest handlerEstateCovenantRequest = null; //OnEstateCovenantRequest; private RequestGodlikePowers handlerReqGodlikePowers = null; //OnRequestGodlikePowers; @@ -814,6 +815,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP public event ParcelSelectObjects OnParcelSelectObjects; public event ParcelObjectOwnerRequest OnParcelObjectOwnerRequest; public event ParcelAbandonRequest OnParcelAbandonRequest; + public event ParcelReturnObjectsRequest OnParcelReturnObjectsRequest; + public event RegionInfoRequest OnRegionInfoRequest; public event EstateCovenantRequest OnEstateCovenantRequest; @@ -5419,6 +5422,28 @@ namespace OpenSim.Region.ClientStack.LindenUDP handlerParcelAbandonRequest(releasePacket.Data.LocalID, this); } break; + case PacketType.ParcelReturnObjects: + + + ParcelReturnObjectsPacket parcelReturnObjects = (ParcelReturnObjectsPacket)Pack; + + LLUUID[] puserselectedOwnerIDs = new LLUUID[parcelReturnObjects.OwnerIDs.Length]; + for (int parceliterator = 0; parceliterator < parcelReturnObjects.OwnerIDs.Length; parceliterator++) + puserselectedOwnerIDs[parceliterator] = parcelReturnObjects.OwnerIDs[parceliterator].OwnerID; + + LLUUID[] puserselectedTaskIDs = new LLUUID[parcelReturnObjects.TaskIDs.Length]; + + for (int parceliterator = 0; parceliterator < parcelReturnObjects.TaskIDs.Length; parceliterator++) + puserselectedTaskIDs[parceliterator] = parcelReturnObjects.TaskIDs[parceliterator].TaskID; + + handlerParcelReturnObjectsRequest = OnParcelReturnObjectsRequest; + if (handlerParcelReturnObjectsRequest != null) + { + handlerParcelReturnObjectsRequest(parcelReturnObjects.ParcelData.LocalID,parcelReturnObjects.ParcelData.ReturnType,puserselectedOwnerIDs,puserselectedTaskIDs, this); + + } + break; + #endregion #region Estate Packets diff --git a/OpenSim/Region/Environment/Interfaces/ILandChannel.cs b/OpenSim/Region/Environment/Interfaces/ILandChannel.cs index f370ee53de..6c53177b96 100644 --- a/OpenSim/Region/Environment/Interfaces/ILandChannel.cs +++ b/OpenSim/Region/Environment/Interfaces/ILandChannel.cs @@ -41,5 +41,6 @@ namespace OpenSim.Region.Environment.Interfaces bool IsLandPrimCountTainted(); bool IsForcefulBansAllowed(); void UpdateLandObject(int localID, LandData data); + void ReturnObjectsInParcel(int localID, uint returnType, LLUUID[] agentIDs, LLUUID[] taskIDs, IClientAPI remoteClient); } } diff --git a/OpenSim/Region/Environment/Interfaces/ILandObject.cs b/OpenSim/Region/Environment/Interfaces/ILandObject.cs index 25c51de08f..43684938cc 100644 --- a/OpenSim/Region/Environment/Interfaces/ILandObject.cs +++ b/OpenSim/Region/Environment/Interfaces/ILandObject.cs @@ -64,7 +64,7 @@ namespace OpenSim.Region.Environment.Interfaces void sendForceObjectSelect(int local_id, int request_type, IClientAPI remote_client); void sendLandObjectOwners(IClientAPI remote_client); void returnObject(SceneObjectGroup obj); - void returnLandObjects(int type, LLUUID owner); + void returnLandObjects(uint type, LLUUID[] owners, IClientAPI remote_client); void resetLandPrimCounts(); void addPrimToCount(SceneObjectGroup obj); void removePrimFromCount(SceneObjectGroup obj); diff --git a/OpenSim/Region/Environment/Modules/World/Land/LandChannel.cs b/OpenSim/Region/Environment/Modules/World/Land/LandChannel.cs index 77c70a879d..0b77b23345 100644 --- a/OpenSim/Region/Environment/Modules/World/Land/LandChannel.cs +++ b/OpenSim/Region/Environment/Modules/World/Land/LandChannel.cs @@ -142,6 +142,13 @@ namespace OpenSim.Region.Environment.Modules.World.Land m_landManagementModule.UpdateLandObject(localID, data); } } + public void ReturnObjectsInParcel(int localID, uint returnType, LLUUID[] agentIDs, LLUUID[] taskIDs, IClientAPI remoteClient) + { + if (m_landManagementModule != null) + { + m_landManagementModule.ReturnObjectsInParcel(localID, returnType, agentIDs, taskIDs, remoteClient); + } + } #endregion } diff --git a/OpenSim/Region/Environment/Modules/World/Land/LandManagementModule.cs b/OpenSim/Region/Environment/Modules/World/Land/LandManagementModule.cs index 7163769cb9..5bc28f7cc0 100644 --- a/OpenSim/Region/Environment/Modules/World/Land/LandManagementModule.cs +++ b/OpenSim/Region/Environment/Modules/World/Land/LandManagementModule.cs @@ -902,7 +902,17 @@ namespace OpenSim.Region.Environment.Modules.World.Land public void handleParcelObjectOwnersRequest(int local_id, IClientAPI remote_client) { - landList[local_id].sendLandObjectOwners(remote_client); + lock (landList) + { + if (landList.ContainsKey(local_id)) + { + landList[local_id].sendLandObjectOwners(remote_client); + } + else + { + System.Console.WriteLine("[PARCEL]: Invalid land object passed for parcel object owner request"); + } + } } public void handleParcelAbandonRequest(int local_id, IClientAPI remote_client) @@ -1004,6 +1014,24 @@ namespace OpenSim.Region.Environment.Modules.World.Land AddLandObject(new_land); } + public void ReturnObjectsInParcel(int localID, uint returnType, LLUUID[] agentIDs, LLUUID[] taskIDs, IClientAPI remoteClient) + { + ILandObject selectedParcel = null; + lock (landList) + { + if (landList.ContainsKey(localID)) + selectedParcel = landList[localID]; + } + if (selectedParcel == null) + return; + + if (returnType == 16) // parcel return + { + selectedParcel.returnLandObjects(returnType, agentIDs, remoteClient); + } + + } + public void NoLandDataFromStorage() { ResetSimLandObjects(); diff --git a/OpenSim/Region/Environment/Modules/World/Land/LandObject.cs b/OpenSim/Region/Environment/Modules/World/Land/LandObject.cs index 98f3a3ace3..1a83f608d4 100644 --- a/OpenSim/Region/Environment/Modules/World/Land/LandObject.cs +++ b/OpenSim/Region/Environment/Modules/World/Land/LandObject.cs @@ -683,13 +683,25 @@ namespace OpenSim.Region.Environment.Modules.World.Land public Dictionary getLandObjectOwners() { Dictionary ownersAndCount = new Dictionary(); - foreach (SceneObjectGroup obj in primsOverMe) + lock (primsOverMe) { - if (!ownersAndCount.ContainsKey(obj.OwnerID)) + try { - ownersAndCount.Add(obj.OwnerID, 0); + + foreach (SceneObjectGroup obj in primsOverMe) + { + if (!ownersAndCount.ContainsKey(obj.OwnerID)) + { + ownersAndCount.Add(obj.OwnerID, 0); + } + ownersAndCount[obj.OwnerID] += obj.PrimCount; + } } - ownersAndCount[obj.OwnerID] += obj.PrimCount; + catch (InvalidOperationException) + { + m_log.Error("[LAND]: Unable to enumerate land owners. arr."); + } + } return ownersAndCount; } @@ -700,10 +712,33 @@ namespace OpenSim.Region.Environment.Modules.World.Land public void returnObject(SceneObjectGroup obj) { + SceneObjectGroup[] objs = new SceneObjectGroup[1]; + objs[0] = obj; + m_scene.returnObjects(objs, obj.OwnerID); } - public void returnLandObjects(int type, LLUUID owner) + public void returnLandObjects(uint type, LLUUID[] owners, IClientAPI remote_client) { + List objlist = new List(); + for (int i = 0; i < owners.Length; i++) + { + lock (primsOverMe) + { + try + { + foreach (SceneObjectGroup obj in primsOverMe) + { + if (obj.OwnerID == owners[i]) + objlist.Add(obj); + } + } + catch (InvalidOperationException) + { + m_log.Info("[PARCEL]: Unable to figure out all the objects owned by " + owners[i].ToString() + " arr."); + } + } + } + m_scene.returnObjects(objlist.ToArray(), remote_client.AgentId); } #endregion @@ -716,7 +751,8 @@ namespace OpenSim.Region.Environment.Modules.World.Land landData.ownerPrims = 0; landData.otherPrims = 0; landData.selectedPrims = 0; - primsOverMe.Clear(); + lock (primsOverMe) + primsOverMe.Clear(); } public void addPrimToCount(SceneObjectGroup obj) @@ -740,30 +776,34 @@ namespace OpenSim.Region.Environment.Modules.World.Land } } - primsOverMe.Add(obj); + lock (primsOverMe) + primsOverMe.Add(obj); } public void removePrimFromCount(SceneObjectGroup obj) { - if (primsOverMe.Contains(obj)) + lock (primsOverMe) { - LLUUID prim_owner = obj.OwnerID; - int prim_count = obj.PrimCount; + if (primsOverMe.Contains(obj)) + { + LLUUID prim_owner = obj.OwnerID; + int prim_count = obj.PrimCount; - if (prim_owner == landData.ownerID) - { - landData.ownerPrims -= prim_count; - } - else if (prim_owner == landData.groupID) - { - landData.groupPrims -= prim_count; - } - else - { - landData.otherPrims -= prim_count; - } + if (prim_owner == landData.ownerID) + { + landData.ownerPrims -= prim_count; + } + else if (prim_owner == landData.groupID) + { + landData.groupPrims -= prim_count; + } + else + { + landData.otherPrims -= prim_count; + } - primsOverMe.Remove(obj); + primsOverMe.Remove(obj); + } } } diff --git a/OpenSim/Region/Environment/Modules/World/NPC/NPCAvatar.cs b/OpenSim/Region/Environment/Modules/World/NPC/NPCAvatar.cs index 71ea0e4dc4..cd5ca61dfc 100644 --- a/OpenSim/Region/Environment/Modules/World/NPC/NPCAvatar.cs +++ b/OpenSim/Region/Environment/Modules/World/NPC/NPCAvatar.cs @@ -243,6 +243,7 @@ namespace OpenSim.Region.Environment.Modules.World.NPC public event ParcelJoinRequest OnParcelJoinRequest; public event ParcelPropertiesUpdateRequest OnParcelPropertiesUpdateRequest; public event ParcelAbandonRequest OnParcelAbandonRequest; + public event ParcelReturnObjectsRequest OnParcelReturnObjectsRequest; public event ParcelAccessListRequest OnParcelAccessListRequest; public event ParcelAccessListUpdateRequest OnParcelAccessListUpdateRequest; public event ParcelSelectObjects OnParcelSelectObjects; diff --git a/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs b/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs index a284ba5f67..850962d8b3 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs @@ -1690,31 +1690,32 @@ namespace OpenSim.Region.Environment.Scenes //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++) { + CachedUserInfo userInfo = + CommsManager.UserProfileCacheService.GetUserDetails(returnobjects[i].OwnerID); + 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; + } permissionToDelete = ExternalChecks.ExternalChecksCanDeleteObject(returnobjects[i].UUID, AgentId); // If the user doesn't have permission, go on to the next one. @@ -1732,7 +1733,7 @@ namespace OpenSim.Region.Environment.Scenes InventoryItemBase item = new InventoryItemBase(); item.Creator = returnobjects[i].RootPart.CreatorID; - item.Owner = AgentId; + item.Owner = returnobjects[i].OwnerID; item.ID = LLUUID.Random(); item.AssetID = asset.FullID; item.Description = asset.Description; @@ -1768,7 +1769,13 @@ namespace OpenSim.Region.Environment.Scenes // TODO: add the new fields (Flags, Sale info, etc) userInfo.AddItem(item); - + + ScenePresence notifyUser = GetScenePresence(item.Owner); + if (notifyUser != null) + { + notifyUser.ControllingClient.SendInventoryItemCreateUpdate(item); + } + SceneObjectGroup ObjectDeleting = returnobjects[i]; returnobjects[i] = null; diff --git a/OpenSim/Region/Environment/Scenes/Scene.cs b/OpenSim/Region/Environment/Scenes/Scene.cs index 71c5b18b45..a42bad54d6 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.cs @@ -1660,6 +1660,7 @@ namespace OpenSim.Region.Environment.Scenes client.OnSetStartLocationRequest += SetHomeRezPoint; client.OnUndo += m_innerScene.HandleUndo; client.OnObjectGroupRequest += m_innerScene.HandleObjectGroupUpdate; + client.OnParcelReturnObjectsRequest += LandChannel.ReturnObjectsInParcel; // EventManager.TriggerOnNewClient(client); } diff --git a/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs b/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs index 93ab411e33..032579e5b8 100644 --- a/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs +++ b/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs @@ -147,6 +147,7 @@ namespace OpenSim.Region.Examples.SimpleModule public event ParcelJoinRequest OnParcelJoinRequest; public event ParcelPropertiesUpdateRequest OnParcelPropertiesUpdateRequest; public event ParcelAbandonRequest OnParcelAbandonRequest; + public event ParcelReturnObjectsRequest OnParcelReturnObjectsRequest; public event ParcelAccessListRequest OnParcelAccessListRequest; public event ParcelAccessListUpdateRequest OnParcelAccessListUpdateRequest; public event ParcelSelectObjects OnParcelSelectObjects;