aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Framework/Communications/Capabilities/Caps.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Framework/Communications/Capabilities/Caps.cs')
-rw-r--r--OpenSim/Framework/Communications/Capabilities/Caps.cs55
1 files changed, 46 insertions, 9 deletions
diff --git a/OpenSim/Framework/Communications/Capabilities/Caps.cs b/OpenSim/Framework/Communications/Capabilities/Caps.cs
index 6e78452..dadafa3 100644
--- a/OpenSim/Framework/Communications/Capabilities/Caps.cs
+++ b/OpenSim/Framework/Communications/Capabilities/Caps.cs
@@ -197,16 +197,53 @@ namespace OpenSim.Region.Capabilities
197 197
198 public string FetchInventoryRequest(string request, string path, string param) 198 public string FetchInventoryRequest(string request, string path, string param)
199 { 199 {
200 request = request.Replace("<llsd><map><key>folders</key><array>", "<llsd>"); 200 string unmodifiedRequest = request.ToString();
201 request = request.Replace("\n", ""); 201
202 request = request.Replace("</map></array></map>", "</map>"); 202
203 Hashtable hash = new Hashtable();
204 try
205 {
206
207 hash = (Hashtable)LLSD.LLSDDeserialize(Helpers.StringToField(request));
208 }
209 catch (LLSD.LLSDParseException pe)
210 {
211 m_log.Error("[INVENTORY]: Fetch error: " + pe.Message);
212 m_log.Error("Request:" + request.ToString());
213 m_log.Error("OriginalRequest:" + unmodifiedRequest.ToString());
214 }
215 //LLSDArray llsdFolderRequest = LLSDHelpers.
216 ArrayList foldersrequested = (ArrayList)hash["folders"];
217
218 string response = "";
219
220 for (int i = 0; i < foldersrequested.Count; i++)
221 {
222 string inventoryitemstr = "";
223 Hashtable inventoryhash = (Hashtable)foldersrequested[i];
224
225 LLSDFetchInventoryDescendents llsdRequest = new LLSDFetchInventoryDescendents();
226 LLSDHelpers.DeserialiseLLSDMap(inventoryhash, llsdRequest);
227 LLSDInventoryDescendents reply = FetchInventory(llsdRequest);
228
229 inventoryitemstr = LLSDHelpers.SerialiseLLSDReply(reply);
230 inventoryitemstr = inventoryitemstr.Replace("<llsd><map><key>folders</key><array>", "");
231 inventoryitemstr = inventoryitemstr.Replace("</array></map></llsd>", "");
232 response += inventoryitemstr;
233 }
234 if (response.Length == 0)
235 {
236 // Ter-guess: If requests fail a lot, the client seems to stop requesting descendants.
237 // Therefore, I'm concluding that the client only has so many threads available to do requests
238 // and when a thread stalls.. is stays stalled.
239 // Therefore we need to return something valid
240 response = "<llsd><map><key>folders</key><array /></map></llsd>";
241 }
242 else
243 {
244 response = "<llsd><map><key>folders</key><array>" + response + "</array></map></llsd>";
245 }
203 246
204 //Console.WriteLine("inventory request " + request);
205 Hashtable hash = (Hashtable)LLSD.LLSDDeserialize(Helpers.StringToField(request));
206 LLSDFetchInventoryDescendents llsdRequest = new LLSDFetchInventoryDescendents();
207 LLSDHelpers.DeserialiseLLSDMap(hash, llsdRequest);
208 LLSDInventoryDescendents reply = FetchInventory(llsdRequest);
209 string response = LLSDHelpers.SerialiseLLSDReply(reply);
210 return response; 247 return response;
211 } 248 }
212 249