From 12bea7b3658c6dadd2142c80df330c0c578aa653 Mon Sep 17 00:00:00 2001 From: omegaworks Date: Thu, 14 Aug 2008 04:09:27 +0000 Subject: [PATCH] Implements Inventory.OnInventoryManaged, triggered when an item or folder is managed. Inventory might *just* be thread-safe now. git-svn-id: http://libopenmetaverse.googlecode.com/svn/trunk@2090 52acb1d6-8a22-11de-b505-999d5b087335 --- OpenMetaverse/Inventory.cs | 85 +++++++++++++++++++++++++++----------- 1 file changed, 62 insertions(+), 23 deletions(-) diff --git a/OpenMetaverse/Inventory.cs b/OpenMetaverse/Inventory.cs index 2ae371cd..28a18741 100644 --- a/OpenMetaverse/Inventory.cs +++ b/OpenMetaverse/Inventory.cs @@ -29,6 +29,7 @@ using System.Collections.Generic; using System.Collections; using System.Text; using System.Threading; + namespace OpenMetaverse { /// @@ -57,15 +58,28 @@ namespace OpenMetaverse /// public event InventoryUpdate OnInventoryUpdate; + + /// + /// Delegate for + /// + /// The Inventory that is managing + /// The inventory item or folder that was managed. + public delegate void InventoryManaged(Inventory inventory, InventoryBase ibase); + + /// + /// Triggered when an inventory item is first managed. + /// + public event InventoryManaged OnInventoryManaged; + /// /// Retrieves a managed InventoryBase from the Inventory. /// Returns null if the UUID isn't managed by this Inventory. /// /// The UUID of the InventoryBase to retrieve. /// A managed InventoryBase. - public InventoryBase this[UUID uuid] + public InventoryBase this[UUID uuid] { - get + get { InventoryBase item; if (Items.TryGetValue(uuid, out item)) @@ -82,11 +96,12 @@ namespace OpenMetaverse /// The owner of this inventory. Inventorys can only manage items /// owned by the same agent. /// - public UUID Owner { + public UUID Owner + { get { return _Owner; } private set { _Owner = value; } } - + private UUID _RootUUID; /// /// The UUID of the root folder. @@ -123,7 +138,7 @@ namespace OpenMetaverse /// Manager for remote updates. /// Skeleton of folders, inventory owner. public Inventory(InventoryManager manager, InventorySkeleton skeleton) - : this (manager, skeleton.Owner, skeleton.RootUUID) + : this(manager, skeleton.Owner, skeleton.RootUUID) { ManageSkeleton(skeleton); } @@ -325,18 +340,29 @@ namespace OpenMetaverse InventoryBase b; if (Items.TryGetValue(item.UUID, out b)) { + //Logger.DebugLog(String.Format("{0}: {1} already managed, updating.", (RootFolder == null) ? RootUUID.ToString() : RootFolder.Name, item.Name)); Update(b as InventoryItem, item); return b as InventoryItem; } else { InventoryItem wrapper = WrapItemData(item); - Items.Add(item.UUID, wrapper); + //Logger.DebugLog(String.Format("{0}: {1} managed, {2} total.", (RootFolder == null) ? RootUUID.ToString() : RootFolder.Name, item.Name, Items.Count)); + lock (Items) + Items.Add(item.UUID, wrapper); + + if (OnInventoryManaged != null) + { + try { OnInventoryManaged(this, wrapper); } + catch (Exception e) { Logger.Log(e.Message, Helpers.LogLevel.Error, e); } + } + return wrapper; } } else { + //Logger.DebugLog(String.Format("{0}: {1} is not owned by this inventory.", (RootFolder == null) ? RootUUID.ToString() : RootFolder.Name, item.Name)); return null; } } @@ -359,29 +385,35 @@ namespace OpenMetaverse InventoryBase b; if (Items.TryGetValue(folder.UUID, out b)) { + //Logger.DebugLog(String.Format("{0}: {1} already managed, updating.", (RootFolder == null) ? RootUUID.ToString() : RootFolder.Name, folder.Name)); Update(b as InventoryFolder, folder); return b as InventoryFolder; } else { InventoryFolder wrapper = WrapFolderData(folder); - Items.Add(folder.UUID, wrapper); lock (Items) + Items.Add(folder.UUID, wrapper); + //Logger.DebugLog(String.Format("{0}: {1} managed, {2} total.", (RootFolder == null) ? RootUUID.ToString() : RootFolder.Name, folder.Name, Items.Count)); + // Folder is now managed, update its contents with known children. + foreach (InventoryBase item in Items.Values) { - // Folder is now managed, update its contents with known children. - foreach (InventoryBase item in Items.Values) + if (item.ParentUUID == folder.UUID) { - if (item.ParentUUID == folder.UUID) - { - wrapper.AddChild(item); - } + wrapper.AddChild(item); } } + if (OnInventoryManaged != null) + { + try { OnInventoryManaged(this, wrapper); } + catch (Exception e) { Logger.Log(e.Message, Helpers.LogLevel.Error, e); } + } return wrapper; } } else { + //Logger.DebugLog(String.Format("{0}: {1} is not owned by this inventory.", (RootFolder == null) ? RootUUID.ToString() : RootFolder.Name, folder.Name)); return null; } } @@ -393,7 +425,9 @@ namespace OpenMetaverse /// public void Unmanage(InventoryBase item) { - Items.Remove(item.UUID); + lock (Items) + Items.Remove(item.UUID); + //Logger.DebugLog("Unmanaging " + item.Name); } protected void Update(InventoryItem item, ItemData update) @@ -433,6 +467,8 @@ namespace OpenMetaverse } } + #region Pathing + /// /// Fetches an inventory item or folder by path. /// If the path starts with /, is ignored @@ -558,16 +594,19 @@ namespace OpenMetaverse return results; } - + #endregion Pathing #region IEnumerable Members public IEnumerator GetEnumerator() { - foreach (KeyValuePair kvp in Items) + lock (Items) { - yield return kvp.Value; + foreach (KeyValuePair kvp in Items) + { + yield return kvp.Value; + } } } @@ -648,7 +687,7 @@ namespace OpenMetaverse get { return _Manager; } private set { _Manager = value; } } - + public InventoryBase(InventoryManager manager, Inventory inventory) { Inventory = inventory; @@ -662,7 +701,7 @@ namespace OpenMetaverse /// The folder to move this InventoryBase to. public virtual void Move(InventoryFolder destination) { - if (destination.UUID != ParentUUID) + if (destination.UUID != ParentUUID) { if (Parent != null) { @@ -925,7 +964,7 @@ namespace OpenMetaverse _Contents[child.UUID] = child; } } - + protected internal void RemoveChild(InventoryBase child) { lock (_Contents) @@ -1062,10 +1101,10 @@ namespace OpenMetaverse { List items; List folders; - bool success = Manager.FolderContents(UUID, Data.OwnerID, true, true, InventorySortOrder.ByName, + bool success = Manager.FolderContents(UUID, Data.OwnerID, true, true, InventorySortOrder.ByName, timeout, out items, out folders); - if (success) - { + if (success) + { Dictionary contents = new Dictionary(items.Count + folders.Count); foreach (ItemData item in items) contents.Add(item.UUID, Inventory.Manage(item));