diff options
author | Melanie | 2010-12-21 20:47:00 +0000 |
---|---|---|
committer | Melanie | 2010-12-21 20:47:00 +0000 |
commit | 2f84f2171fb7e17f6c336a4e6db9a04ad822704a (patch) | |
tree | 8e83f98605b7dbb30960d0aa5ecf64d0d800a0ad | |
parent | Merge branch 'master' into careminster-presence-refactor (diff) | |
download | opensim-SC-2f84f2171fb7e17f6c336a4e6db9a04ad822704a.zip opensim-SC-2f84f2171fb7e17f6c336a4e6db9a04ad822704a.tar.gz opensim-SC-2f84f2171fb7e17f6c336a4e6db9a04ad822704a.tar.bz2 opensim-SC-2f84f2171fb7e17f6c336a4e6db9a04ad822704a.tar.xz |
Make prim inventories a bit more sane
4 files changed, 39 insertions, 110 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..74b4e54 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,19 +949,34 @@ 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 | ||
981 | bool includeAssets = false; | ||
982 | if (m_part.ParentGroup.Scene.Permissions.CanEditObjectInventory(m_part.UUID, client.AgentId)) | ||
983 | includeAssets = true; | ||
984 | |||
985 | lock (m_items) | 956 | lock (m_items) |
986 | { | 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 | |||
976 | bool includeAssets = false; | ||
977 | if (m_part.ParentGroup.Scene.Permissions.CanEditObjectInventory(m_part.UUID, client.AgentId)) | ||
978 | includeAssets = true; | ||
979 | |||
987 | foreach (TaskInventoryItem item in m_items.Values) | 980 | foreach (TaskInventoryItem item in m_items.Values) |
988 | { | 981 | { |
989 | UUID ownerID = item.OwnerID; | 982 | UUID ownerID = item.OwnerID; |
@@ -1032,17 +1025,14 @@ namespace OpenSim.Region.Framework.Scenes | |||
1032 | invString.AddSectionEnd(); | 1025 | invString.AddSectionEnd(); |
1033 | } | 1026 | } |
1034 | } | 1027 | } |
1035 | int count = m_items.Count; | ||
1036 | m_items.LockItemsForRead(false); | ||
1037 | 1028 | ||
1038 | fileData = Utils.StringToBytes(invString.BuildString); | 1029 | int count = m_items.Count; |
1039 | 1030 | ||
1040 | //m_log.Debug(Utils.BytesToString(fileData)); | 1031 | m_inventoryFileData = Utils.StringToBytes(invString.BuildString); |
1041 | //m_log.Debug("[PRIM INVENTORY]: RequestInventoryFile fileData: " + Utils.BytesToString(fileData)); | ||
1042 | 1032 | ||
1043 | if (fileData.Length > 2) | 1033 | if (m_inventoryFileData.Length > 2) |
1044 | { | 1034 | { |
1045 | xferManager.AddNewFile(m_inventoryFileName, fileData); | 1035 | xferManager.AddNewFile(m_inventoryFileName, m_inventoryFileData); |
1046 | } | 1036 | } |
1047 | } | 1037 | } |
1048 | 1038 | ||