From 61619ddefc96be2c1f802360cca48b1b36be8bb2 Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Mon, 18 Apr 2011 21:59:01 +0100
Subject: refactor: split out the code which actually copies a particular
bundle to inventory
---
.../InventoryAccess/InventoryAccessModule.cs | 221 +++++++++++----------
1 file changed, 115 insertions(+), 106 deletions(-)
diff --git a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs
index 666f353..6b3df9d 100644
--- a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs
+++ b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs
@@ -213,19 +213,11 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
return UUID.Zero;
}
-
- ///
- /// Delete a scene object from a scene and place in the given avatar's inventory.
- /// Returns the UUID of the newly created asset.
- ///
- ///
- ///
- ///
- ///
+
public virtual UUID CopyToInventory(DeRezAction action, UUID folderID,
List objectGroups, IClientAPI remoteClient)
{
- Dictionary> deletes = new Dictionary>();
+ Dictionary> bundlesToCopy = new Dictionary>();
if (CoalesceMultipleObjectsToInventory)
{
@@ -234,10 +226,10 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
// reasons.
foreach (SceneObjectGroup g in objectGroups)
{
- if (!deletes.ContainsKey(g.OwnerID))
- deletes[g.OwnerID] = new List();
+ if (!bundlesToCopy.ContainsKey(g.OwnerID))
+ bundlesToCopy[g.OwnerID] = new List();
- deletes[g.OwnerID].Add(g);
+ bundlesToCopy[g.OwnerID].Add(g);
}
}
else
@@ -247,7 +239,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
{
List bundle = new List();
bundle.Add(g);
- deletes[g.UUID] = bundle;
+ bundlesToCopy[g.UUID] = bundle;
}
}
@@ -257,112 +249,129 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
// Each iteration is really a separate asset being created,
// with distinct destinations as well.
- foreach (List objlist in deletes.Values)
+ foreach (List bundle in bundlesToCopy.Values)
+ assetID = CopyBundleToInventory(action, folderID, bundle, remoteClient);
+
+ return assetID;
+ }
+
+ ///
+ /// Copy a bundle of objects to inventory. If there is only one object, then this will create an object
+ /// item. If there are multiple objects then these will be saved as a single coalesced item.
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ protected UUID CopyBundleToInventory(
+ DeRezAction action, UUID folderID, List objlist, IClientAPI remoteClient)
+ {
+ UUID assetID = UUID.Zero;
+
+ CoalescedSceneObjects coa = new CoalescedSceneObjects(UUID.Zero);
+ Dictionary originalPositions = new Dictionary();
+
+ foreach (SceneObjectGroup objectGroup in objlist)
{
- CoalescedSceneObjects coa = new CoalescedSceneObjects(UUID.Zero);
- Dictionary originalPositions = new Dictionary();
+ Vector3 inventoryStoredPosition = new Vector3
+ (((objectGroup.AbsolutePosition.X > (int)Constants.RegionSize)
+ ? 250
+ : objectGroup.AbsolutePosition.X)
+ ,
+ (objectGroup.AbsolutePosition.Y > (int)Constants.RegionSize)
+ ? 250
+ : objectGroup.AbsolutePosition.Y,
+ objectGroup.AbsolutePosition.Z);
+
+ originalPositions[objectGroup.UUID] = objectGroup.AbsolutePosition;
+
+ objectGroup.AbsolutePosition = inventoryStoredPosition;
+
+ // Make sure all bits but the ones we want are clear
+ // on take.
+ // This will be applied to the current perms, so
+ // it will do what we want.
+ objectGroup.RootPart.NextOwnerMask &=
+ ((uint)PermissionMask.Copy |
+ (uint)PermissionMask.Transfer |
+ (uint)PermissionMask.Modify);
+ objectGroup.RootPart.NextOwnerMask |=
+ (uint)PermissionMask.Move;
+
+ coa.Add(objectGroup);
+ }
- foreach (SceneObjectGroup objectGroup in objlist)
- {
- Vector3 inventoryStoredPosition = new Vector3
- (((objectGroup.AbsolutePosition.X > (int)Constants.RegionSize)
- ? 250
- : objectGroup.AbsolutePosition.X)
- ,
- (objectGroup.AbsolutePosition.Y > (int)Constants.RegionSize)
- ? 250
- : objectGroup.AbsolutePosition.Y,
- objectGroup.AbsolutePosition.Z);
-
- originalPositions[objectGroup.UUID] = objectGroup.AbsolutePosition;
-
- objectGroup.AbsolutePosition = inventoryStoredPosition;
-
- // Make sure all bits but the ones we want are clear
- // on take.
- // This will be applied to the current perms, so
- // it will do what we want.
- objectGroup.RootPart.NextOwnerMask &=
- ((uint)PermissionMask.Copy |
- (uint)PermissionMask.Transfer |
- (uint)PermissionMask.Modify);
- objectGroup.RootPart.NextOwnerMask |=
- (uint)PermissionMask.Move;
-
- coa.Add(objectGroup);
- }
+ string itemXml;
- string itemXml;
+ if (objlist.Count > 1)
+ itemXml = CoalescedSceneObjectsSerializer.ToXml(coa);
+ else
+ itemXml = SceneObjectSerializer.ToOriginalXmlFormat(objlist[0]);
+
+ // Restore the position of each group now that it has been stored to inventory.
+ foreach (SceneObjectGroup objectGroup in objlist)
+ objectGroup.AbsolutePosition = originalPositions[objectGroup.UUID];
- if (objlist.Count > 1)
- itemXml = CoalescedSceneObjectsSerializer.ToXml(coa);
- else
- itemXml = SceneObjectSerializer.ToOriginalXmlFormat(objlist[0]);
-
- // Restore the position of each group now that it has been stored to inventory.
- foreach (SceneObjectGroup objectGroup in objlist)
- objectGroup.AbsolutePosition = originalPositions[objectGroup.UUID];
+ InventoryItemBase item = CreateItemForObject(action, remoteClient, objlist[0], folderID);
+ if (item == null)
+ return UUID.Zero;
+
+ // Can't know creator is the same, so null it in inventory
+ if (objlist.Count > 1)
+ {
+ item.CreatorId = UUID.Zero.ToString();
+ item.Flags = (uint)InventoryItemFlags.ObjectHasMultipleItems;
+ }
+ else
+ {
+ item.CreatorId = objlist[0].RootPart.CreatorID.ToString();
+ item.SaleType = objlist[0].RootPart.ObjectSaleType;
+ item.SalePrice = objlist[0].RootPart.SalePrice;
+ }
+
+ AssetBase asset = CreateAsset(
+ objlist[0].GetPartName(objlist[0].RootPart.LocalId),
+ objlist[0].GetPartDescription(objlist[0].RootPart.LocalId),
+ (sbyte)AssetType.Object,
+ Utils.StringToBytes(itemXml),
+ objlist[0].OwnerID.ToString());
+ m_Scene.AssetService.Store(asset);
+
+ item.AssetID = asset.FullID;
+ assetID = asset.FullID;
- InventoryItemBase item = CreateItemForObject(action, remoteClient, objlist[0], folderID);
- if (item == null)
- return UUID.Zero;
-
- // Can't know creator is the same, so null it in inventory
- if (objlist.Count > 1)
- {
- item.CreatorId = UUID.Zero.ToString();
- item.Flags = (uint)InventoryItemFlags.ObjectHasMultipleItems;
- }
- else
- {
- item.CreatorId = objlist[0].RootPart.CreatorID.ToString();
- item.SaleType = objlist[0].RootPart.ObjectSaleType;
- item.SalePrice = objlist[0].RootPart.SalePrice;
- }
-
- AssetBase asset = CreateAsset(
- objlist[0].GetPartName(objlist[0].RootPart.LocalId),
- objlist[0].GetPartDescription(objlist[0].RootPart.LocalId),
- (sbyte)AssetType.Object,
- Utils.StringToBytes(itemXml),
- objlist[0].OwnerID.ToString());
- m_Scene.AssetService.Store(asset);
-
- item.AssetID = asset.FullID;
- assetID = asset.FullID;
+ if (DeRezAction.SaveToExistingUserInventoryItem == action)
+ {
+ m_Scene.InventoryService.UpdateItem(item);
+ }
+ else
+ {
+ AddPermissions(item, objlist[0], objlist, remoteClient);
+
+ item.CreationDate = Util.UnixTimeSinceEpoch();
+ item.Description = asset.Description;
+ item.Name = asset.Name;
+ item.AssetType = asset.Type;
- if (DeRezAction.SaveToExistingUserInventoryItem == action)
+ m_Scene.AddInventoryItem(item);
+
+ if (remoteClient != null && item.Owner == remoteClient.AgentId)
{
- m_Scene.InventoryService.UpdateItem(item);
+ remoteClient.SendInventoryItemCreateUpdate(item, 0);
}
else
{
- AddPermissions(item, objlist[0], objlist, remoteClient);
-
- item.CreationDate = Util.UnixTimeSinceEpoch();
- item.Description = asset.Description;
- item.Name = asset.Name;
- item.AssetType = asset.Type;
-
- m_Scene.AddInventoryItem(item);
-
- if (remoteClient != null && item.Owner == remoteClient.AgentId)
+ ScenePresence notifyUser = m_Scene.GetScenePresence(item.Owner);
+ if (notifyUser != null)
{
- remoteClient.SendInventoryItemCreateUpdate(item, 0);
- }
- else
- {
- ScenePresence notifyUser = m_Scene.GetScenePresence(item.Owner);
- if (notifyUser != null)
- {
- notifyUser.ControllingClient.SendInventoryItemCreateUpdate(item, 0);
- }
+ notifyUser.ControllingClient.SendInventoryItemCreateUpdate(item, 0);
}
}
-
- // This is a hook to do some per-asset post-processing for subclasses that need that
- ExportAsset(remoteClient.AgentId, assetID);
}
+
+ // This is a hook to do some per-asset post-processing for subclasses that need that
+ ExportAsset(remoteClient.AgentId, assetID);
return assetID;
}
--
cgit v1.1