aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/Framework/Scenes/Scene.Inventory.cs')
-rw-r--r--OpenSim/Region/Framework/Scenes/Scene.Inventory.cs267
1 files changed, 160 insertions, 107 deletions
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
index cd01a05..dfb5846 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
@@ -99,34 +99,22 @@ namespace OpenSim.Region.Framework.Scenes
99 /// <param name="item"></param> 99 /// <param name="item"></param>
100 public bool AddInventoryItem(InventoryItemBase item) 100 public bool AddInventoryItem(InventoryItemBase item)
101 { 101 {
102 if (UUID.Zero == item.Folder) 102 InventoryFolderBase folder;
103
104 if (item.Folder == UUID.Zero)
103 { 105 {
104 InventoryFolderBase f = InventoryService.GetFolderForType(item.Owner, (AssetType)item.AssetType); 106 folder = InventoryService.GetFolderForType(item.Owner, (AssetType)item.AssetType);
105 if (f != null) 107 if (folder == null)
106 {
107// m_log.DebugFormat(
108// "[LOCAL INVENTORY SERVICES CONNECTOR]: Found folder {0} type {1} for item {2}",
109// f.Name, (AssetType)f.Type, item.Name);
110
111 item.Folder = f.ID;
112 }
113 else
114 { 108 {
115 f = InventoryService.GetRootFolder(item.Owner); 109 folder = InventoryService.GetRootFolder(item.Owner);
116 if (f != null) 110
117 { 111 if (folder == null)
118 item.Folder = f.ID;
119 }
120 else
121 {
122 m_log.WarnFormat(
123 "[AGENT INVENTORY]: Could not find root folder for {0} when trying to add item {1} with no parent folder specified",
124 item.Owner, item.Name);
125 return false; 112 return false;
126 }
127 } 113 }
114
115 item.Folder = folder.ID;
128 } 116 }
129 117
130 if (InventoryService.AddItem(item)) 118 if (InventoryService.AddItem(item))
131 { 119 {
132 int userlevel = 0; 120 int userlevel = 0;
@@ -252,8 +240,7 @@ namespace OpenSim.Region.Framework.Scenes
252 240
253 // Update item with new asset 241 // Update item with new asset
254 item.AssetID = asset.FullID; 242 item.AssetID = asset.FullID;
255 if (group.UpdateInventoryItem(item)) 243 group.UpdateInventoryItem(item);
256 remoteClient.SendAgentAlertMessage("Script saved", false);
257 244
258 part.GetProperties(remoteClient); 245 part.GetProperties(remoteClient);
259 246
@@ -264,12 +251,7 @@ namespace OpenSim.Region.Framework.Scenes
264 { 251 {
265 // Needs to determine which engine was running it and use that 252 // Needs to determine which engine was running it and use that
266 // 253 //
267 part.Inventory.CreateScriptInstance(item.ItemID, 0, false, DefaultScriptEngine, 0); 254 errors = part.Inventory.CreateScriptInstanceEr(item.ItemID, 0, false, DefaultScriptEngine, 0);
268 errors = part.Inventory.GetScriptErrors(item.ItemID);
269 }
270 else
271 {
272 remoteClient.SendAgentAlertMessage("Script saved", false);
273 } 255 }
274 part.ParentGroup.ResumeScripts(); 256 part.ParentGroup.ResumeScripts();
275 return errors; 257 return errors;
@@ -328,6 +310,7 @@ namespace OpenSim.Region.Framework.Scenes
328 { 310 {
329 if (UUID.Zero == transactionID) 311 if (UUID.Zero == transactionID)
330 { 312 {
313 item.Flags = (item.Flags & ~(uint)255) | (itemUpd.Flags & (uint)255);
331 item.Name = itemUpd.Name; 314 item.Name = itemUpd.Name;
332 item.Description = itemUpd.Description; 315 item.Description = itemUpd.Description;
333 if (item.NextPermissions != (itemUpd.NextPermissions & item.BasePermissions)) 316 if (item.NextPermissions != (itemUpd.NextPermissions & item.BasePermissions))
@@ -700,6 +683,8 @@ namespace OpenSim.Region.Framework.Scenes
700 return; 683 return;
701 } 684 }
702 685
686 if (newName == null) newName = item.Name;
687
703 AssetBase asset = AssetService.Get(item.AssetID.ToString()); 688 AssetBase asset = AssetService.Get(item.AssetID.ToString());
704 689
705 if (asset != null) 690 if (asset != null)
@@ -753,6 +738,24 @@ namespace OpenSim.Region.Framework.Scenes
753 } 738 }
754 739
755 /// <summary> 740 /// <summary>
741 /// Move an item within the agent's inventory, and leave a copy (used in making a new outfit)
742 /// </summary>
743 public void MoveInventoryItemsLeaveCopy(IClientAPI remoteClient, List<InventoryItemBase> items, UUID destfolder)
744 {
745 List<InventoryItemBase> moveitems = new List<InventoryItemBase>();
746 foreach (InventoryItemBase b in items)
747 {
748 CopyInventoryItem(remoteClient, 0, remoteClient.AgentId, b.ID, b.Folder, null);
749 InventoryItemBase n = InventoryService.GetItem(b);
750 n.Folder = destfolder;
751 moveitems.Add(n);
752 remoteClient.SendInventoryItemCreateUpdate(n, 0);
753 }
754
755 MoveInventoryItem(remoteClient, moveitems);
756 }
757
758 /// <summary>
756 /// Move an item within the agent's inventory. 759 /// Move an item within the agent's inventory.
757 /// </summary> 760 /// </summary>
758 /// <param name="remoteClient"></param> 761 /// <param name="remoteClient"></param>
@@ -985,8 +988,12 @@ namespace OpenSim.Region.Framework.Scenes
985 public void RemoveTaskInventory(IClientAPI remoteClient, UUID itemID, uint localID) 988 public void RemoveTaskInventory(IClientAPI remoteClient, UUID itemID, uint localID)
986 { 989 {
987 SceneObjectPart part = GetSceneObjectPart(localID); 990 SceneObjectPart part = GetSceneObjectPart(localID);
988 SceneObjectGroup group = part.ParentGroup; 991 SceneObjectGroup group = null;
989 if (group != null) 992 if (part != null)
993 {
994 group = part.ParentGroup;
995 }
996 if (part != null && group != null)
990 { 997 {
991 if (!Permissions.CanEditObjectInventory(part.UUID, remoteClient.AgentId)) 998 if (!Permissions.CanEditObjectInventory(part.UUID, remoteClient.AgentId))
992 return; 999 return;
@@ -1222,6 +1229,10 @@ namespace OpenSim.Region.Framework.Scenes
1222 if ((part.OwnerID != destPart.OwnerID) && ((srcTaskItem.CurrentPermissions & (uint)PermissionMask.Transfer) == 0)) 1229 if ((part.OwnerID != destPart.OwnerID) && ((srcTaskItem.CurrentPermissions & (uint)PermissionMask.Transfer) == 0))
1223 return; 1230 return;
1224 1231
1232 bool overrideNoMod = false;
1233 if ((part.GetEffectiveObjectFlags() & (uint)PrimFlags.AllowInventoryDrop) != 0)
1234 overrideNoMod = true;
1235
1225 if (part.OwnerID != destPart.OwnerID && (part.GetEffectiveObjectFlags() & (uint)PrimFlags.AllowInventoryDrop) == 0) 1236 if (part.OwnerID != destPart.OwnerID && (part.GetEffectiveObjectFlags() & (uint)PrimFlags.AllowInventoryDrop) == 0)
1226 { 1237 {
1227 // object cannot copy items to an object owned by a different owner 1238 // object cannot copy items to an object owned by a different owner
@@ -1231,7 +1242,7 @@ namespace OpenSim.Region.Framework.Scenes
1231 } 1242 }
1232 1243
1233 // must have both move and modify permission to put an item in an object 1244 // must have both move and modify permission to put an item in an object
1234 if ((part.OwnerMask & ((uint)PermissionMask.Move | (uint)PermissionMask.Modify)) == 0) 1245 if (((part.OwnerMask & (uint)PermissionMask.Modify) == 0) && (!overrideNoMod))
1235 { 1246 {
1236 return; 1247 return;
1237 } 1248 }
@@ -1290,6 +1301,14 @@ namespace OpenSim.Region.Framework.Scenes
1290 1301
1291 public UUID MoveTaskInventoryItems(UUID destID, string category, SceneObjectPart host, List<UUID> items) 1302 public UUID MoveTaskInventoryItems(UUID destID, string category, SceneObjectPart host, List<UUID> items)
1292 { 1303 {
1304 SceneObjectPart destPart = GetSceneObjectPart(destID);
1305 if (destPart != null) // Move into a prim
1306 {
1307 foreach(UUID itemID in items)
1308 MoveTaskInventoryItem(destID, host, itemID);
1309 return destID; // Prim folder ID == prim ID
1310 }
1311
1293 InventoryFolderBase rootFolder = InventoryService.GetRootFolder(destID); 1312 InventoryFolderBase rootFolder = InventoryService.GetRootFolder(destID);
1294 1313
1295 UUID newFolderID = UUID.Random(); 1314 UUID newFolderID = UUID.Random();
@@ -1439,13 +1458,6 @@ namespace OpenSim.Region.Framework.Scenes
1439 { 1458 {
1440 agentTransactions.HandleTaskItemUpdateFromTransaction( 1459 agentTransactions.HandleTaskItemUpdateFromTransaction(
1441 remoteClient, part, transactionID, currentItem); 1460 remoteClient, part, transactionID, currentItem);
1442
1443 if ((InventoryType)itemInfo.InvType == InventoryType.Notecard)
1444 remoteClient.SendAgentAlertMessage("Notecard saved", false);
1445 else if ((InventoryType)itemInfo.InvType == InventoryType.LSL)
1446 remoteClient.SendAgentAlertMessage("Script saved", false);
1447 else
1448 remoteClient.SendAgentAlertMessage("Item saved", false);
1449 } 1461 }
1450 1462
1451 // Base ALWAYS has move 1463 // Base ALWAYS has move
@@ -1586,7 +1598,7 @@ namespace OpenSim.Region.Framework.Scenes
1586 return; 1598 return;
1587 1599
1588 AssetBase asset = CreateAsset(itemBase.Name, itemBase.Description, (sbyte)itemBase.AssetType, 1600 AssetBase asset = CreateAsset(itemBase.Name, itemBase.Description, (sbyte)itemBase.AssetType,
1589 Encoding.ASCII.GetBytes("default\n{\n state_entry()\n {\n llSay(0, \"Script running\");\n }\n}"), 1601 Encoding.ASCII.GetBytes("default\n{\n state_entry()\n {\n llSay(0, \"Script running\");\n }\n\n touch_start(integer num)\n {\n }\n}"),
1590 remoteClient.AgentId); 1602 remoteClient.AgentId);
1591 AssetService.Store(asset); 1603 AssetService.Store(asset);
1592 1604
@@ -1739,23 +1751,32 @@ namespace OpenSim.Region.Framework.Scenes
1739 // build a list of eligible objects 1751 // build a list of eligible objects
1740 List<uint> deleteIDs = new List<uint>(); 1752 List<uint> deleteIDs = new List<uint>();
1741 List<SceneObjectGroup> deleteGroups = new List<SceneObjectGroup>(); 1753 List<SceneObjectGroup> deleteGroups = new List<SceneObjectGroup>();
1742 1754 List<SceneObjectGroup> takeGroups = new List<SceneObjectGroup>();
1743 // Start with true for both, then remove the flags if objects
1744 // that we can't derez are part of the selection
1745 bool permissionToTake = true;
1746 bool permissionToTakeCopy = true;
1747 bool permissionToDelete = true;
1748 1755
1749 foreach (uint localID in localIDs) 1756 foreach (uint localID in localIDs)
1750 { 1757 {
1758 // Start with true for both, then remove the flags if objects
1759 // that we can't derez are part of the selection
1760 bool permissionToTake = true;
1761 bool permissionToTakeCopy = true;
1762 bool permissionToDelete = true;
1763
1751 // Invalid id 1764 // Invalid id
1752 SceneObjectPart part = GetSceneObjectPart(localID); 1765 SceneObjectPart part = GetSceneObjectPart(localID);
1753 if (part == null) 1766 if (part == null)
1767 {
1768 //Client still thinks the object exists, kill it
1769 deleteIDs.Add(localID);
1754 continue; 1770 continue;
1771 }
1755 1772
1756 // Already deleted by someone else 1773 // Already deleted by someone else
1757 if (part.ParentGroup == null || part.ParentGroup.IsDeleted) 1774 if (part.ParentGroup == null || part.ParentGroup.IsDeleted)
1775 {
1776 //Client still thinks the object exists, kill it
1777 deleteIDs.Add(localID);
1758 continue; 1778 continue;
1779 }
1759 1780
1760 // Can't delete child prims 1781 // Can't delete child prims
1761 if (part != part.ParentGroup.RootPart) 1782 if (part != part.ParentGroup.RootPart)
@@ -1763,9 +1784,6 @@ namespace OpenSim.Region.Framework.Scenes
1763 1784
1764 SceneObjectGroup grp = part.ParentGroup; 1785 SceneObjectGroup grp = part.ParentGroup;
1765 1786
1766 deleteIDs.Add(localID);
1767 deleteGroups.Add(grp);
1768
1769 if (remoteClient == null) 1787 if (remoteClient == null)
1770 { 1788 {
1771 // Autoreturn has a null client. Nothing else does. So 1789 // Autoreturn has a null client. Nothing else does. So
@@ -1782,80 +1800,104 @@ namespace OpenSim.Region.Framework.Scenes
1782 } 1800 }
1783 else 1801 else
1784 { 1802 {
1785 if (!Permissions.CanTakeCopyObject(grp.UUID, remoteClient.AgentId)) 1803 if (action == DeRezAction.TakeCopy)
1804 {
1805 if (!Permissions.CanTakeCopyObject(grp.UUID, remoteClient.AgentId))
1806 permissionToTakeCopy = false;
1807 }
1808 else
1809 {
1786 permissionToTakeCopy = false; 1810 permissionToTakeCopy = false;
1787 1811 }
1788 if (!Permissions.CanTakeObject(grp.UUID, remoteClient.AgentId)) 1812 if (!Permissions.CanTakeObject(grp.UUID, remoteClient.AgentId))
1789 permissionToTake = false; 1813 permissionToTake = false;
1790 1814
1791 if (!Permissions.CanDeleteObject(grp.UUID, remoteClient.AgentId)) 1815 if (!Permissions.CanDeleteObject(grp.UUID, remoteClient.AgentId))
1792 permissionToDelete = false; 1816 permissionToDelete = false;
1793 } 1817 }
1794 }
1795 1818
1796 // Handle god perms 1819 // Handle god perms
1797 if ((remoteClient != null) && Permissions.IsGod(remoteClient.AgentId)) 1820 if ((remoteClient != null) && Permissions.IsGod(remoteClient.AgentId))
1798 { 1821 {
1799 permissionToTake = true; 1822 permissionToTake = true;
1800 permissionToTakeCopy = true; 1823 permissionToTakeCopy = true;
1801 permissionToDelete = true; 1824 permissionToDelete = true;
1802 } 1825 }
1803 1826
1804 // If we're re-saving, we don't even want to delete 1827 // If we're re-saving, we don't even want to delete
1805 if (action == DeRezAction.SaveToExistingUserInventoryItem) 1828 if (action == DeRezAction.SaveToExistingUserInventoryItem)
1806 permissionToDelete = false; 1829 permissionToDelete = false;
1807 1830
1808 // if we want to take a copy, we also don't want to delete 1831 // if we want to take a copy, we also don't want to delete
1809 // Note: after this point, the permissionToTakeCopy flag 1832 // Note: after this point, the permissionToTakeCopy flag
1810 // becomes irrelevant. It already includes the permissionToTake 1833 // becomes irrelevant. It already includes the permissionToTake
1811 // permission and after excluding no copy items here, we can 1834 // permission and after excluding no copy items here, we can
1812 // just use that. 1835 // just use that.
1813 if (action == DeRezAction.TakeCopy) 1836 if (action == DeRezAction.TakeCopy)
1814 { 1837 {
1815 // If we don't have permission, stop right here 1838 // If we don't have permission, stop right here
1816 if (!permissionToTakeCopy) 1839 if (!permissionToTakeCopy)
1817 return; 1840 return;
1818 1841
1819 permissionToTake = true; 1842 permissionToTake = true;
1820 // Don't delete 1843 // Don't delete
1821 permissionToDelete = false; 1844 permissionToDelete = false;
1822 } 1845 }
1823 1846
1824 if (action == DeRezAction.Return) 1847 if (action == DeRezAction.Return)
1825 {
1826 if (remoteClient != null)
1827 { 1848 {
1828 if (Permissions.CanReturnObjects( 1849 if (remoteClient != null)
1829 null,
1830 remoteClient.AgentId,
1831 deleteGroups))
1832 { 1850 {
1833 permissionToTake = true; 1851 if (Permissions.CanReturnObjects(
1834 permissionToDelete = true; 1852 null,
1835 1853 remoteClient.AgentId,
1836 foreach (SceneObjectGroup g in deleteGroups) 1854 deleteGroups))
1837 { 1855 {
1838 AddReturn(g.OwnerID, g.Name, g.AbsolutePosition, "parcel owner return"); 1856 permissionToTake = true;
1857 permissionToDelete = true;
1858
1859 AddReturn(grp.OwnerID, grp.Name, grp.AbsolutePosition, "parcel owner return");
1839 } 1860 }
1840 } 1861 }
1862 else // Auto return passes through here with null agent
1863 {
1864 permissionToTake = true;
1865 permissionToDelete = true;
1866 }
1841 } 1867 }
1842 else // Auto return passes through here with null agent 1868
1869 if (permissionToTake && (!permissionToDelete))
1870 takeGroups.Add(grp);
1871
1872 if (permissionToDelete)
1843 { 1873 {
1844 permissionToTake = true; 1874 if (permissionToTake)
1845 permissionToDelete = true; 1875 deleteGroups.Add(grp);
1876 deleteIDs.Add(grp.LocalId);
1846 } 1877 }
1847 } 1878 }
1848 1879
1849 if (permissionToTake) 1880 SendKillObject(deleteIDs);
1881
1882 if (deleteGroups.Count > 0)
1850 { 1883 {
1884 foreach (SceneObjectGroup g in deleteGroups)
1885 deleteIDs.Remove(g.LocalId);
1886
1851 m_asyncSceneObjectDeleter.DeleteToInventory( 1887 m_asyncSceneObjectDeleter.DeleteToInventory(
1852 action, destinationID, deleteGroups, remoteClient, 1888 action, destinationID, deleteGroups, remoteClient,
1853 permissionToDelete); 1889 true);
1890 }
1891 if (takeGroups.Count > 0)
1892 {
1893 m_asyncSceneObjectDeleter.DeleteToInventory(
1894 action, destinationID, takeGroups, remoteClient,
1895 false);
1854 } 1896 }
1855 else if (permissionToDelete) 1897 if (deleteIDs.Count > 0)
1856 { 1898 {
1857 foreach (SceneObjectGroup g in deleteGroups) 1899 foreach (SceneObjectGroup g in deleteGroups)
1858 DeleteSceneObject(g, false); 1900 DeleteSceneObject(g, true);
1859 } 1901 }
1860 } 1902 }
1861 1903
@@ -1907,21 +1949,29 @@ namespace OpenSim.Region.Framework.Scenes
1907 else // oopsies 1949 else // oopsies
1908 item.Folder = UUID.Zero; 1950 item.Folder = UUID.Zero;
1909 1951
1952 // Set up base perms properly
1953 uint permsBase = (uint)(PermissionMask.Move | PermissionMask.Copy | PermissionMask.Transfer | PermissionMask.Modify);
1954 permsBase &= grp.RootPart.BaseMask;
1955 permsBase |= (uint)PermissionMask.Move;
1956
1957 // Make sure we don't lock it
1958 grp.RootPart.NextOwnerMask |= (uint)PermissionMask.Move;
1959
1910 if ((remoteClient.AgentId != grp.RootPart.OwnerID) && Permissions.PropagatePermissions()) 1960 if ((remoteClient.AgentId != grp.RootPart.OwnerID) && Permissions.PropagatePermissions())
1911 { 1961 {
1912 item.BasePermissions = grp.RootPart.NextOwnerMask; 1962 item.BasePermissions = permsBase & grp.RootPart.NextOwnerMask;
1913 item.CurrentPermissions = grp.RootPart.NextOwnerMask; 1963 item.CurrentPermissions = permsBase & grp.RootPart.NextOwnerMask;
1914 item.NextPermissions = grp.RootPart.NextOwnerMask; 1964 item.NextPermissions = permsBase & grp.RootPart.NextOwnerMask;
1915 item.EveryOnePermissions = grp.RootPart.EveryoneMask & grp.RootPart.NextOwnerMask; 1965 item.EveryOnePermissions = permsBase & grp.RootPart.EveryoneMask & grp.RootPart.NextOwnerMask;
1916 item.GroupPermissions = grp.RootPart.GroupMask & grp.RootPart.NextOwnerMask; 1966 item.GroupPermissions = permsBase & grp.RootPart.GroupMask & grp.RootPart.NextOwnerMask;
1917 } 1967 }
1918 else 1968 else
1919 { 1969 {
1920 item.BasePermissions = grp.RootPart.BaseMask; 1970 item.BasePermissions = permsBase;
1921 item.CurrentPermissions = grp.RootPart.OwnerMask; 1971 item.CurrentPermissions = permsBase & grp.RootPart.OwnerMask;
1922 item.NextPermissions = grp.RootPart.NextOwnerMask; 1972 item.NextPermissions = permsBase & grp.RootPart.NextOwnerMask;
1923 item.EveryOnePermissions = grp.RootPart.EveryoneMask; 1973 item.EveryOnePermissions = permsBase & grp.RootPart.EveryoneMask;
1924 item.GroupPermissions = grp.RootPart.GroupMask; 1974 item.GroupPermissions = permsBase & grp.RootPart.GroupMask;
1925 } 1975 }
1926 item.CreationDate = Util.UnixTimeSinceEpoch(); 1976 item.CreationDate = Util.UnixTimeSinceEpoch();
1927 1977
@@ -2077,6 +2127,9 @@ namespace OpenSim.Region.Framework.Scenes
2077 2127
2078 public void SetScriptRunning(IClientAPI controllingClient, UUID objectID, UUID itemID, bool running) 2128 public void SetScriptRunning(IClientAPI controllingClient, UUID objectID, UUID itemID, bool running)
2079 { 2129 {
2130 if (!Permissions.CanEditScript(itemID, objectID, controllingClient.AgentId))
2131 return;
2132
2080 SceneObjectPart part = GetSceneObjectPart(objectID); 2133 SceneObjectPart part = GetSceneObjectPart(objectID);
2081 if (part == null) 2134 if (part == null)
2082 return; 2135 return;