From bf96f06d1ebec91598286c838a744693bf2a76ab Mon Sep 17 00:00:00 2001
From: Freaky Tech
Date: Mon, 2 Mar 2015 22:31:17 +0100
Subject: corrected response when a not existing folder is requested by a
 viewer in that case the response has to report it as bad_folders with uuid
 instead of returning some dummy

Signed-off-by: BlueWall <jamesh@bluewallgroup.com>
---
 .../FetchInvDescHandler.cs                         | 37 ++++++++++++++++------
 1 file changed, 28 insertions(+), 9 deletions(-)

diff --git a/OpenSim/Capabilities/Handlers/FetchInventoryDescendents/FetchInvDescHandler.cs b/OpenSim/Capabilities/Handlers/FetchInventoryDescendents/FetchInvDescHandler.cs
index 3d3340f..451575f 100644
--- a/OpenSim/Capabilities/Handlers/FetchInventoryDescendents/FetchInvDescHandler.cs
+++ b/OpenSim/Capabilities/Handlers/FetchInventoryDescendents/FetchInvDescHandler.cs
@@ -92,6 +92,7 @@ namespace OpenSim.Capabilities.Handlers
                 ArrayList foldersrequested = (ArrayList)hash["folders"];
     
                 string response = "";
+                string bad_folders_response = "";
 
                 for (int i = 0; i < foldersrequested.Count; i++)
                 {
@@ -110,24 +111,42 @@ namespace OpenSim.Capabilities.Handlers
                     }
                     LLSDInventoryDescendents reply = FetchInventoryReply(llsdRequest);
 
-                    inventoryitemstr = LLSDHelpers.SerialiseLLSDReply(reply);
-                    inventoryitemstr = inventoryitemstr.Replace("<llsd><map><key>folders</key><array>", "");
-                    inventoryitemstr = inventoryitemstr.Replace("</array></map></llsd>", "");
+                    if (null == reply)
+                    {
+                        bad_folders_response += "<uuid>" + llsdRequest.folder_id.ToString() + "</uuid>";
+                    }
+                    else
+                    {
+                        inventoryitemstr = LLSDHelpers.SerialiseLLSDReply(reply);
+                        inventoryitemstr = inventoryitemstr.Replace("<llsd><map><key>folders</key><array>", "");
+                        inventoryitemstr = inventoryitemstr.Replace("</array></map></llsd>", "");
+                    }
 
                     response += inventoryitemstr;
                 }
 
                 if (response.Length == 0)
                 {
-                    // Ter-guess: If requests fail a lot, the client seems to stop requesting descendants.
-                    // Therefore, I'm concluding that the client only has so many threads available to do requests
-                    // and when a thread stalls..   is stays stalled.
-                    // Therefore we need to return something valid
-                    response = "<llsd><map><key>folders</key><array /></map></llsd>";
+                    /* Viewers expect a bad_folders array when not available */
+                    if (bad_folders_response.Length != 0)
+                    {
+                        response = "<llsd><map><key>bad_folders</key><array>" + bad_folders_response + "</array></map></llsd>";
+                    }
+                    else
+                    {
+                        response = "<llsd><map><key>folders</key><array /></map></llsd>";
+                    }
                 }
                 else
                 {
-                    response = "<llsd><map><key>folders</key><array>" + response + "</array></map></llsd>";
+                    if (bad_folders_response.Length != 0)
+                    {
+                        response = "<llsd><map><key>folders</key><array>" + response + "</array><key>bad_folders</key><array>" + bad_folders_response + "</array></map></llsd>";
+                    }
+                    else
+                    {
+                        response = "<llsd><map><key>folders</key><array>" + response + "</array></map></llsd>";
+                    }
                 }
 
 //                m_log.DebugFormat("[WEB FETCH INV DESC HANDLER]: Replying to CAPS fetch inventory request");
-- 
cgit v1.1