diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/HGInventoryBroker.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/HGInventoryBroker.cs index b5c0af6686..4be3804c1f 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/HGInventoryBroker.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/HGInventoryBroker.cs @@ -58,6 +58,8 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory private List m_Scenes = new List(); + private InventoryCache m_Cache = new InventoryCache(); + protected IUserManagement m_UserManagement; protected IUserManagement UserManagementModule { @@ -312,6 +314,9 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory public InventoryFolderBase GetRootFolder(UUID userID) { //m_log.DebugFormat("[HG INVENTORY CONNECTOR]: GetRootFolder for {0}", userID); + InventoryFolderBase root = m_Cache.GetRootFolder(userID); + if (root != null) + return root; string invURL = GetInventoryServiceURL(userID); @@ -320,12 +325,19 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory IInventoryService connector = GetConnector(invURL); - return connector.GetRootFolder(userID); + root = connector.GetRootFolder(userID); + + m_Cache.Cache(userID, root); + + return root; } public InventoryFolderBase GetFolderForType(UUID userID, AssetType type) { //m_log.DebugFormat("[HG INVENTORY CONNECTOR]: GetFolderForType {0} type {1}", userID, type); + InventoryFolderBase f = m_Cache.GetFolderForType(userID, type); + if (f != null) + return f; string invURL = GetInventoryServiceURL(userID); @@ -334,7 +346,11 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory IInventoryService connector = GetConnector(invURL); - return connector.GetFolderForType(userID, type); + f = connector.GetFolderForType(userID, type); + + m_Cache.Cache(userID, type, f); + + return f; } public InventoryCollection GetFolderContent(UUID userID, UUID folderID) diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/InventoryCache.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/InventoryCache.cs new file mode 100644 index 0000000000..0fe778dfa6 --- /dev/null +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/InventoryCache.cs @@ -0,0 +1,59 @@ +using System; +using System.Collections.Generic; + +using OpenSim.Framework; +using OpenMetaverse; + +namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory +{ + public class InventoryCache + { + private const double CACHE_EXPIRATION_SECONDS = 3600.0; // 1 hour + + private static ExpiringCache m_RootFolders = new ExpiringCache(); + private static ExpiringCache> m_FolderTypes = new ExpiringCache>(); + + public void Cache(UUID userID, InventoryFolderBase root) + { + lock (m_RootFolders) + m_RootFolders.AddOrUpdate(userID, root, CACHE_EXPIRATION_SECONDS); + } + + public InventoryFolderBase GetRootFolder(UUID userID) + { + InventoryFolderBase root = null; + if (m_RootFolders.TryGetValue(userID, out root)) + return root; + + return null; + } + + public void Cache(UUID userID, AssetType type, InventoryFolderBase folder) + { + lock (m_FolderTypes) + { + Dictionary ff = null; + if (!m_FolderTypes.TryGetValue(userID, out ff)) + { + ff = new Dictionary(); + m_FolderTypes.Add(userID, ff, CACHE_EXPIRATION_SECONDS); + } + if (!ff.ContainsKey(type)) + ff.Add(type, folder); + } + } + + public InventoryFolderBase GetFolderForType(UUID userID, AssetType type) + { + Dictionary ff = null; + if (m_FolderTypes.TryGetValue(userID, out ff)) + { + InventoryFolderBase f = null; + if (ff.TryGetValue(type, out f)) + return f; + } + + return null; + } + } +} diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs index 719c300985..d1739de284 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs @@ -616,7 +616,7 @@ namespace OpenSim.Region.Framework.Scenes { IInventoryAccessModule invAccess = RequestModuleInterface(); if (invAccess != null) - invAccess.TransferInventoryAssets(itemCopy, senderId, recipient); + Util.FireAndForget(delegate { invAccess.TransferInventoryAssets(itemCopy, senderId, recipient); }); } if (!Permissions.BypassPermissions()) diff --git a/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs b/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs index 96f33a5a91..cdb6efec71 100644 --- a/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs +++ b/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs @@ -34,13 +34,17 @@ using OpenSim.Framework; using OpenSim.Region.Framework.Interfaces; using OpenSim.Region.Framework.Scenes; using OpenSim.Region.CoreModules.World.Estate; +using log4net; +using System.Reflection; +using System.Xml; namespace OpenSim.Region.OptionalModules.World.NPC { public class NPCAvatar : IClientAPI, INPC { - public bool SenseAsAgent { get; set; } + private static readonly Dictionary m_defaultAnimations = new Dictionary(); + public bool SenseAsAgent { get; set; } private readonly string m_firstname; private readonly string m_lastname; private readonly Vector3 m_startPos; @@ -57,8 +61,16 @@ namespace OpenSim.Region.OptionalModules.World.NPC m_scene = scene; m_ownerID = ownerID; SenseAsAgent = senseAsAgent; + } + static NPCAvatar() + { + InitDefaultAnimations(); + } + + + public IScene Scene { get { return m_scene; } @@ -130,8 +142,31 @@ namespace OpenSim.Region.OptionalModules.World.NPC } + private static void InitDefaultAnimations() + { + using (XmlTextReader reader = new XmlTextReader("data/avataranimations.xml")) + { + XmlDocument doc = new XmlDocument(); + doc.Load(reader); + if (doc.DocumentElement != null) + foreach (XmlNode nod in doc.DocumentElement.ChildNodes) + { + if (nod.Attributes["name"] != null) + { + string name = nod.Attributes["name"].Value.ToLower(); + string id = nod.InnerText; + m_defaultAnimations.Add(name, (UUID)id); + } + } + } + } + public UUID GetDefaultAnimation(string name) { + if (m_defaultAnimations.ContainsKey(name)) + { + return m_defaultAnimations[name]; + } return UUID.Zero; } diff --git a/OpenSim/Services/Connectors/Inventory/XInventoryConnector.cs b/OpenSim/Services/Connectors/Inventory/XInventoryConnector.cs index a662abb867..39e983bfd9 100644 --- a/OpenSim/Services/Connectors/Inventory/XInventoryConnector.cs +++ b/OpenSim/Services/Connectors/Inventory/XInventoryConnector.cs @@ -48,6 +48,8 @@ namespace OpenSim.Services.Connectors private string m_ServerURI = String.Empty; + private object m_Lock = new object(); + public XInventoryServicesConnector() { } @@ -514,9 +516,11 @@ namespace OpenSim.Services.Connectors { sendData["METHOD"] = method; - string reply = SynchronousRestFormsRequester.MakeRequest("POST", - m_ServerURI + "/xinventory", - ServerUtils.BuildQueryString(sendData)); + string reply = string.Empty; + lock (m_Lock) + reply = SynchronousRestFormsRequester.MakeRequest("POST", + m_ServerURI + "/xinventory", + ServerUtils.BuildQueryString(sendData)); Dictionary replyData = ServerUtils.ParseXmlResponse( reply);