diff options
-rw-r--r-- | OpenSim/Capabilities/Handlers/FetchInventory/FetchInvDescHandler.cs | 104 |
1 files changed, 47 insertions, 57 deletions
diff --git a/OpenSim/Capabilities/Handlers/FetchInventory/FetchInvDescHandler.cs b/OpenSim/Capabilities/Handlers/FetchInventory/FetchInvDescHandler.cs index 89d9e80..bc92536 100644 --- a/OpenSim/Capabilities/Handlers/FetchInventory/FetchInvDescHandler.cs +++ b/OpenSim/Capabilities/Handlers/FetchInventory/FetchInvDescHandler.cs | |||
@@ -98,53 +98,51 @@ namespace OpenSim.Capabilities.Handlers | |||
98 | folders.Add(llsdRequest); | 98 | folders.Add(llsdRequest); |
99 | } | 99 | } |
100 | 100 | ||
101 | StringBuilder lastresponse = new StringBuilder(1024); | 101 | if(folders.Count == 0) |
102 | lastresponse.Append("<llsd>"); | 102 | return "<llsd><map><key>folders</key><array /></map></llsd>"; |
103 | if (folders.Count > 0) | ||
104 | { | ||
105 | List<UUID> bad_folders = new List<UUID>(); | ||
106 | List<InventoryCollectionWithDescendents> invcollSet = Fetch(folders, bad_folders); | ||
107 | //m_log.DebugFormat("[XXX]: Got {0} folders from a request of {1}", invcollSet.Count, folders.Count); | ||
108 | 103 | ||
109 | if (invcollSet == null) | 104 | List<UUID> bad_folders = new List<UUID>(); |
110 | { | 105 | |
111 | m_log.DebugFormat("[WEB FETCH INV DESC HANDLER]: Multiple folder fetch failed. Trying old protocol."); | 106 | List<InventoryCollectionWithDescendents> invcollSet = Fetch(folders, bad_folders); |
107 | //m_log.DebugFormat("[XXX]: Got {0} folders from a request of {1}", invcollSet.Count, folders.Count); | ||
108 | |||
109 | if (invcollSet == null) | ||
110 | { | ||
111 | m_log.DebugFormat("[WEB FETCH INV DESC HANDLER]: Multiple folder fetch failed. Trying old protocol."); | ||
112 | #pragma warning disable 0612 | 112 | #pragma warning disable 0612 |
113 | return FetchInventoryDescendentsRequest(foldersrequested, httpRequest, httpResponse); | 113 | return FetchInventoryDescendentsRequest(foldersrequested, httpRequest, httpResponse); |
114 | #pragma warning restore 0612 | 114 | #pragma warning restore 0612 |
115 | } | 115 | } |
116 | 116 | ||
117 | if(invcollSet.Count > 0) | 117 | StringBuilder lastresponse = new StringBuilder(1024); |
118 | { | 118 | lastresponse.Append("<llsd>"); |
119 | lastresponse.Append("<map><key>folders</key><array>"); | ||
120 | foreach (InventoryCollectionWithDescendents icoll in invcollSet) | ||
121 | { | ||
122 | LLSDInventoryFolderContents thiscontents = contentsToLLSD(icoll.Collection, icoll.Descendents); | ||
123 | lastresponse.Append(LLSDHelpers.SerialiseLLSDReplyNoHeader(thiscontents)); | ||
124 | } | ||
125 | lastresponse.Append("</array></map>"); | ||
126 | } | ||
127 | else | ||
128 | lastresponse.Append("<map><key>folders</key><array /></map>"); | ||
129 | 119 | ||
130 | //m_log.DebugFormat("[WEB FETCH INV DESC HANDLER]: Bad folders {0}", string.Join(", ", bad_folders)); | 120 | if(invcollSet.Count > 0) |
131 | if(bad_folders.Count > 0) | 121 | { |
122 | lastresponse.Append("<map><key>folders</key><array>"); | ||
123 | foreach (InventoryCollectionWithDescendents icoll in invcollSet) | ||
132 | { | 124 | { |
133 | lastresponse.Append("<map><key>bad_folders</key><array>"); | 125 | LLSDInventoryFolderContents thiscontents = contentsToLLSD(icoll.Collection, icoll.Descendents); |
134 | foreach (UUID bad in bad_folders) | 126 | lastresponse.Append(LLSDHelpers.SerialiseLLSDReplyNoHeader(thiscontents)); |
135 | { | ||
136 | lastresponse.Append("<map><key>folder_id</key><uuid>"); | ||
137 | lastresponse.Append(bad.ToString()); | ||
138 | lastresponse.Append("</uuid><key>error</key><string>Unknown</string></map>"); | ||
139 | } | ||
140 | lastresponse.Append("</array></map>"); | ||
141 | } | 127 | } |
142 | lastresponse.Append("</llsd>"); | 128 | lastresponse.Append("</array></map>"); |
143 | } | 129 | } |
144 | else | 130 | else |
131 | lastresponse.Append("<map><key>folders</key><array /></map>"); | ||
132 | |||
133 | //m_log.DebugFormat("[WEB FETCH INV DESC HANDLER]: Bad folders {0}", string.Join(", ", bad_folders)); | ||
134 | if(bad_folders.Count > 0) | ||
145 | { | 135 | { |
146 | lastresponse.Append("<map><key>folders</key><array /></map></llsd>"); | 136 | lastresponse.Append("<map><key>bad_folders</key><array>"); |
137 | foreach (UUID bad in bad_folders) | ||
138 | { | ||
139 | lastresponse.Append("<map><key>folder_id</key><uuid>"); | ||
140 | lastresponse.Append(bad.ToString()); | ||
141 | lastresponse.Append("</uuid><key>error</key><string>Unknown</string></map>"); | ||
142 | } | ||
143 | lastresponse.Append("</array></map>"); | ||
147 | } | 144 | } |
145 | lastresponse.Append("</llsd>"); | ||
148 | 146 | ||
149 | return lastresponse.ToString();; | 147 | return lastresponse.ToString();; |
150 | } | 148 | } |
@@ -436,9 +434,6 @@ namespace OpenSim.Capabilities.Handlers | |||
436 | // FIXME MAYBE: We're not handling sortOrder! | 434 | // FIXME MAYBE: We're not handling sortOrder! |
437 | 435 | ||
438 | List<InventoryCollectionWithDescendents> result = new List<InventoryCollectionWithDescendents>(); | 436 | List<InventoryCollectionWithDescendents> result = new List<InventoryCollectionWithDescendents>(); |
439 | if(fetchFolders.Count <= 0) | ||
440 | return result; | ||
441 | |||
442 | List<LLSDFetchInventoryDescendents> libFolders = new List<LLSDFetchInventoryDescendents>(); | 437 | List<LLSDFetchInventoryDescendents> libFolders = new List<LLSDFetchInventoryDescendents>(); |
443 | List<LLSDFetchInventoryDescendents> otherFolders = new List<LLSDFetchInventoryDescendents>(); | 438 | List<LLSDFetchInventoryDescendents> otherFolders = new List<LLSDFetchInventoryDescendents>(); |
444 | HashSet<UUID> libIDs = new HashSet<UUID>(); | 439 | HashSet<UUID> libIDs = new HashSet<UUID>(); |
@@ -452,10 +447,14 @@ namespace OpenSim.Capabilities.Handlers | |||
452 | // Filter folder Zero right here. Some viewers (Firestorm) send request for folder Zero, which doesn't make sense | 447 | // Filter folder Zero right here. Some viewers (Firestorm) send request for folder Zero, which doesn't make sense |
453 | // and can kill the sim (all root folders have parent_id Zero) | 448 | // and can kill the sim (all root folders have parent_id Zero) |
454 | // send something. | 449 | // send something. |
450 | bool doneZeroID = false; | ||
455 | foreach(LLSDFetchInventoryDescendents f in fetchFolders) | 451 | foreach(LLSDFetchInventoryDescendents f in fetchFolders) |
456 | { | 452 | { |
457 | if (f.folder_id == UUID.Zero) | 453 | if (f.folder_id == UUID.Zero) |
458 | { | 454 | { |
455 | if(doneZeroID) | ||
456 | continue; | ||
457 | doneZeroID = true; | ||
459 | InventoryCollectionWithDescendents zeroColl = new InventoryCollectionWithDescendents(); | 458 | InventoryCollectionWithDescendents zeroColl = new InventoryCollectionWithDescendents(); |
460 | zeroColl.Collection = new InventoryCollection(); | 459 | zeroColl.Collection = new InventoryCollection(); |
461 | zeroColl.Collection.OwnerID = f.owner_id; | 460 | zeroColl.Collection.OwnerID = f.owner_id; |
@@ -479,17 +478,13 @@ namespace OpenSim.Capabilities.Handlers | |||
479 | otherFolders.Add(f); | 478 | otherFolders.Add(f); |
480 | } | 479 | } |
481 | 480 | ||
482 | |||
483 | if(otherFolders.Count > 0) | 481 | if(otherFolders.Count > 0) |
484 | { | 482 | { |
485 | UUID[] fids = new UUID[otherFolders.Count]; | ||
486 | int i = 0; | 483 | int i = 0; |
487 | foreach (LLSDFetchInventoryDescendents f in otherFolders) | ||
488 | fids[i++] = f.folder_id; | ||
489 | 484 | ||
490 | //m_log.DebugFormat("[XXX]: {0}", string.Join(",", fids)); | 485 | //m_log.DebugFormat("[XXX]: {0}", string.Join(",", fids)); |
491 | 486 | ||
492 | InventoryCollection[] fetchedContents = m_InventoryService.GetMultipleFoldersContent(otherFolders[0].owner_id, fids); | 487 | InventoryCollection[] fetchedContents = m_InventoryService.GetMultipleFoldersContent(otherFolders[0].owner_id, otherIDs.ToArray()); |
493 | 488 | ||
494 | if (fetchedContents == null) | 489 | if (fetchedContents == null) |
495 | return null; | 490 | return null; |
@@ -532,34 +527,29 @@ namespace OpenSim.Capabilities.Handlers | |||
532 | 527 | ||
533 | private bool BadFolder(LLSDFetchInventoryDescendents freq, InventoryCollection contents, List<UUID> bad_folders) | 528 | private bool BadFolder(LLSDFetchInventoryDescendents freq, InventoryCollection contents, List<UUID> bad_folders) |
534 | { | 529 | { |
535 | bool bad = false; | ||
536 | if (contents == null) | 530 | if (contents == null) |
537 | { | 531 | { |
538 | bad_folders.Add(freq.folder_id); | 532 | bad_folders.Add(freq.folder_id); |
539 | bad = true; | 533 | return true; |
540 | } | 534 | } |
541 | 535 | ||
542 | // The inventory server isn't sending FolderID in the collection... | 536 | // The inventory server isn't sending FolderID in the collection... |
543 | // Must fetch it individually | 537 | // Must fetch it individually |
544 | else if (contents.FolderID == UUID.Zero) | 538 | if (contents.FolderID == UUID.Zero) |
545 | { | 539 | { |
546 | InventoryFolderBase containingFolder = m_InventoryService.GetFolder(freq.owner_id, freq.folder_id); | 540 | InventoryFolderBase containingFolder = m_InventoryService.GetFolder(freq.owner_id, freq.folder_id); |
547 | 541 | if (containingFolder == null) | |
548 | if (containingFolder != null) | ||
549 | { | ||
550 | contents.FolderID = containingFolder.ID; | ||
551 | contents.OwnerID = containingFolder.Owner; | ||
552 | contents.Version = containingFolder.Version; | ||
553 | } | ||
554 | else | ||
555 | { | 542 | { |
556 | m_log.WarnFormat("[WEB FETCH INV DESC HANDLER]: Unable to fetch folder {0}", freq.folder_id); | 543 | m_log.WarnFormat("[WEB FETCH INV DESC HANDLER]: Unable to fetch folder {0}", freq.folder_id); |
557 | bad_folders.Add(freq.folder_id); | 544 | bad_folders.Add(freq.folder_id); |
558 | bad = true; | 545 | return true; |
559 | } | 546 | } |
547 | contents.FolderID = containingFolder.ID; | ||
548 | contents.OwnerID = containingFolder.Owner; | ||
549 | contents.Version = containingFolder.Version; | ||
560 | } | 550 | } |
561 | 551 | ||
562 | return bad; | 552 | return false; |
563 | } | 553 | } |
564 | 554 | ||
565 | private void ProcessLinks(LLSDFetchInventoryDescendents freq, InventoryCollectionWithDescendents coll) | 555 | private void ProcessLinks(LLSDFetchInventoryDescendents freq, InventoryCollectionWithDescendents coll) |