insert an InventoryArchiveUtils.FindItemsByPath() to return multiple items rather than just the first one
parent
896f039513
commit
fe890554fb
|
@ -149,14 +149,15 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Find an item given a PATH_DELIMITOR delimited path starting from the user's root folder.
|
/// Find an item given a PATH_DELIMITOR delimited path starting from the user's root folder.
|
||||||
///
|
/// </summary>
|
||||||
|
/// <remarks>
|
||||||
/// This method does not handle paths that contain multiple delimitors
|
/// This method does not handle paths that contain multiple delimitors
|
||||||
///
|
///
|
||||||
/// FIXME: We do not yet handle situations where folders or items have the same name. We could handle this by some
|
/// FIXME: We do not yet handle situations where folders or items have the same name. We could handle this by some
|
||||||
/// XPath like expression
|
/// XPath like expression
|
||||||
///
|
///
|
||||||
/// FIXME: Delimitors which occur in names themselves are not currently escapable.
|
/// FIXME: Delimitors which occur in names themselves are not currently escapable.
|
||||||
/// </summary>
|
/// </remarks>
|
||||||
///
|
///
|
||||||
/// <param name="inventoryService">
|
/// <param name="inventoryService">
|
||||||
/// Inventory service to query
|
/// Inventory service to query
|
||||||
|
@ -198,6 +199,35 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
|
||||||
public static InventoryItemBase FindItemByPath(
|
public static InventoryItemBase FindItemByPath(
|
||||||
IInventoryService inventoryService, InventoryFolderBase startFolder, string path)
|
IInventoryService inventoryService, InventoryFolderBase startFolder, string path)
|
||||||
{
|
{
|
||||||
|
List<InventoryItemBase> foundItems = FindItemsByPath(inventoryService, startFolder, path);
|
||||||
|
|
||||||
|
if (foundItems.Count != 0)
|
||||||
|
return foundItems[0];
|
||||||
|
else
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Find items that match a given PATH_DELIMITOR delimited path starting from this folder.
|
||||||
|
/// </summary>
|
||||||
|
/// <remarks>
|
||||||
|
/// This method does not handle paths that contain multiple delimiters
|
||||||
|
///
|
||||||
|
/// FIXME: We do not yet handle situations where folders or items have the same name. We could handle this by some
|
||||||
|
/// XPath like expression
|
||||||
|
///
|
||||||
|
/// FIXME: Delimitors which occur in names themselves are not currently escapable.
|
||||||
|
/// </remarks>
|
||||||
|
///
|
||||||
|
/// <param name="inventoryService">Inventory service to query</param>
|
||||||
|
/// <param name="startFolder">The folder from which the path starts</param>
|
||||||
|
/// <param name="path">The path to the required item.</param>
|
||||||
|
/// <returns>The items that were found with this path. An empty list if no items were found.</returns>
|
||||||
|
public static List<InventoryItemBase> FindItemsByPath(
|
||||||
|
IInventoryService inventoryService, InventoryFolderBase startFolder, string path)
|
||||||
|
{
|
||||||
|
List<InventoryItemBase> foundItems = new List<InventoryItemBase>();
|
||||||
|
|
||||||
// If the path isn't just / then trim any starting extraneous slashes
|
// If the path isn't just / then trim any starting extraneous slashes
|
||||||
path = path.TrimStart(new char[] { PATH_DELIMITER });
|
path = path.TrimStart(new char[] { PATH_DELIMITER });
|
||||||
|
|
||||||
|
@ -221,7 +251,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
|
||||||
// m_log.DebugFormat("[INVENTORY ARCHIVE UTILS]: Inspecting item {0} {1}", item.Name, item.ID);
|
// m_log.DebugFormat("[INVENTORY ARCHIVE UTILS]: Inspecting item {0} {1}", item.Name, item.ID);
|
||||||
|
|
||||||
if (item.Name == components[0])
|
if (item.Name == components[0])
|
||||||
return item;
|
foundItems.Add(item);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -233,12 +263,11 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
|
||||||
foreach (InventoryFolderBase folder in contents.Folders)
|
foreach (InventoryFolderBase folder in contents.Folders)
|
||||||
{
|
{
|
||||||
if (folder.Name == components[0])
|
if (folder.Name == components[0])
|
||||||
return FindItemByPath(inventoryService, folder, components[1]);
|
foundItems.AddRange(FindItemsByPath(inventoryService, folder, components[1]));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// We didn't find an item or intermediate folder with the given name
|
return foundItems;
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|
|
@ -255,10 +255,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
|
||||||
|
|
||||||
// The path may point to an item instead
|
// The path may point to an item instead
|
||||||
if (inventoryFolder == null)
|
if (inventoryFolder == null)
|
||||||
{
|
|
||||||
inventoryItem = InventoryArchiveUtils.FindItemByPath(m_scene.InventoryService, rootFolder, m_invPath);
|
inventoryItem = InventoryArchiveUtils.FindItemByPath(m_scene.InventoryService, rootFolder, m_invPath);
|
||||||
//inventoryItem = m_userInfo.RootFolder.FindItemByPath(m_invPath);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (null == inventoryFolder && null == inventoryItem)
|
if (null == inventoryFolder && null == inventoryItem)
|
||||||
{
|
{
|
||||||
|
|
|
@ -69,6 +69,9 @@ namespace OpenSim.Region.Framework.Tests
|
||||||
= UserInventoryHelpers.GetInventoryItem(scene.InventoryService, user2.PrincipalID, "Objects/item1");
|
= UserInventoryHelpers.GetInventoryItem(scene.InventoryService, user2.PrincipalID, "Objects/item1");
|
||||||
|
|
||||||
Assert.That(retrievedItem1, Is.Not.Null);
|
Assert.That(retrievedItem1, Is.Not.Null);
|
||||||
|
|
||||||
|
// Try giving back the freshly received item
|
||||||
|
//scene.GiveInventoryItem(user1.PrincipalID, user2.PrincipalID, retrievedItem1.ID);
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
|
|
Loading…
Reference in New Issue