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;