diff options
Diffstat (limited to 'OpenSim/Region/Framework')
-rw-r--r-- | OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs | 60 |
1 files changed, 55 insertions, 5 deletions
diff --git a/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs b/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs index 431b903..e970543 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs | |||
@@ -422,6 +422,20 @@ namespace OpenSim.Region.Framework.Scenes | |||
422 | ); | 422 | ); |
423 | } | 423 | } |
424 | 424 | ||
425 | private class DescendentsRequestData | ||
426 | { | ||
427 | public IClientAPI RemoteClient; | ||
428 | public UUID FolderID; | ||
429 | public UUID OwnerID; | ||
430 | public bool FetchFolders; | ||
431 | public bool FetchItems; | ||
432 | public int SortOrder; | ||
433 | } | ||
434 | |||
435 | private Queue<DescendentsRequestData> m_descendentsRequestQueue = new Queue<DescendentsRequestData>(); | ||
436 | private Object m_descendentsRequestLock = new Object(); | ||
437 | private bool m_descendentsRequestProcessing = false; | ||
438 | |||
425 | /// <summary> | 439 | /// <summary> |
426 | /// Tell the client about the various child items and folders contained in the requested folder. | 440 | /// Tell the client about the various child items and folders contained in the requested folder. |
427 | /// </summary> | 441 | /// </summary> |
@@ -458,17 +472,38 @@ namespace OpenSim.Region.Framework.Scenes | |||
458 | } | 472 | } |
459 | } | 473 | } |
460 | 474 | ||
461 | // We're going to send the reply async, because there may be | 475 | lock (m_descendentsRequestLock) |
462 | // an enormous quantity of packets -- basically the entire inventory! | 476 | { |
463 | // We don't want to block the client thread while all that is happening. | 477 | if (!m_descendentsRequestProcessing) |
464 | SendInventoryDelegate d = SendInventoryAsync; | 478 | { |
465 | d.BeginInvoke(remoteClient, folderID, ownerID, fetchFolders, fetchItems, sortOrder, SendInventoryComplete, d); | 479 | m_descendentsRequestProcessing = true; |
480 | |||
481 | // We're going to send the reply async, because there may be | ||
482 | // an enormous quantity of packets -- basically the entire inventory! | ||
483 | // We don't want to block the client thread while all that is happening. | ||
484 | SendInventoryDelegate d = SendInventoryAsync; | ||
485 | d.BeginInvoke(remoteClient, folderID, ownerID, fetchFolders, fetchItems, sortOrder, SendInventoryComplete, d); | ||
486 | |||
487 | return; | ||
488 | } | ||
489 | |||
490 | DescendentsRequestData req = new DescendentsRequestData(); | ||
491 | req.RemoteClient = remoteClient; | ||
492 | req.FolderID = folderID; | ||
493 | req.OwnerID = ownerID; | ||
494 | req.FetchFolders = fetchFolders; | ||
495 | req.FetchItems = fetchItems; | ||
496 | req.SortOrder = sortOrder; | ||
497 | |||
498 | m_descendentsRequestQueue.Enqueue(req); | ||
499 | } | ||
466 | } | 500 | } |
467 | 501 | ||
468 | delegate void SendInventoryDelegate(IClientAPI remoteClient, UUID folderID, UUID ownerID, bool fetchFolders, bool fetchItems, int sortOrder); | 502 | delegate void SendInventoryDelegate(IClientAPI remoteClient, UUID folderID, UUID ownerID, bool fetchFolders, bool fetchItems, int sortOrder); |
469 | 503 | ||
470 | void SendInventoryAsync(IClientAPI remoteClient, UUID folderID, UUID ownerID, bool fetchFolders, bool fetchItems, int sortOrder) | 504 | void SendInventoryAsync(IClientAPI remoteClient, UUID folderID, UUID ownerID, bool fetchFolders, bool fetchItems, int sortOrder) |
471 | { | 505 | { |
506 | Thread.Sleep(20); | ||
472 | SendInventoryUpdate(remoteClient, new InventoryFolderBase(folderID), fetchFolders, fetchItems); | 507 | SendInventoryUpdate(remoteClient, new InventoryFolderBase(folderID), fetchFolders, fetchItems); |
473 | } | 508 | } |
474 | 509 | ||
@@ -476,6 +511,21 @@ namespace OpenSim.Region.Framework.Scenes | |||
476 | { | 511 | { |
477 | SendInventoryDelegate d = (SendInventoryDelegate)iar.AsyncState; | 512 | SendInventoryDelegate d = (SendInventoryDelegate)iar.AsyncState; |
478 | d.EndInvoke(iar); | 513 | d.EndInvoke(iar); |
514 | |||
515 | lock (m_descendentsRequestLock) | ||
516 | { | ||
517 | if (m_descendentsRequestQueue.Count > 0) | ||
518 | { | ||
519 | DescendentsRequestData req = m_descendentsRequestQueue.Dequeue(); | ||
520 | |||
521 | d = SendInventoryAsync; | ||
522 | d.BeginInvoke(req.RemoteClient, req.FolderID, req.OwnerID, req.FetchFolders, req.FetchItems, req.SortOrder, SendInventoryComplete, d); | ||
523 | |||
524 | return; | ||
525 | } | ||
526 | |||
527 | m_descendentsRequestProcessing = false; | ||
528 | } | ||
479 | } | 529 | } |
480 | 530 | ||
481 | /// <summary> | 531 | /// <summary> |