diff options
author | Justin Clarke Casey | 2008-04-11 18:13:10 +0000 |
---|---|---|
committer | Justin Clarke Casey | 2008-04-11 18:13:10 +0000 |
commit | a5176c2e2c4d2791ec15a22db4309bb15bc3ae98 (patch) | |
tree | bbadbbd793ebda546831e9541e312d480d5dae0c | |
parent | * fix bug 935 (diff) | |
download | opensim-SC_OLD-a5176c2e2c4d2791ec15a22db4309bb15bc3ae98.zip opensim-SC_OLD-a5176c2e2c4d2791ec15a22db4309bb15bc3ae98.tar.gz opensim-SC_OLD-a5176c2e2c4d2791ec15a22db4309bb15bc3ae98.tar.bz2 opensim-SC_OLD-a5176c2e2c4d2791ec15a22db4309bb15bc3ae98.tar.xz |
* Change inventory async response deliver to deliver all items and folders at once, rather than each individual
* This is required in order to work towards eliminating some inventory race conditions and to better deal with situations where a grid inventory server is slow or not responding.
8 files changed, 151 insertions, 89 deletions
diff --git a/OpenSim/Framework/Communications/Cache/CachedUserInfo.cs b/OpenSim/Framework/Communications/Cache/CachedUserInfo.cs index 1208605..cf701cb 100644 --- a/OpenSim/Framework/Communications/Cache/CachedUserInfo.cs +++ b/OpenSim/Framework/Communications/Cache/CachedUserInfo.cs | |||
@@ -118,64 +118,82 @@ namespace OpenSim.Framework.Communications.Cache | |||
118 | } | 118 | } |
119 | } | 119 | } |
120 | } | 120 | } |
121 | 121 | ||
122 | /// <summary> | 122 | /// <summary> |
123 | /// Callback invoked when a folder is received from an async request to the inventory service. | 123 | /// Callback invoked when the inventory is received from an async request to the inventory service |
124 | /// </summary> | 124 | /// </summary> |
125 | /// <param name="userID"></param> | 125 | /// <param name="userID"></param> |
126 | /// <param name="folderInfo"></param> | 126 | /// <param name="inventoryCollection"></param> |
127 | public void FolderReceive(LLUUID userID, InventoryFolderImpl folderInfo) | 127 | public void InventoryReceive(LLUUID userID, ICollection<InventoryFolderImpl> folders, ICollection<InventoryItemBase> items) |
128 | { | 128 | { |
129 | // FIXME: Exceptions thrown upwards never appear on the console. Could fix further up if these | 129 | // FIXME: Exceptions thrown upwards never appear on the console. Could fix further up if these |
130 | // are simply being swallowed | 130 | // are simply being swallowed |
131 | try | 131 | try |
132 | { | ||
133 | foreach (InventoryFolderImpl folder in folders) | ||
134 | { | ||
135 | FolderReceive(userID, folder); | ||
136 | } | ||
137 | |||
138 | foreach (InventoryItemBase item in items) | ||
139 | { | ||
140 | ItemReceive(userID, item); | ||
141 | } | ||
142 | } | ||
143 | catch (Exception e) | ||
132 | { | 144 | { |
145 | m_log.ErrorFormat("[INVENTORY CACHE]: {0}", e); | ||
146 | } | ||
147 | } | ||
148 | |||
149 | /// <summary> | ||
150 | /// Callback invoked when a folder is received from an async request to the inventory service. | ||
151 | /// </summary> | ||
152 | /// <param name="userID"></param> | ||
153 | /// <param name="folderInfo"></param> | ||
154 | private void FolderReceive(LLUUID userID, InventoryFolderImpl folderInfo) | ||
155 | { | ||
133 | // m_log.DebugFormat( | 156 | // m_log.DebugFormat( |
134 | // "[INVENTORY CACHE]: Received folder {0} {1} for user {2}", | 157 | // "[INVENTORY CACHE]: Received folder {0} {1} for user {2}", |
135 | // folderInfo.name, folderInfo.folderID, userID); | 158 | // folderInfo.name, folderInfo.folderID, userID); |
136 | 159 | ||
137 | if (userID == UserProfile.ID) | 160 | if (userID == UserProfile.ID) |
161 | { | ||
162 | if (RootFolder == null) | ||
138 | { | 163 | { |
139 | if (RootFolder == null) | 164 | if (folderInfo.ParentID == LLUUID.Zero) |
140 | { | 165 | { |
141 | if (folderInfo.ParentID == LLUUID.Zero) | 166 | m_rootFolder = folderInfo; |
142 | { | ||
143 | m_rootFolder = folderInfo; | ||
144 | } | ||
145 | } | 167 | } |
146 | else if (RootFolder.ID == folderInfo.ParentID) | 168 | } |
169 | else if (RootFolder.ID == folderInfo.ParentID) | ||
170 | { | ||
171 | if (!RootFolder.SubFolders.ContainsKey(folderInfo.ID)) | ||
147 | { | 172 | { |
148 | if (!RootFolder.SubFolders.ContainsKey(folderInfo.ID)) | 173 | RootFolder.SubFolders.Add(folderInfo.ID, folderInfo); |
149 | { | ||
150 | RootFolder.SubFolders.Add(folderInfo.ID, folderInfo); | ||
151 | } | ||
152 | else | ||
153 | { | ||
154 | AddPendingFolder(folderInfo); | ||
155 | } | ||
156 | } | 174 | } |
157 | else | 175 | else |
158 | { | 176 | { |
159 | InventoryFolderImpl folder = RootFolder.HasSubFolder(folderInfo.ParentID); | 177 | AddPendingFolder(folderInfo); |
160 | if (folder != null) | 178 | } |
161 | { | 179 | } |
162 | if (!folder.SubFolders.ContainsKey(folderInfo.ID)) | 180 | else |
163 | { | 181 | { |
164 | folder.SubFolders.Add(folderInfo.ID, folderInfo); | 182 | InventoryFolderImpl folder = RootFolder.HasSubFolder(folderInfo.ParentID); |
165 | } | 183 | if (folder != null) |
166 | } | 184 | { |
167 | else | 185 | if (!folder.SubFolders.ContainsKey(folderInfo.ID)) |
168 | { | 186 | { |
169 | AddPendingFolder(folderInfo); | 187 | folder.SubFolders.Add(folderInfo.ID, folderInfo); |
170 | } | 188 | } |
171 | } | 189 | } |
172 | 190 | else | |
173 | ResolvePendingFolders(folderInfo); | 191 | { |
192 | AddPendingFolder(folderInfo); | ||
193 | } | ||
174 | } | 194 | } |
175 | } | 195 | |
176 | catch (Exception e) | 196 | ResolvePendingFolders(folderInfo); |
177 | { | ||
178 | m_log.ErrorFormat("[INVENTORY CACHE] {0}", e); | ||
179 | } | 197 | } |
180 | } | 198 | } |
181 | 199 | ||
@@ -187,7 +205,7 @@ namespace OpenSim.Framework.Communications.Cache | |||
187 | /// </summary> | 205 | /// </summary> |
188 | /// <param name="userID"></param> | 206 | /// <param name="userID"></param> |
189 | /// <param name="folderInfo"></param> | 207 | /// <param name="folderInfo"></param> |
190 | public void ItemReceive(LLUUID userID, InventoryItemBase itemInfo) | 208 | private void ItemReceive(LLUUID userID, InventoryItemBase itemInfo) |
191 | { | 209 | { |
192 | if ((userID == UserProfile.ID) && (RootFolder != null)) | 210 | if ((userID == UserProfile.ID) && (RootFolder != null)) |
193 | { | 211 | { |
@@ -212,6 +230,11 @@ namespace OpenSim.Framework.Communications.Cache | |||
212 | } | 230 | } |
213 | } | 231 | } |
214 | 232 | ||
233 | /// <summary> | ||
234 | /// Add an item to the user's inventory | ||
235 | /// </summary> | ||
236 | /// <param name="userID"></param> | ||
237 | /// <param name="itemInfo"></param> | ||
215 | public void AddItem(LLUUID userID, InventoryItemBase itemInfo) | 238 | public void AddItem(LLUUID userID, InventoryItemBase itemInfo) |
216 | { | 239 | { |
217 | if ((userID == UserProfile.ID) && HasInventory) | 240 | if ((userID == UserProfile.ID) && HasInventory) |
@@ -221,6 +244,11 @@ namespace OpenSim.Framework.Communications.Cache | |||
221 | } | 244 | } |
222 | } | 245 | } |
223 | 246 | ||
247 | /// <summary> | ||
248 | /// Update an item in the user's inventory | ||
249 | /// </summary> | ||
250 | /// <param name="userID"></param> | ||
251 | /// <param name="itemInfo"></param> | ||
224 | public void UpdateItem(LLUUID userID, InventoryItemBase itemInfo) | 252 | public void UpdateItem(LLUUID userID, InventoryItemBase itemInfo) |
225 | { | 253 | { |
226 | if ((userID == UserProfile.ID) && HasInventory) | 254 | if ((userID == UserProfile.ID) && HasInventory) |
@@ -229,6 +257,12 @@ namespace OpenSim.Framework.Communications.Cache | |||
229 | } | 257 | } |
230 | } | 258 | } |
231 | 259 | ||
260 | /// <summary> | ||
261 | /// Delete an item from the user's inventory | ||
262 | /// </summary> | ||
263 | /// <param name="userID"></param> | ||
264 | /// <param name="item"></param> | ||
265 | /// <returns></returns> | ||
232 | public bool DeleteItem(LLUUID userID, InventoryItemBase item) | 266 | public bool DeleteItem(LLUUID userID, InventoryItemBase item) |
233 | { | 267 | { |
234 | bool result = false; | 268 | bool result = false; |
@@ -240,6 +274,7 @@ namespace OpenSim.Framework.Communications.Cache | |||
240 | m_commsManager.InventoryService.DeleteInventoryItem(userID, item); | 274 | m_commsManager.InventoryService.DeleteInventoryItem(userID, item); |
241 | } | 275 | } |
242 | } | 276 | } |
277 | |||
243 | return result; | 278 | return result; |
244 | } | 279 | } |
245 | } | 280 | } |
diff --git a/OpenSim/Framework/Communications/Cache/UserProfileCacheService.cs b/OpenSim/Framework/Communications/Cache/UserProfileCacheService.cs index b924d5c..6b09e01 100644 --- a/OpenSim/Framework/Communications/Cache/UserProfileCacheService.cs +++ b/OpenSim/Framework/Communications/Cache/UserProfileCacheService.cs | |||
@@ -97,7 +97,7 @@ namespace OpenSim.Framework.Communications.Cache | |||
97 | CachedUserInfo userInfo = GetUserDetails(userID); | 97 | CachedUserInfo userInfo = GetUserDetails(userID); |
98 | if (userInfo != null) | 98 | if (userInfo != null) |
99 | { | 99 | { |
100 | m_commsManager.InventoryService.RequestInventoryForUser(userID, userInfo.FolderReceive, userInfo.ItemReceive); | 100 | m_commsManager.InventoryService.RequestInventoryForUser(userID, userInfo.InventoryReceive); |
101 | } | 101 | } |
102 | else | 102 | else |
103 | { | 103 | { |
@@ -118,6 +118,14 @@ namespace OpenSim.Framework.Communications.Cache | |||
118 | return null; | 118 | return null; |
119 | } | 119 | } |
120 | 120 | ||
121 | /// <summary> | ||
122 | /// Handle an inventory folder creation request from the client. | ||
123 | /// </summary> | ||
124 | /// <param name="remoteClient"></param> | ||
125 | /// <param name="folderID"></param> | ||
126 | /// <param name="folderType"></param> | ||
127 | /// <param name="folderName"></param> | ||
128 | /// <param name="parentID"></param> | ||
121 | public void HandleCreateInventoryFolder(IClientAPI remoteClient, LLUUID folderID, ushort folderType, | 129 | public void HandleCreateInventoryFolder(IClientAPI remoteClient, LLUUID folderID, ushort folderType, |
122 | string folderName, LLUUID parentID) | 130 | string folderName, LLUUID parentID) |
123 | { | 131 | { |
@@ -189,6 +197,12 @@ namespace OpenSim.Framework.Communications.Cache | |||
189 | } | 197 | } |
190 | } | 198 | } |
191 | 199 | ||
200 | /// <summary> | ||
201 | /// Handle an inventory folder move request from the client. | ||
202 | /// </summary> | ||
203 | /// <param name="remoteClient"></param> | ||
204 | /// <param name="folderID"></param> | ||
205 | /// <param name="parentID"></param> | ||
192 | public void HandleMoveInventoryFolder(IClientAPI remoteClient, LLUUID folderID, LLUUID parentID) | 206 | public void HandleMoveInventoryFolder(IClientAPI remoteClient, LLUUID folderID, LLUUID parentID) |
193 | { | 207 | { |
194 | CachedUserInfo userProfile; | 208 | CachedUserInfo userProfile; |
diff --git a/OpenSim/Framework/Communications/IInventoryServices.cs b/OpenSim/Framework/Communications/IInventoryServices.cs index ecc6c71..40e7ffd 100644 --- a/OpenSim/Framework/Communications/IInventoryServices.cs +++ b/OpenSim/Framework/Communications/IInventoryServices.cs | |||
@@ -26,21 +26,34 @@ | |||
26 | */ | 26 | */ |
27 | 27 | ||
28 | using System.Collections.Generic; | 28 | using System.Collections.Generic; |
29 | |||
29 | using libsecondlife; | 30 | using libsecondlife; |
31 | |||
30 | using OpenSim.Framework.Communications.Cache; | 32 | using OpenSim.Framework.Communications.Cache; |
31 | 33 | ||
32 | namespace OpenSim.Framework.Communications | 34 | namespace OpenSim.Framework.Communications |
33 | { | 35 | { |
34 | public delegate void InventoryFolderInfo(LLUUID userID, InventoryFolderImpl folderInfo); | 36 | /// <summary> |
37 | /// Callback used when a user's inventory is received from the inventory service | ||
38 | /// </summary> | ||
39 | public delegate void InventoryReceiptCallback(LLUUID userId, ICollection<InventoryFolderImpl> folders, ICollection<InventoryItemBase> items); | ||
40 | |||
41 | //public delegate void InventoryFolderInfo(LLUUID userID, InventoryFolderImpl folderInfo); | ||
35 | 42 | ||
36 | public delegate void InventoryItemInfo(LLUUID userID, InventoryItemBase itemInfo); | 43 | //public delegate void InventoryItemInfo(LLUUID userID, InventoryItemBase itemInfo); |
37 | 44 | ||
38 | /// <summary> | 45 | /// <summary> |
39 | /// Defines all the operations one can perform on a user's inventory. | 46 | /// Defines all the operations one can perform on a user's inventory. |
40 | /// </summary> | 47 | /// </summary> |
41 | public interface IInventoryServices | 48 | public interface IInventoryServices |
42 | { | 49 | { |
43 | void RequestInventoryForUser(LLUUID userID, InventoryFolderInfo folderCallBack, InventoryItemInfo itemCallBack); | 50 | /// <summary> |
51 | /// Request the inventory for a user. This is an asynchronous operation that will call the callback when the | ||
52 | /// inventory has been received | ||
53 | /// </summary> | ||
54 | /// <param name="userID"></param> | ||
55 | /// <param name="callback"></param> | ||
56 | void RequestInventoryForUser(LLUUID userID, InventoryReceiptCallback callback); | ||
44 | 57 | ||
45 | /// <summary> | 58 | /// <summary> |
46 | /// Add a new folder to the given user's inventory | 59 | /// Add a new folder to the given user's inventory |
diff --git a/OpenSim/Framework/Communications/InventoryServiceBase.cs b/OpenSim/Framework/Communications/InventoryServiceBase.cs index e50e19e..aedf4b3 100644 --- a/OpenSim/Framework/Communications/InventoryServiceBase.cs +++ b/OpenSim/Framework/Communications/InventoryServiceBase.cs | |||
@@ -158,8 +158,9 @@ namespace OpenSim.Framework.Communications | |||
158 | return false; | 158 | return false; |
159 | } | 159 | } |
160 | 160 | ||
161 | public abstract void RequestInventoryForUser(LLUUID userID, InventoryFolderInfo folderCallBack, | 161 | // See IInventoryServices |
162 | InventoryItemInfo itemCallBack); | 162 | public abstract void RequestInventoryForUser(LLUUID userID, InventoryReceiptCallback callback); |
163 | |||
163 | public abstract void AddNewInventoryFolder(LLUUID userID, InventoryFolderBase folder); | 164 | public abstract void AddNewInventoryFolder(LLUUID userID, InventoryFolderBase folder); |
164 | public abstract void MoveExistingInventoryFolder(InventoryFolderBase folder); | 165 | public abstract void MoveExistingInventoryFolder(InventoryFolderBase folder); |
165 | public abstract void AddNewInventoryItem(LLUUID userID, InventoryItemBase item); | 166 | public abstract void AddNewInventoryItem(LLUUID userID, InventoryItemBase item); |
diff --git a/OpenSim/Framework/InventoryCollection.cs b/OpenSim/Framework/InventoryCollection.cs index c8d8716..e76e1a9 100644 --- a/OpenSim/Framework/InventoryCollection.cs +++ b/OpenSim/Framework/InventoryCollection.cs | |||
@@ -32,6 +32,9 @@ using libsecondlife; | |||
32 | 32 | ||
33 | namespace OpenSim.Framework | 33 | namespace OpenSim.Framework |
34 | { | 34 | { |
35 | /// <summary> | ||
36 | /// Used to serialize a whole inventory for transfer over the network. | ||
37 | /// </summary> | ||
35 | public class InventoryCollection | 38 | public class InventoryCollection |
36 | { | 39 | { |
37 | public List<InventoryFolderBase> _folders; | 40 | public List<InventoryFolderBase> _folders; |
diff --git a/OpenSim/Grid/InventoryServer/GridInventoryService.cs b/OpenSim/Grid/InventoryServer/GridInventoryService.cs index 1ae5243..72d43d4 100644 --- a/OpenSim/Grid/InventoryServer/GridInventoryService.cs +++ b/OpenSim/Grid/InventoryServer/GridInventoryService.cs | |||
@@ -41,8 +41,7 @@ namespace OpenSim.Grid.InventoryServer | |||
41 | { | 41 | { |
42 | private static readonly log4net.ILog m_log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); | 42 | private static readonly log4net.ILog m_log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); |
43 | 43 | ||
44 | public override void RequestInventoryForUser(LLUUID userID, InventoryFolderInfo folderCallBack, | 44 | public override void RequestInventoryForUser(LLUUID userID, InventoryReceiptCallback callback) |
45 | InventoryItemInfo itemCallBack) | ||
46 | { | 45 | { |
47 | } | 46 | } |
48 | 47 | ||
diff --git a/OpenSim/Region/Communications/Local/LocalInventoryService.cs b/OpenSim/Region/Communications/Local/LocalInventoryService.cs index bb3db9d..13cb6de 100644 --- a/OpenSim/Region/Communications/Local/LocalInventoryService.cs +++ b/OpenSim/Region/Communications/Local/LocalInventoryService.cs | |||
@@ -39,32 +39,38 @@ namespace OpenSim.Region.Communications.Local | |||
39 | /// </summary> | 39 | /// </summary> |
40 | public class LocalInventoryService : InventoryServiceBase | 40 | public class LocalInventoryService : InventoryServiceBase |
41 | { | 41 | { |
42 | public override void RequestInventoryForUser(LLUUID userID, InventoryFolderInfo folderCallBack, | 42 | public override void RequestInventoryForUser(LLUUID userID, InventoryReceiptCallback callback) |
43 | InventoryItemInfo itemCallBack) | ||
44 | { | 43 | { |
45 | List<InventoryFolderBase> folders = GetInventorySkeleton(userID); | 44 | List<InventoryFolderBase> skeletonFolders = GetInventorySkeleton(userID); |
46 | |||
47 | InventoryFolderImpl rootFolder = null; | 45 | InventoryFolderImpl rootFolder = null; |
46 | |||
47 | ICollection<InventoryFolderImpl> folders = new List<InventoryFolderImpl>(); | ||
48 | ICollection<InventoryItemBase> items = new List<InventoryItemBase>(); | ||
48 | 49 | ||
49 | //need to make sure we send root folder first | 50 | // Need to retrieve the root folder on the first pass |
50 | foreach (InventoryFolderBase folder in folders) | 51 | foreach (InventoryFolderBase folder in skeletonFolders) |
51 | { | 52 | { |
52 | if (folder.ParentID == LLUUID.Zero) | 53 | if (folder.ParentID == LLUUID.Zero) |
53 | { | 54 | { |
54 | rootFolder = RequestInventoryFolder(userID, folder, folderCallBack, itemCallBack); | 55 | //rootFolder = RequestInventoryFolder(userID, folder, callback); |
56 | rootFolder = new InventoryFolderImpl(folder); | ||
57 | folders.Add(rootFolder); | ||
55 | } | 58 | } |
56 | } | 59 | } |
57 | 60 | ||
58 | if (rootFolder != null) | 61 | if (rootFolder != null) |
59 | { | 62 | { |
60 | foreach (InventoryFolderBase folder in folders) | 63 | foreach (InventoryFolderBase folder in skeletonFolders) |
61 | { | 64 | { |
62 | if (folder.ID != rootFolder.ID) | 65 | if (folder.ID != rootFolder.ID) |
63 | { | 66 | { |
64 | RequestInventoryFolder(userID, folder, folderCallBack, itemCallBack); | 67 | //RequestInventoryFolder(userID, folder, callback); |
68 | folders.Add(new InventoryFolderImpl(folder)); | ||
65 | } | 69 | } |
66 | } | 70 | } |
67 | } | 71 | } |
72 | |||
73 | callback(userID, folders, items); | ||
68 | } | 74 | } |
69 | 75 | ||
70 | public override void AddNewInventoryFolder(LLUUID userID, InventoryFolderBase folder) | 76 | public override void AddNewInventoryFolder(LLUUID userID, InventoryFolderBase folder) |
@@ -99,26 +105,5 @@ namespace OpenSim.Region.Communications.Local | |||
99 | return true; | 105 | return true; |
100 | } | 106 | } |
101 | } | 107 | } |
102 | |||
103 | /// <summary> | ||
104 | /// Send the given inventory folder and its item contents back to the requester. | ||
105 | /// </summary> | ||
106 | /// <param name="userID"></param> | ||
107 | /// <param name="folder"></param> | ||
108 | private InventoryFolderImpl RequestInventoryFolder(LLUUID userID, InventoryFolderBase folder, | ||
109 | InventoryFolderInfo folderCallBack, | ||
110 | InventoryItemInfo itemCallBack) | ||
111 | { | ||
112 | InventoryFolderImpl newFolder = new InventoryFolderImpl(folder); | ||
113 | folderCallBack(userID, newFolder); | ||
114 | |||
115 | List<InventoryItemBase> items = RequestFolderItems(newFolder.ID); | ||
116 | foreach (InventoryItemBase item in items) | ||
117 | { | ||
118 | itemCallBack(userID, item); | ||
119 | } | ||
120 | |||
121 | return newFolder; | ||
122 | } | ||
123 | } | 108 | } |
124 | } | 109 | } |
diff --git a/OpenSim/Region/Communications/OGS1/OGS1InventoryService.cs b/OpenSim/Region/Communications/OGS1/OGS1InventoryService.cs index b18c5bf..f31127f 100644 --- a/OpenSim/Region/Communications/OGS1/OGS1InventoryService.cs +++ b/OpenSim/Region/Communications/OGS1/OGS1InventoryService.cs | |||
@@ -51,12 +51,11 @@ namespace OpenSim.Region.Communications.OGS1 | |||
51 | #region IInventoryServices Members | 51 | #region IInventoryServices Members |
52 | 52 | ||
53 | // See IInventoryServices | 53 | // See IInventoryServices |
54 | public void RequestInventoryForUser(LLUUID userID, InventoryFolderInfo folderCallBack, | 54 | public void RequestInventoryForUser(LLUUID userID, InventoryReceiptCallback callback) |
55 | InventoryItemInfo itemCallBack) | ||
56 | { | 55 | { |
57 | if (!m_RequestingInventory.ContainsKey(userID)) | 56 | if (!m_RequestingInventory.ContainsKey(userID)) |
58 | { | 57 | { |
59 | InventoryRequest request = new InventoryRequest(userID, folderCallBack, itemCallBack); | 58 | InventoryRequest request = new InventoryRequest(userID, callback); |
60 | m_RequestingInventory.Add(userID, request); | 59 | m_RequestingInventory.Add(userID, request); |
61 | RequestInventory(userID); | 60 | RequestInventory(userID); |
62 | } | 61 | } |
@@ -105,13 +104,17 @@ namespace OpenSim.Region.Communications.OGS1 | |||
105 | 104 | ||
106 | InventoryFolderImpl rootFolder = null; | 105 | InventoryFolderImpl rootFolder = null; |
107 | InventoryRequest request = m_RequestingInventory[userID]; | 106 | InventoryRequest request = m_RequestingInventory[userID]; |
107 | |||
108 | ICollection<InventoryFolderImpl> folders = new List<InventoryFolderImpl>(); | ||
109 | ICollection<InventoryItemBase> items = new List<InventoryItemBase>(); | ||
110 | |||
108 | foreach (InventoryFolderBase folder in response.Folders) | 111 | foreach (InventoryFolderBase folder in response.Folders) |
109 | { | 112 | { |
110 | if (folder.ParentID == LLUUID.Zero) | 113 | if (folder.ParentID == LLUUID.Zero) |
111 | { | 114 | { |
112 | InventoryFolderImpl newfolder = new InventoryFolderImpl(folder); | 115 | rootFolder = new InventoryFolderImpl(folder); |
113 | rootFolder = newfolder; | 116 | folders.Add(rootFolder); |
114 | request.FolderCallBack(userID, newfolder); | 117 | //request.FolderCallBack(userID, newfolder); |
115 | } | 118 | } |
116 | } | 119 | } |
117 | 120 | ||
@@ -121,16 +124,20 @@ namespace OpenSim.Region.Communications.OGS1 | |||
121 | { | 124 | { |
122 | if (folder.ID != rootFolder.ID) | 125 | if (folder.ID != rootFolder.ID) |
123 | { | 126 | { |
124 | InventoryFolderImpl newfolder = new InventoryFolderImpl(folder); | 127 | folders.Add(new InventoryFolderImpl(folder)); |
125 | request.FolderCallBack(userID, newfolder); | 128 | //request.FolderCallBack(userID, newfolder); |
126 | } | 129 | } |
127 | } | 130 | } |
128 | 131 | ||
129 | foreach (InventoryItemBase item in response.AllItems) | 132 | foreach (InventoryItemBase item in response.AllItems) |
130 | { | 133 | { |
131 | request.ItemCallBack(userID, item); | 134 | items.Add(item); |
135 | //request.ItemCallBack(userID, item); | ||
132 | } | 136 | } |
133 | } | 137 | } |
138 | |||
139 | request.Callback(userID, folders, items); | ||
140 | |||
134 | m_RequestingInventory.Remove(userID); | 141 | m_RequestingInventory.Remove(userID); |
135 | } | 142 | } |
136 | else | 143 | else |
@@ -223,17 +230,22 @@ namespace OpenSim.Region.Communications.OGS1 | |||
223 | 230 | ||
224 | #endregion | 231 | #endregion |
225 | 232 | ||
233 | /// <summary> | ||
234 | /// Caches a pending inventory request that has yet to be satisfied by the inventory service | ||
235 | /// </summary> | ||
226 | public class InventoryRequest | 236 | public class InventoryRequest |
227 | { | 237 | { |
228 | public LLUUID UserID; | 238 | public LLUUID UserID; |
229 | public InventoryFolderInfo FolderCallBack; | 239 | public InventoryReceiptCallback Callback; |
230 | public InventoryItemInfo ItemCallBack; | 240 | //public InventoryFolderInfo FolderCallBack; |
241 | //public InventoryItemInfo ItemCallBack; | ||
231 | 242 | ||
232 | public InventoryRequest(LLUUID userId, InventoryFolderInfo folderCall, InventoryItemInfo itemCall) | 243 | public InventoryRequest(LLUUID userId, InventoryReceiptCallback callback) |
233 | { | 244 | { |
234 | UserID = userId; | 245 | UserID = userId; |
235 | FolderCallBack = folderCall; | 246 | //FolderCallBack = folderCall; |
236 | ItemCallBack = itemCall; | 247 | //ItemCallBack = itemCall; |
248 | Callback = callback; | ||
237 | } | 249 | } |
238 | } | 250 | } |
239 | } | 251 | } |