aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/CoreModules/Framework/InventoryAccess
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/CoreModules/Framework/InventoryAccess')
-rw-r--r--OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs211
1 files changed, 141 insertions, 70 deletions
diff --git a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs
index 831922e..6251266 100644
--- a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs
+++ b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs
@@ -183,44 +183,49 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
183 if (!m_Scene.Permissions.CanCreateUserInventory(invType, remoteClient.AgentId)) 183 if (!m_Scene.Permissions.CanCreateUserInventory(invType, remoteClient.AgentId))
184 return; 184 return;
185 185
186 if (transactionID == UUID.Zero) 186 InventoryFolderBase f = new InventoryFolderBase(folderID, remoteClient.AgentId);
187 InventoryFolderBase folder = m_Scene.InventoryService.GetFolder(f);
188
189 if (folder == null || folder.Owner != remoteClient.AgentId)
190 return;
191
192 if (transactionID != UUID.Zero)
187 { 193 {
188 ScenePresence presence; 194 IAgentAssetTransactions agentTransactions = m_Scene.AgentTransactionsModule;
189 if (m_Scene.TryGetScenePresence(remoteClient.AgentId, out presence)) 195 if (agentTransactions != null)
190 { 196 {
191 byte[] data = null; 197 if (agentTransactions.HandleItemCreationFromTransaction(
198 remoteClient, transactionID, folderID, callbackID, description,
199 name, invType, assetType, wearableType, nextOwnerMask))
200 return;
201 }
202 }
192 203
193 if (invType == (sbyte)InventoryType.Landmark && presence != null) 204 ScenePresence presence;
194 { 205 if (m_Scene.TryGetScenePresence(remoteClient.AgentId, out presence))
195 string suffix = string.Empty, prefix = string.Empty; 206 {
196 string strdata = GenerateLandmark(presence, out prefix, out suffix); 207 byte[] data = null;
197 data = Encoding.ASCII.GetBytes(strdata);
198 name = prefix + name;
199 description += suffix;
200 }
201 208
202 AssetBase asset = m_Scene.CreateAsset(name, description, assetType, data, remoteClient.AgentId); 209 if (invType == (sbyte)InventoryType.Landmark && presence != null)
203 m_Scene.AssetService.Store(asset);
204 m_Scene.CreateNewInventoryItem(
205 remoteClient, remoteClient.AgentId.ToString(), string.Empty, folderID,
206 name, description, 0, callbackID, asset, invType, nextOwnerMask, creationDate);
207 }
208 else
209 { 210 {
210 m_log.ErrorFormat( 211 string suffix = string.Empty, prefix = string.Empty;
211 "[INVENTORY ACCESS MODULE]: ScenePresence for agent uuid {0} unexpectedly not found in CreateNewInventoryItem", 212 string strdata = GenerateLandmark(presence, out prefix, out suffix);
212 remoteClient.AgentId); 213 data = Encoding.ASCII.GetBytes(strdata);
214 name = prefix + name;
215 description += suffix;
213 } 216 }
217
218 AssetBase asset = m_Scene.CreateAsset(name, description, assetType, data, remoteClient.AgentId);
219 m_Scene.AssetService.Store(asset);
220 m_Scene.CreateNewInventoryItem(
221 remoteClient, remoteClient.AgentId.ToString(), string.Empty, folderID,
222 name, description, 0, callbackID, asset, invType, nextOwnerMask, creationDate,transactionID);
214 } 223 }
215 else 224 else
216 { 225 {
217 IAgentAssetTransactions agentTransactions = m_Scene.AgentTransactionsModule; 226 m_log.ErrorFormat(
218 if (agentTransactions != null) 227 "[INVENTORY ACCESS MODULE]: ScenePresence for agent uuid {0} unexpectedly not found in CreateNewInventoryItem",
219 { 228 remoteClient.AgentId);
220 agentTransactions.HandleItemCreationFromTransaction(
221 remoteClient, transactionID, folderID, callbackID, description,
222 name, invType, assetType, wearableType, nextOwnerMask);
223 }
224 } 229 }
225 } 230 }
226 231
@@ -359,20 +364,42 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
359 { 364 {
360 if (objectGroup.RootPart.KeyframeMotion != null) 365 if (objectGroup.RootPart.KeyframeMotion != null)
361 objectGroup.RootPart.KeyframeMotion.Stop(); 366 objectGroup.RootPart.KeyframeMotion.Stop();
367 objectGroup.RootPart.SetForce(Vector3.Zero);
368 objectGroup.RootPart.SetAngularImpulse(Vector3.Zero, false);
362 objectGroup.RootPart.KeyframeMotion = null; 369 objectGroup.RootPart.KeyframeMotion = null;
363// Vector3 inventoryStoredPosition = new Vector3 370
364// (((objectGroup.AbsolutePosition.X > (int)Constants.RegionSize) 371 Vector3 inventoryStoredPosition = new Vector3
365// ? 250 372 (((objectGroup.AbsolutePosition.X > (int)Constants.RegionSize)
366// : objectGroup.AbsolutePosition.X) 373 ? 250
367// , 374 : objectGroup.AbsolutePosition.X)
368// (objectGroup.AbsolutePosition.Y > (int)Constants.RegionSize) 375 ,
369// ? 250 376 (objectGroup.AbsolutePosition.Y > (int)Constants.RegionSize)
370// : objectGroup.AbsolutePosition.Y, 377 ? 250
371// objectGroup.AbsolutePosition.Z); 378 : objectGroup.AbsolutePosition.Y,
372// 379 objectGroup.AbsolutePosition.Z);
373// originalPositions[objectGroup.UUID] = objectGroup.AbsolutePosition; 380
374// 381 Quaternion inventoryStoredRotation = objectGroup.GroupRotation;
375// objectGroup.AbsolutePosition = inventoryStoredPosition; 382 //originalPositions[objectGroup.UUID] = objectGroup.AbsolutePosition;
383
384 // Restore attachment data after trip through the sim
385 if (objectGroup.RootPart.AttachPoint > 0)
386 {
387 inventoryStoredPosition = objectGroup.RootPart.AttachOffset;
388 inventoryStoredRotation = objectGroup.RootPart.AttachRotation;
389 }
390
391 // Trees could be attached and it's been done, but it makes
392 // no sense. State must be preserved because it's the tree type
393 if (objectGroup.RootPart.Shape.PCode != (byte) PCode.Tree &&
394 objectGroup.RootPart.Shape.PCode != (byte) PCode.NewTree)
395 {
396 objectGroup.RootPart.Shape.State = objectGroup.RootPart.AttachPoint;
397 if (objectGroup.RootPart.AttachPoint > 0)
398 objectGroup.RootPart.Shape.LastAttachPoint = objectGroup.RootPart.AttachPoint;
399 }
400
401 objectGroup.AbsolutePosition = inventoryStoredPosition;
402 objectGroup.RootPart.RotationOffset = inventoryStoredRotation;
376 403
377 // Make sure all bits but the ones we want are clear 404 // Make sure all bits but the ones we want are clear
378 // on take. 405 // on take.
@@ -491,8 +518,17 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
491 IClientAPI remoteClient) 518 IClientAPI remoteClient)
492 { 519 {
493 uint effectivePerms = (uint)(PermissionMask.Copy | PermissionMask.Transfer | PermissionMask.Modify | PermissionMask.Move | PermissionMask.Export) | 7; 520 uint effectivePerms = (uint)(PermissionMask.Copy | PermissionMask.Transfer | PermissionMask.Modify | PermissionMask.Move | PermissionMask.Export) | 7;
521 // For the porposes of inventory, an object is modify if the prims
522 // are modify. This allows renaming an object that contains no
523 // mod items.
494 foreach (SceneObjectGroup grp in objsForEffectivePermissions) 524 foreach (SceneObjectGroup grp in objsForEffectivePermissions)
495 effectivePerms &= grp.GetEffectivePermissions(); 525 {
526 uint groupPerms = grp.GetEffectivePermissions(true);
527 if ((grp.RootPart.BaseMask & (uint)PermissionMask.Modify) != 0)
528 groupPerms |= (uint)PermissionMask.Modify;
529
530 effectivePerms &= groupPerms;
531 }
496 effectivePerms |= (uint)PermissionMask.Move; 532 effectivePerms |= (uint)PermissionMask.Move;
497 533
498 if (remoteClient != null && (remoteClient.AgentId != so.RootPart.OwnerID) && m_Scene.Permissions.PropagatePermissions()) 534 if (remoteClient != null && (remoteClient.AgentId != so.RootPart.OwnerID) && m_Scene.Permissions.PropagatePermissions())
@@ -673,7 +709,8 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
673 if (so.FromFolderID != UUID.Zero && so.RootPart.OwnerID == remoteClient.AgentId) 709 if (so.FromFolderID != UUID.Zero && so.RootPart.OwnerID == remoteClient.AgentId)
674 { 710 {
675 InventoryFolderBase f = new InventoryFolderBase(so.FromFolderID, userID); 711 InventoryFolderBase f = new InventoryFolderBase(so.FromFolderID, userID);
676 folder = m_Scene.InventoryService.GetFolder(f); 712 if (f != null)
713 folder = m_Scene.InventoryService.GetFolder(f);
677 714
678 if(folder.Type == 14 || folder.Type == 16) 715 if(folder.Type == 14 || folder.Type == 16)
679 { 716 {
@@ -709,16 +746,11 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
709 bool RezSelected, bool RemoveItem, UUID fromTaskID, bool attachment) 746 bool RezSelected, bool RemoveItem, UUID fromTaskID, bool attachment)
710 { 747 {
711// m_log.DebugFormat("[INVENTORY ACCESS MODULE]: RezObject for {0}, item {1}", remoteClient.Name, itemID); 748// m_log.DebugFormat("[INVENTORY ACCESS MODULE]: RezObject for {0}, item {1}", remoteClient.Name, itemID);
712
713 InventoryItemBase item = new InventoryItemBase(itemID, remoteClient.AgentId); 749 InventoryItemBase item = new InventoryItemBase(itemID, remoteClient.AgentId);
714 item = m_Scene.InventoryService.GetItem(item); 750 item = m_Scene.InventoryService.GetItem(item);
715 751
716 if (item == null) 752 if (item == null)
717 { 753 {
718 m_log.WarnFormat(
719 "[INVENTORY ACCESS MODULE]: Could not find item {0} for {1} in RezObject()",
720 itemID, remoteClient.Name);
721
722 return null; 754 return null;
723 } 755 }
724 756
@@ -782,12 +814,35 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
782 pos -= bbox / 2; 814 pos -= bbox / 2;
783 } 815 }
784 816
817 int primcount = 0;
818 foreach (SceneObjectGroup g in objlist)
819 primcount += g.PrimCount;
820
821 if (!m_Scene.Permissions.CanRezObject(
822 primcount, remoteClient.AgentId, pos)
823 && !attachment)
824 {
825 // The client operates in no fail mode. It will
826 // have already removed the item from the folder
827 // if it's no copy.
828 // Put it back if it's not an attachment
829 //
830 if (item != null)
831 {
832 if (((item.CurrentPermissions & (uint)PermissionMask.Copy) == 0) && (!attachment))
833 remoteClient.SendBulkUpdateInventory(item);
834 }
835
836 return null;
837 }
838
785 if (item != null && !DoPreRezWhenFromItem(remoteClient, item, objlist, pos, veclist, attachment)) 839 if (item != null && !DoPreRezWhenFromItem(remoteClient, item, objlist, pos, veclist, attachment))
786 return null; 840 return null;
787 841
788 for (int i = 0; i < objlist.Count; i++) 842 for (int i = 0; i < objlist.Count; i++)
789 { 843 {
790 group = objlist[i]; 844 group = objlist[i];
845 SceneObjectPart rootPart = group.RootPart;
791 846
792// m_log.DebugFormat( 847// m_log.DebugFormat(
793// "[INVENTORY ACCESS MODULE]: Preparing to rez {0} {1} {2} ownermask={3:X} nextownermask={4:X} groupmask={5:X} everyonemask={6:X} for {7}", 848// "[INVENTORY ACCESS MODULE]: Preparing to rez {0} {1} {2} ownermask={3:X} nextownermask={4:X} groupmask={5:X} everyonemask={6:X} for {7}",
@@ -856,8 +911,6 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
856 911
857 if (!attachment) 912 if (!attachment)
858 { 913 {
859 SceneObjectPart rootPart = group.RootPart;
860
861 if (rootPart.Shape.PCode == (byte)PCode.Prim) 914 if (rootPart.Shape.PCode == (byte)PCode.Prim)
862 group.ClearPartAttachmentData(); 915 group.ClearPartAttachmentData();
863 916
@@ -875,6 +928,8 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
875// remoteClient.Name); 928// remoteClient.Name);
876 } 929 }
877 930
931 group.SetGroup(remoteClient.ActiveGroupId, remoteClient);
932
878 if (item != null) 933 if (item != null)
879 DoPostRezWhenFromItem(item, attachment); 934 DoPostRezWhenFromItem(item, attachment);
880 935
@@ -959,8 +1014,11 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
959 { 1014 {
960 rootPart.Name = item.Name; 1015 rootPart.Name = item.Name;
961 rootPart.Description = item.Description; 1016 rootPart.Description = item.Description;
962 rootPart.ObjectSaleType = item.SaleType; 1017 if ((item.Flags & (uint)InventoryItemFlags.ObjectSlamSale) != 0)
963 rootPart.SalePrice = item.SalePrice; 1018 {
1019 rootPart.ObjectSaleType = item.SaleType;
1020 rootPart.SalePrice = item.SalePrice;
1021 }
964 } 1022 }
965 1023
966 so.FromFolderID = item.Folder; 1024 so.FromFolderID = item.Folder;
@@ -970,7 +1028,8 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
970// rootPart.OwnerID, item.Owner, item.CurrentPermissions); 1028// rootPart.OwnerID, item.Owner, item.CurrentPermissions);
971 1029
972 if ((rootPart.OwnerID != item.Owner) || 1030 if ((rootPart.OwnerID != item.Owner) ||
973 (item.CurrentPermissions & 16) != 0) 1031 (item.CurrentPermissions & 16) != 0 ||
1032 (item.Flags & (uint)InventoryItemFlags.ObjectSlamPerm) != 0)
974 { 1033 {
975 //Need to kill the for sale here 1034 //Need to kill the for sale here
976 rootPart.ObjectSaleType = 0; 1035 rootPart.ObjectSaleType = 0;
@@ -980,31 +1039,43 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
980 { 1039 {
981 foreach (SceneObjectPart part in so.Parts) 1040 foreach (SceneObjectPart part in so.Parts)
982 { 1041 {
983 if ((item.Flags & (uint)InventoryItemFlags.ObjectHasMultipleItems) == 0)
984 {
985 part.EveryoneMask = item.EveryOnePermissions;
986 part.NextOwnerMask = item.NextPermissions;
987 }
988 part.GroupMask = 0; // DO NOT propagate here 1042 part.GroupMask = 0; // DO NOT propagate here
1043
1044 part.LastOwnerID = part.OwnerID;
1045 part.OwnerID = item.Owner;
1046 part.Inventory.ChangeInventoryOwner(item.Owner);
989 } 1047 }
990 1048
991 so.ApplyNextOwnerPermissions(); 1049 so.ApplyNextOwnerPermissions();
1050
1051 // In case the user has changed flags on a received item
1052 // we have to apply those changes after the slam. Else we
1053 // get a net loss of permissions
1054 foreach (SceneObjectPart part in so.Parts)
1055 {
1056 if ((item.Flags & (uint)InventoryItemFlags.ObjectHasMultipleItems) == 0)
1057 {
1058 if ((item.Flags & (uint)InventoryItemFlags.ObjectOverwriteEveryone) != 0)
1059 part.EveryoneMask = item.EveryOnePermissions & part.BaseMask;
1060 if ((item.Flags & (uint)InventoryItemFlags.ObjectOverwriteNextOwner) != 0)
1061 part.NextOwnerMask = item.NextPermissions & part.BaseMask;
1062 }
1063 }
992 } 1064 }
993 } 1065 }
994 1066 else
995 foreach (SceneObjectPart part in so.Parts)
996 { 1067 {
997 part.FromUserInventoryItemID = fromUserInventoryItemId; 1068 foreach (SceneObjectPart part in so.Parts)
998
999 if ((part.OwnerID != item.Owner) ||
1000 (item.CurrentPermissions & 16) != 0)
1001 { 1069 {
1002 part.Inventory.ChangeInventoryOwner(item.Owner); 1070 part.FromUserInventoryItemID = fromUserInventoryItemId;
1003 part.GroupMask = 0; // DO NOT propagate here 1071
1072 if ((item.Flags & (uint)InventoryItemFlags.ObjectOverwriteEveryone) != 0)
1073 part.EveryoneMask = item.EveryOnePermissions;
1074 if ((item.Flags & (uint)InventoryItemFlags.ObjectOverwriteNextOwner) != 0)
1075 part.NextOwnerMask = item.NextPermissions;
1076 if ((item.Flags & (uint)InventoryItemFlags.ObjectOverwriteGroup) != 0)
1077 part.GroupMask = item.GroupPermissions;
1004 } 1078 }
1005
1006 part.EveryoneMask = item.EveryOnePermissions;
1007 part.NextOwnerMask = item.NextPermissions;
1008 } 1079 }
1009 1080
1010 rootPart.TrimPermissions(); 1081 rootPart.TrimPermissions();