mirror of
https://github.com/opensim/opensim.git
synced 2026-08-12 20:55:43 +08:00
* 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.
This commit is contained in:
@@ -39,32 +39,38 @@ namespace OpenSim.Region.Communications.Local
|
||||
/// </summary>
|
||||
public class LocalInventoryService : InventoryServiceBase
|
||||
{
|
||||
public override void RequestInventoryForUser(LLUUID userID, InventoryFolderInfo folderCallBack,
|
||||
InventoryItemInfo itemCallBack)
|
||||
public override void RequestInventoryForUser(LLUUID userID, InventoryReceiptCallback callback)
|
||||
{
|
||||
List<InventoryFolderBase> folders = GetInventorySkeleton(userID);
|
||||
|
||||
List<InventoryFolderBase> skeletonFolders = GetInventorySkeleton(userID);
|
||||
InventoryFolderImpl rootFolder = null;
|
||||
|
||||
ICollection<InventoryFolderImpl> folders = new List<InventoryFolderImpl>();
|
||||
ICollection<InventoryItemBase> items = new List<InventoryItemBase>();
|
||||
|
||||
//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;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Send the given inventory folder and its item contents back to the requester.
|
||||
/// </summary>
|
||||
/// <param name="userID"></param>
|
||||
/// <param name="folder"></param>
|
||||
private InventoryFolderImpl RequestInventoryFolder(LLUUID userID, InventoryFolderBase folder,
|
||||
InventoryFolderInfo folderCallBack,
|
||||
InventoryItemInfo itemCallBack)
|
||||
{
|
||||
InventoryFolderImpl newFolder = new InventoryFolderImpl(folder);
|
||||
folderCallBack(userID, newFolder);
|
||||
|
||||
List<InventoryItemBase> items = RequestFolderItems(newFolder.ID);
|
||||
foreach (InventoryItemBase item in items)
|
||||
{
|
||||
itemCallBack(userID, item);
|
||||
}
|
||||
|
||||
return newFolder;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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<InventoryFolderImpl> folders = new List<InventoryFolderImpl>();
|
||||
ICollection<InventoryItemBase> items = new List<InventoryItemBase>();
|
||||
|
||||
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
|
||||
|
||||
/// <summary>
|
||||
/// Caches a pending inventory request that has yet to be satisfied by the inventory service
|
||||
/// </summary>
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user