From 6942eaed5b3d8065ebf01dc465e905ca456c0fa4 Mon Sep 17 00:00:00 2001 From: Charles Krinke Date: Mon, 29 Jun 2009 21:47:47 +0000 Subject: Thank you kindly, Snowdrop, for a patch that solves: The current API for MRM is quite sparse, this patch supplies basic support for accessing the task inventory of object. --- .../Scripting/Minimodule/SOPObjectInventory.cs | 190 +++++++++++++++++++++ 1 file changed, 190 insertions(+) create mode 100644 OpenSim/Region/OptionalModules/Scripting/Minimodule/SOPObjectInventory.cs (limited to 'OpenSim/Region/OptionalModules/Scripting/Minimodule/SOPObjectInventory.cs') diff --git a/OpenSim/Region/OptionalModules/Scripting/Minimodule/SOPObjectInventory.cs b/OpenSim/Region/OptionalModules/Scripting/Minimodule/SOPObjectInventory.cs new file mode 100644 index 0000000..19740bd --- /dev/null +++ b/OpenSim/Region/OptionalModules/Scripting/Minimodule/SOPObjectInventory.cs @@ -0,0 +1,190 @@ +using System; +using System.Collections; +using System.Collections.Generic; + +using OpenSim.Framework; +using OpenSim.Region.Framework.Scenes; +using OpenMetaverse; + +namespace OpenSim.Region.OptionalModules.Scripting.Minimodule.Object +{ + + + public class SOPObjectInventory : IObjectInventory + { + TaskInventoryDictionary m_privateInventory; /// OpenSim's task inventory + Dictionary m_publicInventory; /// MRM's inventory + Scene m_rootScene; + + public SOPObjectInventory(Scene rootScene, TaskInventoryDictionary taskInventory) + { + m_rootScene = rootScene; + m_privateInventory = taskInventory; + m_publicInventory = new Dictionary(); + } + + /// + /// Fully populate the public dictionary with the contents of the private dictionary + /// + /// + /// This will only convert those items which hasn't already been converted. ensuring that + /// no items are converted twice, and that any references already in use are maintained. + /// + private void SynchronizeDictionaries() + { + foreach(TaskInventoryItem privateItem in m_privateInventory.Values) + if(!m_publicInventory.ContainsKey(privateItem.ItemID)) + m_publicInventory.Add(privateItem.ItemID, new InventoryItem(m_rootScene, privateItem)); + } + + #region IDictionary implementation + public void Add (UUID key, IInventoryItem value) + { + m_publicInventory.Add(key, value); + m_privateInventory.Add(key, InventoryItem.FromInterface(value).ToTaskInventoryItem()); + } + + public bool ContainsKey (UUID key) + { + return m_privateInventory.ContainsKey(key); + } + + public bool Remove (UUID key) + { + m_publicInventory.Remove(key); + return m_privateInventory.Remove(key); + } + + public bool TryGetValue (UUID key, out IInventoryItem value) + { + value = null; + + bool result = false; + if(!m_publicInventory.TryGetValue(key, out value)) + { + // wasn't found in the public inventory + TaskInventoryItem privateItem; + + result = m_privateInventory.TryGetValue(key, out privateItem); + if(result) + { + value = new InventoryItem(m_rootScene, privateItem); + m_publicInventory.Add(key, value); // add item, so we don't convert again + } + } else + return true; + + return result; + } + + public ICollection Keys { + get { + return m_privateInventory.Keys; + } + } + + public ICollection Values { + get { + SynchronizeDictionaries(); + return m_publicInventory.Values; + } + } + #endregion + + #region IEnumerable> implementation + public IEnumerator> GetEnumerator () + { + SynchronizeDictionaries(); + return m_publicInventory.GetEnumerator(); + } + + #endregion + + #region IEnumerable implementation + IEnumerator IEnumerable.GetEnumerator () + { + SynchronizeDictionaries(); + return m_publicInventory.GetEnumerator(); + } + + #endregion + + #region ICollection> implementation + public void Add (KeyValuePair item) + { + Add(item.Key, item.Value); + } + + public void Clear () + { + m_publicInventory.Clear(); + m_privateInventory.Clear(); + } + + public bool Contains (KeyValuePair item) + { + return m_privateInventory.ContainsKey(item.Key); + } + + public void CopyTo (KeyValuePair[] array, int arrayIndex) + { + throw new NotImplementedException(); + } + + public bool Remove (KeyValuePair item) + { + return Remove(item.Key); + } + + public int Count { + get { + return m_privateInventory.Count; + } + } + + public bool IsReadOnly { + get { + return false; + } + } + #endregion + + #region Explicit implementations + IInventoryItem System.Collections.Generic.IDictionary.this[UUID key] + { + get { + IInventoryItem result; + if(TryGetValue(key, out result)) + return result; + else + throw new KeyNotFoundException("[MRM] The requrested item ID could not be found"); + } + set { + m_publicInventory[key] = value; + m_privateInventory[key] = InventoryItem.FromInterface(value).ToTaskInventoryItem(); + } + } + + void System.Collections.Generic.ICollection>.CopyTo(System.Collections.Generic.KeyValuePair[] array, int offset) + { + throw new NotImplementedException(); + } + #endregion + + public IInventoryItem this[string name] + { + get { + foreach(TaskInventoryItem i in m_privateInventory.Values) + if(i.Name == name) + { + if(!m_publicInventory.ContainsKey(i.ItemID)) + m_publicInventory.Add(i.ItemID, new InventoryItem(m_rootScene, i)); + + return m_publicInventory[i.ItemID]; + } + throw new KeyNotFoundException(); + } + } + + } +} -- cgit v1.1