diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
index edb881f6ca..2f37483964 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
@@ -898,33 +898,33 @@ namespace OpenSim.Region.Framework.Scenes
}
- if (remoteClient.AgentId == oldAgentID
- || (LibraryService != null
- && LibraryService.LibraryRootFolder != null
- && oldAgentID == LibraryService.LibraryRootFolder.Owner))
- {
- CreateNewInventoryItem(
- remoteClient, item.CreatorId, item.CreatorData, newFolderID,
- newName, item.Description, item.Flags, callbackID, item.AssetID, (sbyte)item.AssetType, (sbyte)item.InvType,
- item.BasePermissions, item.CurrentPermissions, item.EveryOnePermissions,
- item.NextPermissions, item.GroupPermissions, Util.UnixTimeSinceEpoch(), false);
- }
- else
- {
- // If item is transfer or permissions are off or calling agent is allowed to copy item owner's inventory item.
- if (((item.CurrentPermissions & (uint)PermissionMask.Transfer) != 0)
- && (m_permissions.BypassPermissions()
- || m_permissions.CanCopyUserInventory(remoteClient.AgentId, oldItemID)))
+ if (remoteClient.AgentId == oldAgentID
+ || (LibraryService != null
+ && LibraryService.LibraryRootFolder != null
+ && oldAgentID == LibraryService.LibraryRootFolder.Owner))
{
CreateNewInventoryItem(
- remoteClient, item.CreatorId, item.CreatorData, newFolderID, newName, item.Description, item.Flags, callbackID,
- item.AssetID, (sbyte)item.AssetType, (sbyte) item.InvType,
- item.NextPermissions, item.NextPermissions, item.EveryOnePermissions & item.NextPermissions,
+ remoteClient, item.CreatorId, item.CreatorData, newFolderID,
+ newName, item.Description, item.Flags, callbackID, item.AssetID, (sbyte)item.AssetType, (sbyte)item.InvType,
+ item.BasePermissions, item.CurrentPermissions, item.EveryOnePermissions,
item.NextPermissions, item.GroupPermissions, Util.UnixTimeSinceEpoch(), false);
}
+ else
+ {
+ // If item is transfer or permissions are off or calling agent is allowed to copy item owner's inventory item.
+ if (((item.CurrentPermissions & (uint)PermissionMask.Transfer) != 0)
+ && (m_permissions.BypassPermissions()
+ || m_permissions.CanCopyUserInventory(remoteClient.AgentId, oldItemID)))
+ {
+ CreateNewInventoryItem(
+ remoteClient, item.CreatorId, item.CreatorData, newFolderID, newName, item.Description, item.Flags, callbackID,
+ item.AssetID, (sbyte)item.AssetType, (sbyte)item.InvType,
+ item.NextPermissions, item.NextPermissions, item.EveryOnePermissions & item.NextPermissions,
+ item.NextPermissions, item.GroupPermissions, Util.UnixTimeSinceEpoch(), false);
+ }
+ }
}
- }
- else
+ else
{
m_log.ErrorFormat(
"[AGENT INVENTORY]: Could not copy item {0} since asset {1} could not be found",
diff --git a/OpenSim/Services/Connectors/Inventory/XInventoryServicesConnector.cs b/OpenSim/Services/Connectors/Inventory/XInventoryServicesConnector.cs
index f235446ac9..36d4ae25f0 100644
--- a/OpenSim/Services/Connectors/Inventory/XInventoryServicesConnector.cs
+++ b/OpenSim/Services/Connectors/Inventory/XInventoryServicesConnector.cs
@@ -33,37 +33,22 @@ using System.Reflection;
using Nini.Config;
using OpenSim.Framework;
using OpenSim.Framework.Console;
-
-using OpenSim.Framework.Monitoring;
+using OpenSim.Framework.Communications;
using OpenSim.Services.Interfaces;
using OpenSim.Server.Base;
using OpenMetaverse;
namespace OpenSim.Services.Connectors
{
- public class XInventoryServicesConnector : BaseServiceConnector, IInventoryService
+ public class XInventoryServicesConnector : IInventoryService
{
private static readonly ILog m_log =
LogManager.GetLogger(
MethodBase.GetCurrentMethod().DeclaringType);
- ///
- /// Number of requests made to the remote inventory service.
- ///
- public int RequestsMade { get; private set; }
-
private string m_ServerURI = String.Empty;
- ///
- /// Timeout for remote requests.
- ///
- ///
- /// In this case, -1 is default timeout (100 seconds), not infinite.
- ///
- private int m_requestTimeoutSecs = -1;
-
- private const double CACHE_EXPIRATION_SECONDS = 20.0;
- private static ExpiringCache m_ItemCache = new ExpiringCache();
+ private object m_Lock = new object();
public XInventoryServicesConnector()
{
@@ -75,21 +60,20 @@ namespace OpenSim.Services.Connectors
}
public XInventoryServicesConnector(IConfigSource source)
- : base(source, "InventoryService")
{
Initialise(source);
}
public virtual void Initialise(IConfigSource source)
{
- IConfig config = source.Configs["InventoryService"];
- if (config == null)
+ IConfig assetConfig = source.Configs["InventoryService"];
+ if (assetConfig == null)
{
m_log.Error("[INVENTORY CONNECTOR]: InventoryService missing from OpenSim.ini");
throw new Exception("Inventory connector init error");
}
- string serviceURI = config.GetString("InventoryServerURI",
+ string serviceURI = assetConfig.GetString("InventoryServerURI",
String.Empty);
if (serviceURI == String.Empty)
@@ -98,21 +82,6 @@ namespace OpenSim.Services.Connectors
throw new Exception("Inventory connector init error");
}
m_ServerURI = serviceURI;
-
- m_requestTimeoutSecs = config.GetInt("RemoteRequestTimeout", m_requestTimeoutSecs);
-
- StatsManager.RegisterStat(
- new Stat(
- "RequestsMade",
- "Requests made",
- "Number of requests made to the remove inventory service",
- "requests",
- "inventory",
- serviceURI,
- StatType.Pull,
- MeasuresOfInterest.AverageChangeOverTime,
- s => s.Value = RequestsMade,
- StatVerbosity.Debug));
}
private bool CheckReturn(Dictionary ret)
@@ -189,7 +158,7 @@ namespace OpenSim.Services.Connectors
return BuildFolder((Dictionary)ret["folder"]);
}
- public InventoryFolderBase GetFolderForType(UUID principalID, FolderType type)
+ public InventoryFolderBase GetFolderForType(UUID principalID, AssetType type)
{
Dictionary ret = MakeRequest("GETFOLDERFORTYPE",
new Dictionary {
@@ -208,7 +177,7 @@ namespace OpenSim.Services.Connectors
InventoryCollection inventory = new InventoryCollection();
inventory.Folders = new List();
inventory.Items = new List();
- inventory.OwnerID = principalID;
+ inventory.UserID = principalID;
try
{
@@ -221,17 +190,15 @@ namespace OpenSim.Services.Connectors
if (!CheckReturn(ret))
return null;
- Dictionary folders = ret.ContainsKey("FOLDERS") ?
- (Dictionary)ret["FOLDERS"] : null;
- Dictionary items = ret.ContainsKey("ITEMS") ?
- (Dictionary)ret["ITEMS"] : null;
+ Dictionary folders =
+ (Dictionary)ret["FOLDERS"];
+ Dictionary items =
+ (Dictionary)ret["ITEMS"];
- if (folders != null)
- foreach (Object o in folders.Values) // getting the values directly, we don't care about the keys folder_i
- inventory.Folders.Add(BuildFolder((Dictionary)o));
- if (items != null)
- foreach (Object o in items.Values) // getting the values directly, we don't care about the keys item_i
- inventory.Items.Add(BuildItem((Dictionary)o));
+ foreach (Object o in folders.Values) // getting the values directly, we don't care about the keys folder_i
+ inventory.Folders.Add(BuildFolder((Dictionary)o));
+ foreach (Object o in items.Values) // getting the values directly, we don't care about the keys item_i
+ inventory.Items.Add(BuildItem((Dictionary)o));
}
catch (Exception e)
{
@@ -240,87 +207,6 @@ namespace OpenSim.Services.Connectors
return inventory;
}
-
- public virtual InventoryCollection[] GetMultipleFoldersContent(UUID principalID, UUID[] folderIDs)
- {
- InventoryCollection[] inventoryArr = new InventoryCollection[folderIDs.Length];
- // m_log.DebugFormat("[XXX]: In GetMultipleFoldersContent {0}", String.Join(",", folderIDs));
- try
- {
- Dictionary resultSet = MakeRequest("GETMULTIPLEFOLDERSCONTENT",
- new Dictionary {
- { "PRINCIPAL", principalID.ToString() },
- { "FOLDERS", String.Join(",", folderIDs) },
- { "COUNT", folderIDs.Length.ToString() }
- });
-
- if (!CheckReturn(resultSet))
- return null;
-
- int i = 0;
- foreach (KeyValuePair kvp in resultSet)
- {
- InventoryCollection inventory = new InventoryCollection();
- if (kvp.Key.StartsWith("F_"))
- {
- UUID fid = UUID.Zero;
- if (UUID.TryParse(kvp.Key.Substring(2), out fid) && fid == folderIDs[i])
- {
- inventory.Folders = new List();
- inventory.Items = new List();
-
- Dictionary ret = (Dictionary)kvp.Value;
-
- if (ret.ContainsKey("FID"))
- {
- if (!UUID.TryParse(ret["FID"].ToString(), out inventory.FolderID))
- m_log.WarnFormat("[XINVENTORY SERVICES CONNECTOR]: Could not parse folder id {0}", ret["FID"].ToString());
- }
- else
- m_log.WarnFormat("[XINVENTORY SERVICES CONNECTOR]: FID key not present in response");
-
- inventory.Version = -1;
- if (ret.ContainsKey("VERSION"))
- Int32.TryParse(ret["VERSION"].ToString(), out inventory.Version);
- if (ret.ContainsKey("OWNER"))
- UUID.TryParse(ret["OWNER"].ToString(), out inventory.OwnerID);
-
- //m_log.DebugFormat("[XXX]: Received {0} ({1}) {2} {3}", inventory.FolderID, fid, inventory.Version, inventory.OwnerID);
-
- Dictionary folders =
- (Dictionary)ret["FOLDERS"];
- Dictionary items =
- (Dictionary)ret["ITEMS"];
-
- foreach (Object o in folders.Values) // getting the values directly, we don't care about the keys folder_i
- {
- inventory.Folders.Add(BuildFolder((Dictionary)o));
- }
- foreach (Object o in items.Values) // getting the values directly, we don't care about the keys item_i
- {
- inventory.Items.Add(BuildItem((Dictionary)o));
- }
-
- inventoryArr[i] = inventory;
- }
- else
- {
- m_log.WarnFormat("[XINVENTORY SERVICES CONNECTOR]: Folder id does not match. Expected {0} got {1}",
- folderIDs[i], fid);
- m_log.WarnFormat("[XINVENTORY SERVICES CONNECTOR]: {0} {1}", String.Join(",", folderIDs), String.Join(",", resultSet.Keys));
- }
-
- i += 1;
- }
- }
- }
- catch (Exception e)
- {
- m_log.WarnFormat("[XINVENTORY SERVICES CONNECTOR]: Exception in GetMultipleFoldersContent: {0}", e.Message);
- }
-
- return inventoryArr;
- }
public List GetFolderItems(UUID principalID, UUID folderID)
{
@@ -411,13 +297,9 @@ namespace OpenSim.Services.Connectors
public bool AddItem(InventoryItemBase item)
{
- if (item.Description == null)
- item.Description = String.Empty;
if (item.CreatorData == null)
item.CreatorData = String.Empty;
- if (item.CreatorId == null)
- item.CreatorId = String.Empty;
- Dictionary ret = MakeRequest("ADDITEM",
+ Dictionary ret = MakeRequest("ADDITEM",
new Dictionary {
{ "AssetID", item.AssetID.ToString() },
{ "AssetType", item.AssetType.ToString() },
@@ -516,10 +398,6 @@ namespace OpenSim.Services.Connectors
public InventoryItemBase GetItem(InventoryItemBase item)
{
- InventoryItemBase retrieved = null;
- if (m_ItemCache.TryGetValue(item.ID, out retrieved))
- return retrieved;
-
try
{
Dictionary ret = MakeRequest("GETITEM",
@@ -530,78 +408,14 @@ namespace OpenSim.Services.Connectors
if (!CheckReturn(ret))
return null;
- retrieved = BuildItem((Dictionary)ret["item"]);
+ return BuildItem((Dictionary)ret["item"]);
}
catch (Exception e)
{
m_log.Error("[XINVENTORY SERVICES CONNECTOR]: Exception in GetItem: ", e);
}
- m_ItemCache.AddOrUpdate(item.ID, retrieved, CACHE_EXPIRATION_SECONDS);
-
- return retrieved;
- }
-
- public virtual InventoryItemBase[] GetMultipleItems(UUID principalID, UUID[] itemIDs)
- {
- //m_log.DebugFormat("[XXX]: In GetMultipleItems {0}", String.Join(",", itemIDs));
-
- InventoryItemBase[] itemArr = new InventoryItemBase[itemIDs.Length];
- // Try to get them from the cache
- List pending = new List();
- InventoryItemBase item = null;
- int i = 0;
- foreach (UUID id in itemIDs)
- {
- if (m_ItemCache.TryGetValue(id, out item))
- itemArr[i++] = item;
- else
- pending.Add(id);
- }
-
- if (pending.Count == 0) // we're done, everything was in the cache
- return itemArr;
-
- try
- {
- Dictionary resultSet = MakeRequest("GETMULTIPLEITEMS",
- new Dictionary {
- { "PRINCIPAL", principalID.ToString() },
- { "ITEMS", String.Join(",", pending.ToArray()) },
- { "COUNT", pending.Count.ToString() }
- });
-
- if (!CheckReturn(resultSet))
- {
- if (i == 0)
- return null;
- else
- return itemArr;
- }
-
- // carry over index i where we left above
- foreach (KeyValuePair kvp in resultSet)
- {
- InventoryCollection inventory = new InventoryCollection();
- if (kvp.Key.StartsWith("item_"))
- {
- if (kvp.Value is Dictionary)
- {
- item = BuildItem((Dictionary)kvp.Value);
- m_ItemCache.AddOrUpdate(item.ID, item, CACHE_EXPIRATION_SECONDS);
- itemArr[i++] = item;
- }
- else
- itemArr[i++] = null;
- }
- }
- }
- catch (Exception e)
- {
- m_log.WarnFormat("[XINVENTORY SERVICES CONNECTOR]: Exception in GetMultipleItems: {0}", e.Message);
- }
-
- return itemArr;
+ return null;
}
public InventoryFolderBase GetFolder(InventoryFolderBase folder)
@@ -670,6 +484,45 @@ namespace OpenSim.Services.Connectors
return 0;
}
+ public InventoryCollection GetUserInventory(UUID principalID)
+ {
+ InventoryCollection inventory = new InventoryCollection();
+ inventory.Folders = new List();
+ inventory.Items = new List();
+ inventory.UserID = principalID;
+
+ try
+ {
+ Dictionary ret = MakeRequest("GETUSERINVENTORY",
+ new Dictionary {
+ { "PRINCIPAL", principalID.ToString() }
+ });
+
+ if (!CheckReturn(ret))
+ return null;
+
+ Dictionary folders =
+ (Dictionary)ret["FOLDERS"];
+ Dictionary items =
+ (Dictionary)ret["ITEMS"];
+
+ foreach (Object o in folders.Values) // getting the values directly, we don't care about the keys folder_i
+ inventory.Folders.Add(BuildFolder((Dictionary)o));
+ foreach (Object o in items.Values) // getting the values directly, we don't care about the keys item_i
+ inventory.Items.Add(BuildItem((Dictionary)o));
+ }
+ catch (Exception e)
+ {
+ m_log.Error("[XINVENTORY SERVICES CONNECTOR]: Exception in GetUserInventory: ", e);
+ }
+
+ return inventory;
+ }
+
+ public void GetUserInventory(UUID principalID, InventoryReceiptCallback callback)
+ {
+ }
+
public bool HasInventoryForUser(UUID principalID)
{
return false;
@@ -680,19 +533,13 @@ namespace OpenSim.Services.Connectors
private Dictionary MakeRequest(string method,
Dictionary sendData)
{
- // Add "METHOD" as the first key in the dictionary. This ensures that it will be
- // visible even when using partial logging ("debug http all 5").
- Dictionary temp = sendData;
- sendData = new Dictionary{ { "METHOD", method } };
- foreach (KeyValuePair kvp in temp)
- sendData.Add(kvp.Key, kvp.Value);
+ sendData["METHOD"] = method;
- RequestsMade++;
-
- string reply
- = SynchronousRestFormsRequester.MakeRequest(
- "POST", m_ServerURI + "/xinventory",
- ServerUtils.BuildQueryString(sendData), m_requestTimeoutSecs, m_Auth);
+ string reply = string.Empty;
+ lock (m_Lock)
+ reply = SynchronousRestFormsRequester.MakeRequest("POST",
+ m_ServerURI + "/xinventory",
+ ServerUtils.BuildQueryString(sendData));
Dictionary replyData = ServerUtils.ParseXmlResponse(
reply);
@@ -760,4 +607,4 @@ namespace OpenSim.Services.Connectors
return item;
}
}
-}
+}
\ No newline at end of file