aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Capabilities
diff options
context:
space:
mode:
authorUbitUmarov2016-07-19 18:56:32 +0100
committerUbitUmarov2016-07-19 18:56:32 +0100
commit46c55b6fa08b089961fe7fff4079295bfa24dc87 (patch)
treed9312ef006831a14c18bddf465fbe14d61b837f0 /OpenSim/Capabilities
parent don't loose inventory items when there are bad folders (diff)
downloadopensim-SC-46c55b6fa08b089961fe7fff4079295bfa24dc87.zip
opensim-SC-46c55b6fa08b089961fe7fff4079295bfa24dc87.tar.gz
opensim-SC-46c55b6fa08b089961fe7fff4079295bfa24dc87.tar.bz2
opensim-SC-46c55b6fa08b089961fe7fff4079295bfa24dc87.tar.xz
some cleanup on FetchInvDescHandler
Diffstat (limited to 'OpenSim/Capabilities')
-rw-r--r--OpenSim/Capabilities/Handlers/FetchInventory/FetchInvDescHandler.cs170
1 files changed, 22 insertions, 148 deletions
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
60 m_LibraryService = libService; 60 m_LibraryService = libService;
61 m_Scene = s; 61 m_Scene = s;
62 } 62 }
63
64 63
65 public string FetchInventoryDescendentsRequest(string request, string path, string param, IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) 64 public string FetchInventoryDescendentsRequest(string request, string path, string param, IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
66 { 65 {
@@ -137,13 +136,13 @@ namespace OpenSim.Capabilities.Handlers
137 string inventoryitemstr = string.Empty; 136 string inventoryitemstr = string.Empty;
138 foreach (InventoryCollectionWithDescendents icoll in invcollSet) 137 foreach (InventoryCollectionWithDescendents icoll in invcollSet)
139 { 138 {
140 LLSDInventoryDescendents reply = ToLLSD(icoll.Collection, icoll.Descendents); 139 LLSDInventoryFolderContents thiscontents = contentsToLLSD(icoll.Collection, icoll.Descendents);
141 140 inventoryitemstr = LLSDHelpers.SerialiseLLSDReply(thiscontents);
142 inventoryitemstr = LLSDHelpers.SerialiseLLSDReply(reply); 141// inventoryitemstr = inventoryitemstr.Replace("<llsd>", "");
143 inventoryitemstr = inventoryitemstr.Replace("<llsd><map><key>folders</key><array>", ""); 142// inventoryitemstr = inventoryitemstr.Replace("</llsd>", "");
144 inventoryitemstr = inventoryitemstr.Replace("</array></map></llsd>", ""); 143// inventoryitemstr = inventoryitemstr.Substring(6,inventoryitemstr.Length - 13);
145 144// tmpresponse.Append(inventoryitemstr);
146 tmpresponse.Append(inventoryitemstr); 145 tmpresponse.Append(inventoryitemstr.Substring(6,inventoryitemstr.Length - 13));
147 } 146 }
148 147
149 //m_log.DebugFormat("[WEB FETCH INV DESC HANDLER]: Bad folders {0}", string.Join(", ", bad_folders)); 148 //m_log.DebugFormat("[WEB FETCH INV DESC HANDLER]: Bad folders {0}", string.Join(", ", bad_folders));
@@ -236,16 +235,13 @@ namespace OpenSim.Capabilities.Handlers
236 return reply; 235 return reply;
237 } 236 }
238 237
239 private LLSDInventoryDescendents ToLLSD(InventoryCollection inv, int descendents) 238 private LLSDInventoryFolderContents contentsToLLSD(InventoryCollection inv, int descendents)
240 { 239 {
241 LLSDInventoryDescendents reply = new LLSDInventoryDescendents();
242 LLSDInventoryFolderContents contents = new LLSDInventoryFolderContents(); 240 LLSDInventoryFolderContents contents = new LLSDInventoryFolderContents();
243 contents.agent_id = inv.OwnerID; 241 contents.agent_id = inv.OwnerID;
244 contents.owner_id = inv.OwnerID; 242 contents.owner_id = inv.OwnerID;
245 contents.folder_id = inv.FolderID; 243 contents.folder_id = inv.FolderID;
246 244
247 reply.folders.Array.Add(contents);
248
249 if (inv.Folders != null) 245 if (inv.Folders != null)
250 { 246 {
251 foreach (InventoryFolderBase invFolder in inv.Folders) 247 foreach (InventoryFolderBase invFolder in inv.Folders)
@@ -267,7 +263,7 @@ namespace OpenSim.Capabilities.Handlers
267 contents.descendents = descendents; 263 contents.descendents = descendents;
268 contents.version = inv.Version; 264 contents.version = inv.Version;
269 265
270 return reply; 266 return contents;
271 } 267 }
272 /// <summary> 268 /// <summary>
273 /// Old style. Soon to be deprecated. 269 /// Old style. Soon to be deprecated.
@@ -424,108 +420,7 @@ namespace OpenSim.Capabilities.Handlers
424 itemsToReturn.Insert(0, linkedItem); 420 itemsToReturn.Insert(0, linkedItem);
425 } 421 }
426 } 422 }
427
428 // Now scan for folder links and insert the items they target and those links at the head of the return data
429
430/* dont send contents of LinkFolders.
431from docs seems this was never a spec
432
433 foreach (InventoryItemBase item in originalItems)
434 {
435 if (item.AssetType == (int)AssetType.LinkFolder)
436 {
437 InventoryCollection linkedFolderContents = m_InventoryService.GetFolderContent(ownerID, item.AssetID);
438 List<InventoryItemBase> links = linkedFolderContents.Items;
439
440 itemsToReturn.InsertRange(0, links);
441
442 foreach (InventoryItemBase link in linkedFolderContents.Items)
443 {
444 // Take care of genuinely broken links where the target doesn't exist
445 // HACK: Also, don't follow up links that just point to other links. In theory this is legitimate,
446 // but no viewer has been observed to set these up and this is the lazy way of avoiding cycles
447 // rather than having to keep track of every folder requested in the recursion.
448 if (link != null)
449 {
450// m_log.DebugFormat(
451// "[WEB FETCH INV DESC HANDLER]: Adding item {0} {1} from folder {2} linked from {3}",
452// link.Name, (AssetType)link.AssetType, item.AssetID, containingFolder.Name);
453
454 InventoryItemBase linkedItem
455 = m_InventoryService.GetItem(new InventoryItemBase(link.AssetID));
456
457 if (linkedItem != null)
458 itemsToReturn.Insert(0, linkedItem);
459 }
460 }
461 }
462 }
463*/
464 } 423 }
465
466// foreach (InventoryItemBase item in contents.Items)
467// {
468// m_log.DebugFormat(
469// "[WEB FETCH INV DESC HANDLER]: Returning item {0}, type {1}, parent {2} in {3} {4}",
470// item.Name, (AssetType)item.AssetType, item.Folder, containingFolder.Name, containingFolder.ID);
471// }
472
473 // =====
474
475//
476// foreach (InventoryItemBase linkedItem in linkedItemsToAdd)
477// {
478// m_log.DebugFormat(
479// "[WEB FETCH INV DESC HANDLER]: Inserted linked item {0} for link in folder {1} for agent {2}",
480// linkedItem.Name, folderID, agentID);
481//
482// contents.Items.Add(linkedItem);
483// }
484//
485// // If the folder requested contains links, then we need to send those folders first, otherwise the links
486// // will be broken in the viewer.
487// HashSet<UUID> linkedItemFolderIdsToSend = new HashSet<UUID>();
488// foreach (InventoryItemBase item in contents.Items)
489// {
490// if (item.AssetType == (int)AssetType.Link)
491// {
492// InventoryItemBase linkedItem = m_InventoryService.GetItem(new InventoryItemBase(item.AssetID));
493//
494// // Take care of genuinely broken links where the target doesn't exist
495// // HACK: Also, don't follow up links that just point to other links. In theory this is legitimate,
496// // but no viewer has been observed to set these up and this is the lazy way of avoiding cycles
497// // rather than having to keep track of every folder requested in the recursion.
498// if (linkedItem != null && linkedItem.AssetType != (int)AssetType.Link)
499// {
500// // We don't need to send the folder if source and destination of the link are in the same
501// // folder.
502// if (linkedItem.Folder != containingFolder.ID)
503// linkedItemFolderIdsToSend.Add(linkedItem.Folder);
504// }
505// }
506// }
507//
508// foreach (UUID linkedItemFolderId in linkedItemFolderIdsToSend)
509// {
510// m_log.DebugFormat(
511// "[WEB FETCH INV DESC HANDLER]: Recursively fetching folder {0} linked by item in folder {1} for agent {2}",
512// linkedItemFolderId, folderID, agentID);
513//
514// int dummyVersion;
515// InventoryCollection linkedCollection
516// = Fetch(
517// agentID, linkedItemFolderId, ownerID, fetchFolders, fetchItems, sortOrder, out dummyVersion);
518//
519// InventoryFolderBase linkedFolder = new InventoryFolderBase(linkedItemFolderId);
520// linkedFolder.Owner = agentID;
521// linkedFolder = m_InventoryService.GetFolder(linkedFolder);
522//
523//// contents.Folders.AddRange(linkedCollection.Folders);
524//
525// contents.Folders.Add(linkedFolder);
526// contents.Items.AddRange(linkedCollection.Items);
527// }
528// }
529 } 424 }
530 } 425 }
531 else 426 else
@@ -696,42 +591,21 @@ from docs seems this was never a spec
696 591
697 if (freq.fetch_items && contents.Items != null) 592 if (freq.fetch_items && contents.Items != null)
698 { 593 {
699 List<InventoryItemBase> itemsToReturn = contents.Items; 594 // viewers are lasy and want a copy of the link item sent before the link to it
700 595
701 // descendents must only include the links, not the linked items we add 596 // descendents must only include the links, not the linked items we add
702 coll.Descendents = itemsToReturn.Count; 597 coll.Descendents = contents.Items.Count;
703 598
704 // Add target items for links in this folder before the links themselves. 599 // look for item links
705 List<UUID> itemIDs = new List<UUID>(); 600 List<UUID> itemIDs = new List<UUID>();
706 List<UUID> folderIDs = new List<UUID>(); 601 foreach (InventoryItemBase item in contents.Items)
707 foreach (InventoryItemBase item in itemsToReturn)
708 { 602 {
709 //m_log.DebugFormat("[XXX]: {0} {1}", item.Name, item.AssetType); 603 //m_log.DebugFormat("[XXX]: {0} {1}", item.Name, item.AssetType);
710 if (item.AssetType == (int)AssetType.Link) 604 if (item.AssetType == (int)AssetType.Link)
711 itemIDs.Add(item.AssetID); 605 itemIDs.Add(item.AssetID);
712
713// else if (item.AssetType == (int)AssetType.LinkFolder)
714// folderIDs.Add(item.AssetID);
715 }
716
717 //m_log.DebugFormat("[XXX]: folder {0} has {1} links and {2} linkfolders", contents.FolderID, itemIDs.Count, folderIDs.Count);
718
719 // Scan for folder links and insert the items they target and those links at the head of the return data
720 if (folderIDs.Count > 0)
721 {
722 InventoryCollection[] linkedFolders = m_InventoryService.GetMultipleFoldersContent(coll.Collection.OwnerID, folderIDs.ToArray());
723 foreach (InventoryCollection linkedFolderContents in linkedFolders)
724 {
725 if (linkedFolderContents == null)
726 continue;
727
728 List<InventoryItemBase> links = linkedFolderContents.Items;
729
730 itemsToReturn.InsertRange(0, links);
731
732 }
733 } 606 }
734 607
608 // get the linked if any
735 if (itemIDs.Count > 0) 609 if (itemIDs.Count > 0)
736 { 610 {
737 InventoryItemBase[] linked = m_InventoryService.GetMultipleItems(freq.owner_id, itemIDs.ToArray()); 611 InventoryItemBase[] linked = m_InventoryService.GetMultipleItems(freq.owner_id, itemIDs.ToArray());
@@ -746,13 +620,11 @@ from docs seems this was never a spec
746 linked[i++] = m_InventoryService.GetItem(freq.owner_id, id); 620 linked[i++] = m_InventoryService.GetItem(freq.owner_id, id);
747 } 621 }
748 } 622 }
749 623
750 //m_log.DebugFormat("[WEB FETCH INV DESC HANDLER]: Processing folder {0}. Existing items:", freq.folder_id);
751 //foreach (InventoryItemBase item in itemsToReturn)
752 // m_log.DebugFormat("[XXX]: {0} {1} {2}", item.Name, item.AssetType, item.Folder);
753
754 if (linked != null) 624 if (linked != null)
755 { 625 {
626 List<InventoryItemBase> linkedItems = new List<InventoryItemBase>();
627 // check for broken
756 foreach (InventoryItemBase linkedItem in linked) 628 foreach (InventoryItemBase linkedItem in linked)
757 { 629 {
758 // Take care of genuinely broken links where the target doesn't exist 630 // Take care of genuinely broken links where the target doesn't exist
@@ -761,14 +633,16 @@ from docs seems this was never a spec
761 // rather than having to keep track of every folder requested in the recursion. 633 // rather than having to keep track of every folder requested in the recursion.
762 if (linkedItem != null && linkedItem.AssetType != (int)AssetType.Link) 634 if (linkedItem != null && linkedItem.AssetType != (int)AssetType.Link)
763 { 635 {
764 itemsToReturn.Insert(0, linkedItem); 636 linkedItems.Add(linkedItem);
765 //m_log.DebugFormat("[WEB FETCH INV DESC HANDLER]: Added {0} {1} {2}", linkedItem.Name, linkedItem.AssetType, linkedItem.Folder); 637 //m_log.DebugFormat("[WEB FETCH INV DESC HANDLER]: Added {0} {1} {2}", linkedItem.Name, linkedItem.AssetType, linkedItem.Folder);
766 } 638 }
767 } 639 }
640 // insert them
641 if(linkedItems.Count > 0)
642 contents.Items.InsertRange(0,linkedItems);
768 } 643 }
769 } 644 }
770 } 645 }
771
772 } 646 }
773 647
774 /// <summary> 648 /// <summary>