From 46c55b6fa08b089961fe7fff4079295bfa24dc87 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Tue, 19 Jul 2016 18:56:32 +0100 Subject: some cleanup on FetchInvDescHandler --- .../Handlers/FetchInventory/FetchInvDescHandler.cs | 170 +++------------------ 1 file changed, 22 insertions(+), 148 deletions(-) (limited to 'OpenSim/Capabilities/Handlers/FetchInventory/FetchInvDescHandler.cs') diff --git a/OpenSim/Capabilities/Handlers/FetchInventory/FetchInvDescHandler.cs b/OpenSim/Capabilities/Handlers/FetchInventory/FetchInvDescHandler.cs index 45eda57..8998b7a 100644 --- a/OpenSim/Capabilities/Handlers/FetchInventory/FetchInvDescHandler.cs +++ b/OpenSim/Capabilities/Handlers/FetchInventory/FetchInvDescHandler.cs @@ -60,7 +60,6 @@ namespace OpenSim.Capabilities.Handlers m_LibraryService = libService; m_Scene = s; } - public string FetchInventoryDescendentsRequest(string request, string path, string param, IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) { @@ -137,13 +136,13 @@ namespace OpenSim.Capabilities.Handlers string inventoryitemstr = string.Empty; foreach (InventoryCollectionWithDescendents icoll in invcollSet) { - LLSDInventoryDescendents reply = ToLLSD(icoll.Collection, icoll.Descendents); - - inventoryitemstr = LLSDHelpers.SerialiseLLSDReply(reply); - inventoryitemstr = inventoryitemstr.Replace("folders", ""); - inventoryitemstr = inventoryitemstr.Replace("", ""); - - tmpresponse.Append(inventoryitemstr); + LLSDInventoryFolderContents thiscontents = contentsToLLSD(icoll.Collection, icoll.Descendents); + inventoryitemstr = LLSDHelpers.SerialiseLLSDReply(thiscontents); +// inventoryitemstr = inventoryitemstr.Replace("", ""); +// inventoryitemstr = inventoryitemstr.Replace("", ""); +// inventoryitemstr = inventoryitemstr.Substring(6,inventoryitemstr.Length - 13); +// tmpresponse.Append(inventoryitemstr); + tmpresponse.Append(inventoryitemstr.Substring(6,inventoryitemstr.Length - 13)); } //m_log.DebugFormat("[WEB FETCH INV DESC HANDLER]: Bad folders {0}", string.Join(", ", bad_folders)); @@ -236,16 +235,13 @@ namespace OpenSim.Capabilities.Handlers return reply; } - private LLSDInventoryDescendents ToLLSD(InventoryCollection inv, int descendents) + private LLSDInventoryFolderContents contentsToLLSD(InventoryCollection inv, int descendents) { - LLSDInventoryDescendents reply = new LLSDInventoryDescendents(); LLSDInventoryFolderContents contents = new LLSDInventoryFolderContents(); contents.agent_id = inv.OwnerID; contents.owner_id = inv.OwnerID; contents.folder_id = inv.FolderID; - reply.folders.Array.Add(contents); - if (inv.Folders != null) { foreach (InventoryFolderBase invFolder in inv.Folders) @@ -267,7 +263,7 @@ namespace OpenSim.Capabilities.Handlers contents.descendents = descendents; contents.version = inv.Version; - return reply; + return contents; } /// /// Old style. Soon to be deprecated. @@ -424,108 +420,7 @@ namespace OpenSim.Capabilities.Handlers itemsToReturn.Insert(0, linkedItem); } } - - // Now scan for folder links and insert the items they target and those links at the head of the return data - -/* dont send contents of LinkFolders. -from docs seems this was never a spec - - foreach (InventoryItemBase item in originalItems) - { - if (item.AssetType == (int)AssetType.LinkFolder) - { - InventoryCollection linkedFolderContents = m_InventoryService.GetFolderContent(ownerID, item.AssetID); - List links = linkedFolderContents.Items; - - itemsToReturn.InsertRange(0, links); - - foreach (InventoryItemBase link in linkedFolderContents.Items) - { - // Take care of genuinely broken links where the target doesn't exist - // HACK: Also, don't follow up links that just point to other links. In theory this is legitimate, - // but no viewer has been observed to set these up and this is the lazy way of avoiding cycles - // rather than having to keep track of every folder requested in the recursion. - if (link != null) - { -// m_log.DebugFormat( -// "[WEB FETCH INV DESC HANDLER]: Adding item {0} {1} from folder {2} linked from {3}", -// link.Name, (AssetType)link.AssetType, item.AssetID, containingFolder.Name); - - InventoryItemBase linkedItem - = m_InventoryService.GetItem(new InventoryItemBase(link.AssetID)); - - if (linkedItem != null) - itemsToReturn.Insert(0, linkedItem); - } - } - } - } -*/ } - -// foreach (InventoryItemBase item in contents.Items) -// { -// m_log.DebugFormat( -// "[WEB FETCH INV DESC HANDLER]: Returning item {0}, type {1}, parent {2} in {3} {4}", -// item.Name, (AssetType)item.AssetType, item.Folder, containingFolder.Name, containingFolder.ID); -// } - - // ===== - -// -// foreach (InventoryItemBase linkedItem in linkedItemsToAdd) -// { -// m_log.DebugFormat( -// "[WEB FETCH INV DESC HANDLER]: Inserted linked item {0} for link in folder {1} for agent {2}", -// linkedItem.Name, folderID, agentID); -// -// contents.Items.Add(linkedItem); -// } -// -// // If the folder requested contains links, then we need to send those folders first, otherwise the links -// // will be broken in the viewer. -// HashSet linkedItemFolderIdsToSend = new HashSet(); -// foreach (InventoryItemBase item in contents.Items) -// { -// if (item.AssetType == (int)AssetType.Link) -// { -// InventoryItemBase linkedItem = m_InventoryService.GetItem(new InventoryItemBase(item.AssetID)); -// -// // Take care of genuinely broken links where the target doesn't exist -// // HACK: Also, don't follow up links that just point to other links. In theory this is legitimate, -// // but no viewer has been observed to set these up and this is the lazy way of avoiding cycles -// // rather than having to keep track of every folder requested in the recursion. -// if (linkedItem != null && linkedItem.AssetType != (int)AssetType.Link) -// { -// // We don't need to send the folder if source and destination of the link are in the same -// // folder. -// if (linkedItem.Folder != containingFolder.ID) -// linkedItemFolderIdsToSend.Add(linkedItem.Folder); -// } -// } -// } -// -// foreach (UUID linkedItemFolderId in linkedItemFolderIdsToSend) -// { -// m_log.DebugFormat( -// "[WEB FETCH INV DESC HANDLER]: Recursively fetching folder {0} linked by item in folder {1} for agent {2}", -// linkedItemFolderId, folderID, agentID); -// -// int dummyVersion; -// InventoryCollection linkedCollection -// = Fetch( -// agentID, linkedItemFolderId, ownerID, fetchFolders, fetchItems, sortOrder, out dummyVersion); -// -// InventoryFolderBase linkedFolder = new InventoryFolderBase(linkedItemFolderId); -// linkedFolder.Owner = agentID; -// linkedFolder = m_InventoryService.GetFolder(linkedFolder); -// -//// contents.Folders.AddRange(linkedCollection.Folders); -// -// contents.Folders.Add(linkedFolder); -// contents.Items.AddRange(linkedCollection.Items); -// } -// } } } else @@ -696,42 +591,21 @@ from docs seems this was never a spec if (freq.fetch_items && contents.Items != null) { - List itemsToReturn = contents.Items; - + // viewers are lasy and want a copy of the link item sent before the link to it + // descendents must only include the links, not the linked items we add - coll.Descendents = itemsToReturn.Count; + coll.Descendents = contents.Items.Count; - // Add target items for links in this folder before the links themselves. + // look for item links List itemIDs = new List(); - List folderIDs = new List(); - foreach (InventoryItemBase item in itemsToReturn) + foreach (InventoryItemBase item in contents.Items) { //m_log.DebugFormat("[XXX]: {0} {1}", item.Name, item.AssetType); if (item.AssetType == (int)AssetType.Link) itemIDs.Add(item.AssetID); - -// else if (item.AssetType == (int)AssetType.LinkFolder) -// folderIDs.Add(item.AssetID); - } - - //m_log.DebugFormat("[XXX]: folder {0} has {1} links and {2} linkfolders", contents.FolderID, itemIDs.Count, folderIDs.Count); - - // Scan for folder links and insert the items they target and those links at the head of the return data - if (folderIDs.Count > 0) - { - InventoryCollection[] linkedFolders = m_InventoryService.GetMultipleFoldersContent(coll.Collection.OwnerID, folderIDs.ToArray()); - foreach (InventoryCollection linkedFolderContents in linkedFolders) - { - if (linkedFolderContents == null) - continue; - - List links = linkedFolderContents.Items; - - itemsToReturn.InsertRange(0, links); - - } } + // get the linked if any if (itemIDs.Count > 0) { InventoryItemBase[] linked = m_InventoryService.GetMultipleItems(freq.owner_id, itemIDs.ToArray()); @@ -746,13 +620,11 @@ from docs seems this was never a spec linked[i++] = m_InventoryService.GetItem(freq.owner_id, id); } } - - //m_log.DebugFormat("[WEB FETCH INV DESC HANDLER]: Processing folder {0}. Existing items:", freq.folder_id); - //foreach (InventoryItemBase item in itemsToReturn) - // m_log.DebugFormat("[XXX]: {0} {1} {2}", item.Name, item.AssetType, item.Folder); - + if (linked != null) { + List linkedItems = new List(); + // check for broken foreach (InventoryItemBase linkedItem in linked) { // Take care of genuinely broken links where the target doesn't exist @@ -761,14 +633,16 @@ from docs seems this was never a spec // rather than having to keep track of every folder requested in the recursion. if (linkedItem != null && linkedItem.AssetType != (int)AssetType.Link) { - itemsToReturn.Insert(0, linkedItem); + linkedItems.Add(linkedItem); //m_log.DebugFormat("[WEB FETCH INV DESC HANDLER]: Added {0} {1} {2}", linkedItem.Name, linkedItem.AssetType, linkedItem.Folder); } } + // insert them + if(linkedItems.Count > 0) + contents.Items.InsertRange(0,linkedItems); } } } - } /// -- cgit v1.1