Merge branch 'master' of melanie@opensimulator.org:/var/git/opensim
commit
5c5a493791
|
@ -58,6 +58,8 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
|
||||||
|
|
||||||
private List<Scene> m_Scenes = new List<Scene>();
|
private List<Scene> m_Scenes = new List<Scene>();
|
||||||
|
|
||||||
|
private InventoryCache m_Cache = new InventoryCache();
|
||||||
|
|
||||||
protected IUserManagement m_UserManagement;
|
protected IUserManagement m_UserManagement;
|
||||||
protected IUserManagement UserManagementModule
|
protected IUserManagement UserManagementModule
|
||||||
{
|
{
|
||||||
|
@ -312,6 +314,9 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
|
||||||
public InventoryFolderBase GetRootFolder(UUID userID)
|
public InventoryFolderBase GetRootFolder(UUID userID)
|
||||||
{
|
{
|
||||||
//m_log.DebugFormat("[HG INVENTORY CONNECTOR]: GetRootFolder for {0}", 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);
|
string invURL = GetInventoryServiceURL(userID);
|
||||||
|
|
||||||
|
@ -320,12 +325,19 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
|
||||||
|
|
||||||
IInventoryService connector = GetConnector(invURL);
|
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)
|
public InventoryFolderBase GetFolderForType(UUID userID, AssetType type)
|
||||||
{
|
{
|
||||||
//m_log.DebugFormat("[HG INVENTORY CONNECTOR]: GetFolderForType {0} type {1}", userID, 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);
|
string invURL = GetInventoryServiceURL(userID);
|
||||||
|
|
||||||
|
@ -334,7 +346,11 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
|
||||||
|
|
||||||
IInventoryService connector = GetConnector(invURL);
|
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)
|
public InventoryCollection GetFolderContent(UUID userID, UUID folderID)
|
||||||
|
|
|
@ -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<UUID, InventoryFolderBase> m_RootFolders = new ExpiringCache<UUID, InventoryFolderBase>();
|
||||||
|
private static ExpiringCache<UUID, Dictionary<AssetType, InventoryFolderBase>> m_FolderTypes = new ExpiringCache<UUID, Dictionary<AssetType, InventoryFolderBase>>();
|
||||||
|
|
||||||
|
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<AssetType, InventoryFolderBase> ff = null;
|
||||||
|
if (!m_FolderTypes.TryGetValue(userID, out ff))
|
||||||
|
{
|
||||||
|
ff = new Dictionary<AssetType, InventoryFolderBase>();
|
||||||
|
m_FolderTypes.Add(userID, ff, CACHE_EXPIRATION_SECONDS);
|
||||||
|
}
|
||||||
|
if (!ff.ContainsKey(type))
|
||||||
|
ff.Add(type, folder);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public InventoryFolderBase GetFolderForType(UUID userID, AssetType type)
|
||||||
|
{
|
||||||
|
Dictionary<AssetType, InventoryFolderBase> ff = null;
|
||||||
|
if (m_FolderTypes.TryGetValue(userID, out ff))
|
||||||
|
{
|
||||||
|
InventoryFolderBase f = null;
|
||||||
|
if (ff.TryGetValue(type, out f))
|
||||||
|
return f;
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -633,7 +633,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
{
|
{
|
||||||
IInventoryAccessModule invAccess = RequestModuleInterface<IInventoryAccessModule>();
|
IInventoryAccessModule invAccess = RequestModuleInterface<IInventoryAccessModule>();
|
||||||
if (invAccess != null)
|
if (invAccess != null)
|
||||||
invAccess.TransferInventoryAssets(itemCopy, senderId, recipient);
|
Util.FireAndForget(delegate { invAccess.TransferInventoryAssets(itemCopy, senderId, recipient); });
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!Permissions.BypassPermissions())
|
if (!Permissions.BypassPermissions())
|
||||||
|
|
|
@ -48,6 +48,8 @@ namespace OpenSim.Services.Connectors
|
||||||
|
|
||||||
private string m_ServerURI = String.Empty;
|
private string m_ServerURI = String.Empty;
|
||||||
|
|
||||||
|
private object m_Lock = new object();
|
||||||
|
|
||||||
public XInventoryServicesConnector()
|
public XInventoryServicesConnector()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
@ -514,9 +516,11 @@ namespace OpenSim.Services.Connectors
|
||||||
{
|
{
|
||||||
sendData["METHOD"] = method;
|
sendData["METHOD"] = method;
|
||||||
|
|
||||||
string reply = SynchronousRestFormsRequester.MakeRequest("POST",
|
string reply = string.Empty;
|
||||||
m_ServerURI + "/xinventory",
|
lock (m_Lock)
|
||||||
ServerUtils.BuildQueryString(sendData));
|
reply = SynchronousRestFormsRequester.MakeRequest("POST",
|
||||||
|
m_ServerURI + "/xinventory",
|
||||||
|
ServerUtils.BuildQueryString(sendData));
|
||||||
|
|
||||||
Dictionary<string, object> replyData = ServerUtils.ParseXmlResponse(
|
Dictionary<string, object> replyData = ServerUtils.ParseXmlResponse(
|
||||||
reply);
|
reply);
|
||||||
|
|
Loading…
Reference in New Issue