aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs')
-rw-r--r--OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs228
1 files changed, 157 insertions, 71 deletions
diff --git a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs
index 68e4e26..89bb037 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,38 @@ 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 objectGroup.RootPart.Shape.State = objectGroup.RootPart.AttachPoint;
396
397 objectGroup.AbsolutePosition = inventoryStoredPosition;
398 objectGroup.RootPart.RotationOffset = inventoryStoredRotation;
376 399
377 // Make sure all bits but the ones we want are clear 400 // Make sure all bits but the ones we want are clear
378 // on take. 401 // on take.
@@ -491,8 +514,17 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
491 IClientAPI remoteClient) 514 IClientAPI remoteClient)
492 { 515 {
493 uint effectivePerms = (uint)(PermissionMask.Copy | PermissionMask.Transfer | PermissionMask.Modify | PermissionMask.Move | PermissionMask.Export) | 7; 516 uint effectivePerms = (uint)(PermissionMask.Copy | PermissionMask.Transfer | PermissionMask.Modify | PermissionMask.Move | PermissionMask.Export) | 7;
517 // For the porposes of inventory, an object is modify if the prims
518 // are modify. This allows renaming an object that contains no
519 // mod items.
494 foreach (SceneObjectGroup grp in objsForEffectivePermissions) 520 foreach (SceneObjectGroup grp in objsForEffectivePermissions)
495 effectivePerms &= grp.GetEffectivePermissions(); 521 {
522 uint groupPerms = grp.GetEffectivePermissions(true);
523 if ((grp.RootPart.BaseMask & (uint)PermissionMask.Modify) != 0)
524 groupPerms |= (uint)PermissionMask.Modify;
525
526 effectivePerms &= groupPerms;
527 }
496 effectivePerms |= (uint)PermissionMask.Move; 528 effectivePerms |= (uint)PermissionMask.Move;
497 529
498 if (remoteClient != null && (remoteClient.AgentId != so.RootPart.OwnerID) && m_Scene.Permissions.PropagatePermissions()) 530 if (remoteClient != null && (remoteClient.AgentId != so.RootPart.OwnerID) && m_Scene.Permissions.PropagatePermissions())
@@ -673,7 +705,8 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
673 if (so.FromFolderID != UUID.Zero && so.RootPart.OwnerID == remoteClient.AgentId) 705 if (so.FromFolderID != UUID.Zero && so.RootPart.OwnerID == remoteClient.AgentId)
674 { 706 {
675 InventoryFolderBase f = new InventoryFolderBase(so.FromFolderID, userID); 707 InventoryFolderBase f = new InventoryFolderBase(so.FromFolderID, userID);
676 folder = m_Scene.InventoryService.GetFolder(f); 708 if (f != null)
709 folder = m_Scene.InventoryService.GetFolder(f);
677 710
678 if(folder.Type == 14 || folder.Type == 16) 711 if(folder.Type == 14 || folder.Type == 16)
679 { 712 {
@@ -709,16 +742,11 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
709 bool RezSelected, bool RemoveItem, UUID fromTaskID, bool attachment) 742 bool RezSelected, bool RemoveItem, UUID fromTaskID, bool attachment)
710 { 743 {
711// m_log.DebugFormat("[INVENTORY ACCESS MODULE]: RezObject for {0}, item {1}", remoteClient.Name, itemID); 744// m_log.DebugFormat("[INVENTORY ACCESS MODULE]: RezObject for {0}, item {1}", remoteClient.Name, itemID);
712
713 InventoryItemBase item = new InventoryItemBase(itemID, remoteClient.AgentId); 745 InventoryItemBase item = new InventoryItemBase(itemID, remoteClient.AgentId);
714 item = m_Scene.InventoryService.GetItem(item); 746 item = m_Scene.InventoryService.GetItem(item);
715 747
716 if (item == null) 748 if (item == null)
717 { 749 {
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; 750 return null;
723 } 751 }
724 752
@@ -766,9 +794,19 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
766 XmlDocument doc = new XmlDocument(); 794 XmlDocument doc = new XmlDocument();
767 doc.LoadXml(xmlData); 795 doc.LoadXml(xmlData);
768 XmlElement e = (XmlElement)doc.SelectSingleNode("/CoalescedObject"); 796 XmlElement e = (XmlElement)doc.SelectSingleNode("/CoalescedObject");
797 Vector3 rez_pos;
769 if (e == null || attachment) // Single 798 if (e == null || attachment) // Single
770 { 799 {
771 SceneObjectGroup g = SceneObjectSerializer.FromOriginalXmlFormat(xmlData); 800 SceneObjectGroup g = SceneObjectSerializer.FromOriginalXmlFormat(xmlData);
801 if (!attachment)
802 {
803 g.RootPart.AttachPoint = g.RootPart.Shape.State;
804 g.RootPart.AttachOffset = g.AbsolutePosition;
805 g.RootPart.AttachRotation = g.GroupRotation;
806 if (g.RootPart.Shape.PCode != (byte)PCode.NewTree &&
807 g.RootPart.Shape.PCode != (byte)PCode.Tree)
808 g.RootPart.Shape.State = 0;
809 }
772 810
773 objlist.Add(g); 811 objlist.Add(g);
774 veclist.Add(Vector3.Zero); 812 veclist.Add(Vector3.Zero);
@@ -778,6 +816,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
778 RayStart, RayEnd, RayTargetID, Quaternion.Identity, 816 RayStart, RayEnd, RayTargetID, Quaternion.Identity,
779 BypassRayCast, bRayEndIsIntersection, true, g.GetAxisAlignedBoundingBox(out offsetHeight), false); 817 BypassRayCast, bRayEndIsIntersection, true, g.GetAxisAlignedBoundingBox(out offsetHeight), false);
780 pos.Z += offsetHeight; 818 pos.Z += offsetHeight;
819 rez_pos = pos;
781 } 820 }
782 else 821 else
783 { 822 {
@@ -792,12 +831,20 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
792 BypassRayCast, bRayEndIsIntersection, true, 831 BypassRayCast, bRayEndIsIntersection, true,
793 bbox, false); 832 bbox, false);
794 833
834 rez_pos = pos;
835
795 pos -= bbox / 2; 836 pos -= bbox / 2;
796 837
797 XmlNodeList groups = e.SelectNodes("SceneObjectGroup"); 838 XmlNodeList groups = e.SelectNodes("SceneObjectGroup");
798 foreach (XmlNode n in groups) 839 foreach (XmlNode n in groups)
799 { 840 {
800 SceneObjectGroup g = SceneObjectSerializer.FromOriginalXmlFormat(n.OuterXml); 841 SceneObjectGroup g = SceneObjectSerializer.FromOriginalXmlFormat(n.OuterXml);
842 g.RootPart.AttachPoint = g.RootPart.Shape.State;
843 g.RootPart.AttachOffset = g.AbsolutePosition;
844 g.RootPart.AttachRotation = g.GroupRotation;
845 if (g.RootPart.Shape.PCode != (byte)PCode.NewTree &&
846 g.RootPart.Shape.PCode != (byte)PCode.Tree)
847 g.RootPart.Shape.State = 0;
801 848
802 objlist.Add(g); 849 objlist.Add(g);
803 XmlElement el = (XmlElement)n; 850 XmlElement el = (XmlElement)n;
@@ -817,12 +864,35 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
817 } 864 }
818 } 865 }
819 866
820 if (item != null && !DoPreRezWhenFromItem(remoteClient, item, objlist, pos, veclist, attachment)) 867 int primcount = 0;
868 foreach (SceneObjectGroup g in objlist)
869 primcount += g.PrimCount;
870
871 if (!m_Scene.Permissions.CanRezObject(
872 primcount, remoteClient.AgentId, rez_pos)
873 && !attachment)
874 {
875 // The client operates in no fail mode. It will
876 // have already removed the item from the folder
877 // if it's no copy.
878 // Put it back if it's not an attachment
879 //
880 if (item != null)
881 {
882 if (((item.CurrentPermissions & (uint)PermissionMask.Copy) == 0) && (!attachment))
883 remoteClient.SendBulkUpdateInventory(item);
884 }
885
886 return null;
887 }
888
889 if (item != null && !DoPreRezWhenFromItem(remoteClient, item, objlist, rez_pos, veclist, attachment))
821 return null; 890 return null;
822 891
823 for (int i = 0; i < objlist.Count; i++) 892 for (int i = 0; i < objlist.Count; i++)
824 { 893 {
825 group = objlist[i]; 894 group = objlist[i];
895 SceneObjectPart rootPart = group.RootPart;
826 896
827// m_log.DebugFormat( 897// m_log.DebugFormat(
828// "[INVENTORY ACCESS MODULE]: Preparing to rez {0} {1} {2} ownermask={3:X} nextownermask={4:X} groupmask={5:X} everyonemask={6:X} for {7}", 898// "[INVENTORY ACCESS MODULE]: Preparing to rez {0} {1} {2} ownermask={3:X} nextownermask={4:X} groupmask={5:X} everyonemask={6:X} for {7}",
@@ -883,8 +953,6 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
883 953
884 if (!attachment) 954 if (!attachment)
885 { 955 {
886 SceneObjectPart rootPart = group.RootPart;
887
888 if (rootPart.Shape.PCode == (byte)PCode.Prim) 956 if (rootPart.Shape.PCode == (byte)PCode.Prim)
889 group.ClearPartAttachmentData(); 957 group.ClearPartAttachmentData();
890 958
@@ -902,6 +970,8 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
902// remoteClient.Name); 970// remoteClient.Name);
903 } 971 }
904 972
973 group.SetGroup(remoteClient.ActiveGroupId, remoteClient);
974
905 if (item != null) 975 if (item != null)
906 DoPostRezWhenFromItem(item, attachment); 976 DoPostRezWhenFromItem(item, attachment);
907 977
@@ -986,8 +1056,11 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
986 { 1056 {
987 rootPart.Name = item.Name; 1057 rootPart.Name = item.Name;
988 rootPart.Description = item.Description; 1058 rootPart.Description = item.Description;
989 rootPart.ObjectSaleType = item.SaleType; 1059 if ((item.Flags & (uint)InventoryItemFlags.ObjectSlamSale) != 0)
990 rootPart.SalePrice = item.SalePrice; 1060 {
1061 rootPart.ObjectSaleType = item.SaleType;
1062 rootPart.SalePrice = item.SalePrice;
1063 }
991 } 1064 }
992 1065
993 so.FromFolderID = item.Folder; 1066 so.FromFolderID = item.Folder;
@@ -997,7 +1070,8 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
997// rootPart.OwnerID, item.Owner, item.CurrentPermissions); 1070// rootPart.OwnerID, item.Owner, item.CurrentPermissions);
998 1071
999 if ((rootPart.OwnerID != item.Owner) || 1072 if ((rootPart.OwnerID != item.Owner) ||
1000 (item.CurrentPermissions & 16) != 0) 1073 (item.CurrentPermissions & 16) != 0 ||
1074 (item.Flags & (uint)InventoryItemFlags.ObjectSlamPerm) != 0)
1001 { 1075 {
1002 //Need to kill the for sale here 1076 //Need to kill the for sale here
1003 rootPart.ObjectSaleType = 0; 1077 rootPart.ObjectSaleType = 0;
@@ -1007,31 +1081,43 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
1007 { 1081 {
1008 foreach (SceneObjectPart part in so.Parts) 1082 foreach (SceneObjectPart part in so.Parts)
1009 { 1083 {
1010 if ((item.Flags & (uint)InventoryItemFlags.ObjectHasMultipleItems) == 0)
1011 {
1012 part.EveryoneMask = item.EveryOnePermissions;
1013 part.NextOwnerMask = item.NextPermissions;
1014 }
1015 part.GroupMask = 0; // DO NOT propagate here 1084 part.GroupMask = 0; // DO NOT propagate here
1085
1086 part.LastOwnerID = part.OwnerID;
1087 part.OwnerID = item.Owner;
1088 part.Inventory.ChangeInventoryOwner(item.Owner);
1016 } 1089 }
1017 1090
1018 so.ApplyNextOwnerPermissions(); 1091 so.ApplyNextOwnerPermissions();
1092
1093 // In case the user has changed flags on a received item
1094 // we have to apply those changes after the slam. Else we
1095 // get a net loss of permissions
1096 foreach (SceneObjectPart part in so.Parts)
1097 {
1098 if ((item.Flags & (uint)InventoryItemFlags.ObjectHasMultipleItems) == 0)
1099 {
1100 if ((item.Flags & (uint)InventoryItemFlags.ObjectOverwriteEveryone) != 0)
1101 part.EveryoneMask = item.EveryOnePermissions & part.BaseMask;
1102 if ((item.Flags & (uint)InventoryItemFlags.ObjectOverwriteNextOwner) != 0)
1103 part.NextOwnerMask = item.NextPermissions & part.BaseMask;
1104 }
1105 }
1019 } 1106 }
1020 } 1107 }
1021 1108 else
1022 foreach (SceneObjectPart part in so.Parts)
1023 { 1109 {
1024 part.FromUserInventoryItemID = fromUserInventoryItemId; 1110 foreach (SceneObjectPart part in so.Parts)
1025
1026 if ((part.OwnerID != item.Owner) ||
1027 (item.CurrentPermissions & 16) != 0)
1028 { 1111 {
1029 part.Inventory.ChangeInventoryOwner(item.Owner); 1112 part.FromUserInventoryItemID = fromUserInventoryItemId;
1030 part.GroupMask = 0; // DO NOT propagate here 1113
1114 if ((item.Flags & (uint)InventoryItemFlags.ObjectOverwriteEveryone) != 0)
1115 part.EveryoneMask = item.EveryOnePermissions;
1116 if ((item.Flags & (uint)InventoryItemFlags.ObjectOverwriteNextOwner) != 0)
1117 part.NextOwnerMask = item.NextPermissions;
1118 if ((item.Flags & (uint)InventoryItemFlags.ObjectOverwriteGroup) != 0)
1119 part.GroupMask = item.GroupPermissions;
1031 } 1120 }
1032
1033 part.EveryoneMask = item.EveryOnePermissions;
1034 part.NextOwnerMask = item.NextPermissions;
1035 } 1121 }
1036 1122
1037 rootPart.TrimPermissions(); 1123 rootPart.TrimPermissions();