From a5176c2e2c4d2791ec15a22db4309bb15bc3ae98 Mon Sep 17 00:00:00 2001 From: Justin Clarke Casey Date: Fri, 11 Apr 2008 18:13:10 +0000 Subject: * Change inventory async response deliver to deliver all items and folders at once, rather than each individual * This is required in order to work towards eliminating some inventory race conditions and to better deal with situations where a grid inventory server is slow or not responding. --- .../Communications/Local/LocalInventoryService.cs | 45 ++++++++-------------- .../Communications/OGS1/OGS1InventoryService.cs | 40 ++++++++++++------- 2 files changed, 41 insertions(+), 44 deletions(-) (limited to 'OpenSim/Region/Communications') diff --git a/OpenSim/Region/Communications/Local/LocalInventoryService.cs b/OpenSim/Region/Communications/Local/LocalInventoryService.cs index bb3db9d..13cb6de 100644 --- a/OpenSim/Region/Communications/Local/LocalInventoryService.cs +++ b/OpenSim/Region/Communications/Local/LocalInventoryService.cs @@ -39,32 +39,38 @@ namespace OpenSim.Region.Communications.Local /// public class LocalInventoryService : InventoryServiceBase { - public override void RequestInventoryForUser(LLUUID userID, InventoryFolderInfo folderCallBack, - InventoryItemInfo itemCallBack) + public override void RequestInventoryForUser(LLUUID userID, InventoryReceiptCallback callback) { - List folders = GetInventorySkeleton(userID); - + List skeletonFolders = GetInventorySkeleton(userID); InventoryFolderImpl rootFolder = null; + + ICollection folders = new List(); + ICollection items = new List(); - //need to make sure we send root folder first - foreach (InventoryFolderBase folder in folders) + // Need to retrieve the root folder on the first pass + foreach (InventoryFolderBase folder in skeletonFolders) { if (folder.ParentID == LLUUID.Zero) { - rootFolder = RequestInventoryFolder(userID, folder, folderCallBack, itemCallBack); + //rootFolder = RequestInventoryFolder(userID, folder, callback); + rootFolder = new InventoryFolderImpl(folder); + folders.Add(rootFolder); } } if (rootFolder != null) { - foreach (InventoryFolderBase folder in folders) + foreach (InventoryFolderBase folder in skeletonFolders) { if (folder.ID != rootFolder.ID) { - RequestInventoryFolder(userID, folder, folderCallBack, itemCallBack); + //RequestInventoryFolder(userID, folder, callback); + folders.Add(new InventoryFolderImpl(folder)); } } } + + callback(userID, folders, items); } public override void AddNewInventoryFolder(LLUUID userID, InventoryFolderBase folder) @@ -99,26 +105,5 @@ namespace OpenSim.Region.Communications.Local return true; } } - - /// - /// Send the given inventory folder and its item contents back to the requester. - /// - /// - /// - private InventoryFolderImpl RequestInventoryFolder(LLUUID userID, InventoryFolderBase folder, - InventoryFolderInfo folderCallBack, - InventoryItemInfo itemCallBack) - { - InventoryFolderImpl newFolder = new InventoryFolderImpl(folder); - folderCallBack(userID, newFolder); - - List items = RequestFolderItems(newFolder.ID); - foreach (InventoryItemBase item in items) - { - itemCallBack(userID, item); - } - - return newFolder; - } } } diff --git a/OpenSim/Region/Communications/OGS1/OGS1InventoryService.cs b/OpenSim/Region/Communications/OGS1/OGS1InventoryService.cs index b18c5bf..f31127f 100644 --- a/OpenSim/Region/Communications/OGS1/OGS1InventoryService.cs +++ b/OpenSim/Region/Communications/OGS1/OGS1InventoryService.cs @@ -51,12 +51,11 @@ namespace OpenSim.Region.Communications.OGS1 #region IInventoryServices Members // See IInventoryServices - public void RequestInventoryForUser(LLUUID userID, InventoryFolderInfo folderCallBack, - InventoryItemInfo itemCallBack) + public void RequestInventoryForUser(LLUUID userID, InventoryReceiptCallback callback) { if (!m_RequestingInventory.ContainsKey(userID)) { - InventoryRequest request = new InventoryRequest(userID, folderCallBack, itemCallBack); + InventoryRequest request = new InventoryRequest(userID, callback); m_RequestingInventory.Add(userID, request); RequestInventory(userID); } @@ -105,13 +104,17 @@ namespace OpenSim.Region.Communications.OGS1 InventoryFolderImpl rootFolder = null; InventoryRequest request = m_RequestingInventory[userID]; + + ICollection folders = new List(); + ICollection items = new List(); + foreach (InventoryFolderBase folder in response.Folders) { if (folder.ParentID == LLUUID.Zero) { - InventoryFolderImpl newfolder = new InventoryFolderImpl(folder); - rootFolder = newfolder; - request.FolderCallBack(userID, newfolder); + rootFolder = new InventoryFolderImpl(folder); + folders.Add(rootFolder); + //request.FolderCallBack(userID, newfolder); } } @@ -121,16 +124,20 @@ namespace OpenSim.Region.Communications.OGS1 { if (folder.ID != rootFolder.ID) { - InventoryFolderImpl newfolder = new InventoryFolderImpl(folder); - request.FolderCallBack(userID, newfolder); + folders.Add(new InventoryFolderImpl(folder)); + //request.FolderCallBack(userID, newfolder); } } foreach (InventoryItemBase item in response.AllItems) { - request.ItemCallBack(userID, item); + items.Add(item); + //request.ItemCallBack(userID, item); } } + + request.Callback(userID, folders, items); + m_RequestingInventory.Remove(userID); } else @@ -223,17 +230,22 @@ namespace OpenSim.Region.Communications.OGS1 #endregion + /// + /// Caches a pending inventory request that has yet to be satisfied by the inventory service + /// public class InventoryRequest { public LLUUID UserID; - public InventoryFolderInfo FolderCallBack; - public InventoryItemInfo ItemCallBack; + public InventoryReceiptCallback Callback; + //public InventoryFolderInfo FolderCallBack; + //public InventoryItemInfo ItemCallBack; - public InventoryRequest(LLUUID userId, InventoryFolderInfo folderCall, InventoryItemInfo itemCall) + public InventoryRequest(LLUUID userId, InventoryReceiptCallback callback) { UserID = userId; - FolderCallBack = folderCall; - ItemCallBack = itemCall; + //FolderCallBack = folderCall; + //ItemCallBack = itemCall; + Callback = callback; } } } -- cgit v1.1