diff options
Diffstat (limited to 'OpenSim/Region')
4 files changed, 82 insertions, 154 deletions
diff --git a/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs b/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs index ed40da9..4b17b9a 100644 --- a/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs +++ b/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs | |||
@@ -196,13 +196,6 @@ namespace OpenSim.Region.Framework.Interfaces | |||
196 | int RemoveInventoryItem(UUID itemID); | 196 | int RemoveInventoryItem(UUID itemID); |
197 | 197 | ||
198 | /// <summary> | 198 | /// <summary> |
199 | /// Return the name with which a client can request a xfer of this prim's inventory metadata | ||
200 | /// </summary> | ||
201 | string GetInventoryFileName(); | ||
202 | |||
203 | bool GetInventoryFileName(IClientAPI client, uint localID); | ||
204 | |||
205 | /// <summary> | ||
206 | /// Serialize all the metadata for the items in this prim's inventory ready for sending to the client | 199 | /// Serialize all the metadata for the items in this prim's inventory ready for sending to the client |
207 | /// </summary> | 200 | /// </summary> |
208 | /// <param name="xferManager"></param> | 201 | /// <param name="xferManager"></param> |
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs index a1f1ea5..47c574a 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | |||
@@ -951,23 +951,12 @@ namespace OpenSim.Region.Framework.Scenes | |||
951 | /// <param name="primLocalID"></param> | 951 | /// <param name="primLocalID"></param> |
952 | public void RequestTaskInventory(IClientAPI remoteClient, uint primLocalID) | 952 | public void RequestTaskInventory(IClientAPI remoteClient, uint primLocalID) |
953 | { | 953 | { |
954 | SceneObjectGroup group = GetGroupByPrim(primLocalID); | 954 | SceneObjectPart part = GetSceneObjectPart(primLocalID); |
955 | if (group != null) | 955 | if (part == null) |
956 | { | 956 | return; |
957 | bool fileChange = group.GetPartInventoryFileName(remoteClient, primLocalID); | 957 | |
958 | if (fileChange) | 958 | if (XferManager != null) |
959 | { | 959 | part.Inventory.RequestInventoryFile(remoteClient, XferManager); |
960 | if (XferManager != null) | ||
961 | { | ||
962 | group.RequestInventoryFile(remoteClient, primLocalID, XferManager); | ||
963 | } | ||
964 | } | ||
965 | } | ||
966 | else | ||
967 | { | ||
968 | m_log.ErrorFormat( | ||
969 | "[PRIM INVENTORY]: Inventory requested of prim {0} which doesn't exist", primLocalID); | ||
970 | } | ||
971 | } | 960 | } |
972 | 961 | ||
973 | /// <summary> | 962 | /// <summary> |
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.Inventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.Inventory.cs index 6cc7231..50521c4 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.Inventory.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.Inventory.cs | |||
@@ -77,49 +77,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
77 | } | 77 | } |
78 | 78 | ||
79 | /// <summary> | 79 | /// <summary> |
80 | /// | ||
81 | /// </summary> | ||
82 | /// <param name="remoteClient"></param> | ||
83 | /// <param name="localID"></param> | ||
84 | public bool GetPartInventoryFileName(IClientAPI remoteClient, uint localID) | ||
85 | { | ||
86 | SceneObjectPart part = GetChildPart(localID); | ||
87 | if (part != null) | ||
88 | { | ||
89 | return part.Inventory.GetInventoryFileName(remoteClient, localID); | ||
90 | } | ||
91 | else | ||
92 | { | ||
93 | m_log.ErrorFormat( | ||
94 | "[PRIM INVENTORY]: " + | ||
95 | "Couldn't find part {0} in object group {1}, {2} to retreive prim inventory", | ||
96 | localID, Name, UUID); | ||
97 | } | ||
98 | return false; | ||
99 | } | ||
100 | |||
101 | /// <summary> | ||
102 | /// Return serialized inventory metadata for the given constituent prim | ||
103 | /// </summary> | ||
104 | /// <param name="localID"></param> | ||
105 | /// <param name="xferManager"></param> | ||
106 | public void RequestInventoryFile(IClientAPI client, uint localID, IXfer xferManager) | ||
107 | { | ||
108 | SceneObjectPart part = GetChildPart(localID); | ||
109 | if (part != null) | ||
110 | { | ||
111 | part.Inventory.RequestInventoryFile(client, xferManager); | ||
112 | } | ||
113 | else | ||
114 | { | ||
115 | m_log.ErrorFormat( | ||
116 | "[PRIM INVENTORY]: " + | ||
117 | "Couldn't find part {0} in object group {1}, {2} to request inventory data", | ||
118 | localID, Name, UUID); | ||
119 | } | ||
120 | } | ||
121 | |||
122 | /// <summary> | ||
123 | /// Add an inventory item to a prim in this group. | 80 | /// Add an inventory item to a prim in this group. |
124 | /// </summary> | 81 | /// </summary> |
125 | /// <param name="remoteClient"></param> | 82 | /// <param name="remoteClient"></param> |
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs index 8fcfcc5..8ec9d55 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs | |||
@@ -46,6 +46,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
46 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 46 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
47 | 47 | ||
48 | private string m_inventoryFileName = String.Empty; | 48 | private string m_inventoryFileName = String.Empty; |
49 | private byte[] m_inventoryFileData = new byte[0]; | ||
49 | private int m_inventoryFileNameSerial = 0; | 50 | private int m_inventoryFileNameSerial = 0; |
50 | 51 | ||
51 | private Dictionary<UUID, ArrayList> m_scriptErrors = new Dictionary<UUID, ArrayList>(); | 52 | private Dictionary<UUID, ArrayList> m_scriptErrors = new Dictionary<UUID, ArrayList>(); |
@@ -930,39 +931,16 @@ namespace OpenSim.Region.Framework.Scenes | |||
930 | return -1; | 931 | return -1; |
931 | } | 932 | } |
932 | 933 | ||
933 | public string GetInventoryFileName() | 934 | private bool CreateInventoryFileName() |
934 | { | 935 | { |
935 | if (m_inventoryFileName == String.Empty) | 936 | if (m_inventoryFileName == String.Empty || |
936 | m_inventoryFileName = "inventory_" + UUID.Random().ToString() + ".tmp"; | 937 | m_inventoryFileNameSerial < m_inventorySerial) |
937 | if (m_inventoryFileNameSerial < m_inventorySerial) | ||
938 | { | 938 | { |
939 | m_inventoryFileName = "inventory_" + UUID.Random().ToString() + ".tmp"; | 939 | m_inventoryFileName = "inventory_" + UUID.Random().ToString() + ".tmp"; |
940 | } | ||
941 | return m_inventoryFileName; | ||
942 | } | ||
943 | |||
944 | /// <summary> | ||
945 | /// Return the name with which a client can request a xfer of this prim's inventory metadata | ||
946 | /// </summary> | ||
947 | /// <param name="client"></param> | ||
948 | /// <param name="localID"></param> | ||
949 | public bool GetInventoryFileName(IClientAPI client, uint localID) | ||
950 | { | ||
951 | // m_log.DebugFormat( | ||
952 | // "[PRIM INVENTORY]: Received request from client {0} for inventory file name of {1}, {2}", | ||
953 | // client.AgentId, Name, UUID); | ||
954 | |||
955 | if (m_inventorySerial > 0) | ||
956 | { | ||
957 | client.SendTaskInventory(m_part.UUID, (short)m_inventorySerial, | ||
958 | Utils.StringToBytes(GetInventoryFileName())); | ||
959 | return true; | 940 | return true; |
960 | } | 941 | } |
961 | else | 942 | |
962 | { | 943 | return false; |
963 | client.SendTaskInventory(m_part.UUID, 0, new byte[0]); | ||
964 | return false; | ||
965 | } | ||
966 | } | 944 | } |
967 | 945 | ||
968 | /// <summary> | 946 | /// <summary> |
@@ -971,78 +949,89 @@ namespace OpenSim.Region.Framework.Scenes | |||
971 | /// <param name="xferManager"></param> | 949 | /// <param name="xferManager"></param> |
972 | public void RequestInventoryFile(IClientAPI client, IXfer xferManager) | 950 | public void RequestInventoryFile(IClientAPI client, IXfer xferManager) |
973 | { | 951 | { |
974 | byte[] fileData = new byte[0]; | 952 | bool changed = CreateInventoryFileName(); |
975 | 953 | ||
976 | // Confusingly, the folder item has to be the object id, while the 'parent id' has to be zero. This matches | ||
977 | // what appears to happen in the Second Life protocol. If this isn't the case. then various functionality | ||
978 | // isn't available (such as drag from prim inventory to agent inventory) | ||
979 | InventoryStringBuilder invString = new InventoryStringBuilder(m_part.UUID, UUID.Zero); | 954 | InventoryStringBuilder invString = new InventoryStringBuilder(m_part.UUID, UUID.Zero); |
980 | 955 | ||
956 | Items.LockItemsForRead(true); | ||
957 | |||
958 | if (m_inventorySerial == 0) // No inventory | ||
959 | { | ||
960 | client.SendTaskInventory(m_part.UUID, 0, new byte[0]); | ||
961 | return; | ||
962 | } | ||
963 | |||
964 | client.SendTaskInventory(m_part.UUID, (short)m_inventorySerial, | ||
965 | Util.StringToBytes256(m_inventoryFileName)); | ||
966 | |||
967 | if (!changed) | ||
968 | { | ||
969 | if (m_inventoryFileData.Length > 2) | ||
970 | { | ||
971 | xferManager.AddNewFile(m_inventoryFileName, | ||
972 | m_inventoryFileData); | ||
973 | } | ||
974 | } | ||
975 | |||
981 | bool includeAssets = false; | 976 | bool includeAssets = false; |
982 | if (m_part.ParentGroup.Scene.Permissions.CanEditObjectInventory(m_part.UUID, client.AgentId)) | 977 | if (m_part.ParentGroup.Scene.Permissions.CanEditObjectInventory(m_part.UUID, client.AgentId)) |
983 | includeAssets = true; | 978 | includeAssets = true; |
984 | 979 | ||
985 | lock (m_items) | 980 | foreach (TaskInventoryItem item in m_items.Values) |
986 | { | 981 | { |
987 | foreach (TaskInventoryItem item in m_items.Values) | 982 | UUID ownerID = item.OwnerID; |
988 | { | 983 | uint everyoneMask = 0; |
989 | UUID ownerID = item.OwnerID; | 984 | uint baseMask = item.BasePermissions; |
990 | uint everyoneMask = 0; | 985 | uint ownerMask = item.CurrentPermissions; |
991 | uint baseMask = item.BasePermissions; | 986 | uint groupMask = item.GroupPermissions; |
992 | uint ownerMask = item.CurrentPermissions; | 987 | |
993 | uint groupMask = item.GroupPermissions; | 988 | invString.AddItemStart(); |
994 | 989 | invString.AddNameValueLine("item_id", item.ItemID.ToString()); | |
995 | invString.AddItemStart(); | 990 | invString.AddNameValueLine("parent_id", m_part.UUID.ToString()); |
996 | invString.AddNameValueLine("item_id", item.ItemID.ToString()); | 991 | |
997 | invString.AddNameValueLine("parent_id", m_part.UUID.ToString()); | 992 | invString.AddPermissionsStart(); |
998 | 993 | ||
999 | invString.AddPermissionsStart(); | 994 | invString.AddNameValueLine("base_mask", Utils.UIntToHexString(baseMask)); |
1000 | 995 | invString.AddNameValueLine("owner_mask", Utils.UIntToHexString(ownerMask)); | |
1001 | invString.AddNameValueLine("base_mask", Utils.UIntToHexString(baseMask)); | 996 | invString.AddNameValueLine("group_mask", Utils.UIntToHexString(groupMask)); |
1002 | invString.AddNameValueLine("owner_mask", Utils.UIntToHexString(ownerMask)); | 997 | invString.AddNameValueLine("everyone_mask", Utils.UIntToHexString(everyoneMask)); |
1003 | invString.AddNameValueLine("group_mask", Utils.UIntToHexString(groupMask)); | 998 | invString.AddNameValueLine("next_owner_mask", Utils.UIntToHexString(item.NextPermissions)); |
1004 | invString.AddNameValueLine("everyone_mask", Utils.UIntToHexString(everyoneMask)); | 999 | |
1005 | invString.AddNameValueLine("next_owner_mask", Utils.UIntToHexString(item.NextPermissions)); | 1000 | invString.AddNameValueLine("creator_id", item.CreatorID.ToString()); |
1006 | 1001 | invString.AddNameValueLine("owner_id", ownerID.ToString()); | |
1007 | invString.AddNameValueLine("creator_id", item.CreatorID.ToString()); | 1002 | |
1008 | invString.AddNameValueLine("owner_id", ownerID.ToString()); | 1003 | invString.AddNameValueLine("last_owner_id", item.LastOwnerID.ToString()); |
1009 | 1004 | ||
1010 | invString.AddNameValueLine("last_owner_id", item.LastOwnerID.ToString()); | 1005 | invString.AddNameValueLine("group_id", item.GroupID.ToString()); |
1011 | 1006 | invString.AddSectionEnd(); | |
1012 | invString.AddNameValueLine("group_id", item.GroupID.ToString()); | 1007 | |
1013 | invString.AddSectionEnd(); | 1008 | if (includeAssets) |
1014 | 1009 | invString.AddNameValueLine("asset_id", item.AssetID.ToString()); | |
1015 | if (includeAssets) | 1010 | else |
1016 | invString.AddNameValueLine("asset_id", item.AssetID.ToString()); | 1011 | invString.AddNameValueLine("asset_id", UUID.Zero.ToString()); |
1017 | else | 1012 | invString.AddNameValueLine("type", TaskInventoryItem.Types[item.Type]); |
1018 | invString.AddNameValueLine("asset_id", UUID.Zero.ToString()); | 1013 | invString.AddNameValueLine("inv_type", TaskInventoryItem.InvTypes[item.InvType]); |
1019 | invString.AddNameValueLine("type", TaskInventoryItem.Types[item.Type]); | 1014 | invString.AddNameValueLine("flags", Utils.UIntToHexString(item.Flags)); |
1020 | invString.AddNameValueLine("inv_type", TaskInventoryItem.InvTypes[item.InvType]); | 1015 | |
1021 | invString.AddNameValueLine("flags", Utils.UIntToHexString(item.Flags)); | 1016 | invString.AddSaleStart(); |
1022 | 1017 | invString.AddNameValueLine("sale_type", "not"); | |
1023 | invString.AddSaleStart(); | 1018 | invString.AddNameValueLine("sale_price", "0"); |
1024 | invString.AddNameValueLine("sale_type", "not"); | 1019 | invString.AddSectionEnd(); |
1025 | invString.AddNameValueLine("sale_price", "0"); | 1020 | |
1026 | invString.AddSectionEnd(); | 1021 | invString.AddNameValueLine("name", item.Name + "|"); |
1027 | 1022 | invString.AddNameValueLine("desc", item.Description + "|"); | |
1028 | invString.AddNameValueLine("name", item.Name + "|"); | 1023 | |
1029 | invString.AddNameValueLine("desc", item.Description + "|"); | 1024 | invString.AddNameValueLine("creation_date", item.CreationDate.ToString()); |
1030 | 1025 | invString.AddSectionEnd(); | |
1031 | invString.AddNameValueLine("creation_date", item.CreationDate.ToString()); | ||
1032 | invString.AddSectionEnd(); | ||
1033 | } | ||
1034 | } | 1026 | } |
1035 | int count = m_items.Count; | ||
1036 | m_items.LockItemsForRead(false); | ||
1037 | 1027 | ||
1038 | fileData = Utils.StringToBytes(invString.BuildString); | 1028 | Items.LockItemsForRead(false); |
1039 | 1029 | ||
1040 | //m_log.Debug(Utils.BytesToString(fileData)); | 1030 | m_inventoryFileData = Utils.StringToBytes(invString.BuildString); |
1041 | //m_log.Debug("[PRIM INVENTORY]: RequestInventoryFile fileData: " + Utils.BytesToString(fileData)); | ||
1042 | 1031 | ||
1043 | if (fileData.Length > 2) | 1032 | if (m_inventoryFileData.Length > 2) |
1044 | { | 1033 | { |
1045 | xferManager.AddNewFile(m_inventoryFileName, fileData); | 1034 | xferManager.AddNewFile(m_inventoryFileName, m_inventoryFileData); |
1046 | } | 1035 | } |
1047 | } | 1036 | } |
1048 | 1037 | ||